Browse Source

考勤同步

ouyj 3 weeks ago
parent
commit
e50922ddc8

+ 37 - 0
src/main/hr/com/yw/hr/attendance/action/AttendanceRecordAction.java

@@ -133,6 +133,9 @@ public class AttendanceRecordAction extends BaseAction {
 		}else if ("queryRecordOutList".equals(task)) { // 获取公出列表数据
 		}else if ("queryRecordOutList".equals(task)) { // 获取公出列表数据
 			getRecordOutList(response, request);
 			getRecordOutList(response, request);
 			return;
 			return;
+		}else if ("syncHikVisionAttendance".equals(task)) { // 同步海康考勤数据
+			syncHikVisionAttendance(response, request);
+			return;
 		}
 		}
 	}
 	}
 
 
@@ -167,6 +170,40 @@ public class AttendanceRecordAction extends BaseAction {
 		this.path = this.PATH_AJAX;
 		this.path = this.PATH_AJAX;
 		
 		
 	}
 	}
+	
+	/**
+	 * 
+	 * @Description:  同步海康考勤数据
+	 * @param response
+	 * @param request
+	 * @author AI Assistant
+	 * @date 2026年5月18日
+	 */
+	private void syncHikVisionAttendance(HttpServletResponse response, HttpServletRequest request) throws Exception {
+		attendanceRecordService = this.getBean(AttendanceRecordService.class, "attendanceRecordService");
+		String att_date_start = request.getParameter("att_date_start");
+		String att_date_end = request.getParameter("att_date_end");
+		
+		try {
+			if (att_date_start == null || att_date_end == null || att_date_start.isEmpty() || att_date_end.isEmpty()) {
+				response.getWriter().write("{'success':false,'message':'日期范围不能为空'}");
+				return;
+			}
+			
+			// 转换为LocalDate
+			java.time.LocalDate startDate = java.time.LocalDate.parse(att_date_start);
+			java.time.LocalDate endDate = java.time.LocalDate.parse(att_date_end);
+			
+			// 调用同步方法
+			int syncCount = attendanceRecordService.syncHikVisionAttendanceData(startDate, endDate);
+			
+			response.getWriter().write("{'success':true,'count':" + syncCount + "}");
+		} catch (Exception e) {
+			e.printStackTrace();
+			response.getWriter().write("{'success':false,'message':'" + e.getMessage() + "'}");
+		}
+		this.path = this.PATH_AJAX;
+	}
 
 
 	public String delrecord(HttpServletRequest request, HttpServletResponse response) throws Exception {
 	public String delrecord(HttpServletRequest request, HttpServletResponse response) throws Exception {
 		attendanceRecordService = this.getBean(AttendanceRecordService.class, "attendanceRecordService");
 		attendanceRecordService = this.getBean(AttendanceRecordService.class, "attendanceRecordService");

+ 1 - 1
src/main/hr/com/yw/hr/attendance/dao/AttendanceRecordDaoImpl.java

@@ -540,7 +540,7 @@ public class AttendanceRecordDaoImpl extends BaseDao implements AttendanceRecord
 		//List<Map<String, Object>> listmap;
 		//List<Map<String, Object>> listmap;
 		//listmap = ps.queryForList(p, pSize, sqlBuffer.toString(), params);
 		//listmap = ps.queryForList(p, pSize, sqlBuffer.toString(), params);
 		//return listmap;
 		//return listmap;
-		System.out.println(sqlBuffer.toString());
+		//System.out.println(sqlBuffer.toString());
 		return jdbcTemplate.queryForList(sqlBuffer.toString());
 		return jdbcTemplate.queryForList(sqlBuffer.toString());
 	}
 	}
 	
 	

+ 2 - 2
src/main/hr/com/yw/hr/attendance/service/AttendanceRecordServiceImpl.java

@@ -981,7 +981,7 @@ public class AttendanceRecordServiceImpl implements AttendanceRecordService {
 						try {
 						try {
 							// 解密data字段
 							// 解密data字段
 							String decryptedData = HikVisionUtils.decryptByPrivateKey(encryptedData, appSecret);
 							String decryptedData = HikVisionUtils.decryptByPrivateKey(encryptedData, appSecret);
-							LogUtil.info("解密后的数据: " + decryptedData);
+							//LogUtil.info("解密后的数据: " + decryptedData);
 											
 											
 							// 解析解密后的JSON - 直接是数组格式
 							// 解析解密后的JSON - 直接是数组格式
 							records = new JSONArray(decryptedData);
 							records = new JSONArray(decryptedData);
@@ -1072,7 +1072,7 @@ public class AttendanceRecordServiceImpl implements AttendanceRecordService {
 			// 根据person_no_hk查询用户
 			// 根据person_no_hk查询用户
 			User user = userDao.loadByPersonNoHk(personNoHk.trim(), null);
 			User user = userDao.loadByPersonNoHk(personNoHk.trim(), null);
 			if (user == null) {
 			if (user == null) {
-				LogUtil.warn("海康人员编号 " + personNoHk + " 在系统中未找到对应用户(person_no_hk),跳过");
+				//LogUtil.warn("海康人员编号 " + personNoHk + " 在系统中未找到对应用户(person_no_hk),跳过");
 				return false;
 				return false;
 			}
 			}
 			
 			

+ 1 - 1
src/main/hr/com/yw/hr/client/action/HrClientGetMyQDQTAttendanceAction.java

@@ -79,7 +79,7 @@ public class HrClientGetMyQDQTAttendanceAction extends RequestAbs {
 				list = attendanceRecordService.listQDQTbyweek(p, pSize, map);
 				list = attendanceRecordService.listQDQTbyweek(p, pSize, map);
 				String aaaa = DateJson.fromArray(map).toString().trim();
 				String aaaa = DateJson.fromArray(map).toString().trim();
 				String list22 = DateJson.fromArray(list).toString().trim();				
 				String list22 = DateJson.fromArray(list).toString().trim();				
-			    System.out.println(p + " - - " + pSize + " - - " + aaaa + " = " + list22);
+			    //System.out.println(p + " - - " + pSize + " - - " + aaaa + " = " + list22);
 				total = attendanceRecordService.countQDQTbyweek(map);
 				total = attendanceRecordService.countQDQTbyweek(map);
 			} catch (SQLException e) {
 			} catch (SQLException e) {
 				e.printStackTrace();
 				e.printStackTrace();

+ 136 - 0
src/main/webapp/yw/hr/attendance/report/listAttendanceRecord.jsp

@@ -10,6 +10,7 @@
 <script src="${pageContext.request.contextPath }/liger/lib/ligerUI/js/core/base.js" type="text/javascript"></script>
 <script src="${pageContext.request.contextPath }/liger/lib/ligerUI/js/core/base.js" type="text/javascript"></script>
 <script src="${pageContext.request.contextPath }/liger/lib/ligerUI/js/plugins/ligerGrid.js" type="text/javascript"></script>
 <script src="${pageContext.request.contextPath }/liger/lib/ligerUI/js/plugins/ligerGrid.js" type="text/javascript"></script>
 <script src="${pageContext.request.contextPath }/liger/lib/ligerUI/js/plugins/ligerResizable.js" type="text/javascript"></script>
 <script src="${pageContext.request.contextPath }/liger/lib/ligerUI/js/plugins/ligerResizable.js" type="text/javascript"></script>
+<script src="${pageContext.request.contextPath }/liger/lib/ligerUI/js/plugins/ligerDialog.js" type="text/javascript"></script>
 <script type="text/javascript" src="/shares/js/constant.js"></script>
 <script type="text/javascript" src="/shares/js/constant.js"></script>
 <script type="text/javascript" src="/shares/js/common.js"></script>
 <script type="text/javascript" src="/shares/js/common.js"></script>
 <script type="text/javascript" src="/shares/datePicker/WdatePicker.js"></script>
 <script type="text/javascript" src="/shares/datePicker/WdatePicker.js"></script>
@@ -107,6 +108,138 @@
 		$("#task").val("exportExcel");
 		$("#task").val("exportExcel");
 		$("#report").submit();
 		$("#report").submit();
 	}
 	}
+	
+	//同步海康考勤数据
+	function syncHikVisionAttendance() {
+		// 创建弹窗HTML
+		var dialogHtml = '<div style="padding:20px;">' +
+			'<div style="margin-bottom:15px;">' +
+			'<label style="display:inline-block;width:80px;">开始日期:</label>' +
+			'<input type="text" id="syncStartDate" class="Wdate" style="width:150px;" />' +
+			'</div>' +
+			'<div style="margin-bottom:15px;">' +
+			'<label style="display:inline-block;width:80px;">结束日期:</label>' +
+			'<input type="text" id="syncEndDate" class="Wdate" style="width:150px;" />' +
+			'</div>' +
+			'<div style="color:#999;font-size:12px;margin-top:10px;">提示:请选择要同步的日期范围</div>' +
+			'</div>';
+		
+		// 使用ligerDialog创建弹窗
+		if (typeof $.ligerDialog !== 'undefined') {
+			var dialog = $.ligerDialog.open({
+				target: null,
+				title: '同步海康考勤数据',
+				width: 400,
+				height: 220,
+				modal: true,
+				content: dialogHtml,
+				buttons: [
+					{
+						text: '确定同步',
+						onclick: function(item, dialog) {
+							var startDate = $('#syncStartDate').val();
+							var endDate = $('#syncEndDate').val();
+							
+							if (!startDate || !endDate) {
+								$.ligerDialog.warn('请选择开始日期和结束日期!');
+								return;
+							}
+							
+							// 关闭对话框
+							dialog.hide();
+							
+							// 显示加载提示
+							var loadingDialog = $.ligerDialog.waitting('正在同步海康考勤数据,请稍候...');
+							
+							// 执行同步
+							$.ajax({
+								url: 'hrAttendanceRecordAction.do',
+								type: 'POST',
+								data: {
+									task: 'syncHikVisionAttendance',
+									att_date_start: startDate,
+									att_date_end: endDate
+								},
+								success: function(response) {
+									// 关闭加载提示
+									$.ligerDialog.closeWaitting();
+									
+									try {
+										var result = eval('(' + response + ')');
+										if (result.success) {
+											$.ligerDialog.success("同步成功!共同步 " + result.count + " 条记录。", function() {
+												// 刷新表格
+												searchByKword();
+											});
+										} else {
+											$.ligerDialog.error("同步失败:" + result.message);
+										}
+									} catch(e) {
+										$.ligerDialog.error("同步失败:" + response);
+									}
+								},
+								error: function(xhr, status, error) {
+									// 关闭加载提示
+									$.ligerDialog.closeWaitting();
+									$.ligerDialog.error("同步请求失败:" + error);
+								}
+							});
+						}
+					},
+					{
+						text: '取消',
+						onclick: function(item, dialog) {
+							dialog.hide();
+						}
+					}
+				]
+			});
+			
+			// 在弹窗打开后初始化日期选择器
+			setTimeout(function() {
+				$('#syncStartDate').unbind('click').click(function() {
+					WdatePicker({dateFmt:'yyyy-MM-dd', maxDate:'#F{$dp.$D(\'syncEndDate\',{d:0})}'});
+				});
+				$('#syncEndDate').unbind('click').click(function() {
+					WdatePicker({dateFmt:'yyyy-MM-dd', minDate:'#F{$dp.$D(\'syncStartDate\',{d:0})}'});
+				});
+			}, 100);
+		} else {
+			// 如果ligerDialog不可用,使用原生prompt
+			var startDate = prompt('请输入开始日期(格式:yyyy-MM-dd):');
+			if (!startDate) return;
+			var endDate = prompt('请输入结束日期(格式:yyyy-MM-dd):');
+			if (!endDate) return;
+			
+			if (confirm("确定要同步海康考勤数据吗?\n日期范围:" + startDate + " 至 " + endDate)) {
+				$.ajax({
+					url: 'hrAttendanceRecordAction.do',
+					type: 'POST',
+					data: {
+						task: 'syncHikVisionAttendance',
+						att_date_start: startDate,
+						att_date_end: endDate
+					},
+					success: function(response) {
+						try {
+							var result = eval('(' + response + ')');
+							if (result.success) {
+								alert("同步成功!共同步 " + result.count + " 条记录。");
+								searchByKword();
+							} else {
+								alert("同步失败:" + result.message);
+							}
+						} catch(e) {
+							alert("同步失败:" + response);
+						}
+					},
+					error: function(xhr, status, error) {
+						alert("同步请求失败:" + error);
+					}
+				});
+			}
+		}
+	}
 </script>
 </script>
 </head>
 </head>
 <body>
 <body>
@@ -137,6 +270,9 @@
 				<ul>
 				<ul>
 					<li class="search-button"><input type="button" class='l-button' name="search" onclick="exportExcel()" value="导出" /></li>
 					<li class="search-button"><input type="button" class='l-button' name="search" onclick="exportExcel()" value="导出" /></li>
 				</ul>
 				</ul>
+				<ul>
+					<li class="search-button"><input type="button" class='l-button' name="syncHik" onclick="syncHikVisionAttendance()" value="同步海康考勤" style="width:120px;" /></li>
+				</ul>
 			</div>
 			</div>
 			<div style="clear: both;"></div>
 			<div style="clear: both;"></div>
 			<div id="searchbar">
 			<div id="searchbar">