Sfoglia il codice sorgente

Merge branch 'feature/attendance728' into 'develop'

考勤,添加指定人员分析打卡数据接口

See merge request o2oa/o2oa!1313
o2null 5 anni fa
parent
commit
3fa6be6ebb

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

@@ -169,6 +169,70 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
 	}
 	
+	/**
+	 * 分析时间范围内的所有打卡记录
+	 * 1、如果未传入时间,或者时间有错,那么分析所有未分析过的打卡记录
+	 * 2、只分析未归档的,已经归档的将不再分析了
+	 * 3、如果forceFlag为true则分析(未分析的,已分析的,错误的)
+	 * @param startDateString
+	 * @param endDateString
+	 * @param personName
+	 * @param forceFlag
+	 * @return
+	 * @throws Exception
+	 */
+	//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
+	public List<String> getAllAnalysenessDetailsForce(String startDateString, String endDateString, String personName ,Boolean forceFlag) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		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);
+		
+		//一般始终为true, id is not null
+		Predicate p = root.get( AttendanceDetail_.id ).isNotNull();
+		p = cb.and( p, root.get( AttendanceDetail_.archiveTime ).isNull()); //要未归档的,才再次进行分析
+		if( StringUtils.isNotEmpty( personName ) ) {
+			p = cb.and( p, cb.equal( root.get(AttendanceDetail_.empName ), personName)); //匹配员工姓名
+		}
+		Date startDate = null;
+		Date endDate = null;
+		try{
+			startDate = dateOperation.getDateFromString( startDateString );
+		}catch(Exception e){
+			startDate = null;
+		}
+		try{
+			endDate = dateOperation.getDateFromString( endDateString );
+		}catch(Exception e){
+			endDate = null;
+		}
+		//如果开始时间和结束时间有值,那么分析一个时间区间内的所有打卡记录,已经分析过了的,也需要重新分析一次
+		if( startDate != null  && endDate != null ){
+			p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, endDate));
+		}else{
+			if( startDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, new Date()));
+			}
+			if( endDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), new Date(), endDate));
+			}
+			if( startDate == null && endDate == null ){
+				//startDateString和endDateString都为空,只分析所有未分析过的
+				List<Integer> statusArray = new ArrayList<Integer>();
+				statusArray.add( 0 ); //未分析的
+				if(forceFlag){
+					statusArray.add( 1 ); //已分析的
+				}
+				statusArray.add( -1 ); //有错误的
+				p = cb.and( p, root.get( AttendanceDetail_.recordStatus).in( statusArray ));
+			}
+		}
+		
+		cq.select( root.get( AttendanceDetail_.id ) );
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
 	/**
 	 * 分析时间范围内的所有打卡记录
 	 * 1、如果未传入时间,或者时间有错,那么分析所有未分析过的打卡记录
@@ -224,6 +288,66 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
 	}
 	
+	/**
+	 * 分析时间范围内的所有打卡记录(可选择已分析/未分析)
+	 * 1、如果未传入时间,或者时间有错, 那么分析所有未分析过的打卡记录
+	 * 2、只分析未归档的,已经归档的将不再分析了
+	 * 3、如果forceFlag为true则分析(未分析的,已分析的,错误的)
+	 * @param startDateString
+	 * @param endDateString
+	 * @param forceFlag
+	 * @return
+	 * @throws Exception
+	 */
+	//@MethodDescribe("按指定的开始时间,结束时间列示员工姓名列表")
+	public List<String> getAllAnalysenessPersonNamesForce(String startDateString, String endDateString ,Boolean forceFlag) throws Exception {
+		DateOperation dateOperation = new DateOperation();
+		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);
+		
+		//一般始终为true, id is not null
+		Predicate p = root.get( AttendanceDetail_.id ).isNotNull();
+		p = cb.and( p, root.get( AttendanceDetail_.archiveTime ).isNull()); //要未归档的,才再次进行分析
+		Date startDate = null;
+		Date endDate = null;
+		try{
+			startDate = dateOperation.getDateFromString( startDateString );
+		}catch(Exception e){
+			startDate = null;
+		}
+		try{
+			endDate = dateOperation.getDateFromString( endDateString );
+		}catch(Exception e){
+			endDate = null;
+		}
+		//如果开始时间和结束时间有值,那么分析一个时间区间内的所有打卡记录,已经分析过了的,也需要重新分析一次
+		if( startDate != null  && endDate != null ){
+			p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, endDate));
+		}else{
+			if( startDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), startDate, new Date()));
+			}
+			if( endDate != null ){
+				p = cb.and( p, cb.between( root.get( AttendanceDetail_.recordDate), new Date(), endDate));
+			}
+			if( startDate == null && endDate == null ){
+				//startDateString和endDateString都为空,只分析所有未分析过的
+				List<Integer> statusArray = new ArrayList<Integer>();
+				statusArray.add( 0 ); //未分析的
+				if(forceFlag){
+					statusArray.add( 1 ); //已分析的
+				}
+				statusArray.add( -1 ); //有错误的
+				p = cb.and( p, root.get( AttendanceDetail_.recordStatus).in( statusArray ));
+			}
+		}
+		
+		cq.distinct(true).select( root.get( AttendanceDetail_.empName ) );
+		return em.createQuery(cq.where(p)).setMaxResults(20000).getResultList();
+	}
+	
 	//@MethodDescribe("按指定的开始时间,结束时间列示未被分析的AttendanceDetail信息列表")
 	public List<String> getUserAnalysenessDetails(String empName, String startDateString, String endDateString) throws Exception {
 		DateOperation dateOperation = new DateOperation();

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

@@ -0,0 +1,149 @@
+package com.x.attendance.assemble.control.jaxrs.attendancedetail;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import com.google.gson.JsonElement;
+import com.x.attendance.assemble.control.ExceptionWrapInConvert;
+import com.x.attendance.assemble.control.jaxrs.attendancedetail.ActionReciveSingleAttendance.Wi;
+import com.x.attendance.assemble.control.processor.monitor.StatusSystemImportOpt;
+import com.x.attendance.assemble.control.processor.sender.SenderForAnalyseData;
+import com.x.attendance.entity.AttendanceStatisticalCycle;
+import com.x.attendance.entity.AttendanceWorkDayConfig;
+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.tools.ListTools;
+
+public class ActionAnalyseAttendanceDetailsForce extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger( ActionAnalyseAttendanceDetails.class );
+	
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		//List<String> personNames = null;
+		List<AttendanceWorkDayConfig> attendanceWorkDayConfigList = null;
+		Map<String, Map<String, List<AttendanceStatisticalCycle>>> topUnitAttendanceStatisticalCycleMap = null;
+		StatusSystemImportOpt statusSystemImportOpt = StatusSystemImportOpt.getInstance();
+		Boolean check = true;
+		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( statusSystemImportOpt.getProcessing() ) {
+			check = false;
+			Exception exception = new ExceptionAttendanceDetailProcess( "考勤数据处理器正在处理数据中,请稍候再试......" );
+			result.error(exception);
+		}
+		List<String> personNames = null;
+		String startDate = wrapIn.getStartDate(); 
+		String endDate = wrapIn.getEndDate();
+		Boolean forceFlag = wrapIn.getForceFlag();
+		personNames = wrapIn.getPersonNames();
+
+		if (check) {
+			try {
+				if(ListTools.isEmpty(personNames)){
+					//personNames = attendanceDetailServiceAdv.getAllAnalysenessPersonNames( startDate, endDate );
+					personNames = attendanceDetailServiceAdv.getAllAnalysenessPersonNamesForce( startDate, endDate ,forceFlag);
+					if( personNames == null || personNames.isEmpty() ) {
+						check = false;
+						Exception exception = new ExceptionAttendanceDetailProcess( "暂时未查询到需要分析的打卡数据." + "开始日期:" + startDate + ", 结束日期:" + endDate );
+						result.error(exception);
+					}
+				}
+				
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionAttendanceDetailProcess(e, "系统根据开始时间和结束时间查询需要分析的员工姓名列表时发生异常." + "开始日期:" + startDate + ", 结束日期:" + endDate );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		
+		if ( check ) {
+			try {
+				attendanceWorkDayConfigList = attendanceWorkDayConfigServiceAdv.listAll();
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionAttendanceDetailProcess( e, "系统在根据ID列表查询工作节假日配置信息列表时发生异常!" );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		if ( check ) {
+			try {// 查询所有的周期配置,组织成Map
+				topUnitAttendanceStatisticalCycleMap = attendanceStatisticCycleServiceAdv.getCycleMapFormAllCycles( effectivePerson.getDebugger() );
+			} catch (Exception e) {
+				check = false;
+				Exception exception = new ExceptionAttendanceDetailProcess( e, "系统在查询并且组织所有的统计周期时发生异常." );
+				result.error(exception);
+				logger.error(e, effectivePerson, request, null);
+			}
+		}
+		if ( check ) {
+			new SenderForAnalyseData().executeForce( personNames, startDate, endDate,forceFlag, attendanceWorkDayConfigList, topUnitAttendanceStatisticalCycleMap, effectivePerson.getDebugger() ); 
+		}
+		return result;
+	}
+	
+	public static class Wi {
+
+		@FieldDescribe( "开始日期." )
+		private String startDate = null;
+
+		@FieldDescribe( "结束日期." )
+		private String endDate = null;
+
+		@FieldDescribe("用户distinguishedName.")
+		private List<String>personNames;
+
+		@FieldDescribe("是否分析已分析过的打卡记录.")
+		private Boolean forceFlag;
+
+
+		public String getStartDate() {
+			return startDate;
+		}
+		public void setStartDate(String startDate) {
+			this.startDate = startDate;
+		}
+		public String getEndDate() {
+			return endDate;
+		}
+		public void setEndDate(String endDate) {
+			this.endDate = endDate;
+		}
+		public List<String> getPersonNames() {
+			return personNames;
+		}
+		public void setPersonNames(List<String> personNames) {
+			this.personNames = personNames;
+		}
+		public Boolean getForceFlag() {
+			return forceFlag;
+		}
+		public void setForceFlag(Boolean forceFlag) {
+			this.forceFlag = forceFlag;
+		}
+		
+	}
+	
+	public static class Wo extends WoId {
+		public Wo( String id ) {
+			setId( id );
+		}
+	}
+}

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

@@ -251,6 +251,30 @@ public class AttendanceDetailAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+	
+	@JaxrsMethodDescribe(value = "分析打卡数据(指定人员)", action = ActionAnalyseAttendanceDetailsForce.class)
+	@POST
+	@Path("analyse")
+	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void analyseAttendanceDetailsForce(@Suspended final AsyncResponse asyncResponse,
+			@Context HttpServletRequest request,
+			JsonElement jsonElement) {
+		ActionResult<ActionAnalyseAttendanceDetailsForce.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		Boolean check = true;
+		if (check) {
+			try {
+				result = new ActionAnalyseAttendanceDetailsForce().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 = "分析打卡数据", action = ActionAnalyseAttendanceDetail.class)
 	@GET

+ 21 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/sender/SenderForAnalyseData.java

@@ -44,4 +44,24 @@ public class SenderForAnalyseData {
 		}
 	}
 	
-}
+	public void executeForce(List<String> personNames, String startDate, String endDate,Boolean forceFlag, List<AttendanceWorkDayConfig> attendanceWorkDayConfigList, Map<String, Map<String, List<AttendanceStatisticalCycle>>> topUnitAttendanceStatisticalCycleMap, Boolean debugger ) {
+			
+			StatusSystemImportOpt statusSystemImportOpt = StatusSystemImportOpt.getInstance();
+			List<String> ids = null;
+			 
+			for ( String personName : personNames ) {
+				try {
+					ids = attendanceDetailServiceAdv.getAllAnalysenessDetailsForce( startDate, endDate, personName ,forceFlag);
+					if( ids != null && !ids.isEmpty() ) {
+						statusSystemImportOpt.setProcessing( true );
+						statusSystemImportOpt.setProcessing_analysis( true );
+						statusSystemImportOpt.increaseProcess_analysis_total( ids.size() );
+						DataProcessThreadFactory.getInstance().submit( new EntityAnalyseData( "analyse", personName, ids, attendanceWorkDayConfigList, topUnitAttendanceStatisticalCycleMap ), debugger );
+					}
+				} catch (Exception e) {
+					logger.error(e);
+				}
+			}
+		}
+		
+	}

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

@@ -138,6 +138,11 @@ public class AttendanceDetailService {
 		Business business =  new Business( emc );
 		return business.getAttendanceDetailFactory().getAllAnalysenessDetails( startDate, endDate, personName );	
 	}
+	
+	public List<String> getAllAnalysenessDetailsForce( EntityManagerContainer emc, String startDate, String endDate, String personName ,Boolean forceFlag) throws Exception {
+		Business business =  new Business( emc );
+		return business.getAttendanceDetailFactory().getAllAnalysenessDetailsForce( startDate, endDate, personName ,forceFlag);
+	}
 
 	/**
 	 * 
@@ -340,6 +345,11 @@ public class AttendanceDetailService {
 		Business business =  new Business( emc );
 		return business.getAttendanceDetailFactory().getAllAnalysenessPersonNames( startDate, endDate );
 	}
+	
+	public List<String> getAllAnalysenessPersonNamesForce(EntityManagerContainer emc, String startDate, String endDate,Boolean forceFlag) throws Exception {
+		Business business =  new Business( emc );
+		return business.getAttendanceDetailFactory().getAllAnalysenessPersonNamesForce( startDate, endDate , forceFlag);
+	}
 
 	public AttendanceDetail listDetailWithEmployee(EntityManagerContainer emc, String employeeName, String recordDateString) throws Exception {
 		Business business =  new Business( emc );

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

@@ -146,6 +146,14 @@ public class AttendanceDetailServiceAdv {
 		}
 	}
 	
+	public List<String> getAllAnalysenessDetailsForce( String startDate, String endDate, String personName ,Boolean forceFlag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return attendanceDetailService.getAllAnalysenessDetailsForce( emc, startDate, endDate, personName ,forceFlag);
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+	
 	public List<String> getAllAnalysenessPersonNames( String startDate, String endDate ) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			return attendanceDetailService.getAllAnalysenessPersonNames( emc, startDate, endDate );
@@ -153,6 +161,14 @@ public class AttendanceDetailServiceAdv {
 			throw e;
 		}
 	}
+	
+	public List<String> getAllAnalysenessPersonNamesForce( String startDate, String endDate ,Boolean forceFlag) throws Exception {
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			return attendanceDetailService.getAllAnalysenessPersonNamesForce( emc, startDate, endDate , forceFlag);
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
 
 	public void archive( String id ) throws Exception {
 		DateOperation dateOperation = new DateOperation();