Преглед изворни кода

移动考勤打卡分析需求修改,打卡策略可选择一天二次,三次,四次打卡,目前实现三种策略

o2lee пре 5 година
родитељ
комит
6eb075c21b
13 измењених фајлова са 115 додато и 110 уклоњено
  1. 27 27
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListMyMobileRecordToday.java
  2. 27 43
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionReciveAttendanceMobile.java
  3. 13 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionDelete.java
  4. 12 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionDeleteByWfDocId.java
  5. 8 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionSave.java
  6. 12 8
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseCoreService.java
  7. 0 13
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseSignProxy1.java
  8. 10 8
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailServiceAdv.java
  9. 1 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/ComposeDetailWithMobileInSignProxy1.java
  10. 2 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/ComposeDetailWithMobileInSignProxy2.java
  11. 1 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/ComposeDetailWithMobileInSignProxy3.java
  12. 1 1
      o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceDetailMobile.java
  13. 1 1
      o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceScheduleSetting.java

+ 27 - 27
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListMyMobileRecordToday.java

@@ -75,15 +75,15 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 			if( scheduleSetting != null ){
 			if( scheduleSetting != null ){
 				woScheduleSetting = WoScheduleSetting.copier.copy(scheduleSetting);
 				woScheduleSetting = WoScheduleSetting.copier.copy(scheduleSetting);
 
 
-				if( scheduleSetting.getSignProxy() == 3 ){
+				if( woScheduleSetting.getSignProxy() == 3 ){
 					//3-四次打卡(上午下午都打上班下班卡)
 					//3-四次打卡(上午下午都打上班下班卡)
-					woSignFeature = getWoSignFeatureWithProxy3(wraps, scheduleSetting);
-				}else if( scheduleSetting.getSignProxy() == 2 ){
+					woSignFeature = getWoSignFeatureWithProxy3(wraps, woScheduleSetting);
+				}else if( woScheduleSetting.getSignProxy() == 2 ){
 					//2-三次打卡(上午上班,下午下班加中午一次共三次)
 					//2-三次打卡(上午上班,下午下班加中午一次共三次)
-					woSignFeature = getWoSignFeatureWithProxy2(wraps, scheduleSetting);
+					woSignFeature = getWoSignFeatureWithProxy2(wraps, woScheduleSetting);
 				}else{
 				}else{
 					//1-两次打卡(上午上班,下午下班)
 					//1-两次打卡(上午上班,下午下班)
-					woSignFeature = getWoSignFeatureWithProxy1(wraps, scheduleSetting);
+					woSignFeature = getWoSignFeatureWithProxy1(wraps, woScheduleSetting);
 				}
 				}
 			}
 			}
 			if( woSignFeature != null ){
 			if( woSignFeature != null ){
@@ -138,11 +138,11 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 			if( now.after(afternoonOndutyTime)){
 			if( now.after(afternoonOndutyTime)){
 				//在下午下班时间之后了,下午上班签到打卡
 				//在下午下班时间之后了,下午上班签到打卡
 				woSignFeature.setSignSeq(1);
 				woSignFeature.setSignSeq(1);
-				woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_AFTERNOON_ONDUTY );
+				woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_AFTERNOON_ONDUTY );
 				woSignFeature.setSignTime(scheduleSetting.getOnDutyTime());
 				woSignFeature.setSignTime(scheduleSetting.getOnDutyTime());
 			}else{
 			}else{
 				woSignFeature.setSignSeq(1);
 				woSignFeature.setSignSeq(1);
-				woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_ONDUTY );
+				woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_ONDUTY );
 				woSignFeature.setSignTime(scheduleSetting.getOnDutyTime());
 				woSignFeature.setSignTime(scheduleSetting.getOnDutyTime());
 			}
 			}
 		}else{
 		}else{
@@ -150,41 +150,41 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 			//当前是什么区间
 			//当前是什么区间
 			if( onDutyTime.after(now)){
 			if( onDutyTime.after(now)){
 				//上午上班之前,无论几次,都只可能是上午的下班卡
 				//上午上班之前,无论几次,都只可能是上午的下班卡
-				woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_MORNING_OFFDUTY );
+				woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_MORNING_OFFDUTY );
 				woSignFeature.setSignTime(scheduleSetting.getMiddayRestStartTime());
 				woSignFeature.setSignTime(scheduleSetting.getMiddayRestStartTime());
 				woSignFeature.setSignSeq(2);
 				woSignFeature.setSignSeq(2);
 			}else if( now.after(onDutyTime) && morningOffdutyTime.after(now)){
 			}else if( now.after(onDutyTime) && morningOffdutyTime.after(now)){
 				//上午上班时段: 上午签退
 				//上午上班时段: 上午签退
 				woSignFeature.setSignSeq(2);
 				woSignFeature.setSignSeq(2);
-				woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_MORNING_OFFDUTY );
+				woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_MORNING_OFFDUTY );
 				woSignFeature.setSignTime(scheduleSetting.getMiddayRestStartTime());
 				woSignFeature.setSignTime(scheduleSetting.getMiddayRestStartTime());
 			}else if( now.after(morningOffdutyTime) && afternoonOndutyTime.after( now )){
 			}else if( now.after(morningOffdutyTime) && afternoonOndutyTime.after( now )){
 				//午休时段:前一次打卡有可能上午签到卡,可能下午签到卡
 				//午休时段:前一次打卡有可能上午签到卡,可能下午签到卡
 				if( signRecordStatus.alreadyOnduty ){ //已经上午签到过了,只有一次卡,应该就是签到
 				if( signRecordStatus.alreadyOnduty ){ //已经上午签到过了,只有一次卡,应该就是签到
-					woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_MORNING_OFFDUTY );
+					woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_MORNING_OFFDUTY );
 					woSignFeature.setSignTime(scheduleSetting.getMiddayRestStartTime());
 					woSignFeature.setSignTime(scheduleSetting.getMiddayRestStartTime());
 				}else if( signRecordStatus.alreadyAfternoonOnDuty){
 				}else if( signRecordStatus.alreadyAfternoonOnDuty){
 					//如果上午没有签到,是下午的签到的话,第二次就应该是下午签退打卡了
 					//如果上午没有签到,是下午的签到的话,第二次就应该是下午签退打卡了
-					woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
+					woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
 					woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 					woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 				}
 				}
 			}else if( now.after(afternoonOndutyTime) && offDutyTime.after(now)){
 			}else if( now.after(afternoonOndutyTime) && offDutyTime.after(now)){
 				//下午上班时段,如果前一次是下午签到,那么下一次就应该是下午签退了,否则,就是下午签到
 				//下午上班时段,如果前一次是下午签到,那么下一次就应该是下午签退了,否则,就是下午签到
 				if( signRecordStatus.alreadyAfternoonOnDuty){
 				if( signRecordStatus.alreadyAfternoonOnDuty){
-					woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY  );
+					woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY  );
 					woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 					woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 				}else{
 				}else{
-					woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_AFTERNOON_ONDUTY  );
+					woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_AFTERNOON_ONDUTY  );
 					woSignFeature.setSignTime(scheduleSetting.getMiddayRestEndTime());
 					woSignFeature.setSignTime(scheduleSetting.getMiddayRestEndTime());
 				}
 				}
 			}else{
 			}else{
 				//下午下班之后,只可能是下午的签到签退卡了
 				//下午下班之后,只可能是下午的签到签退卡了
 				if( signRecordStatus.alreadyAfternoonOnDuty){
 				if( signRecordStatus.alreadyAfternoonOnDuty){
 					woSignFeature.setSignSeq(-1);
 					woSignFeature.setSignSeq(-1);
-					woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY  );
+					woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY  );
 					woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 					woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 				}else{
 				}else{
-					woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_AFTERNOON_ONDUTY  );
+					woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_AFTERNOON_ONDUTY  );
 					woSignFeature.setSignTime(scheduleSetting.getMiddayRestEndTime());
 					woSignFeature.setSignTime(scheduleSetting.getMiddayRestEndTime());
 				}
 				}
 			}
 			}
@@ -221,7 +221,7 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 		if( ListTools.isEmpty( wraps )){
 		if( ListTools.isEmpty( wraps )){
 			//一次都没有打过,不管几点,都是上班打卡
 			//一次都没有打过,不管几点,都是上班打卡
 			woSignFeature.setSignSeq(1);
 			woSignFeature.setSignSeq(1);
-			woSignFeature.setSignName( "上班签到" );
+			woSignFeature.setCheckinType( "上班签到" );
 			woSignFeature.setSignTime(scheduleSetting.getOnDutyTime());
 			woSignFeature.setSignTime(scheduleSetting.getOnDutyTime());
 		}else{
 		}else{
 			//打了一次,之后,有可能是中午签到打卡,有可能是下午下班签退打卡
 			//打了一次,之后,有可能是中午签到打卡,有可能是下午下班签退打卡
@@ -233,11 +233,11 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 					//看当前时间,有没有过中午签到时间
 					//看当前时间,有没有过中午签到时间
 					if( middayRestEndTime !=null && middayRestEndTime.before( now )){
 					if( middayRestEndTime !=null && middayRestEndTime.before( now )){
 						//在午休结束之后了,就是下班打卡了,上班和午休都缺卡了
 						//在午休结束之后了,就是下班打卡了,上班和午休都缺卡了
-						woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
+						woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
 						woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 						woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 					}else{
 					}else{
 						//午休卡
 						//午休卡
-						woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_AFTERNOON );
+						woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_AFTERNOON );
 						woSignFeature.setSignTime(scheduleSetting.getMiddayRestEndTime());
 						woSignFeature.setSignTime(scheduleSetting.getMiddayRestEndTime());
 					}
 					}
 				}
 				}
@@ -257,17 +257,17 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 					}
 					}
 					if( exists_offDuty ){
 					if( exists_offDuty ){
 						woSignFeature.setSignSeq(-1);
 						woSignFeature.setSignSeq(-1);
-						woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
+						woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
 						woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 						woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 					}else{
 					}else{
 						woSignFeature.setSignSeq(3);
 						woSignFeature.setSignSeq(3);
-						woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
+						woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
 						woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 						woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 					}
 					}
 				}
 				}
 			}else{
 			}else{
 				woSignFeature.setSignSeq(-1);
 				woSignFeature.setSignSeq(-1);
-				woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
+				woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
 				woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 				woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 			}
 			}
 		}
 		}
@@ -287,17 +287,17 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 		if( ListTools.isEmpty( wraps )){
 		if( ListTools.isEmpty( wraps )){
 			//一次都没有打过,不管几点,都是上班打卡
 			//一次都没有打过,不管几点,都是上班打卡
 			woSignFeature.setSignSeq(1);
 			woSignFeature.setSignSeq(1);
-			woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_ONDUTY );
+			woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_ONDUTY );
 			woSignFeature.setSignTime(scheduleSetting.getOnDutyTime());
 			woSignFeature.setSignTime(scheduleSetting.getOnDutyTime());
 		}else{
 		}else{
 			//打了一次,就是下班打卡,打了两次,就没有了
 			//打了一次,就是下班打卡,打了两次,就没有了
 			if( wraps.size() == 1 ){
 			if( wraps.size() == 1 ){
 				woSignFeature.setSignSeq(2);
 				woSignFeature.setSignSeq(2);
-				woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
+				woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
 				woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 				woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 			}else{
 			}else{
 				woSignFeature.setSignSeq(-1); //没有需要的打卡了
 				woSignFeature.setSignSeq(-1); //没有需要的打卡了
-				woSignFeature.setSignName( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
+				woSignFeature.setCheckinType( AttendanceDetailMobile.CHECKIN_TYPE_OFFDUTY );
 				woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 				woSignFeature.setSignTime(scheduleSetting.getOffDutyTime());
 			}
 			}
 		}
 		}
@@ -418,7 +418,7 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 		private String signTime = null;
 		private String signTime = null;
 
 
 		@FieldDescribe("打卡操作名称:上班打卡|下班打卡|午休打卡|上午下班打卡|下午上班打卡(根据不同的打卡策略稍有不同)....")
 		@FieldDescribe("打卡操作名称:上班打卡|下班打卡|午休打卡|上午下班打卡|下午上班打卡(根据不同的打卡策略稍有不同)....")
-		private String signName = "上班打卡";
+		private String checkinType = "上班打卡";
 
 
 		@FieldDescribe("最晚打卡时间")
 		@FieldDescribe("最晚打卡时间")
 		private Date latestSignTime;
 		private Date latestSignTime;
@@ -435,9 +435,9 @@ public class ActionListMyMobileRecordToday extends BaseAction {
 
 
 		public void setSignDate(String signDate) { this.signDate = signDate; }
 		public void setSignDate(String signDate) { this.signDate = signDate; }
 
 
-		public String getSignName() { return signName; }
+		public String getCheckinType() { return checkinType; }
 
 
-		public void setSignName(String signName) { this.signName = signName; }
+		public void setCheckinType(String checkinType) { this.checkinType = checkinType; }
 
 
 		public Date getLatestSignTime() { return latestSignTime; }
 		public Date getLatestSignTime() { return latestSignTime; }
 
 

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

@@ -2,6 +2,7 @@ package com.x.attendance.assemble.control.jaxrs.attendancedetail;
 
 
 import java.util.Date;
 import java.util.Date;
 
 
+import javax.persistence.Column;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 
 
@@ -39,40 +40,29 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 		}
 		}
 
 
 		if( check ){
 		if( check ){
-			if( wrapIn.getRecordAddress() == null || wrapIn.getRecordAddress().isEmpty() ){
-				check = false;
-				Exception exception = new ExceptionAddressEmpty();
-				result.error( exception );
-				//logger.error( e, currentPerson, request, null);
-			}else{
+			if( StringUtils.isNotEmpty(wrapIn.getRecordAddress()) ){
 				attendanceDetailMobile.setRecordAddress( wrapIn.getRecordAddress() );
 				attendanceDetailMobile.setRecordAddress( wrapIn.getRecordAddress() );
 			}
 			}
 		}
 		}
 		if( check ){
 		if( check ){
-			if( wrapIn.getLatitude() == null || wrapIn.getLatitude().isEmpty() ){
-				check = false;
-				Exception exception = new ExceptionLatitudeEmpty();
-				result.error( exception );
-				//logger.error( e, currentPerson, request, null);
-			}else{
+			if( StringUtils.isNotEmpty(wrapIn.getLatitude())){
 				attendanceDetailMobile.setLatitude( wrapIn.getLatitude() );
 				attendanceDetailMobile.setLatitude( wrapIn.getLatitude() );
 			}
 			}
 		}
 		}
 		if( check ){
 		if( check ){
-			if( wrapIn.getLongitude() == null || wrapIn.getLongitude().isEmpty() ){
-				check = false;
-				Exception exception = new ExceptionLongitudeEmpty();
-				result.error( exception );
-				//logger.error( e, currentPerson, request, null);
-			}else{
+			if( StringUtils.isNotEmpty(wrapIn.getLongitude())){
 				attendanceDetailMobile.setLongitude( wrapIn.getLongitude() );
 				attendanceDetailMobile.setLongitude( wrapIn.getLongitude() );
 			}
 			}
 		}
 		}
+
 		if( check ){
 		if( check ){
 			attendanceDetailMobile.setEmpName( currentPerson.getDistinguishedName() );
 			attendanceDetailMobile.setEmpName( currentPerson.getDistinguishedName() );
+			attendanceDetailMobile.setCheckin_time(wrapIn.getCheckin_time());
+			attendanceDetailMobile.setCheckin_type(wrapIn.getCheckin_type());
 		}
 		}
+
 		if( check ){
 		if( check ){
-			if( wrapIn.getSignTime() != null && wrapIn.getSignTime().trim().length() > 0 ){
+			if( StringUtils.isNotEmpty(wrapIn.getSignTime()) ){
 				try{
 				try{
 					datetime = dateOperation.getDateFromString( wrapIn.getSignTime() );
 					datetime = dateOperation.getDateFromString( wrapIn.getSignTime() );
 					attendanceDetailMobile.setSignTime( dateOperation.getDateStringFromDate( datetime, "HH:mm:ss") ); //打卡时间
 					attendanceDetailMobile.setSignTime( dateOperation.getDateStringFromDate( datetime, "HH:mm:ss") ); //打卡时间
@@ -85,6 +75,12 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 			}else{//打卡时间没有填写就填写为当前时间
 			}else{//打卡时间没有填写就填写为当前时间
 				attendanceDetailMobile.setSignTime( dateOperation.getNowTime() ); //打卡时间
 				attendanceDetailMobile.setSignTime( dateOperation.getNowTime() ); //打卡时间
 			}
 			}
+
+			if( wrapIn.checkin_time < 1500000000000L ){ //无效
+				attendanceDetailMobile.setCheckin_time( new Date().getTime() ); //打卡时间
+			}else{//打卡时间没有填写就填写为当前时间
+				attendanceDetailMobile.setCheckin_time( wrapIn.checkin_time ); //打卡时间
+			}
 		}
 		}
 		if( check ){
 		if( check ){
 			if( StringUtils.isNotEmpty( wrapIn.getRecordDateString() ) ){
 			if( StringUtils.isNotEmpty( wrapIn.getRecordDateString() ) ){
@@ -106,7 +102,6 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 			if( StringUtils.isNotEmpty( wrapIn.getId() )){
 			if( StringUtils.isNotEmpty( wrapIn.getId() )){
 				attendanceDetailMobile.setId( wrapIn.getId() );
 				attendanceDetailMobile.setId( wrapIn.getId() );
 			}
 			}
-			
 			attendanceDetailMobile.setSignDescription( wrapIn.getSignDescription() );
 			attendanceDetailMobile.setSignDescription( wrapIn.getSignDescription() );
 			try {
 			try {
 				attendanceDetailMobile = attendanceDetailServiceAdv.save( attendanceDetailMobile );
 				attendanceDetailMobile = attendanceDetailServiceAdv.save( attendanceDetailMobile );
@@ -119,28 +114,9 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 			}
 			}
 		}
 		}
 
 
-//		AttendanceScheduleSetting scheduleSetting = attendanceScheduleSettingService.getAttendanceScheduleSettingWithPerson( detail.getEmpName(), debugger );
-//		if( scheduleSetting == null ){
-//			throw new Exception("scheduleSetting is null, empName:" + detail.getEmpName() );
-//		}
-
-//		//获取打卡策略:两次,三次还是四次
-//		//根据考勤打卡规则来判断启用何种规则来进行考勤结果分析
-//		if ( 1 == scheduleSetting.getSignProxy() ){
-//			//1、一天只打上下班两次卡
-//
-//		}else if( 2 == scheduleSetting.getSignProxy() ){
-//			//2、一天三次打卡:打上班,下班两次卡外,中午休息时间也需要打一次卡,以确保员工在公司活动
-//
-//		}else if( 3 == scheduleSetting.getSignProxy() ){
-//			//3、一天四次打卡:打上午上班,上午下班,下午上班,下午下班四次卡
-//
-//		}
-
 		if( check ){
 		if( check ){
-			//对该员工的所有移动考勤数据进行一个整合
+			//对该员工的所有移动考勤数据进行一个整合,并且立即send到分析队列
 			attendanceDetailServiceAdv.pushToDetail( currentPerson.getDistinguishedName(), attendanceDetailMobile.getRecordDateString(), effectivePerson.getDebugger() );
 			attendanceDetailServiceAdv.pushToDetail( currentPerson.getDistinguishedName(), attendanceDetailMobile.getRecordDateString(), effectivePerson.getDebugger() );
-
 		}
 		}
 		return result;
 		return result;
 	}
 	}
@@ -157,7 +133,13 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 		private String empName;
 		private String empName;
 
 
 		@FieldDescribe( "打卡记录日期字符串:yyyy-mm-dd, 必须填写." )
 		@FieldDescribe( "打卡记录日期字符串:yyyy-mm-dd, 必须填写." )
-		private String recordDateString;	
+		private String recordDateString;
+
+		@FieldDescribe("打卡类型。字符串,目前有:上午上班打卡,上午下班打卡,下午上班打卡,下午下班打卡,外出打卡,午间打卡")
+		private String checkin_type;
+
+		@FieldDescribe("打卡时间。Unix时间戳")
+		private long checkin_time;
 
 
 		@FieldDescribe( "打卡时间: hh24:mi:ss, 必须填写." )
 		@FieldDescribe( "打卡时间: hh24:mi:ss, 必须填写." )
 		private String signTime;
 		private String signTime;
@@ -231,7 +213,6 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 		public void setOptSystemName(String optSystemName) {
 		public void setOptSystemName(String optSystemName) {
 			this.optSystemName = optSystemName;
 			this.optSystemName = optSystemName;
 		}
 		}
-		
 		public String getEmpNo() {
 		public String getEmpNo() {
 			return empNo;
 			return empNo;
 		}
 		}
@@ -256,7 +237,10 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 		public void setId(String id) {
 		public void setId(String id) {
 			this.id = id;
 			this.id = id;
 		}
 		}
-		
+		public String getCheckin_type() { return checkin_type; }
+		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 static class Wo extends WoId {
 	public static class Wo extends WoId {

+ 13 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionDelete.java

@@ -4,6 +4,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
+
+import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.entity.AttendanceSelfHoliday;
 import com.x.attendance.entity.AttendanceSelfHoliday;
 import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.EntityManagerContainer;
@@ -24,6 +26,7 @@ public class ActionDelete extends BaseAction {
 		ActionResult<Wo> result = new ActionResult<>();
 		ActionResult<Wo> result = new ActionResult<>();
 		EffectivePerson currentPerson = this.effectivePerson(request);
 		EffectivePerson currentPerson = this.effectivePerson(request);
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+
 			//先判断需要操作的应用信息是否存在,根据ID进行一次查询,如果不存在不允许继续操作
 			//先判断需要操作的应用信息是否存在,根据ID进行一次查询,如果不存在不允许继续操作
 			AttendanceSelfHoliday attendanceSelfHoliday = emc.find(id, AttendanceSelfHoliday.class);
 			AttendanceSelfHoliday attendanceSelfHoliday = emc.find(id, AttendanceSelfHoliday.class);
 			if (null == attendanceSelfHoliday) {
 			if (null == attendanceSelfHoliday) {
@@ -37,8 +40,17 @@ public class ActionDelete extends BaseAction {
 
 
 				//根据员工休假数据来记录与这条数据相关的统计需求记录
 				//根据员工休假数据来记录与这条数据相关的统计需求记录
 				List<String> ids = attendanceDetailAnalyseServiceAdv.listAnalyseAttendanceDetailIds( attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(), attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger() );
 				List<String> ids = attendanceDetailAnalyseServiceAdv.listAnalyseAttendanceDetailIds( attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(), attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger() );
+//				if( ListTools.isNotEmpty( ids ) ){
+//					attendanceDetailAnalyseServiceAdv.analyseAttendanceDetails( attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(), attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger()  );
+//				}
 				if( ListTools.isNotEmpty( ids ) ){
 				if( ListTools.isNotEmpty( ids ) ){
-					attendanceDetailAnalyseServiceAdv.analyseAttendanceDetails( attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(), attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger()  );
+					for( String _id : ids ){
+						try { //分析保存好的考勤数据
+							ThisApplication.detailAnalyseQueue.send( _id );
+						} catch ( Exception e1 ) {
+							e1.printStackTrace();
+						}
+					}
 				}
 				}
 			}			
 			}			
 		} catch ( Exception e ) {
 		} catch ( Exception e ) {

+ 12 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionDeleteByWfDocId.java

@@ -5,6 +5,7 @@ import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 
 
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.entity.AttendanceSelfHoliday;
 import com.x.attendance.entity.AttendanceSelfHoliday;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
@@ -48,8 +49,17 @@ public class ActionDeleteByWfDocId extends BaseAction {
 						ids = attendanceDetailAnalyseServiceAdv.listAnalyseAttendanceDetailIds(
 						ids = attendanceDetailAnalyseServiceAdv.listAnalyseAttendanceDetailIds(
 								attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(),
 								attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(),
 								attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger() );
 								attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger() );
-						if ( ListTools.isNotEmpty( ids ) ) {
-							attendanceDetailAnalyseServiceAdv.analyseAttendanceDetails( attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(), attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger() );
+//						if ( ListTools.isNotEmpty( ids ) ) {
+//							attendanceDetailAnalyseServiceAdv.analyseAttendanceDetails( attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(), attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger() );
+//						}
+						if( ListTools.isNotEmpty( ids ) ){
+							for( String id : ids ){
+								try { //分析保存好的考勤数据
+									ThisApplication.detailAnalyseQueue.send( id );
+								} catch ( Exception e1 ) {
+									e1.printStackTrace();
+								}
+							}
 						}
 						}
 					}
 					}
 				}
 				}

+ 8 - 3
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionSave.java

@@ -2,6 +2,7 @@ package com.x.attendance.assemble.control.jaxrs.selfholiday;
 
 
 import com.google.gson.JsonElement;
 import com.google.gson.JsonElement;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
 import com.x.attendance.assemble.control.ExceptionWrapInConvert;
+import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.entity.AttendanceSelfHoliday;
 import com.x.attendance.entity.AttendanceSelfHoliday;
 import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.attendance.entity.AttendanceStatisticalCycle;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.EntityManagerContainer;
@@ -25,8 +26,6 @@ public class ActionSave extends BaseAction {
 	private static  Logger logger = LoggerFactory.getLogger( ActionSave.class );
 	private static  Logger logger = LoggerFactory.getLogger( ActionSave.class );
 	
 	
 	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement ) throws Exception {
 	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson, JsonElement jsonElement ) throws Exception {
-		logger.info("+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++" );
-		logger.info("++++++++++++++++++++++调用接口:com.x.attendance.assemble.control.jaxrs.selfholiday.ActionSave......" );
 		ActionResult<Wo> result = new ActionResult<>();
 		ActionResult<Wo> result = new ActionResult<>();
 		Wi wrapIn = null;
 		Wi wrapIn = null;
 		List<AttendanceSelfHoliday> holidayList = null;
 		List<AttendanceSelfHoliday> holidayList = null;
@@ -105,7 +104,13 @@ public class ActionSave extends BaseAction {
 					//休假数据有更新,对该员工的该请假时间内的所有打卡记录进行分析
 					//休假数据有更新,对该员工的该请假时间内的所有打卡记录进行分析
 					List<String> ids = attendanceDetailAnalyseServiceAdv.listAnalyseAttendanceDetailIds(attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(), attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger() );
 					List<String> ids = attendanceDetailAnalyseServiceAdv.listAnalyseAttendanceDetailIds(attendanceSelfHoliday.getEmployeeName(), attendanceSelfHoliday.getStartTime(), attendanceSelfHoliday.getEndTime(), effectivePerson.getDebugger() );
 					if( ListTools.isNotEmpty( ids ) ){
 					if( ListTools.isNotEmpty( ids ) ){
-						attendanceDetailAnalyseServiceAdv.analyseAttendanceDetailWithIds(ids, effectivePerson.getDebugger() );
+						for( String id : ids ){
+							try { //分析保存好的考勤数据
+								ThisApplication.detailAnalyseQueue.send( id );
+							} catch ( Exception e1 ) {
+								e1.printStackTrace();
+							}
+						}
 					}
 					}
 				}else{
 				}else{
 					if( jsonElement == null ){
 					if( jsonElement == null ){

+ 12 - 8
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseCoreService.java

@@ -49,15 +49,15 @@ class AttendanceDetailAnalyseCoreService {
 			throw new Exception("scheduleSetting is null, empName:" + detail.getEmpName() );
 			throw new Exception("scheduleSetting is null, empName:" + detail.getEmpName() );
 		}
 		}
 		//根据考勤打卡规则来判断启用何种规则来进行考勤结果分析
 		//根据考勤打卡规则来判断启用何种规则来进行考勤结果分析
-		if ( 1 == scheduleSetting.getSignProxy() ){
-			//1、一天只打上下班两次卡
-			detail = new AttendanceDetailAnalyseSignProxy1().analyse(detail, scheduleSetting, debugger);
-		}else if( 2 == scheduleSetting.getSignProxy() ){
+		if( 2 == scheduleSetting.getSignProxy() ){
 			//2、一天三次打卡:打上班,下班两次卡外,中午休息时间也需要打一次卡,以确保员工在公司活动
 			//2、一天三次打卡:打上班,下班两次卡外,中午休息时间也需要打一次卡,以确保员工在公司活动
 			detail = new AttendanceDetailAnalyseSignProxy2().analyse(detail, scheduleSetting, debugger);
 			detail = new AttendanceDetailAnalyseSignProxy2().analyse(detail, scheduleSetting, debugger);
 		}else if( 3 == scheduleSetting.getSignProxy() ){
 		}else if( 3 == scheduleSetting.getSignProxy() ){
 			//3、一天四次打卡:打上午上班,上午下班,下午上班,下午下班四次卡
 			//3、一天四次打卡:打上午上班,上午下班,下午上班,下午下班四次卡
 			detail = new AttendanceDetailAnalyseSignProxy3().analyse(detail, scheduleSetting, debugger);
 			detail = new AttendanceDetailAnalyseSignProxy3().analyse(detail, scheduleSetting, debugger);
+		}else{
+			//1、一天只打上下班两次卡
+			detail = new AttendanceDetailAnalyseSignProxy1().analyse(detail, scheduleSetting, debugger);
 		}
 		}
 		return detail;
 		return detail;
 	}
 	}
@@ -154,8 +154,10 @@ class AttendanceDetailAnalyseCoreService {
 			if( StringUtils.isEmpty( detail.getOnDutyTime() ) ){
 			if( StringUtils.isEmpty( detail.getOnDutyTime() ) ){
 				logger.debug( debugger, "middleRestEndTime " );
 				logger.debug( debugger, "middleRestEndTime " );
 			}else{
 			}else{
-				logger.debug(debugger, "middleRestStartTime=" + detail.getRecordDateString() + " " + scheduleSetting.getMiddayRestStartTime());
-				return dateOperation.getDateFromString(detail.getRecordDateString() + " " + detail.getMiddayRestStartTime());
+				if( scheduleSetting.getMiddayRestStartTime() != null ){
+					logger.debug(debugger, "middleRestStartTime=" + detail.getRecordDateString() + " " + scheduleSetting.getMiddayRestStartTime());
+					return dateOperation.getDateFromString(detail.getRecordDateString() + " " + detail.getMiddayRestStartTime());
+				}
 			}
 			}
 		} catch (Exception e) {
 		} catch (Exception e) {
 			detail.setDescription(detail.getDescription() + "; 系统进行时间转换时发生异常,middleRestStartTime=" + detail.getRecordDateString() + " " + scheduleSetting.getMiddayRestStartTime() + " - " + scheduleSetting.getMiddayRestEndTime());
 			detail.setDescription(detail.getDescription() + "; 系统进行时间转换时发生异常,middleRestStartTime=" + detail.getRecordDateString() + " " + scheduleSetting.getMiddayRestStartTime() + " - " + scheduleSetting.getMiddayRestEndTime());
@@ -177,8 +179,10 @@ class AttendanceDetailAnalyseCoreService {
 			if( StringUtils.isEmpty( detail.getOnDutyTime() ) ){
 			if( StringUtils.isEmpty( detail.getOnDutyTime() ) ){
 				logger.debug( debugger, "middleRestEndTime " );
 				logger.debug( debugger, "middleRestEndTime " );
 			}else{
 			}else{
-				logger.debug(debugger, "middleRestEndTime=" + detail.getRecordDateString() + " " + scheduleSetting.getMiddayRestEndTime());
-				return dateOperation.getDateFromString(detail.getRecordDateString() + " " + detail.getMiddayRestEndTime());
+				if( scheduleSetting.getMiddayRestEndTime() != null ){
+					logger.debug(debugger, "middleRestEndTime=" + detail.getRecordDateString() + " " + scheduleSetting.getMiddayRestEndTime());
+					return dateOperation.getDateFromString(detail.getRecordDateString() + " " + detail.getMiddayRestEndTime());
+				}
 			}
 			}
 		} catch (Exception e) {
 		} catch (Exception e) {
 			detail.setDescription(detail.getDescription() + "; 系统进行时间转换时发生异常,middleRestEndTime=" + detail.getRecordDateString() + " " + scheduleSetting.getMiddayRestStartTime() + " - " + scheduleSetting.getMiddayRestEndTime());
 			detail.setDescription(detail.getDescription() + "; 系统进行时间转换时发生异常,middleRestEndTime=" + detail.getRecordDateString() + " " + scheduleSetting.getMiddayRestStartTime() + " - " + scheduleSetting.getMiddayRestEndTime());

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

@@ -149,19 +149,6 @@ class AttendanceDetailAnalyseSignProxy1 {
 							detail.setIsLeaveEarlier( true );
 							detail.setIsLeaveEarlier( true );
 						}
 						}
 					}
 					}
-//					else if ((leaveEarlyStartTime != null && offDutyTime.after(leaveEarlyStartTime)) && offDutyTime.before(offWorkTime)) {
-//						//打卡在早退起算之后,并在下班时间之前
-//						logger.debug(debugger, "下午打卡时间晚于早退计时时间早于下班时间......");
-//						if ( isSelfHoliday_Afternoon || isSelfHoliday_Afternoon || isNotWorkDay ) {
-//							logger.debug(debugger, ">>>>>>>>>>请幸运,请假不计考勤,出勤只算半天,但请过假了不算早退");
-//							detail.setLeaveEarlierTimeDuration(0L);
-//							detail.setIsLeaveEarlier(false);
-//						} else {
-//							minutes = dateOperation.getMinutes(offDutyTime, offWorkTime);//计算早退时长
-//							detail.setLeaveEarlierTimeDuration(minutes); //早退时长
-//							detail.setIsLeaveEarlier(true);
-//						}
-//					}
 					//下午已经签退了,现在计算全天的工作时长
 					//下午已经签退了,现在计算全天的工作时长
 					if( afternoonStartTime != null ){ //已经配置过了下午上班时间
 					if( afternoonStartTime != null ){ //已经配置过了下午上班时间
 						minutes = dateOperation.getMinutes( afternoonStartTime, offDutyTime);
 						minutes = dateOperation.getMinutes( afternoonStartTime, offDutyTime);

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

@@ -6,6 +6,7 @@ import java.util.Map;
 
 
 import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.entity.*;
 import com.x.attendance.entity.*;
+import com.x.base.core.entity.JpaObject;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.StringUtils;
 
 
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.common.date.DateOperation;
@@ -243,22 +244,22 @@ public class AttendanceDetailServiceAdv {
 				AttendanceDetail detail_old = attendanceDetailService.listDetailWithEmployee( emc, distinguishedName, recordDateString );
 				AttendanceDetail detail_old = attendanceDetailService.listDetailWithEmployee( emc, distinguishedName, recordDateString );
 				AttendanceDetail detail = null;
 				AttendanceDetail detail = null;
 
 
-				AttendanceScheduleSetting scheduleSetting = attendanceScheduleSettingService.getAttendanceScheduleSettingWithPerson( detail.getEmpName(), debugger );
+				AttendanceScheduleSetting scheduleSetting = attendanceScheduleSettingService.getAttendanceScheduleSettingWithPerson( distinguishedName, debugger );
 				if( scheduleSetting == null ){
 				if( scheduleSetting == null ){
-					throw new Exception("scheduleSetting is null, empName:" + detail.getEmpName() );
+					throw new Exception("scheduleSetting is null, empName:" + distinguishedName );
 				}
 				}
 
 
 				//获取打卡策略:两次,三次还是四次
 				//获取打卡策略:两次,三次还是四次
 				//根据考勤打卡规则来判断启用何种规则来进行考勤结果分析
 				//根据考勤打卡规则来判断启用何种规则来进行考勤结果分析
-				if ( 1 == scheduleSetting.getSignProxy() ){
-					//1、一天只打上下班两次卡
-					detail = new ComposeDetailWithMobileInSignProxy1().compose( mobileDetails, scheduleSetting, debugger);
-				}else if( 2 == scheduleSetting.getSignProxy() ){
+				if( 2 == scheduleSetting.getSignProxy() ){
 					//2、一天三次打卡:打上班,下班两次卡外,中午休息时间也需要打一次卡,以确保员工在公司活动
 					//2、一天三次打卡:打上班,下班两次卡外,中午休息时间也需要打一次卡,以确保员工在公司活动
 					detail = new ComposeDetailWithMobileInSignProxy2().compose( mobileDetails, scheduleSetting, debugger);
 					detail = new ComposeDetailWithMobileInSignProxy2().compose( mobileDetails, scheduleSetting, debugger);
 				}else if( 3 == scheduleSetting.getSignProxy() ){
 				}else if( 3 == scheduleSetting.getSignProxy() ){
 					//3、一天四次打卡:打上午上班,上午下班,下午上班,下午下班四次卡
 					//3、一天四次打卡:打上午上班,上午下班,下午上班,下午下班四次卡
 					detail = new ComposeDetailWithMobileInSignProxy3().compose( mobileDetails, scheduleSetting, debugger);
 					detail = new ComposeDetailWithMobileInSignProxy3().compose( mobileDetails, scheduleSetting, debugger);
+				}else{
+					//1、一天只打上下班两次卡
+					detail = new ComposeDetailWithMobileInSignProxy1().compose( mobileDetails, scheduleSetting, debugger);
 				}
 				}
 
 
 				if( detail_old == null ) {
 				if( detail_old == null ) {
@@ -266,9 +267,10 @@ public class AttendanceDetailServiceAdv {
 					emc.beginTransaction( AttendanceDetail.class );
 					emc.beginTransaction( AttendanceDetail.class );
 					emc.persist( detail , CheckPersistType.all );
 					emc.persist( detail , CheckPersistType.all );
 					emc.commit();
 					emc.commit();
+					detail_old = detail;
 				}else {
 				}else {
 					emc.beginTransaction( AttendanceDetail.class );
 					emc.beginTransaction( AttendanceDetail.class );
-					detail.copyTo( detail_old );
+					detail.copyTo( detail_old, JpaObject.FieldsUnmodify);
 					emc.check( detail_old , CheckPersistType.all );
 					emc.check( detail_old , CheckPersistType.all );
 					emc.commit();
 					emc.commit();
 				}
 				}
@@ -282,7 +284,7 @@ public class AttendanceDetailServiceAdv {
 
 
 				//分析保存好的考勤数据
 				//分析保存好的考勤数据
 				try {
 				try {
-					ThisApplication.detailAnalyseQueue.send( detail.getId() );
+					ThisApplication.detailAnalyseQueue.send( detail_old.getId() );
 				} catch ( Exception e1 ) {
 				} catch ( Exception e1 ) {
 					e1.printStackTrace();
 					e1.printStackTrace();
 				}
 				}

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

@@ -7,7 +7,7 @@ import com.x.attendance.entity.AttendanceScheduleSetting;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.ListTools;
 import com.x.base.core.project.tools.ListTools;
-import org.codehaus.plexus.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;

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

@@ -7,7 +7,8 @@ import com.x.attendance.entity.AttendanceScheduleSetting;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.ListTools;
 import com.x.base.core.project.tools.ListTools;
-import org.codehaus.plexus.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
+
 
 
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;

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

@@ -7,7 +7,7 @@ import com.x.attendance.entity.AttendanceScheduleSetting;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.logger.LoggerFactory;
 import com.x.base.core.project.tools.ListTools;
 import com.x.base.core.project.tools.ListTools;
-import org.codehaus.plexus.util.StringUtils;
+import org.apache.commons.lang3.StringUtils;
 
 
 import java.util.Date;
 import java.util.Date;
 import java.util.List;
 import java.util.List;

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

@@ -93,8 +93,8 @@ public class AttendanceDetailMobile extends SliceJpaObject {
 	public static final String CHECKIN_TYPE_MORNING_OFFDUTY = "上午下班打卡";
 	public static final String CHECKIN_TYPE_MORNING_OFFDUTY = "上午下班打卡";
 	public static final String CHECKIN_TYPE_AFTERNOON_ONDUTY = "下午上班打卡";
 	public static final String CHECKIN_TYPE_AFTERNOON_ONDUTY = "下午上班打卡";
 	public static final String CHECKIN_TYPE_OFFDUTY = "下午下班打卡";
 	public static final String CHECKIN_TYPE_OFFDUTY = "下午下班打卡";
-//	public static final String CHECKIN_TYPE_OUTSIDE = "外出打卡";
 	public static final String CHECKIN_TYPE_AFTERNOON = "午间打卡";
 	public static final String CHECKIN_TYPE_AFTERNOON = "午间打卡";
+	//	public static final String CHECKIN_TYPE_OUTSIDE = "外出打卡";
 
 
 	public static final String checkin_type_FIELDNAME = "checkin_type";
 	public static final String checkin_type_FIELDNAME = "checkin_type";
 	@FieldDescribe("打卡类型。字符串,目前有:上午上班打卡,上午下班打卡,下午上班打卡,下午下班打卡,外出打卡,午间打卡")
 	@FieldDescribe("打卡类型。字符串,目前有:上午上班打卡,上午下班打卡,下午上班打卡,下午下班打卡,外出打卡,午间打卡")

+ 1 - 1
o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceScheduleSetting.java

@@ -168,7 +168,7 @@ public class AttendanceScheduleSetting extends SliceJpaObject {
 
 
 	public void setMiddayRestEndTime(String middayRestEndTime) { this.middayRestEndTime = middayRestEndTime; }
 	public void setMiddayRestEndTime(String middayRestEndTime) { this.middayRestEndTime = middayRestEndTime; }
 
 
-	public Integer getSignProxy() { return signProxy; }
+	public Integer getSignProxy() { return signProxy == null? 1:signProxy; }
 
 
 	public void setSignProxy(Integer signProxy) { this.signProxy = signProxy; }
 	public void setSignProxy(Integer signProxy) { this.signProxy = signProxy; }