workAttendance-list.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <template>
  2. <div v-loading="downloadLoading"
  3. element-loading-text="加载中"
  4. element-loading-spinner="el-icon-loading">
  5. <el-breadcrumb separator=">">
  6. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  7. <el-breadcrumb-item>
  8. <a href="#">系统管理</a>
  9. </el-breadcrumb-item>
  10. <el-breadcrumb-item>
  11. <a href="/workAttendance">考勤统计</a>
  12. </el-breadcrumb-item>
  13. </el-breadcrumb>
  14. <el-divider></el-divider>
  15. <!--
  16. 要resetFields起作用,必须配置:model和prop
  17. -->
  18. <el-form
  19. ref="queryForm"
  20. :model="queryModel"
  21. :rules="ruleValidate"
  22. inline
  23. class="demo-form-inline"
  24. >
  25. <div>
  26. <el-row>
  27. <el-form-item label="单位" prop="companyId">
  28. <el-select
  29. v-model="queryModel.companyId"
  30. size="mini"
  31. filterable
  32. placeholder="请选择"
  33. style="width:220px"
  34. >
  35. <el-option
  36. v-for="company in companyResult"
  37. :key="company.id"
  38. :label="company.name"
  39. :value="company.id"
  40. ></el-option>
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item label="统计区间" prop="timeRanges">
  44. <el-date-picker
  45. v-model="queryModel.timeRanges"
  46. type="daterange"
  47. range-separator="至"
  48. start-placeholder="开始日期"
  49. end-placeholder="结束日期"
  50. value-format="yyyy-MM-dd"
  51. :default-time="timeRangesDefaultTime"
  52. size="mini"
  53. ></el-date-picker>
  54. </el-form-item>
  55. </el-row>
  56. <el-row>
  57. <el-form-item label="姓名" prop="name">
  58. <el-input type="text" size="mini" v-model="queryModel.name"></el-input>
  59. </el-form-item>
  60. <el-form-item label="工号" prop="jobNumber">
  61. <el-input type="text" size="mini" v-model="queryModel.jobNumber"></el-input>
  62. </el-form-item>
  63. <el-form-item>
  64. <el-button
  65. type="primary"
  66. size="mini"
  67. style="margin-left: 8px"
  68. @click="handleQuery('queryForm')"
  69. >查询</el-button>&nbsp;
  70. <el-button
  71. type="info"
  72. size="mini"
  73. style="margin-left: 8px"
  74. @click="handleReset('queryForm')"
  75. >重置</el-button>
  76. </el-form-item>
  77. </el-row>
  78. </div>
  79. </el-form>
  80. <el-divider></el-divider>
  81. <el-row class="button-group">
  82. <el-button
  83. type="primary"
  84. size="small"
  85. plain
  86. icon="el-icon-download"
  87. :loading="downloadLoading"
  88. @click="exportXls"
  89. >导出数据</el-button>
  90. </el-row>
  91. <el-table
  92. ref="table"
  93. stripe
  94. :data="tableData"
  95. :height="tableHeight"
  96. style="width: 100%">
  97. <el-table-column label="序号" fixed="left" type="index" :index="indexMethod"></el-table-column>
  98. <el-table-column label="姓名" fixed="left" prop="name"></el-table-column>
  99. <el-table-column label="单位" prop="company"></el-table-column>
  100. <el-table-column label="部门" prop="department"></el-table-column>
  101. <el-table-column label="工号" prop="jobNumber"></el-table-column>
  102. <el-table-column label="出勤天数" prop="workDays"></el-table-column>
  103. <el-table-column label="休息天数" prop="restDays"></el-table-column>
  104. <el-table-column label="迟到次数" prop="lateNum"></el-table-column>
  105. <el-table-column label="早退次数" prop="leaveNum"></el-table-column>
  106. <el-table-column label="上班缺卡次数" prop="missCardOnWorkCount"></el-table-column>
  107. <el-table-column label="下班缺卡次数" prop="missCardOffWorkCount"></el-table-column>
  108. <el-table-column label="旷工天数" prop="missCardAllDayCount"></el-table-column>
  109. <template v-for="col in dayColumns">
  110. <el-table-column :label="col.label" :prop="col.name" :key="col.name" width="200px">
  111. <template slot-scope="{row}">
  112. <div style="display:flex;flex-direction:column;">
  113. <template v-for="(item,index) in row.workAttendanceMap[col.name]">
  114. <div v-html="showItem(item)" :key="index"></div>
  115. </template>
  116. </div>
  117. </template>
  118. </el-table-column>
  119. </template>
  120. </el-table>
  121. <el-pagination
  122. :current-page.sync="pageIndex"
  123. :total="totalElements"
  124. :page-sizes="pageSizeList"
  125. @current-change="changePage"
  126. @size-change="pageSizeChange"
  127. layout="total, sizes, prev, pager, next, jumper"
  128. ></el-pagination>
  129. </div>
  130. </template>
  131. <script>
  132. import Constant from "@/constant";
  133. import workAttendanceApi from "@/api/business/workAttendance";
  134. import companyInfoApi from "@/api/base/companyInfo";
  135. import NProgress from "nprogress"; // progress bar
  136. import "nprogress/nprogress.css"; // progress bar style
  137. export default {
  138. data() {
  139. var self = this;
  140. return {
  141. ruleValidate: {
  142. companyId: [{ required: true, message: "不能为空", trigger: "blur" }],
  143. timeRanges: [
  144. { required: true, message: "请选择事件范围", trigger: "blur" }
  145. ]
  146. },
  147. queryModel: {
  148. companyId: "",
  149. timeRanges: "",
  150. name:"",
  151. jobNumber:""
  152. },
  153. loading: false,
  154. tableData: [],
  155. pageIndex: 1,
  156. pageSize: 20,
  157. totalPages: 0,
  158. totalElements: 0,
  159. field: "",
  160. direction: "",
  161. pageSizeList: [20, 30, 50],
  162. multipleSelection: [],
  163. showModal: false,
  164. modalTitle: "",
  165. businessKey: "",
  166. downloadLoading: false,
  167. tableHeight: "",
  168. timeRangesDefaultTime: [],
  169. companyResult: "",
  170. editorOption: {
  171. modules: {
  172. toolbar: "title" // 设置文本编辑器的头部是否展示
  173. },
  174. placeholder: "", // 文本框为空时 , 占位文本
  175. theme: "snow" // 或者为 `bubble`
  176. },
  177. downloadUrl: "",
  178. dayColumns: [],
  179. tmplKey: ""
  180. };
  181. },
  182. created() {
  183. var self = this;
  184. companyInfoApi.list().then(function(response) {
  185. var jsonData = response.data;
  186. if (jsonData.result) {
  187. if (jsonData.data != null && jsonData.data != "") {
  188. self.companyResult = jsonData.data;
  189. }
  190. }
  191. });
  192. this.getCurrentMonthFirst();
  193. },
  194. methods: {
  195. indexMethod(index){
  196. return (this.pageIndex-1)*this.pageSize + (index+1);
  197. },
  198. changePage(pageIndex) {
  199. var self = this;
  200. self.pageIndex = pageIndex;
  201. var formData = new FormData();
  202. formData.append("pageIndex", self.pageIndex);
  203. formData.append("pageSize", self.pageSize);
  204. formData.append("companyId", self.queryModel.companyId);
  205. formData.append("name", self.queryModel.name);
  206. formData.append("jobNumber", self.queryModel.jobNumber);
  207. var startDate = "";
  208. var endDate = "";
  209. var timeRanges = self.queryModel.timeRanges + "";
  210. if (timeRanges != "" && timeRanges != null) {
  211. timeRanges = timeRanges.split(",");
  212. startDate = timeRanges[0];
  213. endDate = timeRanges[1];
  214. }
  215. formData.append("startDate", startDate);
  216. formData.append("endDate", endDate);
  217. self.downloadLoading = true;
  218. workAttendanceApi.statList(formData).then(function(response) {
  219. var jsonData = response.data;
  220. self.downloadLoading = false;
  221. if (jsonData.result) {
  222. self.tableData = jsonData.data.data;
  223. self.totalPages = jsonData.data.totalPage;
  224. self.totalElements = jsonData.data.totalElements;
  225. self.tableHeight = window.innerHeight - 280;
  226. self.dayColumns = jsonData.data.dayColumns;
  227. self.tmplKey = jsonData.data.tmplKey;
  228. } else {
  229. self.$message({
  230. type: "warning",
  231. message: jsonData.message
  232. });
  233. }
  234. });
  235. },
  236. pageSizeChange(pageSize) {
  237. this.pageSize = pageSize;
  238. this.changePage(1);
  239. },
  240. showItem(item){
  241. var content = [];
  242. var arr = item.recordTime.split(' ');
  243. if(arr.length>1){
  244. content.push(arr[1]);
  245. }
  246. else{
  247. content.push(arr[0]);
  248. }
  249. content.push(" ");
  250. if(item.classifier==1){
  251. content.push("上班");
  252. }
  253. else{
  254. content.push("下班");
  255. }
  256. var fontColor = "";
  257. if(item.result=="0"){
  258. content.push("缺卡");
  259. fontColor = "red";
  260. }
  261. else if(item.result=="1"){
  262. content.push("打卡");
  263. fontColor = "green";
  264. }
  265. else if(item.result=="2"){
  266. content.push("迟到");
  267. }
  268. else if(item.result=="3"){
  269. content.push("早退");
  270. }
  271. return `<font color='${fontColor}'>` + content.join("") + '</font>';
  272. },
  273. handleQuery(){
  274. var self = this;
  275. this.$refs["queryForm"].validate(valid => {
  276. if (valid) {
  277. self.changePage(1);
  278. }
  279. });
  280. },
  281. handleReset(name) {
  282. this.$refs[name].resetFields();
  283. },
  284. exportXls() {
  285. var self = this;
  286. //导出
  287. this.$refs["queryForm"].validate(valid => {
  288. if (valid) {
  289. self.downloadLoading = true;
  290. var formData = new FormData();
  291. formData.append("companyId", self.queryModel.companyId);
  292. formData.append("name", self.queryModel.name);
  293. formData.append("jobNumber", self.queryModel.jobNumber);
  294. var startDate = "";
  295. var endDate = "";
  296. var timeRanges = self.queryModel.timeRanges + "";
  297. if (timeRanges != "" && timeRanges != null) {
  298. timeRanges = timeRanges.split(",");
  299. startDate = timeRanges[0];
  300. endDate = timeRanges[1];
  301. }
  302. formData.append("startDate", startDate);
  303. formData.append("endDate", endDate);
  304. workAttendanceApi.exportXls(formData).then(function(response) {
  305. var jsonData = response.data;
  306. self.downloadLoading = false;
  307. if (jsonData.result) {
  308. self.$message({
  309. type: "success",
  310. message: `报表已生成,<a href="${jsonData.data}">请点击链接下载</a>`,
  311. dangerouslyUseHTMLString: true,
  312. duration: 30000
  313. });
  314. } else {
  315. self.$message({
  316. type: "warning",
  317. message: jsonData.message
  318. });
  319. }
  320. });
  321. }
  322. });
  323. },
  324. //初始化日期
  325. getCurrentMonthFirst() {
  326. var self = this;
  327. var date = new Date();
  328. date.setDate(1);
  329. var month = parseInt(date.getMonth() + 1)
  330. var startTime =
  331. date.getFullYear() + "-" + month + "-" + date.getDate();
  332. var lastDate = new Date();
  333. //设置为第一天
  334. lastDate.setDate(1);
  335. var lastMonth = parseInt(lastDate.getMonth() + 2)
  336. var endTime =
  337. lastDate.getFullYear() +
  338. "-" +
  339. lastMonth +
  340. "-" +
  341. lastDate.getDate();
  342. self.queryModel.timeRanges = [startTime, endTime];
  343. }
  344. },
  345. mounted: function() {}
  346. };
  347. </script>
  348. <style lang="scss" scoped>
  349. .el-breadcrumb {
  350. margin: 10px;
  351. line-height: 20px;
  352. }
  353. .el-divider {
  354. margin: 5px 0;
  355. }
  356. .demo-form-inline {
  357. margin-left: 10px;
  358. text-align: left;
  359. }
  360. .button-group {
  361. margin-left: 10px;
  362. text-align: left;
  363. }
  364. </style>