alarmConfig-list.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. <template>
  2. <div>
  3. <el-breadcrumb separator=">">
  4. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  5. <el-breadcrumb-item>
  6. <a href="#">系统管理</a>
  7. </el-breadcrumb-item>
  8. <el-breadcrumb-item>
  9. <a href="/messageNotice">考勤时间</a>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form
  17. ref="queryForm"
  18. :model="queryModel"
  19. inline
  20. class="demo-form-inline"
  21. >
  22. <el-form-item label="单位" prop="companyId">
  23. <!-- <el-select
  24. v-model="queryModel.companyId"
  25. size="mini"
  26. filterable
  27. placeholder="请选择"
  28. style="width:280px"
  29. >
  30. <el-option
  31. v-for="company in companyResult"
  32. :key="company.id"
  33. :label="company.name"
  34. :value="company.id"
  35. ></el-option>
  36. </el-select>-->
  37. <el-select-tree
  38. :props="props"
  39. aria-setsize="mini"
  40. :options="companyResult"
  41. v-model="queryModel.companyId"
  42. height="200"
  43. ></el-select-tree>
  44. </el-form-item>
  45. <el-form-item>
  46. <el-button
  47. type="primary"
  48. size="mini"
  49. icon="ios-search"
  50. @click="changePage(1)"
  51. :loading="loading"
  52. >查询</el-button
  53. >&nbsp;
  54. </el-form-item>
  55. </el-form>
  56. <el-divider></el-divider>
  57. <el-row class="button-group">
  58. <el-button
  59. type="primary"
  60. size="small"
  61. plain
  62. icon="el-icon-circle-plus"
  63. @click="handleAdd"
  64. >新增</el-button
  65. >
  66. <el-button
  67. type="primary"
  68. size="small"
  69. plain
  70. icon="el-icon-remove"
  71. :disabled="multipleSelection.length == 0"
  72. @click="handleBatchDelete"
  73. >删除选中项</el-button
  74. >
  75. <el-button
  76. type="primary"
  77. size="small"
  78. plain
  79. icon="el-icon-upload2"
  80. @click="batchImportVisible = true"
  81. >导入</el-button
  82. >
  83. <el-button
  84. type="primary"
  85. size="small"
  86. plain
  87. icon="el-icon-download"
  88. :loading="xlsLoading"
  89. @click="downloadAll"
  90. >导出数据</el-button
  91. >
  92. </el-row>
  93. <el-table
  94. ref="formTable"
  95. :data="tableData"
  96. v-loading="loading"
  97. :height="tableHeight"
  98. stripe
  99. @sort-change="sortChange"
  100. @selection-change="handleSelectionChange"
  101. >
  102. <el-table-column type="selection" width="55"></el-table-column>
  103. <el-table-column
  104. prop="companyName"
  105. label="单位"
  106. width="220"
  107. fixed="left"
  108. ></el-table-column>
  109. <el-table-column prop="subordinate" label="是否包含下级单位" width="150">
  110. <template slot-scope="{ row }">
  111. <span v-html="row.subordinate ? '是' : '否'"></span>
  112. </template>
  113. </el-table-column>
  114. <el-table-column
  115. prop="weekdays"
  116. label="周工作日"
  117. show-overflow-tooltip
  118. width="150"
  119. ></el-table-column>
  120. <el-table-column prop="classifier" label="考勤分类" width="120">
  121. <template slot-scope="{ row }">
  122. <span v-html="row.classifier == 1 ? '上班时间' : ''"></span>
  123. <span v-html="row.classifier == 2 ? '下班时间' : ''"></span>
  124. </template>
  125. </el-table-column>
  126. <el-table-column
  127. prop="startTime"
  128. label="开始时间"
  129. width="120"
  130. ></el-table-column>
  131. <el-table-column
  132. prop="attendanceTime"
  133. label="考勤时间"
  134. width="120"
  135. ></el-table-column>
  136. <el-table-column
  137. prop="endTime"
  138. label="结束时间"
  139. width="120"
  140. ></el-table-column>
  141. <el-table-column prop="attendanceType" label="考勤类型" width="120">
  142. <template slot-scope="{ row }">
  143. <span v-html="row.attendanceType == 1 ? '内勤' : ''"></span>
  144. <span v-html="row.attendanceType == 2 ? '外勤' : ''"></span>
  145. </template>
  146. </el-table-column>
  147. <el-table-column
  148. prop="needMeasureTemperature"
  149. label="是否需要提醒"
  150. width="120"
  151. >
  152. <template slot-scope="{ row }">
  153. <span v-html="row.needMeasureTemperature ? '是' : '否'"></span>
  154. </template>
  155. </el-table-column>
  156. <el-table-column label="操作" width="200" fixed="right">
  157. <template slot-scope="{ row }">
  158. <el-button size="mini" type="warning" @click="handleEdit(row)"
  159. >修改</el-button
  160. >
  161. <el-button size="mini" type="danger" @click="handleDelete(row)"
  162. >删除</el-button
  163. >
  164. </template>
  165. </el-table-column>
  166. </el-table>
  167. <el-pagination
  168. :current-page.sync="pageIndex"
  169. :total="totalElements"
  170. :page-sizes="pageSizeList"
  171. @current-change="changePage"
  172. @size-change="pageSizeChange"
  173. layout="total, sizes, prev, pager, next, jumper"
  174. ></el-pagination>
  175. <alarmConfig-detail
  176. v-if="showModal"
  177. :businessKey="businessKey"
  178. :title="modalTitle"
  179. :companyResult="companyResult"
  180. @close="onDetailModalClose"
  181. ></alarmConfig-detail>
  182. <!--批量导入s-->
  183. <el-dialog
  184. title="批量导入考勤时间设置"
  185. :visible.sync="batchImportVisible"
  186. :modal-append-to-body="false"
  187. style="text-align: left"
  188. :close-on-click-modal="false"
  189. >
  190. <el-form label-width="150px">
  191. <el-form-item label="模板下载">
  192. <el-link
  193. href="http://rccs.oss-cn-hangzhou.aliyuncs.com/smart/alarmConfig/2020/12/%E8%80%83%E5%8B%A4%E6%97%B6%E9%97%B4%E8%AE%BE%E7%BD%AE%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xls"
  194. type="primary"
  195. target="_blank"
  196. >点击下载模板</el-link
  197. >
  198. </el-form-item>
  199. <el-form-item label="单位">
  200. <el-select-tree
  201. size="large"
  202. :props="props"
  203. :options="companyResult"
  204. v-model="uploadXlsData.companyId"
  205. height="200"
  206. width="300px"
  207. ></el-select-tree>
  208. </el-form-item>
  209. <el-form-item label="上传文件">
  210. <el-upload
  211. class="upload-demo"
  212. accept=".xls"
  213. :action="uploadUrlXls"
  214. :data="uploadXlsData"
  215. :headers="headers"
  216. :on-preview="handleBatchImportPreview"
  217. name="uploadFile"
  218. :multiple="true"
  219. :limit="1"
  220. :on-remove="handleBatchImportRemove"
  221. :before-remove="beforeBatchImportRemove"
  222. :before-upload="beforeUpload"
  223. :on-exceed="handleBatchImportExceed"
  224. :on-success="handleBatchImportSuccess"
  225. :file-list="batchImportFileList"
  226. >
  227. <el-button size="small" type="primary" :loading="xlsLoading"
  228. >点击上传</el-button
  229. >
  230. <div slot="tip" class="el-upload__tip">
  231. 只能上传xls文件,且不超过500kb
  232. </div>
  233. </el-upload>
  234. </el-form-item>
  235. </el-form>
  236. <div slot="footer" class="dialog-footer">
  237. <el-button type="primary" @click="batchImportVisible = false"
  238. >关 闭</el-button
  239. >
  240. </div>
  241. </el-dialog>
  242. <!--批量导入E-->
  243. </div>
  244. </template>
  245. <script>
  246. import Constant from "@/constant";
  247. import alarmConfigDetail from "./alarmConfig-detail";
  248. import alarmConfigApi from "@/api/base/alarmConfig";
  249. import companyInfoApi from "@/api/base/companyInfo";
  250. import SelectTree from "@/components/SelectTree";
  251. import pageUtil from "@/utils/page";
  252. import { getToken } from "@/utils/auth"; // get token from cookie
  253. import NProgress from "nprogress"; // progress bar
  254. import "nprogress/nprogress.css"; // progress bar style
  255. export default {
  256. name: "BaseAlarmConfigList",
  257. data() {
  258. var self = this;
  259. return {
  260. queryModel: {
  261. companyId: "",
  262. },
  263. loading: false,
  264. tableData: [],
  265. pageIndex: 1,
  266. pageSize: 10,
  267. totalPages: 0,
  268. totalElements: 0,
  269. field: "",
  270. direction: "",
  271. pageSizeList: [10, 20, 30],
  272. multipleSelection: [],
  273. showModal: false,
  274. modalTitle: "",
  275. businessKey: "",
  276. tableHeight: 400,
  277. companyResult: [],
  278. treeData: [],
  279. props: {
  280. // 配置项(必选)
  281. value: "id",
  282. label: "name",
  283. children: "children",
  284. },
  285. batchImportVisible: false,
  286. batchImportFileList: [],
  287. uploadUrlXls: Constant.serverUrl + "/base/alarmConfig/importXls",
  288. uploadXlsData: {
  289. subFolder: "company",
  290. companyId: "",
  291. },
  292. headers: {
  293. Authorization: getToken(),
  294. },
  295. xlsLoading: false,
  296. };
  297. },
  298. created() {
  299. this.loadTree();
  300. },
  301. methods: {
  302. getSelectedValue(value) {
  303. this.queryModel.companyId = value;
  304. },
  305. loadTree() {
  306. var formData = new FormData();
  307. companyInfoApi.loadChildren(formData).then((resp) => {
  308. var jsonData = resp.data;
  309. if (jsonData.result) {
  310. this.treeData = jsonData.data;
  311. } else {
  312. this.$message.error(jsonData.message + "");
  313. }
  314. });
  315. },
  316. loadChildren(tree, treeNode, resolve) {
  317. console.log(tree);
  318. var formData = new FormData();
  319. formData.append("parentId", tree.id);
  320. companyInfoApi.loadChildren(formData).then((resp) => {
  321. var jsonData = resp.data;
  322. if (jsonData.result) {
  323. resolve(jsonData.data);
  324. } else {
  325. this.$message.error(jsonData.message + "");
  326. }
  327. });
  328. },
  329. changePage(pageIndex) {
  330. var self = this;
  331. self.loading = true;
  332. self.pageIndex = pageIndex;
  333. var formData = new FormData();
  334. formData.append("pageIndex", self.pageIndex);
  335. formData.append("pageSize", self.pageSize);
  336. if (self.queryModel.companyId == null) {
  337. self.queryModel.companyId = "";
  338. }
  339. formData.append("companyId", self.queryModel.companyId);
  340. if (this.field != null) {
  341. formData.append("field", this.field);
  342. }
  343. if (this.direction != null) {
  344. formData.append("direction", this.direction);
  345. }
  346. alarmConfigApi
  347. .pageList(formData)
  348. .then(function (response) {
  349. self.loading = false;
  350. var jsonData = response.data.data;
  351. self.tableData = jsonData.data;
  352. self.totalPages = jsonData.totalPages;
  353. self.totalElements = jsonData.recordsTotal;
  354. })
  355. .catch((error) => {
  356. self.loading = false;
  357. // self.$message.error(error + "");
  358. });
  359. },
  360. pageSizeChange(pageSize) {
  361. this.pageSize = pageSize;
  362. },
  363. sortChange(data) {
  364. this.field = data.column.field;
  365. this.direction = data.order == "ascending" ? "asc" : "desc";
  366. this.changePage(this.pageIndex);
  367. },
  368. handleSelectionChange(val) {
  369. this.multipleSelection = val;
  370. },
  371. handleReset(name) {
  372. this.$refs[name].resetFields();
  373. },
  374. handleAdd() {
  375. this.modalTitle = "新增";
  376. this.businessKey = "";
  377. this.showModal = true;
  378. },
  379. handleEdit(record) {
  380. this.modalTitle = "编辑";
  381. this.businessKey = record.id;
  382. this.showModal = true;
  383. },
  384. handleDelete(record) {
  385. var self = this;
  386. self
  387. .$confirm("是否确认删除?", "提示", {
  388. confirmButtonText: "确定",
  389. cancelButtonText: "取消",
  390. type: "warning",
  391. })
  392. .then(() => {
  393. alarmConfigApi.remove(record.id).then(function (response) {
  394. var jsonData = response.data;
  395. if (jsonData.result) {
  396. // var index = self.tableData.indexOf(record);
  397. // self.tableData.splice(index, 1);
  398. self.changePage(self.pageIndex);
  399. self.$message({
  400. type: "success",
  401. message: "删除成功!",
  402. });
  403. }
  404. });
  405. });
  406. },
  407. handleBatchDelete() {
  408. var self = this;
  409. var idList = this.multipleSelection.map((record) => {
  410. return record.id;
  411. });
  412. this.$confirm("是否确认删除选中项?", "提示", {
  413. confirmButtonText: "确定",
  414. cancelButtonText: "取消",
  415. type: "warning",
  416. }).then(() => {
  417. alarmConfigApi.batchRemove(idList).then(function (response) {
  418. var jsonData = response.data;
  419. if (jsonData.result) {
  420. self.changePage(self.pageIndex);
  421. self.$message({
  422. type: "success",
  423. message: "删除成功!",
  424. });
  425. }
  426. });
  427. });
  428. },
  429. onDetailModalClose(refreshed) {
  430. //保存成功后回调
  431. this.showModal = false;
  432. if (refreshed) {
  433. this.changePage(this.pageIndex);
  434. }
  435. },
  436. beforeUpload(file, fileList) {
  437. //导入前判断
  438. var self = this;
  439. var companyId = self.uploadXlsData.companyId;
  440. if (companyId == null || companyId.length == 0) {
  441. self.$message({
  442. type: "warning",
  443. message: "请选择单位!",
  444. });
  445. self.xlsLoading = false;
  446. return false;
  447. } else {
  448. self.xlsLoading = true;
  449. return true;
  450. }
  451. },
  452. //批量导入-上传成功
  453. handleBatchImportSuccess(response, file, fileList) {
  454. var self = this;
  455. self.xlsLoading = false;
  456. self.uploadXlsData.companyId = null;
  457. if (response.result) {
  458. self.$message.success(response.message);
  459. this.batchImportFileList = [];
  460. this.changePage(1);
  461. this.batchImportVisible = false;
  462. } else {
  463. //this.$message.error(response.message);
  464. this.batchImportFileList = [];
  465. this.changePage(1);
  466. if (response.data != null) {
  467. //下载有错误信息提示的报表
  468. //window.open(response.data);
  469. self.$message({
  470. showClose: true,
  471. dangerouslyUseHTMLString: true,
  472. message:
  473. response.message +
  474. `,<a href="${response.data}" target="_blank">点击下载未导入的数据报表</a>&nbsp;`,
  475. duration: 30000,
  476. });
  477. }
  478. }
  479. },
  480. //批量导入-预览
  481. handleBatchImportPreview(file) {
  482. console.log(file.url);
  483. },
  484. //批量导入-移除
  485. handleBatchImportRemove(file, fileList) {
  486. console.log(file, fileList);
  487. },
  488. //批量导入-移除前操作
  489. beforeBatchImportRemove(file, fileList) {
  490. console.log(file, fileList);
  491. },
  492. //批量导入-文件超出个数限制时的钩子
  493. handleBatchImportExceed(files, fileList) {
  494. this.$message.warning(
  495. `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
  496. files.length + fileList.length
  497. } 个文件`
  498. );
  499. },
  500. downloadAll() {
  501. //导出
  502. var self = this;
  503. var formData = new FormData();
  504. if (self.queryModel.companyId == null) {
  505. self.queryModel.companyId = "";
  506. }
  507. formData.append("companyId", self.queryModel.companyId);
  508. self.loading = true;
  509. self.xlsLoading = true;
  510. alarmConfigApi.exportXls(formData).then(function (response) {
  511. self.loading = false;
  512. self.xlsLoading = false;
  513. var jsonData = response.data;
  514. if (jsonData.result) {
  515. if (jsonData.data != null) {
  516. if (document.location.href.startsWith("https://")) {
  517. jsonData.data = jsonData.data.replace("http://", "https://");
  518. }
  519. self.$message({
  520. showClose: true,
  521. type: "success",
  522. dangerouslyUseHTMLString: true,
  523. message: `报表已生成,<a href="${jsonData.data}" target="_blank">点击下载报表</a>&nbsp;`,
  524. duration: 30000,
  525. });
  526. }
  527. }
  528. });
  529. },
  530. },
  531. mounted: function () {
  532. var self = this;
  533. this.changePage(1);
  534. companyInfoApi.treeList().then(function (response) {
  535. var jsonData = response.data;
  536. if (jsonData.result) {
  537. self.companyResult = jsonData.data;
  538. }
  539. });
  540. setTimeout(() => {
  541. this.tableHeight = pageUtil.autoAdjustHeight(this.$refs.formTable.$el);
  542. }, 1000);
  543. },
  544. components: {
  545. "alarmConfig-detail": alarmConfigDetail,
  546. "el-select-tree": SelectTree,
  547. },
  548. };
  549. </script>
  550. <style lang="scss" scoped>
  551. .el-breadcrumb {
  552. margin: 10px;
  553. line-height: 20px;
  554. }
  555. .el-divider {
  556. margin: 5px 0;
  557. }
  558. .demo-form-inline {
  559. margin-left: 10px;
  560. text-align: left;
  561. }
  562. .button-group {
  563. margin-left: 10px;
  564. text-align: left;
  565. }
  566. </style>