Browse Source

修复了考勤申诉使用流程时,启动流程和流程状态同步的问题

o2lee 5 years ago
parent
commit
88cef8117c
15 changed files with 252 additions and 47 deletions
  1. 2 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/AttendanceJaxrsFilter.java
  2. 71 13
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAppealCreateWithWorkFlow.java
  3. 27 5
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionWorkFlowSync.java
  4. 6 6
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/AttendanceAppealInfoAction.java
  5. 32 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListNextWithFilter.java
  6. 31 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListPrevWithFilter.java
  7. 27 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionListWithEmployee.java
  8. 17 10
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionReciveAttendanceMobile.java
  9. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceAppealInfoService.java
  10. 1 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceAppealInfoServiceAdv.java
  11. 21 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceScheduleSettingServiceAdv.java
  12. 1 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceSettingService.java
  13. 12 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/WorkFlowSyncService.java
  14. 1 1
      o2server/x_attendance_core_entity/src/main/java/com/x/attendance/entity/AttendanceAppealAuditInfo.java
  15. 2 2
      o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_attendance_assemble_control.java

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

@@ -2,6 +2,7 @@ package com.x.attendance.assemble.control.jaxrs;
 
 import javax.servlet.annotation.WebFilter;
 
+import com.x.base.core.project.jaxrs.CipherManagerUserJaxrsFilter;
 import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
 
 /**
@@ -29,6 +30,6 @@ import com.x.base.core.project.jaxrs.ManagerUserJaxrsFilter;
 		"/jaxrs/uuid/*",
 		"/servlet/*"
 }, asyncSupported = true)
-public class AttendanceJaxrsFilter extends ManagerUserJaxrsFilter {
+public class AttendanceJaxrsFilter extends CipherManagerUserJaxrsFilter {
 	
 }

+ 71 - 13
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionAppealCreateWithWorkFlow.java

@@ -6,7 +6,9 @@ import com.x.attendance.entity.AppealConfig;
 import com.x.attendance.entity.AttendanceAppealAuditInfo;
 import com.x.attendance.entity.AttendanceAppealInfo;
 import com.x.attendance.entity.AttendanceDetail;
+import com.x.base.core.entity.AbstractPersistenceProperties;
 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;
@@ -15,8 +17,10 @@ import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 import org.apache.commons.lang3.StringUtils;
 
+import javax.persistence.*;
 import javax.servlet.http.HttpServletRequest;
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 public class ActionAppealCreateWithWorkFlow extends BaseAction {
@@ -33,9 +37,9 @@ public class ActionAppealCreateWithWorkFlow extends BaseAction {
 
 		try {
 			wrapIn = this.convertToWrapIn(jsonElement, Wi.class);
-			if( StringUtils.isEmpty( wrapIn.getJobId() )){
+			if( StringUtils.isEmpty( wrapIn.getWorkId() )){
 				check = false;
-				Exception exception = new ExceptionAttendanceAppealProcess("使用流程启动申诉时,工作流的jobId不允许为空");
+				Exception exception = new ExceptionAttendanceAppealProcess("使用流程启动申诉时,工作流的workId不允许为空");
 				result.error(exception);
 			}
 		} catch (Exception e) {
@@ -45,6 +49,7 @@ public class ActionAppealCreateWithWorkFlow extends BaseAction {
 			logger.error(e, effectivePerson, request, null);
 		}
 
+		//根据传入的考勤信息ID查询考勤信息对象
 		if (check) {
 			try {
 				attendanceDetail = attendanceDetailServiceAdv.get( id );
@@ -66,21 +71,22 @@ public class ActionAppealCreateWithWorkFlow extends BaseAction {
 			attendanceAppealInfo = attendanceSettingServiceAdv.composeAppealInfoWithDetailInfo( attendanceDetail, 
 					wrapIn.getReason(), wrapIn.getAppealReason(),  wrapIn.getSelfHolidayType(),  wrapIn.getAddress(), 
 					wrapIn.getStartTime(),  wrapIn.getEndTime(),  wrapIn.getAppealDescription() );
+
 			// 创建一个申诉审批记录信息
 			attendanceAppealAuditInfo = new AttendanceAppealAuditInfo();
 			attendanceAppealAuditInfo.setId( attendanceAppealInfo.getId());
 			attendanceAppealAuditInfo.setDetailId( attendanceDetail.getId() );
 			attendanceAppealAuditInfo.setAuditFlowType( AppealConfig.APPEAL_AUDIFLOWTYPE_WORKFLOW );
-			attendanceAppealAuditInfo.setWorkId( wrapIn.getJobId());
+			attendanceAppealAuditInfo.setWorkId( wrapIn.getWorkId());
 		}
 
 		//保存申诉信息
 		if (check) {
 			try {
 				attendanceAppealInfo = attendanceAppealInfoServiceAdv.saveNewAppeal( attendanceAppealInfo, attendanceAppealAuditInfo );
+
 				result.setData(new Wo(attendanceAppealInfo.getId()));
 			} catch (Exception e) {
-				check = false;
 				Exception exception = new ExceptionAttendanceAppealProcess(e, "系统在保存考勤申诉信息息时发生异常。");
 				result.error(exception);
 				logger.error(e, effectivePerson, request, null);
@@ -89,25 +95,77 @@ public class ActionAppealCreateWithWorkFlow extends BaseAction {
 		return result;
 	}
 	
-	public static class Wi extends AttendanceAppealInfo {
-		
-		private static final long serialVersionUID = -5076990764713538973L;
-		
-		public static List<String> Excludes = new ArrayList<String>(JpaObject.FieldsUnmodify);
+	public static class Wi {
 
 		@FieldDescribe("申诉人的身份,考勤人员身份:如果考勤人员属于多个组织,可以选择一个身份进行申诉信息绑定.")
 		private String identity = null;
 
-		@FieldDescribe("考勤流程的JOBID.")
-		private String jobId = null;
+		@FieldDescribe("考勤流程的workId.")
+		private String workId = null;
+
+		@FieldDescribe("申诉开始时间")
+		private String startTime;
+
+		@FieldDescribe("申诉结束时间")
+		private String endTime;
+
+		@FieldDescribe("申诉原因简述(60个汉字)")
+		private String appealReason;
+
+		@FieldDescribe("请假类型")
+		private String selfHolidayType;
 
-		public String getJobId() { return jobId; }
+		@FieldDescribe("地址")
+		private String address;
 
-		public void setJobId(String jobId) { this.jobId = jobId; }
+		@FieldDescribe("申诉详细事由, 500字")
+		private String reason;
+
+		@FieldDescribe("申诉详细说明, 500字")
+		private String appealDescription;
+
+		@FieldDescribe("审批状态:0-待处理,1-审批通过,-1-审批不能过,2-需要下一次审批")
+		private Integer status = 0;
+
+		public String getWorkId() { return workId; }
+
+		public void setWorkId(String workId) { this.workId = workId; }
 
 		public String getIdentity() { return identity; }
 
 		public void setIdentity(String identity) { this.identity = identity; }
+
+		public String getStartTime() { return startTime; }
+
+		public void setStartTime(String startTime) { this.startTime = startTime; }
+
+		public String getEndTime() { return endTime; }
+
+		public void setEndTime(String endTime) { this.endTime = endTime; }
+
+		public String getAppealReason() { return appealReason; }
+
+		public void setAppealReason(String appealReason) { this.appealReason = appealReason; }
+
+		public String getSelfHolidayType() { return selfHolidayType; }
+
+		public void setSelfHolidayType(String selfHolidayType) { this.selfHolidayType = selfHolidayType; }
+
+		public String getAddress() { return address; }
+
+		public void setAddress(String address) { this.address = address; }
+
+		public String getReason() { return reason; }
+
+		public void setReason(String reason) { this.reason = reason; }
+
+		public String getAppealDescription() { return appealDescription; }
+
+		public void setAppealDescription(String appealDescription) { this.appealDescription = appealDescription; }
+
+		public Integer getStatus() { return status; }
+
+		public void setStatus(Integer status) { this.status = status; }
 	}
 	
 	public static class Wo extends WoId {

+ 27 - 5
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/ActionWorkFlowSync.java

@@ -27,14 +27,14 @@ public class ActionWorkFlowSync extends BaseAction {
 		ActionResult<Wo> result = new ActionResult<>();
 		AttendanceAppealInfo attendanceAppealInfo = null;
 		AttendanceAppealAuditInfo attendanceAppealAuditInfo = null;
-		WorkFlowSyncService.WoWorkComplex woWorkComplex = null;
+		WorkFlowSyncService.WoWorkOrCompletedComplex woWorkComplex = null;
 		ActionAppealCreate.Wi wrapIn = null;
 		Boolean check = true;
 
 		if (check) {
-			if ( StringUtils.isNotEmpty( id )) {
+			if ( StringUtils.isEmpty( id )) {
 				check = false;
-				result.error(new Exception("传入的workId为空,或者不合法,无法同步流程数据。"));
+				result.error(new Exception("传入的id为空,或者不合法,无法同步流程数据。"));
 			}
 		}
 
@@ -100,6 +100,27 @@ public class ActionWorkFlowSync extends BaseAction {
 			}
 		}
 
+		if (check) {
+			if( woWorkComplex == null ){
+				try {
+					woWorkComplex = WorkFlowSyncService.getWorkCompletedComplex( attendanceAppealAuditInfo.getWorkId() );
+				} catch (Exception e) {
+					check = false;
+					Exception exception = new ExceptionAttendanceAppealProcess(e, "系统在获取考勤打卡申诉流程信息时发生异常。ID:" + attendanceAppealAuditInfo.getWorkId() );
+					result.error(exception);
+					logger.error(e, effectivePerson, request, null);
+				}
+			}
+		}
+
+		if (check) {
+			if( woWorkComplex == null ){
+				check = false;
+				Exception exception = new ExceptionAttendanceAppealProcess("流程(work or workCompleted)不存在。ID:" + attendanceAppealAuditInfo.getWorkId() );
+				result.error(exception);
+			}
+		}
+
 		if (check) {
 			try {
 				String processorName = null;
@@ -110,8 +131,9 @@ public class ActionWorkFlowSync extends BaseAction {
 				}else{
 					processorName = woWorkComplex.getTaskList().get(0).getIdentity();
 				}
-				activityType = woWorkComplex.getActivity().getActivityType().name();
-
+				if( woWorkComplex.getActivity() != null && woWorkComplex.getActivity().getActivityType() != null ){
+					activityType = woWorkComplex.getActivity().getActivityType().name();
+				}
 				attendanceAppealInfoServiceAdv.syncAppealStatus( attendanceAppealInfo, activityType, processorName, wrapIn.getStatus() );
 
 				result.setData(new Wo(id));

+ 6 - 6
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendanceappealinfo/AttendanceAppealInfoAction.java

@@ -112,19 +112,19 @@ public class AttendanceAppealInfoAction extends StandardJaxrsAction {
 	}
 
 	/**
-	 * 对某条打卡记录进行申诉
+	 * 对某条打卡记录进行申诉,使用流程进行申诉
 	 * @param asyncResponse
 	 * @param request
 	 * @param id
 	 * @param jsonElement
 	 */
-	@JaxrsMethodDescribe(value = "根据ID对考勤结果申诉信息提起申诉", action = ActionAppealCreateWithWorkFlow.class )
+	@JaxrsMethodDescribe(value = "根据ID对考勤结果申诉信息提起申诉流程", action = ActionAppealCreateWithWorkFlow.class )
 	@PUT
 	@Path("workflow/appeal/{id}")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
 	public void createWithWorkFlow(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
-					   @JaxrsParameterDescribe("考勤申诉信息ID") @PathParam("id") String id, JsonElement jsonElement) {
+					   @JaxrsParameterDescribe("考勤打卡记录ID") @PathParam("id") String id, JsonElement jsonElement) {
 		ActionResult<ActionAppealCreateWithWorkFlow.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);
 		Boolean check = true;
@@ -258,12 +258,12 @@ public class AttendanceAppealInfoAction extends StandardJaxrsAction {
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
 
-	@JaxrsMethodDescribe(value = "根据考勤申诉ID,更新流程的审批信息", action = ActionWorkFlowSync.class)
-	@GET
+	@JaxrsMethodDescribe(value = "根据考勤申诉ID,更新申诉审核流程的审批信息以及最终审核状态", action = ActionWorkFlowSync.class)
+	@PUT
 	@Path("workflow/sync/{id}")
 	@Produces(HttpMediaType.APPLICATION_JSON_UTF_8)
 	@Consumes(MediaType.APPLICATION_JSON)
-	public void archive(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+	public void syncWithWork(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
 						@JaxrsParameterDescribe("考勤申诉信息ID") @PathParam("id") String id, JsonElement jsonElement) {
 		ActionResult<ActionWorkFlowSync.Wo> result = new ActionResult<>();
 		EffectivePerson effectivePerson = this.effectivePerson(request);

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

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.x.attendance.entity.AttendanceScheduleSetting;
+import com.x.base.core.project.annotation.FieldDescribe;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -39,6 +41,8 @@ public class ActionListNextWithFilter extends BaseAction {
 		List<String> topUnitNames_tmp = null;
 		List<String> unitNames_tmp = null;
 		WrapInFilter wrapIn = null;
+		AttendanceScheduleSetting scheduleSetting_top = null;
+		AttendanceScheduleSetting scheduleSetting = null;
 		Boolean check = true;
 
 		try {
@@ -66,6 +70,7 @@ public class ActionListNextWithFilter extends BaseAction {
 				// 处理一下顶层组织,查询下级顶层组织
 				if ( StringUtils.isNotEmpty( wrapIn.getQ_topUnitName() )) {
 					topUnitNames.add(wrapIn.getQ_topUnitName());
+					scheduleSetting_top = attendanceScheduleSettingServiceAdv.getAttendanceScheduleSettingWithUnit(wrapIn.getQ_topUnitName(), effectivePerson.getDebugger() );
 					try {
 						topUnitNames_tmp = userManagerService.listSubUnitNameWithParent(wrapIn.getQ_topUnitName());
 					} catch (Exception e) {
@@ -85,6 +90,7 @@ public class ActionListNextWithFilter extends BaseAction {
 				// 处理一下组织,查询下级组织
 				if ( StringUtils.isNotEmpty( wrapIn.getQ_unitName() )) {
 					unitNames.add(wrapIn.getQ_unitName());
+					scheduleSetting = attendanceScheduleSettingServiceAdv.getAttendanceScheduleSettingWithUnit(wrapIn.getQ_unitName(), effectivePerson.getDebugger() );
 					try {
 						unitNames_tmp = userManagerService.listSubUnitNameWithParent(wrapIn.getQ_unitName());
 					} catch (Exception e) {
@@ -107,7 +113,21 @@ public class ActionListNextWithFilter extends BaseAction {
 				total = business.getAttendanceDetailFactory().getCountWithFilter(wrapIn);
 				// 将所有查询出来的有状态的对象转换为可以输出的过滤过属性的对象
 				wraps = Wo.copier.copy(detailList);
-				
+
+				if( scheduleSetting == null ){
+					scheduleSetting = scheduleSetting_top;
+				}
+
+				if (check && scheduleSetting != null ) {
+					Integer signProxy = scheduleSetting.getSignProxy();
+					signProxy = ( signProxy == null || signProxy == 0 ) ? 1:signProxy;
+					if( scheduleSetting!= null  ){
+						for( Wo detail : wraps ){
+							detail.setSignProxy( signProxy );
+						}
+					}
+				}
+
 			} catch (Throwable th) {
 				th.printStackTrace();
 				result.error(th);
@@ -122,6 +142,17 @@ public class ActionListNextWithFilter extends BaseAction {
 
 		private static final long serialVersionUID = -5076990764713538973L;
 
+		@FieldDescribe("员工所属组织的排班打卡策略:1-两次打卡(上午上班,下午下班) 2-三次打卡(上午上班,下午下班加中午一次共三次) 3-四次打卡(上午下午都打上班下班卡)")
+		private Integer signProxy = 1;
+
+		public Integer getSignProxy() {
+			return signProxy;
+		}
+
+		public void setSignProxy(Integer signProxy) {
+			this.signProxy = signProxy;
+		}
+
 		public static WrapCopier<AttendanceDetail, Wo> copier = WrapCopierFactory.wo(AttendanceDetail.class, Wo.class,
 				null, JpaObject.FieldsInvisible);
 	}

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

@@ -5,6 +5,8 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.x.attendance.entity.AttendanceScheduleSetting;
+import com.x.base.core.project.annotation.FieldDescribe;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -39,6 +41,8 @@ public class ActionListPrevWithFilter extends BaseAction {
 		List<String> topUnitNames_tmp = null;
 		List<String> unitNames_tmp = null;
 		WrapInFilter wrapIn = null;
+		AttendanceScheduleSetting scheduleSetting_top = null;
+		AttendanceScheduleSetting scheduleSetting = null;
 		Boolean check = true;
 
 		try {
@@ -66,6 +70,7 @@ public class ActionListPrevWithFilter extends BaseAction {
 				// 处理一下顶层组织,查询下级顶层组织
 				if ( StringUtils.isNotEmpty( wrapIn.getQ_topUnitName() )) {
 					topUnitNames.add(wrapIn.getQ_topUnitName());
+					scheduleSetting_top = attendanceScheduleSettingServiceAdv.getAttendanceScheduleSettingWithUnit(wrapIn.getQ_topUnitName(), effectivePerson.getDebugger() );
 					try {
 						topUnitNames_tmp = userManagerService.listSubUnitNameWithParent(wrapIn.getQ_topUnitName());
 					} catch (Exception e) {
@@ -85,6 +90,7 @@ public class ActionListPrevWithFilter extends BaseAction {
 				// 处理一下组织,查询下级组织
 				if ( StringUtils.isNotEmpty( wrapIn.getQ_topUnitName() )) {
 					unitNames.add(wrapIn.getQ_topUnitName());
+					scheduleSetting = attendanceScheduleSettingServiceAdv.getAttendanceScheduleSettingWithUnit(wrapIn.getQ_unitName(), effectivePerson.getDebugger() );
 					try {
 						unitNames_tmp = userManagerService.listSubUnitNameWithParent(wrapIn.getQ_topUnitName());
 					} catch (Exception e) {
@@ -107,7 +113,20 @@ public class ActionListPrevWithFilter extends BaseAction {
 				total = business.getAttendanceDetailFactory().getCountWithFilter(wrapIn);
 				// 将所有查询出来的有状态的对象转换为可以输出的过滤过属性的对象
 				wraps = Wo.copier.copy(detailList);
-				
+
+				if( scheduleSetting == null ){
+					scheduleSetting = scheduleSetting_top;
+				}
+
+				if (check && scheduleSetting != null ) {
+					Integer signProxy = scheduleSetting.getSignProxy();
+					signProxy = ( signProxy == null || signProxy == 0 ) ? 1:signProxy;
+					if( scheduleSetting!= null  ){
+						for( Wo detail : wraps ){
+							detail.setSignProxy( signProxy );
+						}
+					}
+				}
 
 			} catch (Throwable th) {
 				th.printStackTrace();
@@ -123,6 +142,17 @@ public class ActionListPrevWithFilter extends BaseAction {
 
 		private static final long serialVersionUID = -5076990764713538973L;
 
+		@FieldDescribe("员工所属组织的排班打卡策略:1-两次打卡(上午上班,下午下班) 2-三次打卡(上午上班,下午下班加中午一次共三次) 3-四次打卡(上午下午都打上班下班卡)")
+		private Integer signProxy = 1;
+
+		public Integer getSignProxy() {
+			return signProxy;
+		}
+
+		public void setSignProxy(Integer signProxy) {
+			this.signProxy = signProxy;
+		}
+
 		public static WrapCopier<AttendanceDetail, Wo> copier = WrapCopierFactory.wo(AttendanceDetail.class, Wo.class,
 				null, JpaObject.FieldsInvisible);
 	}

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

@@ -6,6 +6,9 @@ import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.x.attendance.assemble.control.jaxrs.attendanceschedulesetting.ActionGet;
+import com.x.attendance.entity.AttendanceScheduleSetting;
+import com.x.base.core.project.annotation.FieldDescribe;
 import org.apache.commons.lang3.StringUtils;
 
 import com.google.gson.JsonElement;
@@ -40,6 +43,7 @@ public class ActionListWithEmployee extends BaseAction {
 		Date maxRecordDate = null;
 		String maxRecordDateString = null;
 		DateOperation dateOperation = new DateOperation();
+		AttendanceScheduleSetting scheduleSetting = null;
 		Wi wrapIn = null;
 		Boolean check = true;
 
@@ -84,6 +88,7 @@ public class ActionListWithEmployee extends BaseAction {
 				q_month = dateOperation.getMonth(maxRecordDate);
 			}
 		}
+
 		if (check) {
 			if ( StringUtils.isNotEmpty( cycleYear ) && StringUtils.isNotEmpty( cycleMonth )) {
 				try {
@@ -133,6 +138,17 @@ public class ActionListWithEmployee extends BaseAction {
 				}
 			}
 		}
+
+		if (check) {
+			scheduleSetting = attendanceScheduleSettingServiceAdv.getAttendanceScheduleSettingWithPerson( q_empName, effectivePerson.getDebugger() );
+			Integer signProxy = scheduleSetting.getSignProxy();
+			if( scheduleSetting!= null  ){
+				for( Wo detail : wraps ){
+					detail.setSignProxy( signProxy );
+				}
+			}
+		}
+
 		result.setData(wraps);
 		return result;
 	}
@@ -315,6 +331,17 @@ public class ActionListWithEmployee extends BaseAction {
 
 		private static final long serialVersionUID = -5076990764713538973L;
 
+		@FieldDescribe("员工所属组织的排班打卡策略:1-两次打卡(上午上班,下午下班) 2-三次打卡(上午上班,下午下班加中午一次共三次) 3-四次打卡(上午下午都打上班下班卡)")
+		private Integer signProxy = 1;
+
+		public Integer getSignProxy() {
+			return signProxy;
+		}
+
+		public void setSignProxy(Integer signProxy) {
+			this.signProxy = signProxy;
+		}
+
 		public static WrapCopier<AttendanceDetail, Wo> copier = WrapCopierFactory.wo(AttendanceDetail.class, Wo.class,
 				null, JpaObject.FieldsInvisible);
 	}

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

@@ -93,17 +93,24 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 				distinguishedName = currentPerson.getDistinguishedName();
 			}
 			attendanceDetailMobile.setEmpName( distinguishedName );
-			if( StringUtils.isEmpty( wrapIn.getEmpNo() )){
-				Person person = userManagerService.getPersonObjByName( distinguishedName );
-				if( person != null ){
-					if( StringUtils.isNotEmpty( person.getEmployee() )){
-						attendanceDetailMobile.setEmpNo(person.getEmployee());
-					}else{
-						attendanceDetailMobile.setEmpNo( distinguishedName );
+			Person person = userManagerService.getPersonObjByName( distinguishedName );
+
+			if( person != null ){
+				if( StringUtils.isEmpty( wrapIn.getEmpNo() )){
+					if( person != null ){
+						if( StringUtils.isNotEmpty( person.getEmployee() )){
+							attendanceDetailMobile.setEmpNo(person.getEmployee());
+						}else{
+							attendanceDetailMobile.setEmpNo( distinguishedName );
+						}
 					}
 				}
 			}else{
-				attendanceDetailMobile.setEmpNo( wrapIn.getEmpNo() );
+				//人员不存在
+				check = false;
+				Exception exception = new ExceptionAttendanceDetailProcess(
+						"考勤人员不存在.DistinguishedName:" + distinguishedName );
+				result.error(exception);
 			}
 		}
 
@@ -191,10 +198,10 @@ public class ActionReciveAttendanceMobile extends BaseAction {
 		@FieldDescribe( "Id, 可以为空,如果ID重复,则为更新原有数据." )
 		private String id;
 		
-		@FieldDescribe( "员工号, 可以为空,如果为空则与empName相同." )
+//		@FieldDescribe( "员工号, 可以为空,如果为空则与empName相同." )
 		private String empNo;
 
-		@FieldDescribe( "员工姓名, 可以为空,如果为空则取当前登录人员." )
+		@FieldDescribe( "员工标识, 可以为空但不能错误:DistinguishedName,如果为空则取当前登录人员." )
 		private String empName;
 
 //		@FieldDescribe( "打卡记录日期字符串:yyyy-mm-dd, 必须填写." )

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

@@ -82,6 +82,7 @@ public class AttendanceAppealInfoService {
 			attendanceDetail.setAppealDescription( attendanceAppealInfo.getAppealDescription());
 			emc.check(attendanceDetail, CheckPersistType.all);
 			emc.commit();
+
 			return attendanceAppealInfo;
 		}
 	}

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

@@ -368,11 +368,10 @@ public class AttendanceAppealInfoServiceAdv {
 
 	public AttendanceAppealAuditInfo getAppealAuditInfo(String id) throws Exception {
 		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
-			emc.find( id, AttendanceAppealAuditInfo.class );
+			return emc.find( id, AttendanceAppealAuditInfo.class );
 		} catch ( Exception e ) {
 			throw e;
 		}
-		return null;
 	}
 
 

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

@@ -5,6 +5,7 @@ import java.util.List;
 import com.x.attendance.entity.AttendanceScheduleSetting;
 import com.x.base.core.container.EntityManagerContainer;
 import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.tools.ListTools;
 
 
 public class AttendanceScheduleSettingServiceAdv {
@@ -73,7 +74,26 @@ public class AttendanceScheduleSettingServiceAdv {
 	 * @return
 	 * @throws Exception 
 	 */
-	public synchronized AttendanceScheduleSetting getAttendanceScheduleSettingWithPerson( String personName, Boolean debugger ) throws Exception{
+	public AttendanceScheduleSetting getAttendanceScheduleSettingWithPerson( String personName, Boolean debugger ) throws Exception{
 		return attendanceScheduleSettingService.getAttendanceScheduleSettingWithPerson( personName, debugger );		
 	}
+
+	/**
+	 * 先查询直属组织,然后再递归上级组织
+	 * @param unitName
+	 * @return
+	 * @throws Exception
+	 */
+	public AttendanceScheduleSetting getAttendanceScheduleSettingWithUnit( String unitName, Boolean debugger ) throws Exception{
+		List<String> ids = listByUnitName(unitName);
+		List<AttendanceScheduleSetting> list = null;
+		if(ListTools.isNotEmpty( ids)){
+			list = list(ids );
+		}
+		if(ListTools.isNotEmpty( list )){
+			return list.get(0);
+		}else{
+			return null;
+		}
+	}
 }

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

@@ -144,7 +144,7 @@ public class AttendanceSettingService {
 		isMultiple = false;
 		description = "考勤结果申诉流程,单值。该配置在'自定义申诉流程("+AppealConfig.APPEAL_AUDIFLOWTYPE_BUILTIN+")'时,需要启动的申请流程ID。";
 		try {
-			checkAndInitSystemConfig("APPEAL_AUDIFLOW_ID", "自定义申流程", value, description, type, selectContent, isMultiple, ++ordernumber );
+			checkAndInitSystemConfig("APPEAL_AUDIFLOW_ID", "自定义申流程", value, description, type, selectContent, isMultiple, ++ordernumber );
 		} catch (Exception e) {
 			logger.warn( "system init system config 'APPEAL_AUDIFLOW_ID' got an exception." );
 			logger.error(e);

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

@@ -16,16 +16,25 @@ import java.util.List;
 
 public class WorkFlowSyncService {
 
-	public static WoWorkComplex getWorkComplex( String workId ) throws Exception {
+	public static WoWorkOrCompletedComplex getWorkComplex( String workId ) throws Exception {
 		String serviceUri = "work/" + workId;
 		ActionResponse resp = ThisApplication.context().applications().getQuery(
 				x_processplatform_assemble_surface.class, serviceUri
 		);
-		WoWorkComplex wo = resp.getData( WoWorkComplex.class );
+		WoWorkOrCompletedComplex wo = resp.getData( WoWorkOrCompletedComplex.class );
 		return wo;
 	}
 
-	public static class WoWorkComplex extends GsonPropertyObject {
+	public static WoWorkOrCompletedComplex getWorkCompletedComplex( String workId ) throws Exception {
+		String serviceUri = "workcompleted/" + workId;
+		ActionResponse resp = ThisApplication.context().applications().getQuery(
+				x_processplatform_assemble_surface.class, serviceUri
+		);
+		WoWorkOrCompletedComplex wo = resp.getData( WoWorkOrCompletedComplex.class );
+		return wo;
+	}
+
+	public static class WoWorkOrCompletedComplex extends GsonPropertyObject {
 
 		@FieldDescribe("活动节点")
 		private WoActivity activity;

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

@@ -12,7 +12,7 @@ import java.util.Date;
 
 @ContainerEntity(dumpSize = 1000, type = ContainerEntity.Type.content, reference = ContainerEntity.Reference.strong)
 @Entity
-@Table(name = PersistenceProperties.AttendanceAppealInfo.table, uniqueConstraints = @UniqueConstraint(name = PersistenceProperties.AttendanceAppealInfo.table
+@Table(name = PersistenceProperties.AttendanceAppealAuditInfo.table, uniqueConstraints = @UniqueConstraint(name = PersistenceProperties.AttendanceAppealAuditInfo.table
 		+ JpaObject.IndexNameMiddle + JpaObject.DefaultUniqueConstraintSuffix, columnNames = { JpaObject.IDCOLUMN,
 				JpaObject.CREATETIMECOLUMN, JpaObject.UPDATETIMECOLUMN, JpaObject.SEQUENCECOLUMN }))
 @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

+ 2 - 2
o2server/x_base_core_project/src/main/java/com/x/base/core/project/x_attendance_assemble_control.java

@@ -4,8 +4,8 @@ import com.x.base.core.project.annotation.Module;
 import com.x.base.core.project.annotation.ModuleCategory;
 import com.x.base.core.project.annotation.ModuleType;
 
-@Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "考勤", packageName = "com.x.attendance.assemble.control", containerEntities = {
-		"com.x.attendance.entity.AttendanceAdmin", "com.x.attendance.entity.AttendanceAppealInfo",
+@Module(type = ModuleType.ASSEMBLE, category = ModuleCategory.OFFICIAL, name = "考勤管理", packageName = "com.x.attendance.assemble.control", containerEntities = {
+		"com.x.attendance.entity.AttendanceAdmin", "com.x.attendance.entity.AttendanceAppealInfo", "com.x.attendance.entity.AttendanceAppealAuditInfo",
 		"com.x.attendance.entity.AttendanceDetail", "com.x.attendance.entity.AttendanceDetailMobile",
 		"com.x.attendance.entity.AttendanceEmployeeConfig", "com.x.attendance.entity.AttendanceImportFileInfo",
 		"com.x.attendance.entity.AttendanceScheduleSetting", "com.x.attendance.entity.AttendanceSetting",