requestForLeave-list.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  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="#">请假记录</a>
  10. </el-breadcrumb-item>
  11. </el-breadcrumb>
  12. <el-divider></el-divider>
  13. <!--
  14. 要resetFields起作用,必须配置:model和prop
  15. -->
  16. <el-form ref="queryForm" :model="queryModel" inline class="demo-form-inline">
  17. <el-form-item label="所属单位" prop="classId">
  18. <el-select-tree
  19. size="mini"
  20. :props="props"
  21. :options="treeData"
  22. v-model="queryModel.classId"
  23. height="200"
  24. ></el-select-tree>
  25. </el-form-item>
  26. <el-form-item label="请假类型" prop="type">
  27. <el-select
  28. v-model="queryModel.leaveType"
  29. size="mini"
  30. filterable
  31. placeholder="请选择"
  32. style="width:100px"
  33. >
  34. <el-option v-for="item in leaveTypeList" :key="item.id" :label="item.name" :value="item.value"></el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="审批状态" prop="status">
  38. <!--0-未处理,1-已批准,2-已拒绝-->
  39. <el-select
  40. v-model="queryModel.status"
  41. size="mini"
  42. filterable
  43. placeholder="请选择"
  44. style="width:100px"
  45. >
  46. <el-option v-for="item in statusList" :key="item.id" :label="item.name" :value="item.id"></el-option>
  47. </el-select>
  48. </el-form-item>
  49. <el-form-item label="申请时间" prop="requestTimeRange">
  50. <el-date-picker
  51. v-model="queryModel.requestTimeRange"
  52. type="daterange"
  53. size="mini"
  54. range-separator="至"
  55. start-placeholder="开始时间"
  56. end-placeholder="结束时间"
  57. placeholder="选择时间范围"
  58. value-format="yyyy-MM-dd"
  59. >
  60. </el-date-picker>
  61. </el-form-item>
  62. <el-form-item label="审核时间">
  63. <el-date-picker
  64. v-model="queryModel.auditTimeRange"
  65. type="daterange"
  66. size="mini"
  67. range-separator="至"
  68. start-placeholder="开始时间"
  69. end-placeholder="结束时间"
  70. placeholder="选择时间范围"
  71. value-format="yyyy-MM-dd"
  72. >
  73. </el-date-picker>
  74. </el-form-item>
  75. <el-form-item>
  76. <el-button
  77. type="primary"
  78. size="mini"
  79. icon="ios-search"
  80. @click="changePage(1)"
  81. :loading="loading"
  82. >查询</el-button>&nbsp;
  83. <el-button
  84. type="info"
  85. size="mini"
  86. style="margin-left: 8px"
  87. @click="handleReset('queryForm')"
  88. >重置</el-button>&nbsp;
  89. </el-form-item>
  90. </el-form>
  91. <el-divider></el-divider>
  92. <div class="button-group">
  93. <el-button type="success" size="small" plain icon="el-icon-download" @click="exportXls()">批量导出</el-button>
  94. </div>
  95. <el-table
  96. ref="formTable"
  97. :data="tableData"
  98. :height="tableHeight"
  99. v-loading="loading"
  100. stripe
  101. >
  102. <el-table-column type="expand">
  103. <template slot-scope="{row}">
  104. <el-form label-position="left" class="demo-table-expand">
  105. <el-form-item label="请假类型:">
  106. <span>{{row.leaveTypeN }}</span>
  107. </el-form-item>
  108. <el-form-item label="请假时间:">
  109. <span>{{row.time }}</span>
  110. </el-form-item>
  111. <el-form-item label="请假事由:">
  112. <span>{{row.reason }}</span>
  113. </el-form-item>
  114. <el-form-item label="审核意见:">
  115. <span>{{row.approvalExplain }}</span>
  116. </el-form-item>
  117. <el-form-item label="审核时间:">
  118. <span>{{row.approvedTime }}</span>
  119. </el-form-item>
  120. </el-form>
  121. </template>
  122. </el-table-column>
  123. <el-table-column prop="createTime" label="申请时间" :sortable="false" width="180"></el-table-column>
  124. <el-table-column prop="name" label="姓名" :sortable="false" width="150"></el-table-column>
  125. <el-table-column prop="idCard" label="身份证号" :sortable="false" width="180"></el-table-column>
  126. <el-table-column prop="className" label="所属单位" :sortable="false" width="180"></el-table-column>
  127. <el-table-column prop="approvedName" label="审批人" :sortable="false" width="180"></el-table-column>
  128. <el-table-column prop="leaveTypeN" label="请假类型" :sortable="false" ></el-table-column>
  129. <el-table-column prop="statusN" label="审批状态" :sortable="false" ></el-table-column>
  130. <el-table-column prop="updateTime" label="审核时间" :sortable="false" width="180"></el-table-column>
  131. </el-table>
  132. <el-pagination
  133. :current-page.sync="pageIndex"
  134. :total="totalElements"
  135. :page-sizes="pageSizeList"
  136. @current-change="changePage"
  137. @size-change="pageSizeChange"
  138. layout="total, sizes, prev, pager, next, jumper"
  139. ></el-pagination>
  140. </div>
  141. </template>
  142. <script>
  143. import Constant from "@/constant";
  144. import requestForLeaveApi from "@/api/business/requestForLeave";
  145. import dataDictionaryApi from "@/api/sys/dataDictionary";
  146. import companyInfoApi from "@/api/base/companyInfo";
  147. import pageUtil from "@/utils/page";
  148. import SelectTree from "@/components/SelectTree";
  149. import NProgress from "nprogress"; // progress bar
  150. import "nprogress/nprogress.css"; // progress bar style
  151. export default {
  152. name: "business-requestForLeave-list",
  153. data() {
  154. var self = this;
  155. return {
  156. queryModel: {
  157. classId: "",
  158. leaveType: "",
  159. status:"",
  160. requestTimeRange: ['',''],
  161. auditTimeRange: ['','']
  162. },
  163. loading: false,
  164. tableData: [],
  165. pageIndex: 1,
  166. pageSize: 10,
  167. totalPages: 0,
  168. totalElements: 0,
  169. pageSizeList: [10, 20, 30],
  170. leaveTypeList: [],
  171. //0-未处理,1-已批准,2-已拒绝
  172. statusList: [
  173. {id: 0, name: "未处理"},
  174. {id: 1, name: "已批准"},
  175. {id: 2, name: "已拒绝"}
  176. ],
  177. treeData: [],
  178. props: {
  179. // 配置项(必选)
  180. value: "id",
  181. label: "name",
  182. children: "children"
  183. },
  184. tableHeight: 400
  185. }
  186. },
  187. created() {
  188. var formData = new FormData();
  189. formData.append("catalogName", "请假类型");
  190. dataDictionaryApi.findByCatalogName(formData).then((response)=>{
  191. var jsonData = response.data;
  192. this.leaveTypeList = jsonData.data;
  193. });
  194. this.loadTree();
  195. this.changePage(1);
  196. setTimeout(()=>{
  197. this.tableHeight = pageUtil.autoAdjustHeight(this.$refs.formTable.$el);
  198. },1000);
  199. },
  200. methods: {
  201. handleReset(name) {
  202. this.$refs[name].resetFields();
  203. },
  204. showStatusName(status) {
  205. var list = this.statusList.filter(item=>item.id == status);
  206. if(list.length>0){
  207. return list[0].name;
  208. }
  209. else{
  210. return "";
  211. }
  212. },
  213. loadTree() {
  214. companyInfoApi.list().then(resp => {
  215. var jsonData = resp.data;
  216. if (jsonData.result) {
  217. this.treeData = jsonData.data;
  218. } else {
  219. this.$message.error(jsonData.message + "");
  220. }
  221. });
  222. },
  223. changePage(pageIndex,exportFlag) {
  224. var self = this;
  225. self.loading = true;
  226. self.pageIndex = pageIndex;
  227. var formData = new FormData();
  228. formData.append("pageIndex", self.pageIndex);
  229. if(self.queryModel.classId!=null){
  230. formData.append("classId", self.queryModel.classId);
  231. }
  232. if(self.queryModel.leaveType!=null){
  233. formData.append("leaveType", self.queryModel.leaveType);
  234. }
  235. if(self.queryModel.status!=null){
  236. formData.append("status", self.queryModel.status);
  237. }
  238. if(self.queryModel.requestTimeRange[0] != null){
  239. formData.append("requestStartTime", self.queryModel.requestTimeRange[0]);
  240. }
  241. if(self.queryModel.requestTimeRange[1] != null){
  242. formData.append("requestEndTime", self.queryModel.requestTimeRange[1]);
  243. }
  244. if(self.queryModel.auditTimeRange[0] != null){
  245. formData.append("auditStartTime", self.queryModel.auditTimeRange[0]);
  246. }
  247. if(self.queryModel.auditTimeRange[1] != null){
  248. formData.append("auditEndTime", self.queryModel.auditTimeRange[1]);
  249. }
  250. if(exportFlag!=null){
  251. formData.append("exportFlag", exportFlag);
  252. formData.append("pageSize", 10000);
  253. }
  254. else{
  255. formData.append("pageSize", self.pageSize);
  256. }
  257. requestForLeaveApi
  258. .pageList(formData)
  259. .then(function(response) {
  260. self.loading = false;
  261. var jsonData = response.data;
  262. if(jsonData.result) {
  263. if(exportFlag){
  264. if(document.location.href.startsWith("https://")){
  265. jsonData.data = jsonData.data.replace("http://","https://");
  266. }
  267. //导出
  268. self.$message({
  269. showClose: true,
  270. type: "success",
  271. message: `报表已生成,<a href="${jsonData.data}">请点击链接下载</a>`,
  272. dangerouslyUseHTMLString: true,
  273. duration: 30000
  274. });
  275. }
  276. else{
  277. //分页查看
  278. var page = jsonData.data;
  279. self.tableData = page.data;
  280. self.totalPages = page.totalPages;
  281. self.totalElements = page.recordsTotal;
  282. }
  283. }
  284. else{
  285. self.$message.warning(jsonData.message);
  286. }
  287. })
  288. .catch(error => {
  289. self.loading = false;
  290. });
  291. },
  292. pageSizeChange(pageSize) {
  293. this.pageSize = pageSize;
  294. this.changePage(1);
  295. },
  296. exportXls() {
  297. this.changePage(1,true);
  298. }
  299. },
  300. components: {
  301. "el-select-tree": SelectTree
  302. }
  303. }
  304. </script>
  305. <style lang="scss" scoped>
  306. .el-breadcrumb {
  307. margin: 10px;
  308. line-height: 20px;
  309. }
  310. .el-divider {
  311. margin: 5px 0;
  312. }
  313. .demo-form-inline {
  314. margin-left: 10px;
  315. text-align: left;
  316. }
  317. .button-group {
  318. padding-left: 10px;
  319. padding-right: 20px;
  320. display: flex;
  321. box-sizing:border-box;
  322. flex-direction: row;
  323. justify-content: space-between;
  324. width:100%;
  325. .title{
  326. font-size:16px;
  327. font-weight: bold;
  328. }
  329. }
  330. </style>