Explorar o código

Merge branch 'fix/attendance_1222' into 'wrdp'

考勤,新增周末设置,并应用到考勤计算中

See merge request o2oa/o2oa!2598
o2null %!s(int64=5) %!d(string=hai) anos
pai
achega
f540ccb9c2

+ 18 - 15
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceWorkDayConfigFactory.java

@@ -13,6 +13,7 @@ import javax.persistence.criteria.Root;
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.AbstractFactory;
 import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.service.AttendanceSettingServiceAdv;
 import com.x.attendance.entity.AttendanceWorkDayConfig;
 import com.x.attendance.entity.AttendanceWorkDayConfig_;
 import com.x.base.core.project.exception.ExceptionWhen;
@@ -23,7 +24,8 @@ import com.x.base.core.project.exception.ExceptionWhen;
 public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 
 	private DateOperation dateOperation = new DateOperation();
-	
+	private AttendanceSettingServiceAdv attendanceSettingServiceAdv = new AttendanceSettingServiceAdv();
+
 	public AttendanceWorkDayConfigFactory(Business business) throws Exception {
 		super(business);
 	}
@@ -32,8 +34,8 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 	public AttendanceWorkDayConfig get( String id ) throws Exception {
 		return this.entityManagerContainer().find(id, AttendanceWorkDayConfig.class, ExceptionWhen.none);
 	}
-	
-//	@MethodDescribe("列示全部的AttendanceWorkDayConfig信息列表")
+
+	//	@MethodDescribe("列示全部的AttendanceWorkDayConfig信息列表")
 	@SuppressWarnings("unused")
 	public List<AttendanceWorkDayConfig> listAll() throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
@@ -42,7 +44,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 		Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
 		return em.createQuery(cq).getResultList();
 	}
-	
+
 	//@MethodDescribe("列示指定Id的AttendanceWorkDayConfig信息列表")
 	public List<AttendanceWorkDayConfig> list(List<String> ids) throws Exception {
 		if( ids == null || ids.size() == 0 ){
@@ -55,7 +57,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 		Predicate p = root.get(AttendanceWorkDayConfig_.id).in(ids);
 		return em.createQuery(cq.where(p)).getResultList();
 	}
-	
+
 	//@MethodDescribe("根据年份月份列示全部的AttendanceWorkDayConfig信息列表")
 	public List<String> listByYearAndMonth( String year, String month ) throws Exception {
 		if( year == null ){
@@ -64,20 +66,20 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 		if( "0".equals(month) || "00".equals(month) || "(0)".equals(month)){
 			month = null;
 		}
-		
+
 		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
 		CriteriaBuilder cb = em.getCriteriaBuilder();
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
 		cq.select(root.get(AttendanceWorkDayConfig_.id));
-		
+
 		Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configYear), year);
 		if( month != null ){
 			p = cb.and( p, cb.equal( root.get(AttendanceWorkDayConfig_.configMonth), month));
 		}
 		return em.createQuery(cq.where(p)).getResultList();
 	}
-	
+
 	//@MethodDescribe("根据年份和节假日名称列示全部的AttendanceWorkDayConfig信息列表")
 	public List<String> listByYearAndName( String year, String configName ) throws Exception {
 		if( year == null ){
@@ -88,14 +90,14 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
 		cq.select(root.get(AttendanceWorkDayConfig_.id));
-		
+
 		Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configYear), year);
 		if( configName != null ){
 			p = cb.and( p, cb.equal( root.get(AttendanceWorkDayConfig_.configName), configName));
 		}
 		return em.createQuery(cq.where(p)).getResultList();
 	}
-	
+
 	//@MethodDescribe("根据节假日名称列示全部的AttendanceWorkDayConfig信息列表")
 	public List<String> listByName( String configName ) throws Exception {
 		EntityManager em = this.entityManagerContainer().get(AttendanceWorkDayConfig.class);
@@ -103,9 +105,9 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 		CriteriaQuery<String> cq = cb.createQuery(String.class);
 		Root<AttendanceWorkDayConfig> root = cq.from( AttendanceWorkDayConfig.class);
 		cq.select(root.get(AttendanceWorkDayConfig_.id));
-		
+
 		Predicate p = cb.equal( root.get(AttendanceWorkDayConfig_.configName), configName);
-		
+
 		return em.createQuery(cq.where(p)).getResultList();
 	}
 
@@ -129,7 +131,8 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 			isHoliday = true;
 			dateString = s_year + "-" + _month + "-" + (i<10?"0"+i:i);
 			//判断当天是否周末
-			if( !dateOperation.isWeekend( dateOperation.getDateFromString( dateString )) ){
+			//if( !dateOperation.isWeekend( dateOperation.getDateFromString( dateString )) ){
+			if( !attendanceSettingServiceAdv.isWeekend( dateOperation.getDateFromString( dateString )) ){
 				//如果不是周末
 				if( workDayConfigList != null && workDayConfigList.size() > 0 ){
 					//遍历所有的节假日配置进行判断,是否法定节假日
@@ -161,7 +164,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 		}
 		return workDaysCountForMonth;
 	}
-	
+
 	//@MethodDescribe("根据节假日配置计算一个周期内的应出勤天数")
 	public Integer getWorkDaysCountForMonth( Date startDate, Date endDate, List<AttendanceWorkDayConfig> workDayConfigList ) throws Exception {
 		/**
@@ -181,7 +184,7 @@ public class AttendanceWorkDayConfigFactory extends AbstractFactory {
 			workDaysCountForMonth = dateStringList.size();
 			for( String dateString : dateStringList){
 				//判断当天是否周末
-				if( !dateOperation.isWeekend( dateOperation.getDateFromString( dateString )) ){
+				if(!attendanceSettingServiceAdv.isWeekend( dateOperation.getDateFromString( dateString ))  ){
 					//如果不是周末
 					if( workDayConfigList != null && workDayConfigList.size() > 0 ){
 						//遍历所有的节假日配置进行判断,是否法定节假日

+ 6 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attachment/ActionExportHolidayDetail.java

@@ -6,6 +6,7 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.Row;
 import org.apache.poi.ss.usermodel.Sheet;
@@ -126,9 +127,13 @@ public class ActionExportHolidayDetail extends BaseAction {
 						attendanceSelfHoliday = holidayList.get(i);
 						if( attendanceSelfHoliday != null ){
 							row = sheet.createRow(i + 1);
+							String empName = attendanceSelfHoliday.getEmployeeName();
+							if(StringUtils.isNotEmpty(empName) && StringUtils.contains(empName,"@")){
+								empName = empName.split("@")[0];
+							}
 							row.createCell(0).setCellValue(attendanceSelfHoliday.getTopUnitName());
 							row.createCell(1).setCellValue(attendanceSelfHoliday.getUnitName());
-							row.createCell(2).setCellValue(attendanceSelfHoliday.getEmployeeName());
+							row.createCell(2).setCellValue(empName);
 							row.createCell(3).setCellValue(attendanceSelfHoliday.getLeaveType());
 							
 							if( attendanceSelfHoliday.getStartTime() != null ){

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

@@ -86,7 +86,14 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 				attendanceDetailMobile.setLongitude( wrapIn.getLongitude() );
 			}
 		}
-
+		if( check ){
+			//是否在范围外打卡,默认否
+			if( wrapIn.getIsExternal() ){
+				attendanceDetailMobile.setIsExternal(true);
+			}else{
+				attendanceDetailMobile.setIsExternal(false);
+			}
+		}
 		if( check ){
 			String distinguishedName = wrapIn.getEmpName();
 			if( StringUtils.isEmpty( distinguishedName )){
@@ -240,6 +247,12 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 		@FieldDescribe( "操作设备类别:Mac|Windows|IOS|Android|其他, 可以为空." )
 		private String optSystemName = "其他";
 
+		@FieldDescribe( "工作地点描述, 可以为空." )
+		private String workAddress = "未知";
+
+		@FieldDescribe("是否范围外打卡")
+		private Boolean isExternal = false;
+
 		public String getRecordDateString() {
 			return recordDateString;
 		}
@@ -316,6 +329,18 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 		public void setCheckin_type(String checkin_type) { this.checkin_type = checkin_type; }
 		public long getCheckin_time() { return checkin_time; }
 		public void setCheckin_time(long checkin_time) { this.checkin_time = checkin_time; }
+		public String getWorkAddress() {
+			return workAddress;
+		}
+		public void setWorkAddress(String workAddress) {
+			this.workAddress = workAddress;
+		}
+		public Boolean getIsExternal() {
+			return isExternal;
+		}
+		public void setIsExternal(Boolean isExternal) {
+			this.isExternal = isExternal;
+		}
 	}
 	
 	public static class Wo extends WoId {

+ 3 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseService.java

@@ -40,6 +40,7 @@ public class AttendanceDetailAnalyseService {
 	private AttendanceDetailAnalyseCoreService attendanceDetailAnalyseCoreService = new AttendanceDetailAnalyseCoreService();
 	private DateOperation dateOperation = new DateOperation();
 	private UserManagerService userManagerService = new UserManagerService();
+	private  AttendanceSettingServiceAdv attendanceSettingServiceAdv = new AttendanceSettingServiceAdv();
 
 	/**
 	 * 根据员工姓名\开始日期\结束日期查询日期范围内所有的打卡记录信息ID列表<br/>
@@ -336,7 +337,8 @@ public class AttendanceDetailAnalyseService {
 
 			if( check ){
 				try{
-					detail.setIsWeekend( dateOperation.isWeekend( detail.getRecordDate() ));
+					System.out.println("isWeekend="+attendanceSettingServiceAdv.isWeekend( detail.getRecordDate()));
+					detail.setIsWeekend( attendanceSettingServiceAdv.isWeekend( detail.getRecordDate() ));
 				}catch( Exception e ){
 					check = false;
 					logger.warn( "system analyse record date may be weekend got an exception." + detail.getRecordDateString() );

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

@@ -24,6 +24,7 @@ public class AttendanceDetailServiceAdv {
 	private AttendanceDetailService attendanceDetailService = new AttendanceDetailService();
 	private AttendanceDetailMobileService attendanceDetailMobileService = new AttendanceDetailMobileService();
 	private AttendanceScheduleSettingService attendanceScheduleSettingService = new AttendanceScheduleSettingService();
+	private AttendanceSettingService attendanceSettingService = new AttendanceSettingService();
 //	protected AttendanceDetailAnalyseServiceAdv attendanceDetailAnalyseServiceAdv = new AttendanceDetailAnalyseServiceAdv();
 //	protected AttendanceWorkDayConfigServiceAdv attendanceWorkDayConfigServiceAdv = new AttendanceWorkDayConfigServiceAdv();
 //	protected AttendanceStatisticalCycleServiceAdv attendanceStatisticCycleServiceAdv = new AttendanceStatisticalCycleServiceAdv();
@@ -282,6 +283,16 @@ public class AttendanceDetailServiceAdv {
 	 * @throws Exception
 	 */
 	public void pushToDetail(String distinguishedName, String recordDateString, Boolean debugger ) throws Exception {
+		//查询外勤打卡配置
+		Boolean ATTENDANCE_FIELD = false;
+		try (EntityManagerContainer em = EntityManagerContainerFactory.instance().create()) {
+			AttendanceSetting attendanceSettingField = attendanceSettingService.getByCode(em,"ATTENDANCE_FIELD");
+			if(attendanceSettingField !=null &&  StringUtils.equalsIgnoreCase(attendanceSettingField.getConfigValue(),"true")){
+				ATTENDANCE_FIELD = true;
+			}
+		}catch ( Exception e0 ) {
+			throw e0;
+		}
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 			List<AttendanceDetailMobile> mobileDetails = attendanceDetailMobileService.listAttendanceDetailMobileWithEmployee( emc, distinguishedName, recordDateString );
 			if( ListTools.isNotEmpty( mobileDetails )) {
@@ -292,7 +303,11 @@ public class AttendanceDetailServiceAdv {
 				if( scheduleSetting == null ){
 					throw new Exception("scheduleSetting is null, empName:" + distinguishedName );
 				}
-
+				for( AttendanceDetailMobile detailMobile : mobileDetails ) {
+					if(detailMobile.getIsExternal()){
+						ATTENDANCE_FIELD = true;
+					}
+				}
 				//获取打卡策略:两次,三次还是四次
 				//根据考勤打卡规则来判断启用何种规则来进行考勤结果分析
 				if( 2 == scheduleSetting.getSignProxy() ){
@@ -305,6 +320,7 @@ public class AttendanceDetailServiceAdv {
 					//1、一天只打上下班两次卡
 					detail = new ComposeDetailWithMobileInSignProxy1().compose( mobileDetails, scheduleSetting, debugger);
 				}
+				detail.setIsExternal(ATTENDANCE_FIELD);
 				if( detail_old == null ) {
 					detail.setBatchName( "FromMobile_" + dateOperation.getNowTimeChar() );
 					detail.setRecordStatus(1);

+ 28 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceSettingServiceAdv.java

@@ -8,11 +8,13 @@ import com.x.attendance.entity.AttendanceDetail;
 import com.x.attendance.entity.AttendanceSetting;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
-
+import java.util.Calendar;
+import java.util.Date;
 
 public class AttendanceSettingServiceAdv {
 
 	private AttendanceSettingService attendanceSettingService = new AttendanceSettingService();
+	private DateOperation dateOperation = new DateOperation();
 
 	public List<AttendanceSetting> listAll() throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
@@ -109,4 +111,29 @@ public class AttendanceSettingServiceAdv {
 		attendanceAppealInfo.setEndTime( endTime );
 		return attendanceAppealInfo;
 	}
+	/**
+	 * 判断是否周末
+	 * @param recordDate
+	 * @return
+	 */
+	public boolean isWeekend( Date recordDate ) throws Exception {
+		boolean iflag = false;
+		Calendar cal = Calendar.getInstance();
+		cal.setTime( recordDate );
+
+
+		if(cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY || cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY){
+			AttendanceSetting attendanceSetting = this.getByCode("ATTENDANCE_WEEKEND");
+			String configValue =  attendanceSetting.getConfigValue();
+			if(attendanceSetting != null){
+				if( (configValue.indexOf("周六")>-1 && cal.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY) || (configValue.indexOf("周日")>-1 && cal.get(Calendar.DAY_OF_WEEK)==Calendar.SUNDAY)){
+					iflag = true;
+				}
+			}else{
+				iflag = true;
+			}
+
+		}
+		return iflag;
+	}
 }

+ 14 - 0
o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceDetail.java

@@ -336,6 +336,12 @@ public class AttendanceDetail extends SliceJpaObject {
 	@CheckPersist(allowEmpty = true)
 	private String archiveTime;
 
+	public static final String isExternal_FIELDNAME = "isExternal";
+	@FieldDescribe("是否范围外打卡")
+	@Column(name = ColumnNamePrefix + isExternal_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private Boolean isExternal = false;
+
 	public String getMorningOffDutyTime() {
 		return morningOffDutyTime;
 	}
@@ -1170,6 +1176,14 @@ public class AttendanceDetail extends SliceJpaObject {
 		isWeekend = weekend;
 	}
 
+	public Boolean getIsExternal() {
+		return isExternal;
+	}
+
+	public void setIsExternal(Boolean isExternal) {
+		this.isExternal = isExternal;
+	}
+
 	/**
 	 * 清除对该条数据信息的分析结果
 	 */

+ 28 - 0
o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceDetailMobile.java

@@ -159,6 +159,18 @@ public class AttendanceDetailMobile extends SliceJpaObject {
 	@Column( name = ColumnNamePrefix + recordStatus_FIELDNAME )
 	private Integer recordStatus = 0;
 
+	public static final String workAddress_FIELDNAME = "workAddress";
+	@FieldDescribe("打卡地点描述")
+	@Column( length = JpaObject.length_255B, name = ColumnNamePrefix + workAddress_FIELDNAME )
+	@CheckPersist(allowEmpty = true)
+	private String workAddress;
+
+	public static final String isExternal_FIELDNAME = "isExternal";
+	@FieldDescribe("是否范围外打卡")
+	@Column(name = ColumnNamePrefix + isExternal_FIELDNAME)
+	@CheckPersist(allowEmpty = true)
+	private Boolean isExternal = false;
+
 	public String getEmpNo() {
 		return empNo;
 	}
@@ -270,4 +282,20 @@ public class AttendanceDetailMobile extends SliceJpaObject {
 	public long getCheckin_time() { return checkin_time; }
 
 	public void setCheckin_time(long checkin_time) { this.checkin_time = checkin_time; }
+
+	public String getWorkAddress() {
+		return workAddress;
+	}
+
+	public void setWorkAddress(String workAddress) {
+		this.workAddress = workAddress;
+	}
+
+	public Boolean getIsExternal() {
+		return isExternal;
+	}
+
+	public void setIsExternal(Boolean isExternal) {
+		this.isExternal = isExternal;
+	}
 }