holidayInfo-list.vue 16 KB

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