Procházet zdrojové kódy

补卡后插入补卡考勤数据

ouyj před 4 dny
rodič
revize
0aedc42cd1

+ 287 - 0
src/main/hr/com/yw/hr/client/action/HrClientInsertAttendanceAction.java

@@ -0,0 +1,287 @@
+package com.yw.hr.client.action;
+
+import com.yw.bpm.flow.dao.FlowModelDao;
+import com.yw.contract.contract.model.ContractInfo;
+import com.yw.contract.contract.service.ContractEntryService;
+import com.yw.core.clientImpl.model.ResultVo;
+import com.yw.core.clientImpl.service.RequestAbs;
+import com.yw.core.session.AppSession;
+import com.yw.core.session.OASession;
+import com.yw.core.utils.MsgManager;
+import com.yw.core.utils.RegisterCodeImpl;
+import com.yw.core.utils.StringUtil;
+import com.yw.eu.base.message.model.Message;
+import com.yw.eu.base.user.model.Group;
+import com.yw.hr.attendance.model.AttendanceRecord;
+import com.yw.hr.attendance.service.AttendanceRecordService;
+import com.yw.hr.staff.dao.StaffDao;
+import net.sf.json.JSONObject;
+import org.springframework.context.ApplicationContext;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 
+ * @ClassName: HrClientInsertAttendanceAction
+ * @Description: 插入补卡信息
+ *
+ */
+public class HrClientInsertAttendanceAction extends RequestAbs {
+
+	public final String serviceId = "hr_2026V01InsertAttendance";
+	private ApplicationContext cxt = null;
+	// private FlowDao bpmFlowDao;
+	
+	@Override
+	public String getResult() {
+		// 获取请求的参数
+		String param = getParameters();
+		if (null == cxt) {
+			cxt = AppSession.getApplicationContext();
+		}
+		JSONObject json = JSONObject.fromObject(param);
+		String user_id = json.getString("fix_userId");// 请假人id
+		String flowIns_id = json.getString("fix_flowInsId");// 流程实例id
+		String formInsId = json.getString("fix_formInsId");// 表单实例id
+		String formId = json.getString("fix_formId");// 流程表单id
+		Long unitId = json.getLong("unitId");// 公司id
+		String att_type_name = "";
+		String att_time = ""; 
+		String remark = "";
+		if(json.has("att_type_name")) att_type_name = json.getString("att_type_name");// 补卡类型,值为上班、下班
+		if(json.has("att_time")) att_time = json.getString("att_time");// 补卡时间,对应考勤表的打卡时间 
+		if(json.has("remark")) remark = json.getString("remark");// 说明
+			
+		FlowModelDao bpmFlowModelDao = (FlowModelDao) cxt.getBean("bpmFlowModelDao"); 
+		AttendanceRecordService attendanceRecordService = (AttendanceRecordService) cxt.getBean("attendanceRecordService");
+		StaffDao staffDao = (StaffDao) cxt.getBean("StaffDao");
+	
+		ResultVo rv = new ResultVo();
+		try { 
+			if (!StringUtil.isEmpty(formId) && !"0".equals(formId)) {
+				// 验证必填参数
+				if (StringUtil.isEmpty(user_id)) {
+					rv.setReturnCode("0");
+					rv.setReturnMsg("用户ID不能为空");
+					rv.setReturnParams("{}");
+					String returnJson = JSONObject.fromObject(rv, config).toString();
+					return returnJson;
+				}
+					
+				if (StringUtil.isEmpty(att_time)) {
+					rv.setReturnCode("0");
+					rv.setReturnMsg("补卡时间不能为空");
+					rv.setReturnParams("{}");
+					String returnJson = JSONObject.fromObject(rv, config).toString();
+					return returnJson;
+				}
+					
+				// 解析补卡时间
+				SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+				Date attTimeDate;
+				try {
+					attTimeDate = sdf.parse(att_time);
+				} catch (Exception e) {
+					rv.setReturnCode("0");
+					rv.setReturnMsg("补卡时间格式错误,应为:yyyy-MM-dd HH:mm:ss");
+					rv.setReturnParams("{}");
+					String returnJson = JSONObject.fromObject(rv, config).toString();
+					return returnJson;
+				}
+					
+				// 获取用户信息
+				java.util.Map<String, Object> staffMap = staffDao.getSingleStaff(user_id);
+				if (staffMap == null || staffMap.isEmpty()) {
+					rv.setReturnCode("0");
+					rv.setReturnMsg("未找到用户信息,userId: " + user_id);
+					rv.setReturnParams("{}");
+					String returnJson = JSONObject.fromObject(rv, config).toString();
+					return returnJson;
+				}
+					
+				// 创建考勤记录对象
+				AttendanceRecord ar = new AttendanceRecord();
+				ar.setRecord_id(StringUtil.getSeq());
+				//ar.setAtt_user_id(staffMap.get("att_user_id") != null ? staffMap.get("att_user_id").toString() : "");
+				ar.setAtt_user_id(user_id);
+				ar.setAtt_user_name(staffMap.get("staff_name") != null ? staffMap.get("staff_name").toString() : "");
+				ar.setSys_user_id(Long.parseLong(user_id));
+				ar.setAtt_time(attTimeDate);
+					
+				// 提取日期部分
+				SimpleDateFormat dateSdf = new SimpleDateFormat("yyyy-MM-dd");
+				Date attDate = dateSdf.parse(dateSdf.format(attTimeDate));
+				ar.setAtt_date(attDate);
+					
+				// 根据补卡类型和已有记录智能判断考勤类型
+				String attTypeId = determineAttendanceType(attendanceRecordService, ar, att_type_name, attTimeDate);
+				ar.setAtt_type_id(attTypeId);
+					
+				// 设置其他字段
+				ar.setSign_type("2"); // 2:手工补签到
+				ar.setCreate_date(new Date());
+				ar.setCreate_user(Long.parseLong(user_id));
+				ar.setUnit_id(unitId != null ? unitId : Long.parseLong(staffMap.get("unit_id").toString()));
+				ar.setSpecial_type("1"); // 特殊考勤显示标志
+				ar.setRemark(StringUtil.isEmpty(remark) ? "补卡" : remark);
+					
+				// 检查是否已存在相同的打卡记录(相同人员、相同时间)
+				/*AttendanceRecord checkRecord = new AttendanceRecord();
+				checkRecord.setAtt_user_id(ar.getAtt_user_id());
+				checkRecord.setAtt_time(attTimeDate);
+				List<AttendanceRecord> existingRecords = attendanceRecordService.getAttendanceRecordSearchList(checkRecord);
+					
+				if (existingRecords != null && !existingRecords.isEmpty()) {
+					rv.setReturnCode("0");
+					rv.setReturnMsg("该时间点已存在打卡记录,无需重复补卡");
+					rv.setReturnParams("{}");
+					String returnJson = JSONObject.fromObject(rv, config).toString();
+					return returnJson;
+				}*/
+					
+				// 插入考勤记录
+				int result = attendanceRecordService.addAttendanceRecord(ar);
+				if (result > 0) {
+					rv.setReturnCode("1");
+					rv.setReturnMsg("补卡成功!考勤类型: " + getAttendanceTypeName(attTypeId));
+					rv.setReturnParams("{\"recordId\":\"" + ar.getRecord_id() + "\"}");
+				} else {
+					rv.setReturnCode("0");
+					rv.setReturnMsg("补卡失败,请稍后重试");
+					rv.setReturnParams("{}");
+				}
+			}else{
+				rv.setReturnCode("0");
+				rv.setReturnMsg("没有业务表");
+				rv.setReturnParams("{}");
+			}
+			String returnJson = JSONObject.fromObject(rv, config).toString();
+			return returnJson;
+		} catch (Exception e) {
+			e.printStackTrace();
+			rv.setReturnCode("13");
+			rv.setReturnMsg("执行异常: " + e.getMessage());
+			rv.setReturnParams("{}");
+			String returnJson = JSONObject.fromObject(rv, config).toString();
+			return returnJson;
+		}
+	}
+		
+	/**
+	 * 根据补卡类型和已有记录智能判断考勤类型
+	 * @param attendanceRecordService 考勤记录服务
+	 * @param ar 当前考勤记录
+	 * @param attTypeName 补卡类型名称(上班/下班)
+	 * @param attTime 补卡时间
+	 * @return 考勤类型ID: 1-上午上班, 7-上午下班, 8-下午上班, 2-下午下班
+	 */
+	private String determineAttendanceType(AttendanceRecordService attendanceRecordService, 
+										   AttendanceRecord ar, 
+										   String attTypeName, 
+										   Date attTime) throws Exception {
+		// 获取当前时间的小时
+		java.util.Calendar cal = java.util.Calendar.getInstance();
+		cal.setTime(attTime);
+		int hour = cal.get(java.util.Calendar.HOUR_OF_DAY);
+		int minute = cal.get(java.util.Calendar.MINUTE);
+		
+		// 如果指定了补卡类型,只判断是上午还是下午
+		if (!StringUtil.isEmpty(attTypeName)) {
+			if ("上班".equals(attTypeName)) {
+				// 用户明确要补上班卡,只判断是上午上班还是下午上班
+				if (hour < 12) {
+					return "1"; // 上午上班
+				} else {
+					return "8"; // 下午上班
+				}
+			} else if ("下班".equals(attTypeName)) {
+				// 用户明确要补下班卡,只判断是上午下班还是下午下班
+				if (hour < 14) {
+					return "7"; // 上午下班
+				} else {
+					return "2"; // 下午下班
+				}
+			}
+		}
+		
+		// 未指定补卡类型,查询该用户当天已有的考勤记录进行智能判断
+		AttendanceRecord queryRecord = new AttendanceRecord();
+		queryRecord.setAtt_user_id(ar.getAtt_user_id());
+		queryRecord.setUnit_id(ar.getUnit_id());
+		queryRecord.setAtt_date(ar.getAtt_date());
+		List<AttendanceRecord> existingRecords = attendanceRecordService.getAttendanceRecordSearchList(queryRecord);
+		
+		// 统计已有记录中各类型的数量
+		boolean hasAmStart = false; // 上午上班(1)
+		boolean hasAmEnd = false;   // 上午下班(7)
+		boolean hasPmStart = false; // 下午上班(8)
+		boolean hasPmEnd = false;   // 下午下班(2)
+		
+		if (existingRecords != null) {
+			for (AttendanceRecord record : existingRecords) {
+				String typeId = record.getAtt_type_id();
+				if ("1".equals(typeId)) hasAmStart = true;
+				else if ("7".equals(typeId)) hasAmEnd = true;
+				else if ("8".equals(typeId)) hasPmStart = true;
+				else if ("2".equals(typeId)) hasPmEnd = true;
+			}
+		}
+		
+		// 根据时间和已有记录智能判断
+		if (hour < 12) {
+			// 上午时段(6:00-11:59)
+			if (!hasAmStart) {
+				return "1"; // 还没有上午上班,判定为上午上班
+			} else if (!hasAmEnd) {
+				return "7"; // 有上午上班但没有上午下班,判定为上午下班
+			} else {
+				// 上午上下班都已完成,但时间在12点之前
+				if (hour == 11 && minute >= 30) {
+					return "8"; // 11:30-11:59 且上午已完成,判定为下午上班
+				} else {
+					return "7"; // 其他情况继续算上午下班(重复打卡)
+				}
+			}
+		} else if (hour < 18) {
+			// 下午时段(12:00-17:59)
+			if (!hasPmStart) {
+				return "8"; // 还没有下午上班,判定为下午上班
+			} else {
+				return "2"; // 已有下午上班,判定为下午下班
+			}
+		} else {
+			// 晚上时段(18:00以后)
+			return "2"; // 默认为下午下班
+		}
+	}
+		
+	/**
+	 * 获取考勤类型名称
+	 * @param typeId 考勤类型ID
+	 * @return 考勤类型名称
+	 */
+	private String getAttendanceTypeName(String typeId) {
+		if ("1".equals(typeId)) return "上午上班";
+		else if ("7".equals(typeId)) return "上午下班";
+		else if ("8".equals(typeId)) return "下午上班";
+		else if ("2".equals(typeId)) return "下午下班";
+		else return "未知类型";
+	}
+
+	@Override
+	public String getServiceId() {
+		return serviceId;
+	}
+
+	public static void main(String[] args) {
+
+		String url = "http://localhost:8099/ynet/clientServices.do?iscrypt=1";
+		String param = "{\"serviceId\":\"hr_2015V01InsertLave\",'params':{fix_userId:'30665833357330',fix_groupId:'1358903647341',att_type:'事假',start_time:'2015-03-02 08:30:00',end_time:'2015-03-02 12:00:00',leave_time:'7.5',remark:'事假!'}}";
+
+		System.out.println(param);
+		String rs = RegisterCodeImpl.requestPage(url, param);
+		System.out.println(rs);
+	}
+}

+ 15 - 0
src/main/hr/com/yw/hr/iface_HrInsertAttendance.xml

@@ -0,0 +1,15 @@
+<yr>
+	<iface id="hr_2026V01InsertAttendance" text="插入补卡信息" type="1">
+		<inparam>
+			<param name="att_type_name" type="java.lang.String">补卡类型</param>
+			<param name="att_time" type="java.lang.String">补卡时间</param>
+			<param name="remark" type="java.lang.String">说明</param>
+		</inparam>
+		<outparam>
+			<param name="returnCode" type="java.lang.String">返回编码</param>
+			<param name="returnMsg" type="java.lang.String">返回消息</param>
+			<param name="returnParams" type="java.lang.String">返回参数</param>
+		</outparam>
+		<desc>插入补卡信息</desc>
+	</iface>
+</yr>