Ver Fonte

[考勤管理]增加在某天某时刻未打指定卡的人员列表

o2lee há 5 anos atrás
pai
commit
f7d6fe3dce

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

@@ -983,7 +983,7 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceDetail> root = cq.from( AttendanceDetail.class);
 		cq.select(root.get(AttendanceDetail_.id));
-		Predicate p = cb.equal( root.get( AttendanceDetail_.recordDate ), recordDate );
+		Predicate p = cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate );
 		Predicate offDutyTime_1 = cb.isNull(root.get( AttendanceDetail_.offDutyTime ));
 		Predicate offDutyTime_2 = cb.equal( root.get( AttendanceDetail_.offDutyTime ), "" );
 		p = cb.and( p, cb.or( offDutyTime_1, offDutyTime_2 ));
@@ -991,4 +991,29 @@ public class AttendanceDetailFactory extends AbstractFactory {
 	}
 
 
+    public List<String> listSignedPersonsWithDeadLine( String deadline ) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		if( StringUtils.isEmpty( deadline )){
+			deadline = dateOperation.getNowDateTime();
+		}
+		Date deadlineDate = dateOperation.getDateFromString( deadline, "yyyy-MM-dd HH:mm:ss");
+		String recordDate = dateOperation.getDate( deadlineDate, "yyyy-MM-dd");
+		String deadlineTime = dateOperation.getDate( deadlineDate, "HH:mm:ss");
+
+		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));
+		Predicate p = cb.equal( root.get( AttendanceDetail_.recordDateString ), recordDate );
+		Predicate p_or = cb.or(
+				cb.lessThan( root.get( AttendanceDetail_.onDutyTime ), deadlineTime),
+				cb.lessThan(root.get( AttendanceDetail_.morningOffDutyTime ), deadlineTime),
+				cb.lessThan(root.get( AttendanceDetail_.afternoonOnDutyTime ), deadlineTime),
+				cb.lessThan(root.get( AttendanceDetail_.offDutyTime ), deadlineTime)
+		);
+		p = cb.and( p, p_or );
+		cq.distinct(true).select(root.get(AttendanceDetail_.empName));
+		return em.createQuery(cq.where(p)).setMaxResults(100000).getResultList();
+	}
 }

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

@@ -0,0 +1,124 @@
+package com.x.attendance.assemble.control.jaxrs.attendancedetail;
+
+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.processor.monitor.StatusSystemImportOpt;
+import com.x.attendance.entity.AttendanceEmployeeConfig;
+import com.x.attendance.entity.AttendanceStatisticalCycle;
+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.WoText;
+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;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 获取上班时间前X分钟未打卡人员信息的接口
+ * 1、获取所有需要打卡的人员信息列表
+ * 2、获取指定时间前已经打过卡的人员列表
+ * 3、从所有要打卡的人员信息列表中排除已经打过卡的人员后返回
+ */
+public class ActionNoneSignPersons extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionNoneSignPersons.class );
+	
+	protected ActionResult<List<String>> execute( HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement ) throws Exception {
+		ActionResult<List<String>> result = new ActionResult<>();
+		EffectivePerson currentPerson = this.effectivePerson(request);
+		List<AttendanceEmployeeConfig> attendanceEmployeeConfigList = null;
+		Wi wrapIn = null;
+		Boolean check = true;
+		DateOperation dateOperation = new DateOperation();
+		List<String> allNeedSignPersons = new ArrayList<>();
+		List<String> signedPersons = null;
+		List<String> wos = new ArrayList<>();
+
+		try {
+			wrapIn = this.convertToWrapIn(jsonElement, Wi.class);
+		} catch (Exception e) {
+			check = false;
+			Exception exception = new ExceptionWrapInConvert(e, jsonElement);
+			result.error(exception);
+			logger.error(e, currentPerson, request, null);
+		}
+
+		if( StringUtils.isEmpty( wrapIn.getDeadline() ) ) {
+			wrapIn.setDeadline( dateOperation.getNowDateTime() );
+		}
+
+		if ( check ) {
+			try {
+				attendanceEmployeeConfigList = attendanceEmployeeConfigServiceAdv.listByConfigType( "REQUIRED" );
+				if( ListTools.isEmpty( attendanceEmployeeConfigList ) ) {
+					//如果没有配置需要考勤的人员则为全员考勤
+					List<Person> allPersonObjs = userManagerService.listAllPersons();
+					if(ListTools.isNotEmpty( allPersonObjs )){
+						for( Person person : allPersonObjs ){
+							allNeedSignPersons.add( person.getDistinguishedName() );
+						}
+					}
+				}else{
+					for( AttendanceEmployeeConfig person : attendanceEmployeeConfigList ){
+						allNeedSignPersons.add( person.getEmployeeName() );
+					}
+				}
+			} catch ( Exception e ) {
+				check = false;
+				Exception exception = new ExceptionAttendanceDetailProcess( e, "系统在查询需要考勤的人员配置列表时发生异常." );
+				result.error( exception );
+				logger.error( e, currentPerson, request, null );
+			}
+		}
+
+		if (check) {
+			//查询在指定截止日期前已经打过卡的人员
+			signedPersons = attendanceDetailServiceAdv.listSignedPersonsWithDeadLine( wrapIn.getDeadline() );
+		}
+
+		if (check) {
+			//排除已经打过卡的人
+			if( ListTools.isNotEmpty( signedPersons )){
+				for( String distinguishedName : signedPersons ){
+					ListTools.removeStringFromList( distinguishedName, allNeedSignPersons);
+				}
+			}
+		}
+
+		if (check) {
+			for( String distinguishedName : allNeedSignPersons ){
+				wos.add( distinguishedName );
+			}
+		}
+
+		result.setData( wos );
+		return result;
+	}
+
+	public static class Wi{
+		@FieldDescribe( "截止时间点,如果不填写,则以当前时间作为截止时间" )
+		private String deadline = null;
+
+		public String getDeadline() {
+			return deadline;
+		}
+
+		public void setDeadline(String deadline) {
+			this.deadline = deadline;
+		}
+	}
+
+	public static class Wo extends WoText {
+		public Wo( String text ) {
+			setText( text );
+		}
+	}
+}

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

@@ -348,6 +348,30 @@ public class AttendanceDetailAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
+	@JaxrsMethodDescribe(value = "列示在截止时间仍未打卡的员工列表", action = ActionNoneSignPersons.class)
+	@PUT
+	@Path("list/persons/nonesign")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void listNeedSignPersons(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+								   JsonElement jsonElement) {
+		ActionResult<List<String>> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+
+		if (check) {
+			try {
+				result = new ActionNoneSignPersons().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));
+	}
+
 	/**
 	 * 打卡信息接入
 	 * @author liyi_

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

@@ -321,4 +321,9 @@ public class AttendanceDetailService {
 		Business business =  new Business( emc );
 		return business.getAttendanceDetailFactory().listRecordWithDateAndNoOffDuty( dateString );
     }
+
+    public List<String> listSignedPersonsWithDeadLine(EntityManagerContainer emc, String deadline) throws Exception {
+		Business business =  new Business( emc );
+		return business.getAttendanceDetailFactory().listSignedPersonsWithDeadLine( deadline );
+    }
 }

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

@@ -316,4 +316,20 @@ public class AttendanceDetailServiceAdv {
 			throw e;
 		}
 	}
+
+	/**
+	 * 查询在指定截止日期前已经打过卡的人员
+	 * @param deadline
+	 * @return
+	 */
+    public List<String> listSignedPersonsWithDeadLine( String deadline ) throws Exception {
+		if( StringUtils.isEmpty( deadline )){
+			deadline = dateOperation.getNowDateTime();
+		}
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return attendanceDetailService.listSignedPersonsWithDeadLine( emc, deadline );
+		} catch ( Exception e ) {
+			throw e;
+		}
+    }
 }