Bladeren bron

钉钉demo

sangwenwei 5 maanden geleden
bovenliggende
commit
2fbc6ed7a3
4 gewijzigde bestanden met toevoegingen van 327 en 26 verwijderingen
  1. 17 0
      src/api/test/dd/dd.js
  2. 247 0
      src/views/dd/AttendanceListDia.vue
  3. 19 18
      src/views/dd/PunchCardListDia.vue
  4. 44 8
      src/views/dd/UserList.vue

+ 17 - 0
src/api/test/dd/dd.js

@@ -64,4 +64,21 @@ export default {
 			params: params,
 		});
 	},
+
+	//获取假期列表
+	getattcolumns(params) {
+		return request({
+			url: prefix + "/test/attendance/getattcolumns",
+			method: "get",
+			params: params,
+		});
+	},
+	//获取用户假期详情
+	getleavetimebynames(params) {
+		return request({
+			url: prefix + "/test/attendance/getleavetimebynames",
+			method: "get",
+			params: params,
+		});
+	},
 };

+ 247 - 0
src/views/dd/AttendanceListDia.vue

@@ -0,0 +1,247 @@
+<template>
+  <v-dialog
+    :title="title"
+    :close-on-click-modal="false"
+	width="1300px"
+    v-model="visible">
+	  <el-form  :inline="true" class="query-form m-b-10"  v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter="refreshList()" @submit.prevent>
+		  <!-- 搜索框-->
+		  <el-form-item label="工作时间" prop="meetingDates">
+			  <el-date-picker
+				  style="width:50%;"
+				  v-model="searchForm.workDates"
+				  type="datetimerange"
+				  value-format="YYYY-MM-DD HH:mm:ss"
+				  placeholder="请选择日期"
+				  @change="handleDateChange"
+			  />
+		  </el-form-item>
+		  <el-form-item>
+			  <el-button type="primary" @click="refreshList()"  icon="search">查询</el-button>
+			  <el-button type="default" @click="resetSearch()"  icon="refresh-right">重置</el-button>
+		  </el-form-item>
+	  </el-form>
+	  <el-table :data="gridData" @cell-click="handleCellClick" height="500px" :show-summary="true"
+				:summary-method="summaryMethod">
+		  <el-table-column
+			  width = "130px"
+			  v-for="(column, index) in columns"
+			  :key="index"
+			  :label="column.name"
+			  :prop="column.id"
+
+		  ></el-table-column>
+	  </el-table>
+
+    <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="close()" icon="circle-close">关闭</el-button>
+        </span>
+    </template>
+  </v-dialog>
+	<PunchCardListDia ref="punchCardListDia"></PunchCardListDia>
+</template>
+
+<script>
+	import ddService from "@/api/test/dd/dd.js"
+	import PunchCardListDia from "./PunchCardListDia";
+  export default {
+    data () {
+      return {
+      	userId:"",
+      	userName:"",
+      	userTitle:"",
+        title: '',
+        method: '',
+        visible: false,
+        loading: false,
+	    gridData:[],
+	    searchVisible: true,
+	    searchForm:{
+			workDates:[]
+	    },
+		  columns: [],
+	  }
+    },
+    components: {
+		PunchCardListDia
+    },
+    created () {
+    },
+    methods: {
+      init (id,name,title) {
+		  this.title = name+'的考勤列表'
+		  this.visible = true
+		  this.userId = id
+		  this.userName = name
+		  this.userTitle = title
+        this.loading = false
+        this.$nextTick(() => {
+			this.loading = true
+			ddService.getattcolumns().then((data) => {
+				console.log('data',data.result)
+				this.columns = data.result.columns.slice(0, 18);
+				let leaveTypes = this.columns
+					.map(item => item.id)   // 提取 columns 中每个 item 的 name 属性
+					.join(',');
+				this.columns.unshift({ id: '1', name: '日期' });
+				this.columns = this.columns.map(item => {
+					if (item.name.includes('时长')) {
+						item.name = item.name + '(分钟)';
+					} else if (item.name.includes('次数')) {
+						item.name = item.name + '(次)';
+					} else if (item.name.includes('天数')) {
+						item.name = item.name + '(天)';
+					}
+					return item;
+				});
+
+
+				let params = {
+					userId:id,
+					leaveTypes:leaveTypes,
+					dateFrom:"",
+					dateTo:""
+				}
+				ddService.getleavetimebynames(params).then((da) =>{
+					console.log('da',da)
+					const numColumns = da.result.columnVals.length;
+					const numRows = da.result.columnVals[0].columnVals.length;
+
+					// 假设每一行的数据来自于 columnVals 中的多个列
+					// 遍历每一列的值
+					for (let rowIndex = 0; rowIndex < numRows; rowIndex++) {
+						let obj = {};  // 每一行的数据对象
+						// 假设第一列是日期,获取日期字段
+						let dateValue = da.result.columnVals[0].columnVals[rowIndex]?.date || '';  // 获取日期值
+						let dateOnly = dateValue.split(' ')[0];  // 按空格分割,获取日期部分
+						obj[this.columns[0].id] = dateOnly; // 将日期添加到对象中,作为每一行的第一列
+						// 遍历当前行的列数据,并填充到 obj 中
+						for (let colIndex = 0; colIndex < numColumns; colIndex++) {
+							// 获取每列的数据
+							let columnData = da.result.columnVals[colIndex].columnVals[rowIndex];
+
+							// 提取 value 字段
+							let columnValue = columnData?.value || '';  // 使用可选链,确保字段存在
+							// 将当前列的数据填充到 obj 中,列名来自 this.columns
+							obj[this.columns[colIndex+1].id] = columnValue; // 使用 this.columns 中的 id 作为 key
+						}
+						// 将当前行的 obj 数据加入 gridData
+						this.gridData.push(obj);
+					}
+				})
+
+				this.loading = false
+			})
+        })
+      },
+		refreshList(){
+			this.loading = true
+
+			ddService.getattcolumns().then((data) => {
+				console.log('data',data.result)
+				this.columns = data.result.columns.slice(0, 18);
+				let leaveTypes = this.columns
+					.map(item => item.id)   // 提取 columns 中每个 item 的 name 属性
+					.join(',');
+				this.columns.unshift({ id: '1', name: '日期' });
+				this.columns = this.columns.map(item => {
+					if (item.name.includes('时长')) {
+						item.name = item.name + '(分钟)';
+					} else if (item.name.includes('次数')) {
+						item.name = item.name + '(次)';
+					} else if (item.name.includes('天数')) {
+						item.name = item.name + '(天)';
+					}
+					return item;
+				});
+				let params = {
+					userId:this.userId,
+					leaveTypes:leaveTypes,
+					dateFrom:this.searchForm.workDates[0],
+					dateTo:this.searchForm.workDates[1]
+				}
+				ddService.getleavetimebynames(params).then((da) =>{
+					console.log('da',da)
+					const numColumns = da.result.columnVals.length;
+					const numRows = da.result.columnVals[0].columnVals.length;
+					this.gridData = []
+					// 假设每一行的数据来自于 columnVals 中的多个列
+					// 遍历每一列的值
+					for (let rowIndex = 0; rowIndex < numRows; rowIndex++) {
+						let obj = {};  // 每一行的数据对象
+						// 假设第一列是日期,获取日期字段
+						let dateValue = da.result.columnVals[0].columnVals[rowIndex]?.date || '';  // 获取日期值
+						let dateOnly = dateValue.split(' ')[0];  // 按空格分割,获取日期部分
+						obj[this.columns[0].id] = dateOnly; // 将日期添加到对象中,作为每一行的第一列
+						// 遍历当前行的列数据,并填充到 obj 中
+						for (let colIndex = 0; colIndex < numColumns; colIndex++) {
+							// 获取每列的数据
+							let columnData = da.result.columnVals[colIndex].columnVals[rowIndex];
+
+							// 提取 value 字段
+							let columnValue = columnData?.value || '';  // 使用可选链,确保字段存在
+							// 将当前列的数据填充到 obj 中,列名来自 this.columns
+							obj[this.columns[colIndex+1].id] = columnValue; // 使用 this.columns 中的 id 作为 key
+						}
+						// 将当前行的 obj 数据加入 gridData
+						this.gridData.push(obj);
+					}
+				})
+
+				this.loading = false
+			})
+		},
+		resetSearch () {
+			this.$refs.searchForm.resetFields()
+			this.searchForm.workDates = [] // 重置时清空供应商筛选
+			this.refreshList()
+		},
+		close(){
+			this.visible = false
+			this.searchForm.workDates = []
+		},
+		handleCellClick(row, column, cell, event) {
+			console.log('column',column)
+			console.log('this.columns[0]', row[this.columns[0].id])
+			let workDate = this.moment(row[this.columns[0].id]).format('YYYY-MM-DD HH:mm:ss');
+			// 判断是否是第一列
+			this.$refs.punchCardListDia.init(this.userId, this.userName, this.userTitle,workDate)
+
+			// if (column.property === this.columns[0].id) {
+			// 	console.log('点击了第一列:', row);
+			// }
+		},
+		summaryMethod({ columns, data }) {
+			const sums = [];
+			columns.forEach((column, index) => {
+				if (index === 0) {
+					sums[index] = '汇总';  // 第一列可以是文字或“Total”
+				} else {
+					// 对数字列进行求和
+					const values = data.map(item => Number(item[column.property]));
+					sums[index] = values.reduce((prev, curr) => prev + curr, 0);
+				}
+			});
+			return sums;
+		},
+		handleDateChange(val) {
+			if (val && val[0] && val[1]) {
+				const startDate = new Date(val[0]);
+				const endDate = new Date(val[1]);
+				const diffDays = (endDate - startDate) / (1000 * 3600 * 24); // 计算日期差距
+
+				if (diffDays > 31) {
+					this.$message.warning('选择的时间范围不能超过31天');
+					// 限制选中的日期范围为31天内
+					const newEndDate = new Date(startDate);
+					newEndDate.setDate(startDate.getDate() + 31);
+					this.searchForm.workDates = [startDate, newEndDate];
+				}
+			}
+		},
+    }
+  }
+</script>
+
+

+ 19 - 18
src/views/dd/PunchCardListDia.vue

@@ -4,22 +4,22 @@
     :close-on-click-modal="false"
 	width="1300px"
     v-model="visible">
-	  <el-form  :inline="true" class="query-form m-b-10"  v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter="refreshList()" @submit.prevent>
-		  <!-- 搜索框-->
-		  <el-form-item label="会议开始时间" prop="meetingDates">
-			  <el-date-picker
-				  style="width:50%;"
-				  v-model="searchForm.workDates"
-				  type="datetimerange"
-				  value-format="YYYY-MM-DD HH:mm:ss"
-				  placeholder="请选择日期"
-			  />
-		  </el-form-item>
-		  <el-form-item>
-			  <el-button type="primary" @click="refreshList()"  icon="search">查询</el-button>
-			  <el-button type="default" @click="resetSearch()"  icon="refresh-right">重置</el-button>
-		  </el-form-item>
-	  </el-form>
+<!--	  <el-form  :inline="true" class="query-form m-b-10"  v-if="searchVisible" ref="searchForm" :model="searchForm" @keyup.enter="refreshList()" @submit.prevent>-->
+<!--		  &lt;!&ndash; 搜索框&ndash;&gt;-->
+<!--		  <el-form-item label="工作时间" prop="workDates">-->
+<!--			  <el-date-picker-->
+<!--				  style="width:50%;"-->
+<!--				  v-model="searchForm.workDates"-->
+<!--				  type="datetimerange"-->
+<!--				  value-format="YYYY-MM-DD HH:mm:ss"-->
+<!--				  placeholder="请选择日期"-->
+<!--			  />-->
+<!--		  </el-form-item>-->
+<!--		  <el-form-item>-->
+<!--			  <el-button type="primary" @click="refreshList()"  icon="search">查询</el-button>-->
+<!--			  <el-button type="default" @click="resetSearch()"  icon="refresh-right">重置</el-button>-->
+<!--		  </el-form-item>-->
+<!--	  </el-form>-->
 	  <el-table :data="gridData">
 		  <el-table-column property="name" label="姓名" width="150"/>
 		  <el-table-column property="title" label="职位" width="150"/>
@@ -82,7 +82,7 @@
     created () {
     },
     methods: {
-      init (id,name,title) {
+      init (id,name,title,workDate) {
 		  this.title = '考勤列表'
 		  this.visible = true
 		  this.userId = id
@@ -91,7 +91,8 @@
         this.loading = false
         this.$nextTick(() => {
 			this.loading = true
-			ddService.getWorkListCord({userId:id,workDateForm:"",workDateTo:""}).then((data) => {
+			console.log('workDate',workDate)
+			ddService.getWorkListCord({userId:id,workDateFrom:workDate,workDateTo:workDate}).then((data) => {
 				console.log('data',data)
 				this.gridData = data.recordresult
 				this.gridData.forEach((item)=>{

+ 44 - 8
src/views/dd/UserList.vue

@@ -8,6 +8,16 @@
                     :props="props" :data="deptList" check-strictly :render-after-expand="false" check-on-click-node
                     style="width: 240px" />
             </el-form-item>
+			<el-form-item label="工作时间" prop="workDates">
+				<el-date-picker
+					style="width:50%;"
+					v-model="searchForm.workDates"
+					type="datetimerange"
+					value-format="YYYY-MM-DD HH:mm:ss"
+					placeholder="请选择日期"
+					@change="handleDateChange"
+				/>
+			</el-form-item>
             <el-form-item>
                 <el-button type="primary" @click="refreshList()" icon="search">查询</el-button>
                 <el-button type="default" @click="resetSearch()" icon="refresh-right">重置</el-button>
@@ -35,11 +45,15 @@
                     </vxe-column>
                     <vxe-column field="mobile" title="手机号">
                     </vxe-column>
-                    <vxe-column field="admin" title="是否管理员">
+                    <vxe-column field="requiredAttDays" title="应出勤天数(天)">
                     </vxe-column>
+					<vxe-column field="attDays" title="出勤天数(天)">
+					</vxe-column>
+					<vxe-column field="restDays" title="休息天数(天)">
+					</vxe-column>
                     <vxe-column fixed="right" align="center" width="320" title="操作">
                         <template #default="scope">
-                            <el-button type="success" text @click="handleAdd(scope.row)">打卡</el-button>
+<!--                            <el-button type="success" text @click="handleAdd(scope.row)">打卡</el-button>-->
                             <el-button type="success" text @click="attendance(scope.row)">考勤统计</el-button>
                         </template>
                     </vxe-column>
@@ -63,16 +77,18 @@
             </div>
         </div>
         <PunchCardListDia ref="punchCardListDia"></PunchCardListDia>
+        <AttendanceListDia ref="attendanceListDia"></AttendanceListDia>
     </div>
 </template>
 
 <script>
 import ddService from "@/api/test/dd/dd.js"
 import PunchCardListDia from "./PunchCardListDia";
-
+import AttendanceListDia from "./AttendanceListDia";
 export default {
     components: {
-        PunchCardListDia
+        PunchCardListDia,
+		AttendanceListDia
     },
     data() {
         return {
@@ -84,7 +100,8 @@ export default {
             showViewer: false,
             searchVisible: true,
             searchForm: {
-                deptId: null
+                deptId: null,
+				workDates:[]
             },
             dataList: [],
             deptList: [],
@@ -146,7 +163,7 @@ export default {
         },
 		//考勤统计
 		attendance(row){
-
+			this.$refs.attendanceListDia.init(row.userid, row.name, row.title);
 		},
         handleClick(tab, event) {
             console.log(tab.props.name);
@@ -166,10 +183,13 @@ export default {
             this.loading = true;
             ddService
                 .list({
-                    deptId: this.searchForm.deptId
+                    deptId: this.searchForm.deptId,
+					dateFrom:this.searchForm.workDates[0],
+					dateTo:this.searchForm.workDates[1]
                 })
                 .then((data) => {
-                    this.userDataList = data.result.list;
+					console.log('data',data)
+                    this.userDataList = data;
                     // this.tablePage.total = data.total;
                     this.loading = false;
                     // 获取分类去重的数据
@@ -237,8 +257,24 @@ export default {
         resetSearch() {
             this.$refs.searchForm.resetFields();
             this.searchForm.deptId = 1
+            this.searchForm.workDates = []
             this.refreshList();
         },
+		handleDateChange(val) {
+			if (val && val[0] && val[1]) {
+				const startDate = new Date(val[0]);
+				const endDate = new Date(val[1]);
+				const diffDays = (endDate - startDate) / (1000 * 3600 * 24); // 计算日期差距
+
+				if (diffDays > 31) {
+					this.$message.warning('选择的时间范围不能超过31天');
+					// 限制选中的日期范围为31天内
+					const newEndDate = new Date(startDate);
+					newEndDate.setDate(startDate.getDate() + 31);
+					this.searchForm.workDates = [startDate, newEndDate];
+				}
+			}
+		},
     },
 };
 </script>