Просмотр исходного кода

考勤新增部分更新打卡记录接口

luojing 5 лет назад
Родитель
Сommit
ef2f08b589

+ 23 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java

@@ -535,6 +535,29 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		return em.createQuery(cq.where(p)).getResultList();
 	}
 	
+	//根据人员和打卡日期查找打卡记录
+		public List<String> listDetailByNameAndDate( String user, String dateStr )  throws Exception {
+			if( user == null || user.isEmpty() ||dateStr == null ){
+				return null;
+			}
+			EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+			CriteriaBuilder cb = em.getCriteriaBuilder();
+			CriteriaQuery<String> cq = cb.createQuery(String.class);
+			Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
+			cq.select( root.get(AttendanceDetail_.id ));
+			//一般始终为true, id is not null
+			Predicate p = cb.isNotNull( root.get(AttendanceDetail_.id) );
+			if( StringUtils.isNotEmpty( user ) ){
+				p = cb.and(p, cb.equal( root.get(AttendanceDetail_.empName), user ));
+			}
+			if( StringUtils.isNotEmpty( dateStr ) ){
+				p = cb.and(p, cb.equal( root.get(AttendanceDetail_.recordDateString), dateStr ));
+			}
+			
+	
+			return em.createQuery(cq.where(p)).getResultList();
+		}
+	
 	//@MethodDescribe("按年份月份查询某组织的打卡数据记录列表")
 	public List<String> listUnitAttendanceDetailByYearAndMonth( List<String> unitNames, String year, String month)  throws Exception {
 		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );

+ 258 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionReciveSingleAttendance.java

@@ -0,0 +1,258 @@
+package com.x.attendance.assemble.control.jaxrs.attendancedetail;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.persistence.Column;
+import javax.servlet.http.HttpServletRequest;
+
+import com.google.gson.JsonElement;
+import com.x.attendance.assemble.common.date.DateOperation;
+import com.x.attendance.assemble.control.ExceptionWrapInConvert;
+import com.x.attendance.assemble.control.ThisApplication;
+import com.x.attendance.entity.AttendanceDetail;
+import com.x.attendance.entity.AttendanceScheduleSetting;
+import com.x.attendance.entity.AttendanceSelfHoliday;
+import com.x.attendance.entity.AttendanceStatisticalCycle;
+import com.x.attendance.entity.AttendanceWorkDayConfig;
+import com.x.base.core.entity.JpaObject;
+import com.x.base.core.entity.annotation.CheckPersist;
+import com.x.base.core.project.annotation.FieldDescribe;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoId;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.organization.Person;
+import com.x.base.core.project.tools.ListTools;
+
+import org.apache.commons.lang3.StringUtils;
+
+public class ActionReciveSingleAttendance extends BaseAction {
+	/*
+	 * =============================================================================
+	 * =====用于部分更新打卡数据,例如只更新下午打卡数据而不影响上午的打卡数据
+	 * =============================================================================
+	 * =====
+	 */
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionReciveSingleAttendance.class );
+	
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement ) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		DateOperation dateOperation = new DateOperation();
+		AttendanceDetail attendanceDetail = null;
+		Boolean check = true;
+		List<String> ids = null;
+		Wi wrapIn = null;
+		try {
+			wrapIn = this.convertToWrapIn(jsonElement, Wi.class);
+		} catch (Exception e) {
+			check = false;
+			Exception exception = new ExceptionWrapInConvert(e, jsonElement);
+			result.error(exception);
+			logger.error(e, effectivePerson, request, null);
+		}
+		if (check) {
+			if (wrapIn.getRecordDateString() == null || wrapIn.getRecordDateString().isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionRecordDateEmpty();
+				result.error(exception);
+			}
+		}
+		if (check) {
+			if (wrapIn.getEmpName() == null || wrapIn.getEmpName().isEmpty()) {
+				check = false;
+				Exception exception = new ExceptionPersonNameEmpty();
+				result.error(exception);
+			}
+		}
+
+		Date datetime = null;
+
+		if (check) {
+			try {
+				ids = attendanceDetailServiceAdv.listDetailByNameAndDate( wrapIn.getEmpName(), wrapIn.getRecordDateString() );
+				if(ListTools.isNotEmpty(ids)){
+					attendanceDetail = attendanceDetailServiceAdv.get(ids.get(0));
+					if(attendanceDetail==null){
+						/*try {
+							datetime = dateOperation.getDateFromString(wrapIn.getRecordDateString());
+							attendanceDetail.setRecordDate(datetime);
+							attendanceDetail.setRecordDateString(dateOperation.getDateStringFromDate(datetime, "YYYY-MM-DD"));
+							attendanceDetail.setYearString(dateOperation.getYear(datetime));
+							attendanceDetail.setMonthString(dateOperation.getMonth(datetime));
+						} catch (Exception e) {
+							check = false;
+							Exception exception = new ExceptionAttendanceDetailProcess(e, "员工打卡信息中打卡日期格式异常,格式: yyyy-mm-dd. 日期:" + wrapIn.getRecordDateString());
+							result.error(exception);
+							logger.error(e, effectivePerson, request, null);
+						}
+					}else{*/
+						check = false;
+						Exception exception = new ExceptionDetailNotExists(ids.get(0));
+						result.error(exception);
+					}
+				}else{
+					check = false;
+					Exception exception = new ExceptionSingleDetailNotExists();
+					result.error(exception);
+				}
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionAttendanceDetailProcess(e,
+						"系统在根据员工姓名,打卡日期查询打卡详细信息ID列表时发生异常!"
+						+ "Name:" + wrapIn.getEmpName() + ", RecordDate:" + wrapIn.getRecordDateString());
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+			
+			
+		}
+		if (check) {
+			if (wrapIn.getOnDutyTime() != null && wrapIn.getOnDutyTime().trim().length() > 0) {
+				try {
+					datetime = dateOperation.getDateFromString(wrapIn.getOnDutyTime());
+					attendanceDetail.setOnDutyTime(dateOperation.getDateStringFromDate(datetime, "HH:mm:ss")); // 上班打卡时间
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new ExceptionAttendanceDetailProcess(e, "员工上班打卡时间格式异常,格式: HH:mm:ss. 日期:" + wrapIn.getOnDutyTime());
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			}
+		}
+
+		if (check) {
+			if (wrapIn.getOffDutyTime() != null && wrapIn.getOffDutyTime().trim().length() > 0) {
+				try {
+					datetime = dateOperation.getDateFromString(wrapIn.getOffDutyTime());
+					attendanceDetail.setOffDutyTime(dateOperation.getDateStringFromDate(datetime, "HH:mm:ss")); // 上班打卡时间
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new ExceptionAttendanceDetailProcess(e, "员工下班打卡时间格式异常,格式: HH:mm:ss. 日期:" + wrapIn.getOffDutyTime());
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			}
+		}
+
+		if( check ){
+			String distinguishedName = wrapIn.getEmpName();
+			if( StringUtils.isEmpty( distinguishedName )){
+				distinguishedName = effectivePerson.getDistinguishedName();
+			}
+
+			Person person = userManagerService.getPersonObjByName( distinguishedName );
+
+			if( person != null ){
+				attendanceDetail.setEmpName( person.getDistinguishedName() );
+				if( StringUtils.isEmpty( wrapIn.getEmpNo() )){
+					if( person != null ){
+						if( StringUtils.isNotEmpty( person.getEmployee() )){
+							attendanceDetail.setEmpNo(person.getEmployee());
+						}else{
+							attendanceDetail.setEmpNo( distinguishedName );
+						}
+					}
+				}
+			}else{
+				//人员不存在
+				check = false;
+				Exception exception = new ExceptionAttendanceDetailProcess(
+						"考勤人员不存在.DistinguishedName:" + distinguishedName );
+				result.error(exception);
+			}
+		}
+
+		if (check) {
+			try {
+				
+				attendanceDetail = attendanceDetailServiceAdv.save(attendanceDetail);
+				result.setData( new Wo( attendanceDetail.getId() ));
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionAttendanceDetailProcess( e, "系统在保存员工打卡信息时发生异常。" );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+
+		if (check) {
+			//分析保存好的考勤数据
+			try {
+				ThisApplication.detailAnalyseQueue.send( attendanceDetail.getId() );
+			} catch ( Exception e1 ) {
+				e1.printStackTrace();
+			}
+		}
+
+
+		return result;
+	}
+	
+	public static class Wi {
+
+		@FieldDescribe( "员工标识,<font color='red'>必填</font>,员工的distinguishedName." )
+		private String empName = null;
+
+		private String empNo = null;
+
+		@FieldDescribe( "打卡日期,格式yyyy-mm-dd,可以为空." )
+		private String recordDateString = null;
+
+		@FieldDescribe( "上午上班打卡时间,格式hh24:mi:ss,可以为空,为空就是未打卡." )
+		private String onDutyTime = null;
+
+		@FieldDescribe("上班下午打卡签退时间,打卡策略2和3时使用,格式hh24:mi:ss,可以为空,为空就是未打卡.")
+		private String morningOffdutyTime;
+
+		@FieldDescribe("下午上班打卡签到时间,打卡策略2和3时使用,格式hh24:mi:ss,可以为空,为空就是未打卡.")
+		private String afternoonOnDutyTime;
+
+		@FieldDescribe( "下午下班打卡时间,hh24:mi:ss,可以为空,为空就是未打卡." )
+		private String offDutyTime = null;
+
+		public String getMorningOffdutyTime() { return morningOffdutyTime; }
+		public void setMorningOffdutyTime(String morningOffdutyTime) { this.morningOffdutyTime = morningOffdutyTime; }
+		public String getAfternoonOnDutyTime() { return afternoonOnDutyTime; }
+		public void setAfternoonOnDutyTime(String afternoonOnDutyTime) { this.afternoonOnDutyTime = afternoonOnDutyTime; }
+		public String getEmpName() {
+			return empName;
+		}
+		public void setEmpName(String empName) {
+			this.empName = empName;
+		}
+		public String getEmpNo() {
+			return empNo;
+		}
+		public void setEmpNo(String empNo) {
+			this.empNo = empNo;
+		}
+		public String getRecordDateString() {
+			return recordDateString;
+		}
+		public void setRecordDateString(String recordDateString) {
+			this.recordDateString = recordDateString;
+		}
+		public String getOnDutyTime() {
+			return onDutyTime;
+		}
+		public void setOnDutyTime(String onDutyTime) {
+			this.onDutyTime = onDutyTime;
+		}
+		public String getOffDutyTime() {
+			return offDutyTime;
+		}
+		public void setOffDutyTime(String offDutyTime) {
+			this.offDutyTime = offDutyTime;
+		}
+	}
+	
+	public static class Wo extends WoId {
+		public Wo( String id ) {
+			setId( id );
+		}
+	}
+}

+ 26 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/AttendanceDetailAction.java

@@ -398,6 +398,32 @@ public class AttendanceDetailAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+	
+	/**
+	 * 部分更新打卡记录
+	 */
+	@JaxrsMethodDescribe(value = "部分更新打卡记录,接入完成后直接分析", action = ActionReciveSingleAttendance.class)
+	@Path("reciveSingle")
+	@POST
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void reciveSingle(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<ActionReciveSingleAttendance.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+		if (check) {
+			try {
+				result = new ActionReciveSingleAttendance().execute(request, effectivePerson, jsonElement);
+			} catch (Exception e) {
+				result = new ActionResult<>();
+				Exception exception = new ExceptionAttendanceDetailProcess(e, "接入上下班打卡信息时发生异常!");
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 
 	@JaxrsMethodDescribe(value = "根据ID删除打卡信息记录", action = ActionDelete.class)
 	@DELETE

+ 12 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ExceptionSingleDetailNotExists.java

@@ -0,0 +1,12 @@
+package com.x.attendance.assemble.control.jaxrs.attendancedetail;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionSingleDetailNotExists extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionSingleDetailNotExists( ) {
+		super("根据人员和打卡日期查找员工打卡信息不存在!" );
+	}
+}

+ 20 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailService.java

@@ -109,6 +109,12 @@ public class AttendanceDetailService {
 		Business business =  new Business( emc );
 		return business.getAttendanceDetailFactory().listDetailByCycleYearAndMonthWithOutStatus( user, year, month );
 	}
+	
+	//根据人员和打卡日期查找打卡记录  
+	public List<String> listDetailByNameAndDate( EntityManagerContainer emc, String user, String datestr )  throws Exception {
+		Business business =  new Business( emc );
+		return business.getAttendanceDetailFactory().listDetailByNameAndDate( user, datestr );
+	}
 
 	public List<String> listUserAttendanceDetailByCycleYearAndMonth(EntityManagerContainer emc, String q_empName, String cycleYear,
 			String cycleMonth) throws Exception {
@@ -206,9 +212,10 @@ public class AttendanceDetailService {
 			attendanceDetail_old.setRecordDateString( attendanceDetail.getRecordDateString() );
 			attendanceDetail_old.setRecordStatus( 0 );
 			attendanceDetail_old.setOnDutyTime( attendanceDetail.getOnDutyTime() );
-			attendanceDetail_old.setOffDutyTime( attendanceDetail.getOnWorkTime() );
+			attendanceDetail_old.setOffDutyTime( attendanceDetail.getOffDutyTime() );
 			
-			emc.beginTransaction( AttendanceSetting.class );
+			//emc.beginTransaction( AttendanceSetting.class );
+			emc.beginTransaction( AttendanceDetail.class );
 			emc.check( attendanceDetail_old, CheckPersistType.all);	
 			emc.commit();
 			attendanceDetail = attendanceDetail_old;
@@ -224,6 +231,17 @@ public class AttendanceDetailService {
 		return attendanceDetail;
 	}
 	
+	public AttendanceDetail saveSingle( EntityManagerContainer emc, AttendanceDetail attendanceDetail ) throws Exception {
+		if( attendanceDetail == null ){
+			throw new Exception("attendanceDetail can not be null!");
+		}
+		
+		emc.beginTransaction( AttendanceDetail.class );
+		emc.persist( attendanceDetail, CheckPersistType.all);	
+		emc.commit();
+		return attendanceDetail;
+	}
+	
 //	public AttendanceDetail save( EntityManagerContainer emc, AttendanceDetail attendanceDetail ) throws Exception {
 //		if( attendanceDetail == null ){
 //			throw new Exception("attendanceDetail can not be null!");

+ 20 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailServiceAdv.java

@@ -104,6 +104,15 @@ public class AttendanceDetailServiceAdv {
 			throw e;
 		}
 	}
+	
+	//根据人员和打卡日期查找打卡记录  
+	public List<String> listDetailByNameAndDate( String q_empName, String datestr )  throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return attendanceDetailService.listDetailByNameAndDate( emc, q_empName, datestr);
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
 
 	public List<String> listUserAttendanceDetailByCycleYearAndMonth( String q_empName, String cycleYear, String cycleMonth ) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
@@ -188,6 +197,17 @@ public class AttendanceDetailServiceAdv {
 			throw e;
 		}
 	}
+	
+	public synchronized AttendanceDetail saveSingle(AttendanceDetail attendanceDetail) throws Exception {
+		if( attendanceDetail == null ){
+			throw new Exception("attendanceDetail is null!");
+		}
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return attendanceDetailService.saveSingle( emc, attendanceDetail );
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
 
 	public AttendanceDetailMobile save(AttendanceDetailMobile attendanceDetailMobile) throws Exception {
 		if( attendanceDetailMobile == null ){