|
|
@@ -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);
|
|
|
+ }
|
|
|
+}
|