Jelajahi Sumber

修复考勤管理中请假半天计算出勤天数不正确的问题

o2lee 5 tahun lalu
induk
melakukan
833f756e59
14 mengubah file dengan 213 tambahan dan 114 penghapusan
  1. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/ThisApplication.java
  2. 0 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceDetailFactory.java
  3. 40 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionCheckWithPersonByCycle.java
  4. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/fileimport/ActionImportDateInFile.java
  5. 92 87
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/selfholiday/ActionSave.java
  6. 1 1
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/sender/SenderForSupplementData.java
  7. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/thread/OperatorDataSaver.java
  8. 0 2
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/thread/OperatorDataSupplement.java
  9. 1 3
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/schedule/DetailLastDayRecordAnalyseTask.java
  10. 4 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseSignProxy1.java
  11. 3 4
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseSignProxy2.java
  12. 5 6
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailAnalyseSignProxy3.java
  13. 1 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/AttendanceDetailService.java
  14. 63 0
      o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/service/UserManagerService.java

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

@@ -51,6 +51,7 @@ public class ThisApplication {
 			}
 			}
 
 
 			context.schedule(AttendanceStatisticTask.class, "0 0 0/4 * * ?");
 			context.schedule(AttendanceStatisticTask.class, "0 0 0/4 * * ?");
+
 			context.schedule(MobileRecordAnalyseTask.class, "0 0 * * * ?");
 			context.schedule(MobileRecordAnalyseTask.class, "0 0 * * * ?");
 			//每天凌晨1点,计算前一天所有的未签退和未分析的打卡数据
 			//每天凌晨1点,计算前一天所有的未签退和未分析的打卡数据
 			context.schedule(DetailLastDayRecordAnalyseTask.class, "0 0 1 * * ?");
 			context.schedule(DetailLastDayRecordAnalyseTask.class, "0 0 1 * * ?");

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

@@ -809,9 +809,6 @@ public class AttendanceDetailFactory extends AbstractFactory {
 	
 	
 	/**
 	/**
 	 * 查询符合的文档信息总数
 	 * 查询符合的文档信息总数
-	 * @param id
-	 * @param count
-	 * @param sequence
 	 * @param wrapIn
 	 * @param wrapIn
 	 * @return
 	 * @return
 	 * @throws Exception
 	 * @throws Exception

+ 40 - 4
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attendancedetail/ActionCheckWithPersonByCycle.java

@@ -1,5 +1,6 @@
 package com.x.attendance.assemble.control.jaxrs.attendancedetail;
 package com.x.attendance.assemble.control.jaxrs.attendancedetail;
 
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
@@ -13,6 +14,10 @@ import com.x.base.core.project.http.EffectivePerson;
 import com.x.base.core.project.jaxrs.WoId;
 import com.x.base.core.project.jaxrs.WoId;
 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.organization.Person;
+import com.x.base.core.project.organization.Unit;
+import com.x.base.core.project.tools.ListTools;
+import org.apache.commons.lang3.StringUtils;
 
 
 public class ActionCheckWithPersonByCycle extends BaseAction {
 public class ActionCheckWithPersonByCycle extends BaseAction {
 	
 	
@@ -63,10 +68,41 @@ public class ActionCheckWithPersonByCycle extends BaseAction {
 		if ( check ) {
 		if ( check ) {
 			try {
 			try {
 				attendanceEmployeeConfigList = attendanceEmployeeConfigServiceAdv.listByConfigType( "REQUIRED" );
 				attendanceEmployeeConfigList = attendanceEmployeeConfigServiceAdv.listByConfigType( "REQUIRED" );
-				if( attendanceEmployeeConfigList == null || attendanceEmployeeConfigList.isEmpty() ) {
-					check = false;
-					Exception exception = new ExceptionAttendanceDetailProcess( "系统未获取到需要考勤的人员配置,尚不需要补录任何信息." );
-					result.error( exception );
+				if( ListTools.isEmpty( attendanceEmployeeConfigList ) ) {
+					attendanceEmployeeConfigList = new ArrayList<>();
+//					check = false;
+//					Exception exception = new ExceptionAttendanceDetailProcess( "系统未获取到需要考勤的人员配置,尚不需要补录任何信息." );
+//					result.error( exception );
+					//如果没有配置任何需要考勤的人员,那么就是全员需要考勤
+					AttendanceEmployeeConfig config = null;
+					String identity = null;
+					Unit unit = null;
+					Unit topUnit = null;
+					List<Person> allPersonObjs = userManagerService.listAllPersons();
+					if(ListTools.isNotEmpty( allPersonObjs )){
+						for( Person person : allPersonObjs ){
+							identity = userManagerService.getMajorIdentityWithPerson( person.getDistinguishedName() );
+							if(StringUtils.isNotEmpty(identity)){
+								unit = userManagerService.getUnitWithIdentity(identity);
+							}
+							if( unit != null ){
+								topUnit = userManagerService.getTopUnitWithUnitName( unit.getDistinguishedName() );
+							}
+							if( topUnit != null ){
+								config = new AttendanceEmployeeConfig();
+								config.setId( AttendanceEmployeeConfig.createId() );
+								config.setConfigType( "REQUIRED" );
+								config.setEmpInTopUnitTime("1900-01-01");
+								config.setEmployeeName( person.getDistinguishedName() );
+								config.setEmployeeNumber( person.getEmployee() );
+								config.setUnitOu( unit.getDistinguishedName() );
+								config.setUnitName( unit.getUnique() );
+								config.setTopUnitName( topUnit.getName() );
+								config.setTopUnitOu( topUnit.getUnique() );
+								attendanceEmployeeConfigList.add( config );
+							}
+						}
+					}
 				}
 				}
 			} catch ( Exception e ) {
 			} catch ( Exception e ) {
 				check = false;
 				check = false;

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/fileimport/ActionImportDateInFile.java

@@ -84,6 +84,7 @@ public class ActionImportDateInFile extends BaseAction {
 					attendanceDetail.setEmpName(cacheImportRowDetail.getEmployeeName());
 					attendanceDetail.setEmpName(cacheImportRowDetail.getEmployeeName());
 					attendanceDetail.setYearString(cacheImportRowDetail.getRecordYearString());
 					attendanceDetail.setYearString(cacheImportRowDetail.getRecordYearString());
 					attendanceDetail.setMonthString(cacheImportRowDetail.getRecordMonthString());
 					attendanceDetail.setMonthString(cacheImportRowDetail.getRecordMonthString());
+					attendanceDetail.setRecordDate( cacheImportRowDetail.getRecordDate()  );
 					attendanceDetail.setRecordDateString(cacheImportRowDetail.getRecordDateStringFormated());
 					attendanceDetail.setRecordDateString(cacheImportRowDetail.getRecordDateStringFormated());
 					attendanceDetail.setOnDutyTime(cacheImportRowDetail.getOnDutyTimeFormated());
 					attendanceDetail.setOnDutyTime(cacheImportRowDetail.getOnDutyTimeFormated());
 					attendanceDetail.setOffDutyTime(cacheImportRowDetail.getOffDutyTimeFormated());
 					attendanceDetail.setOffDutyTime(cacheImportRowDetail.getOffDutyTimeFormated());

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

@@ -60,74 +60,95 @@ public class ActionSave extends BaseAction {
 				AttendanceSelfHoliday attendanceSelfHoliday = null;
 				AttendanceSelfHoliday attendanceSelfHoliday = null;
 
 
 				if( wrapIn != null && StringUtils.isNoneEmpty( wrapIn.getEmployeeName() )
 				if( wrapIn != null && StringUtils.isNoneEmpty( wrapIn.getEmployeeName() )
-						&& StringUtils.isNoneEmpty( wrapIn.getEmployeeNumber() )
 						&& StringUtils.isNoneEmpty( wrapIn.getLeaveType() )
 						&& StringUtils.isNoneEmpty( wrapIn.getLeaveType() )
 						&& wrapIn.getStartTime() != null
 						&& wrapIn.getStartTime() != null
 						&& wrapIn.getEndTime() != null
 						&& wrapIn.getEndTime() != null
 				){
 				){
-					if( wrapIn.getEmployeeName().indexOf("@P") < 0 ){
-						//不是DistinguishedName
+					if( wrapIn.getEmployeeName().indexOf("@P") < 0 ){//不是DistinguishedName
 						if( wrapIn.getEmployeeName().indexOf("@I") > 0 ){
 						if( wrapIn.getEmployeeName().indexOf("@I") > 0 ){
-							wrapIn.setEmployeeName(userManagerService.getPersonNameByIdentity(wrapIn.getEmployeeName()));
-						}else{
-							Person person = userManagerService.getPersonObjByName(wrapIn.getEmployeeName());
-							if( person != null ){
-								wrapIn.setEmployeeName( person.getDistinguishedName() );
+							String personName = userManagerService.getPersonNameByIdentity(wrapIn.getEmployeeName());
+							if( StringUtils.isNotEmpty( personName ) ){
+								wrapIn.setEmployeeName(personName);
 							}
 							}
 						}
 						}
 					}
 					}
 
 
-					//补充员工的组织信息
-					Unit unit = userManagerService.getUnitWithPersonName( wrapIn.getEmployeeNumber() );
-					Unit topUnit = null;
-					String unitName = null;
-					String unitOu = null;
-					String topUnitName = null;
-					String topUnitOu = null;
-					if( unit != null ){
-						unitName = unit.getName();
-						unitOu = unit.getDistinguishedName();
-						topUnit = userManagerService.getTopUnitWithUnitName(unitOu);
-					}
-					if( topUnit != null ){
-						topUnitName = topUnit.getName();
-						topUnitOu = topUnit.getDistinguishedName();
-					}
-					emc.beginTransaction( AttendanceSelfHoliday.class );
-					//先根据batchFlag删除原来的数据,然后再进行新数据的保存
-					if(StringUtils.isNotEmpty( wrapIn.getBatchFlag() ) ){
-						holidayList = attendanceSelfHolidayServiceAdv.listWithBatchFlag( wrapIn.getBatchFlag() );
-						if(ListTools.isNotEmpty( holidayList )){
-							logger.info("先根据batchFlag删除原来的数据,然后再进行新数据的保存" );
-							for( AttendanceSelfHoliday holiday : holidayList ){
-								emc.remove( emc.find(holiday.getId(), AttendanceSelfHoliday.class ), CheckRemoveType.all );
+					if( StringUtils.isNotEmpty( wrapIn.getEmployeeName() )){
+						Person person = userManagerService.getPersonObjByName(wrapIn.getEmployeeName());
+						if( person != null ){
+							wrapIn.setEmployeeName( person.getDistinguishedName() );
+							if( StringUtils.isNotEmpty( person.getEmployee() )){
+								wrapIn.setEmployeeNumber( person.getEmployee() );
+							}else{
+								wrapIn.setEmployeeNumber( person.getDistinguishedName() );
 							}
 							}
-							logger.info("删除" + holidayList.size() + "条旧请假信息数据。" );
 						}
 						}
-					}
-
-					if( StringUtils.isNotEmpty( wrapIn.getId() ) ){
-						//根据ID查询信息是否存在,如果存在就update,如果不存在就create
-						attendanceSelfHoliday = emc.find( wrapIn.getId(), AttendanceSelfHoliday.class );
-						if( attendanceSelfHoliday != null ){
-							//更新已经存在的信息
-							wrapIn.copyTo( attendanceSelfHoliday );
-							attendanceSelfHoliday.setBatchFlag(wrapIn.getBatchFlag());
-							logger.info("更新:gson.toJson( attendanceSelfHoliday ) = " + gson.toJson( attendanceSelfHoliday ) );
 
 
-							attendanceSelfHoliday.setUnitName( unitName );
-							attendanceSelfHoliday.setUnitOu( unitOu );
-							attendanceSelfHoliday.setTopUnitName( topUnitName );
-							attendanceSelfHoliday.setTopUnitOu( topUnitOu );
-
-							emc.check( attendanceSelfHoliday, CheckPersistType.all);
+						//补充员工的组织信息
+						Unit unit = userManagerService.getUnitWithPersonName( wrapIn.getEmployeeNumber() );
+						Unit topUnit = null;
+						String unitName = null;
+						String unitOu = null;
+						String topUnitName = null;
+						String topUnitOu = null;
+						if( unit != null ){
+							unitName = unit.getName();
+							unitOu = unit.getDistinguishedName();
+							topUnit = userManagerService.getTopUnitWithUnitName(unitOu);
+						}
+						if( topUnit != null ){
+							topUnitName = topUnit.getName();
+							topUnitOu = topUnit.getDistinguishedName();
+						}
+						emc.beginTransaction( AttendanceSelfHoliday.class );
+						//先根据batchFlag删除原来的数据,然后再进行新数据的保存
+						if(StringUtils.isNotEmpty( wrapIn.getBatchFlag() ) ){
+							holidayList = attendanceSelfHolidayServiceAdv.listWithBatchFlag( wrapIn.getBatchFlag() );
+							if(ListTools.isNotEmpty( holidayList )){
+								logger.info("先根据batchFlag删除原来的数据,然后再进行新数据的保存" );
+								for( AttendanceSelfHoliday holiday : holidayList ){
+									emc.remove( emc.find(holiday.getId(), AttendanceSelfHoliday.class ), CheckRemoveType.all );
+								}
+								logger.info("删除" + holidayList.size() + "条旧请假信息数据。" );
+							}
+						}
+						if( StringUtils.isNotEmpty( wrapIn.getId() ) ){
+							//根据ID查询信息是否存在,如果存在就update,如果不存在就create
+							attendanceSelfHoliday = emc.find( wrapIn.getId(), AttendanceSelfHoliday.class );
+							if( attendanceSelfHoliday != null ){
+								//更新已经存在的信息
+								wrapIn.copyTo( attendanceSelfHoliday );
+								attendanceSelfHoliday.setBatchFlag(wrapIn.getBatchFlag());
+								logger.info("更新:gson.toJson( attendanceSelfHoliday ) = " + gson.toJson( attendanceSelfHoliday ) );
+
+								attendanceSelfHoliday.setUnitName( unitName );
+								attendanceSelfHoliday.setUnitOu( unitOu );
+								attendanceSelfHoliday.setTopUnitName( topUnitName );
+								attendanceSelfHoliday.setTopUnitOu( topUnitOu );
+
+								emc.check( attendanceSelfHoliday, CheckPersistType.all);
+							}else{
+								attendanceSelfHoliday = new AttendanceSelfHoliday();
+								wrapIn.copyTo( attendanceSelfHoliday );
+								//使用参数传入的ID作为记录的ID
+								attendanceSelfHoliday.setId( wrapIn.getId() );
+								attendanceSelfHoliday.setBatchFlag(wrapIn.getBatchFlag());
+								logger.info("新增:gson.toJson( attendanceSelfHoliday ) = " + gson.toJson( attendanceSelfHoliday ) );
+
+								attendanceSelfHoliday.setUnitName( unitName );
+								attendanceSelfHoliday.setUnitOu( unitOu );
+								attendanceSelfHoliday.setTopUnitName( topUnitName );
+								attendanceSelfHoliday.setTopUnitOu( topUnitOu );
+
+								emc.persist( attendanceSelfHoliday, CheckPersistType.all);
+							}
 						}else{
 						}else{
+							//没有传入指定的ID
 							attendanceSelfHoliday = new AttendanceSelfHoliday();
 							attendanceSelfHoliday = new AttendanceSelfHoliday();
+
 							wrapIn.copyTo( attendanceSelfHoliday );
 							wrapIn.copyTo( attendanceSelfHoliday );
-							//使用参数传入的ID作为记录的ID
-							attendanceSelfHoliday.setId( wrapIn.getId() );
 							attendanceSelfHoliday.setBatchFlag(wrapIn.getBatchFlag());
 							attendanceSelfHoliday.setBatchFlag(wrapIn.getBatchFlag());
-							logger.info("新增:gson.toJson( attendanceSelfHoliday ) = " + gson.toJson( attendanceSelfHoliday ) );
+							logger.debug("新增,无ID:gson.toJson( attendanceSelfHoliday ) = " + gson.toJson( attendanceSelfHoliday ) );
 
 
 							attendanceSelfHoliday.setUnitName( unitName );
 							attendanceSelfHoliday.setUnitName( unitName );
 							attendanceSelfHoliday.setUnitOu( unitOu );
 							attendanceSelfHoliday.setUnitOu( unitOu );
@@ -135,42 +156,27 @@ public class ActionSave extends BaseAction {
 							attendanceSelfHoliday.setTopUnitOu( topUnitOu );
 							attendanceSelfHoliday.setTopUnitOu( topUnitOu );
 
 
 							emc.persist( attendanceSelfHoliday, CheckPersistType.all);
 							emc.persist( attendanceSelfHoliday, CheckPersistType.all);
+							result.setData( new Wo( attendanceSelfHoliday.getId() ) );
 						}
 						}
-					}else{
-						//没有传入指定的ID
-						attendanceSelfHoliday = new AttendanceSelfHoliday();
-
-						wrapIn.copyTo( attendanceSelfHoliday );
-						attendanceSelfHoliday.setBatchFlag(wrapIn.getBatchFlag());
-						logger.debug("新增,无ID:gson.toJson( attendanceSelfHoliday ) = " + gson.toJson( attendanceSelfHoliday ) );
-
-						attendanceSelfHoliday.setUnitName( unitName );
-						attendanceSelfHoliday.setUnitOu( unitOu );
-						attendanceSelfHoliday.setTopUnitName( topUnitName );
-						attendanceSelfHoliday.setTopUnitOu( topUnitOu );
-
-						emc.persist( attendanceSelfHoliday, CheckPersistType.all);
+						emc.commit();
 						result.setData( new Wo( attendanceSelfHoliday.getId() ) );
 						result.setData( new Wo( attendanceSelfHoliday.getId() ) );
-					}
-
-					emc.commit();
-					result.setData( new Wo( attendanceSelfHoliday.getId() ) );
-
-					//清除缓存
-					ApplicationCache.notify( AttendanceSelfHoliday.class );
-
-					//根据员工休假数据来记录与这条数据相关的统计需求记录
-					//new AttendanceDetailAnalyseService().recordStatisticRequireLog( attendanceSelfHoliday );
-					logger.debug("休假数据有变动,对该员工的该请假时间内的所有打卡记录进行分析......" );
 
 
-					//休假数据有更新,对该员工的该请假时间内的所有打卡记录进行分析
-					List<String> ids = attendanceDetailAnalyseServiceAdv.listAnalyseAttendanceDetailIds(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();
+						//清除缓存
+						ApplicationCache.notify( AttendanceSelfHoliday.class );
+
+						//根据员工休假数据来记录与这条数据相关的统计需求记录
+						//new AttendanceDetailAnalyseService().recordStatisticRequireLog( attendanceSelfHoliday );
+						logger.debug("休假数据有变动,对该员工的该请假时间内的所有打卡记录进行分析......" );
+
+						//休假数据有更新,对该员工的该请假时间内的所有打卡记录进行分析
+						List<String> ids = attendanceDetailAnalyseServiceAdv.listAnalyseAttendanceDetailIds(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();
+								}
 							}
 							}
 						}
 						}
 					}
 					}
@@ -203,7 +209,6 @@ public class ActionSave extends BaseAction {
 		@FieldDescribe("员工姓名:员工的标识,<font color='red'>必填</font>,员工的distinguishedName,如:张三@zhangsan@P")
 		@FieldDescribe("员工姓名:员工的标识,<font color='red'>必填</font>,员工的distinguishedName,如:张三@zhangsan@P")
 		private String employeeName;
 		private String employeeName;
 
 
-		@FieldDescribe("员工号,如果没有员工号,可以使用员工标识代替,不可为空")
 		private String employeeNumber;
 		private String employeeNumber;
 
 
 		@FieldDescribe("请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他")
 		@FieldDescribe("请假类型:带薪年休假|带薪病假|带薪福利假|扣薪事假|其他")
@@ -215,7 +220,7 @@ public class ActionSave extends BaseAction {
 		@FieldDescribe("结束时间,<font color='red'>必填</font>: yyyy-mm-dd hh24:mi:ss")
 		@FieldDescribe("结束时间,<font color='red'>必填</font>: yyyy-mm-dd hh24:mi:ss")
 		private Date endTime;
 		private Date endTime;
 
 
-		@FieldDescribe("请假天数,<font color='red'>必填</font>")
+		@FieldDescribe("请假天数,最小粒度,0.5天,<font color='red'>必填</font>")
 		private Double leaveDayNumber = 0.0;
 		private Double leaveDayNumber = 0.0;
 
 
 		@FieldDescribe("请假说明")
 		@FieldDescribe("请假说明")

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

@@ -24,7 +24,7 @@ public class SenderForSupplementData {
 	public void execute( List<AttendanceEmployeeConfig> attendanceEmployeeConfigList, Map<String, Map<String, List<AttendanceStatisticalCycle>>> topUnitAttendanceStatisticalCycleMap, String cycleYear, String cycleMonth, Boolean debugger ) {	
 	public void execute( List<AttendanceEmployeeConfig> attendanceEmployeeConfigList, Map<String, Map<String, List<AttendanceStatisticalCycle>>> topUnitAttendanceStatisticalCycleMap, String cycleYear, String cycleMonth, Boolean debugger ) {	
 
 
 		StatusSystemImportOpt statusSystemImportOpt = StatusSystemImportOpt.getInstance();		
 		StatusSystemImportOpt statusSystemImportOpt = StatusSystemImportOpt.getInstance();		
-		
+
 		for ( AttendanceEmployeeConfig attendanceEmployeeConfig : attendanceEmployeeConfigList ) {
 		for ( AttendanceEmployeeConfig attendanceEmployeeConfig : attendanceEmployeeConfigList ) {
 			if( attendanceEmployeeConfig.getEmpInTopUnitTime() == null || attendanceEmployeeConfig.getEmpInTopUnitTime().isEmpty() ){
 			if( attendanceEmployeeConfig.getEmpInTopUnitTime() == null || attendanceEmployeeConfig.getEmpInTopUnitTime().isEmpty() ){
 				logger.warn( "person["+attendanceEmployeeConfig.getEmployeeName()+"] in company date is null, system can not supplement data for person." );
 				logger.warn( "person["+attendanceEmployeeConfig.getEmployeeName()+"] in company date is null, system can not supplement data for person." );

+ 1 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/thread/OperatorDataSaver.java

@@ -45,6 +45,7 @@ public class OperatorDataSaver implements Runnable {
 		attendanceDetail.setEmpName(cacheImportRowDetail.getEmployeeName());
 		attendanceDetail.setEmpName(cacheImportRowDetail.getEmployeeName());
 		attendanceDetail.setYearString(cacheImportRowDetail.getRecordYearString());
 		attendanceDetail.setYearString(cacheImportRowDetail.getRecordYearString());
 		attendanceDetail.setMonthString(cacheImportRowDetail.getRecordMonthString());
 		attendanceDetail.setMonthString(cacheImportRowDetail.getRecordMonthString());
+		attendanceDetail.setRecordDate( cacheImportRowDetail.getRecordDate() );
 		attendanceDetail.setRecordDateString(cacheImportRowDetail.getRecordDateStringFormated());
 		attendanceDetail.setRecordDateString(cacheImportRowDetail.getRecordDateStringFormated());
 		attendanceDetail.setOnDutyTime(cacheImportRowDetail.getOnDutyTimeFormated());
 		attendanceDetail.setOnDutyTime(cacheImportRowDetail.getOnDutyTimeFormated());
 		attendanceDetail.setOffDutyTime(cacheImportRowDetail.getOffDutyTimeFormated());
 		attendanceDetail.setOffDutyTime(cacheImportRowDetail.getOffDutyTimeFormated());

+ 0 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/processor/thread/OperatorDataSupplement.java

@@ -60,7 +60,6 @@ public class OperatorDataSupplement implements Runnable{
 		if( check ) {
 		if( check ) {
 			//根据组织信息、统计周期年、月从所有的顶层组织统计周期信息MAP中查询一个适合的统计周期,如果没有则为该组织新建一个新的配置
 			//根据组织信息、统计周期年、月从所有的顶层组织统计周期信息MAP中查询一个适合的统计周期,如果没有则为该组织新建一个新的配置
 			try {
 			try {
-				//TODO 这个方法要检查一下并发可行性,需要 进一步优化
 				logger.debug( debugger, ">>>>>>>>>>查询指定的统计周期:"+attendanceEmployeeConfig.getTopUnitName() + ", " +
 				logger.debug( debugger, ">>>>>>>>>>查询指定的统计周期:"+attendanceEmployeeConfig.getTopUnitName() + ", " +
 						attendanceEmployeeConfig.getUnitName() + ",  " +
 						attendanceEmployeeConfig.getUnitName() + ",  " +
 						entitySupplementData.getCycleYear() + "-" +
 						entitySupplementData.getCycleYear() + "-" +
@@ -88,7 +87,6 @@ public class OperatorDataSupplement implements Runnable{
 		if( check ) {
 		if( check ) {
 			if ( attendanceStatisticalCycle != null ) {
 			if ( attendanceStatisticalCycle != null ) {
 				try {
 				try {
-					//TODO 这个方法要检查一下并发可行性,需要 进一步优化
 					logger.warn( "系统尝试核对和补充人员考勤数据,"
 					logger.warn( "系统尝试核对和补充人员考勤数据,"
 							+ "StartDate:" + attendanceStatisticalCycle.getCycleStartDate()
 							+ "StartDate:" + attendanceStatisticalCycle.getCycleStartDate()
 							+ ", EndDate:" + attendanceStatisticalCycle.getCycleEndDate() );
 							+ ", EndDate:" + attendanceStatisticalCycle.getCycleEndDate() );

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

@@ -2,8 +2,6 @@ package com.x.attendance.assemble.control.schedule;
 
 
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.ThisApplication;
 import com.x.attendance.assemble.control.ThisApplication;
-import com.x.attendance.assemble.control.service.AttendanceDetailMobileAnalyseServiceAdv;
-import com.x.attendance.assemble.control.service.AttendanceDetailMobileService;
 import com.x.attendance.assemble.control.service.AttendanceDetailServiceAdv;
 import com.x.attendance.assemble.control.service.AttendanceDetailServiceAdv;
 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;
@@ -44,7 +42,7 @@ public class DetailLastDayRecordAnalyseTask extends AbstractJob {
 			}
 			}
 		}
 		}
 
 
-		logger.info("Timertask MobileRecordAnalyseTask completed and excute success.");
+		logger.info("Timertask DetailLastDayRecordAnalyseTask completed and excute success.");
 	}
 	}
 
 
 }
 }

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

@@ -95,8 +95,8 @@ class AttendanceDetailAnalyseSignProxy1 {
 							detail.setAbsentDayTime("上午");
 							detail.setAbsentDayTime("上午");
 							detail.setIsAbsent( true );
 							detail.setIsAbsent( true );
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);//递增缺勤天数 + 0.5
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);//递增缺勤天数 + 0.5
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 						}
 						}
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 					}else if( lateStartTime != null && onDutyTime.after( lateStartTime )){
 					}else if( lateStartTime != null && onDutyTime.after( lateStartTime )){
 						//上午签到过了,并没有超过缺勤起算时间,如果排班设置里已经配置过了迟到起算时间,那么判断员工是否已经迟到,如果未休假也不是周末的话
 						//上午签到过了,并没有超过缺勤起算时间,如果排班设置里已经配置过了迟到起算时间,那么判断员工是否已经迟到,如果未休假也不是周末的话
 						logger.debug( debugger, "上午打卡时间晚于迟到计时时间......" );
 						logger.debug( debugger, "上午打卡时间晚于迟到计时时间......" );
@@ -127,8 +127,8 @@ class AttendanceDetailAnalyseSignProxy1 {
 						detail.setAbsentDayTime("上午");
 						detail.setAbsentDayTime("上午");
 						detail.setIsAbsent(true);
 						detail.setIsAbsent(true);
 						AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
 						AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
-						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 					}
 					}
+					AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 					logger.debug( debugger, "上午工作时长, 未打卡:minutes= 0 分钟。" );
 					logger.debug( debugger, "上午工作时长, 未打卡:minutes= 0 分钟。" );
 					detail.setWorkTimeDuration( 0L );
 					detail.setWorkTimeDuration( 0L );
 				}
 				}
@@ -149,6 +149,7 @@ class AttendanceDetailAnalyseSignProxy1 {
 							detail.setIsLeaveEarlier( true );
 							detail.setIsLeaveEarlier( true );
 						}
 						}
 					}
 					}
+
 					//下午已经签退了,现在计算全天的工作时长
 					//下午已经签退了,现在计算全天的工作时长
 					if( afternoonStartTime != null ){ //已经配置过了下午上班时间
 					if( afternoonStartTime != null ){ //已经配置过了下午上班时间
 						minutes = dateOperation.getMinutes( afternoonStartTime, offDutyTime);
 						minutes = dateOperation.getMinutes( afternoonStartTime, offDutyTime);
@@ -187,10 +188,9 @@ class AttendanceDetailAnalyseSignProxy1 {
 							detail.setIsAbnormalDuty(true);
 							detail.setIsAbnormalDuty(true);
 							detail.setIsAbsent(true);
 							detail.setIsAbsent(true);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 							logger.debug( debugger, "没请假,未打卡,算缺卡和缺勤状态。" );
 							logger.debug( debugger, "没请假,未打卡,算缺卡和缺勤状态。" );
 						}
 						}
-
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 						//员工未签退,计算全天的工作时长,下午的时长不计算
 						//员工未签退,计算全天的工作时长,下午的时长不计算
 //						detail.setWorkTimeDuration( 0L );
 //						detail.setWorkTimeDuration( 0L );
 						logger.debug( debugger, "员工未签退,全天工作时长暂时记为0分钟,等待补卡或者补提请假申请。" );
 						logger.debug( debugger, "员工未签退,全天工作时长暂时记为0分钟,等待补卡或者补提请假申请。" );

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

@@ -105,8 +105,8 @@ class AttendanceDetailAnalyseSignProxy2 {
 							detail.setAbsentDayTime("上午");
 							detail.setAbsentDayTime("上午");
 							detail.setIsAbsent( true );
 							detail.setIsAbsent( true );
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);//递增缺勤天数 + 0.5
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);//递增缺勤天数 + 0.5
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 						}
 						}
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 					}else if( lateStartTime != null && onDutyTime.after( lateStartTime )){
 					}else if( lateStartTime != null && onDutyTime.after( lateStartTime )){
 						//上午签到过了,并没有超过缺勤起算时间,如果排班设置里已经配置过了迟到起算时间,那么判断员工是否已经迟到,如果未休假也不是周末的话
 						//上午签到过了,并没有超过缺勤起算时间,如果排班设置里已经配置过了迟到起算时间,那么判断员工是否已经迟到,如果未休假也不是周末的话
 						logger.debug( debugger, "上午打卡时间晚于迟到计时时间......" );
 						logger.debug( debugger, "上午打卡时间晚于迟到计时时间......" );
@@ -139,8 +139,8 @@ class AttendanceDetailAnalyseSignProxy2 {
 							detail.setAbsentDayTime("上午");
 							detail.setAbsentDayTime("上午");
 							detail.setIsAbsent(true);
 							detail.setIsAbsent(true);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 						}
 						}
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 						logger.debug( debugger, "上午工作时长, 未打卡:minutes= 0 分钟。" );
 						logger.debug( debugger, "上午工作时长, 未打卡:minutes= 0 分钟。" );
 						detail.setWorkTimeDuration( 0L );
 						detail.setWorkTimeDuration( 0L );
 					}
 					}
@@ -233,10 +233,9 @@ class AttendanceDetailAnalyseSignProxy2 {
 							detail.setIsAbnormalDuty(true);
 							detail.setIsAbnormalDuty(true);
 							detail.setIsAbsent(true);
 							detail.setIsAbsent(true);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 							logger.debug( debugger, "没请假,未打卡,算缺卡和缺勤状态。" );
 							logger.debug( debugger, "没请假,未打卡,算缺卡和缺勤状态。" );
 						}
 						}
-
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 						//员工未签退,计算全天的工作时长,下午的时长不计算
 						//员工未签退,计算全天的工作时长,下午的时长不计算
 						detail.setWorkTimeDuration( 0L );
 						detail.setWorkTimeDuration( 0L );
 						logger.debug( debugger, "员工未签退,全天工作时长暂时记为0分钟,等待补卡或者补提请假申请。" );
 						logger.debug( debugger, "员工未签退,全天工作时长暂时记为0分钟,等待补卡或者补提请假申请。" );

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

@@ -102,8 +102,8 @@ class AttendanceDetailAnalyseSignProxy3 {
 							detail.setAbsentDayTime("上午");
 							detail.setAbsentDayTime("上午");
 							detail.setIsAbsent( true );
 							detail.setIsAbsent( true );
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);//递增缺勤天数 + 0.5
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);//递增缺勤天数 + 0.5
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 						}
 						}
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 					}else if( lateStartTime != null && onDutyTime.after( lateStartTime )){
 					}else if( lateStartTime != null && onDutyTime.after( lateStartTime )){
 						//上午签到过了,并没有超过缺勤起算时间,如果排班设置里已经配置过了迟到起算时间,那么判断员工是否已经迟到,如果未休假也不是周末的话
 						//上午签到过了,并没有超过缺勤起算时间,如果排班设置里已经配置过了迟到起算时间,那么判断员工是否已经迟到,如果未休假也不是周末的话
 						logger.debug( debugger, "上午打卡时间晚于迟到计时时间......" );
 						logger.debug( debugger, "上午打卡时间晚于迟到计时时间......" );
@@ -134,8 +134,8 @@ class AttendanceDetailAnalyseSignProxy3 {
 						detail.setAbsentDayTime("上午");
 						detail.setAbsentDayTime("上午");
 						detail.setIsAbsent(true);
 						detail.setIsAbsent(true);
 						AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
 						AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
-						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 					}
 					}
+					AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 					logger.debug( debugger, "上午工作时长, 未打卡:minutes= 0 分钟。" );
 					logger.debug( debugger, "上午工作时长, 未打卡:minutes= 0 分钟。" );
 					detail.setWorkTimeDuration( 0L );
 					detail.setWorkTimeDuration( 0L );
 				}
 				}
@@ -165,9 +165,9 @@ class AttendanceDetailAnalyseSignProxy3 {
 							detail.setIsAbnormalDuty(true);
 							detail.setIsAbnormalDuty(true);
 							detail.setIsAbsent(true);
 							detail.setIsAbsent(true);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 							logger.debug( debugger, "没请假,未打卡,算缺卡和缺勤状态。" );
 							logger.debug( debugger, "没请假,未打卡,算缺卡和缺勤状态。" );
 						}
 						}
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 						//员工未签退,计算全天的工作时长,下午的时长不计算
 						//员工未签退,计算全天的工作时长,下午的时长不计算
 						detail.setWorkTimeDuration( 0L );
 						detail.setWorkTimeDuration( 0L );
 						logger.debug( debugger, "员工未签退,上午工作时长暂时记为0分钟,等待补卡或者补提请假申请。" );
 						logger.debug( debugger, "员工未签退,上午工作时长暂时记为0分钟,等待补卡或者补提请假申请。" );
@@ -194,8 +194,8 @@ class AttendanceDetailAnalyseSignProxy3 {
 							detail.setAbsentDayTime("下午");
 							detail.setAbsentDayTime("下午");
 							detail.setIsAbsent(true);
 							detail.setIsAbsent(true);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 						}
 						}
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 						logger.debug( debugger, "下午工作时长, 未打卡:minutes= 0 分钟。" );
 						logger.debug( debugger, "下午工作时长, 未打卡:minutes= 0 分钟。" );
 //						detail.setWorkTimeDuration( 0L );
 //						detail.setWorkTimeDuration( 0L );
 					}
 					}
@@ -266,10 +266,9 @@ class AttendanceDetailAnalyseSignProxy3 {
 							detail.setIsAbnormalDuty(true);
 							detail.setIsAbnormalDuty(true);
 							detail.setIsAbsent(true);
 							detail.setIsAbsent(true);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
 							AttendanceDetailAnalyseCoreService.increaseAbsenceStatusForAttendanceDetail(detail);
-							AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);
 							logger.debug( debugger, "没请假,未打卡,算缺卡和缺勤状态。" );
 							logger.debug( debugger, "没请假,未打卡,算缺卡和缺勤状态。" );
 						}
 						}
-
+						AttendanceDetailAnalyseCoreService.increaseAttendanceStatusForAttendanceDetail(detail);//递减出勤天数 - 0.5
 						//员工未签退,计算全天的工作时长,下午的时长不计算
 						//员工未签退,计算全天的工作时长,下午的时长不计算
 //						detail.setWorkTimeDuration( 0L );
 //						detail.setWorkTimeDuration( 0L );
 						logger.debug( debugger, "员工未签退,全天工作时长暂时记为0分钟,等待补卡或者补提请假申请。" );
 						logger.debug( debugger, "员工未签退,全天工作时长暂时记为0分钟,等待补卡或者补提请假申请。" );

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

@@ -75,6 +75,7 @@ public class AttendanceDetailService {
 						attendanceDetail.setEmpName( attendanceEmployeeConfig.getEmployeeName() );
 						attendanceDetail.setEmpName( attendanceEmployeeConfig.getEmployeeName() );
 						attendanceDetail.setYearString( dateOperation.getYear( dateOperation.getDateFromString(day)) );
 						attendanceDetail.setYearString( dateOperation.getYear( dateOperation.getDateFromString(day)) );
 						attendanceDetail.setMonthString( dateOperation.getMonth( dateOperation.getDateFromString(day)));
 						attendanceDetail.setMonthString( dateOperation.getMonth( dateOperation.getDateFromString(day)));
+						attendanceDetail.setRecordDate( dateOperation.getDateFromString( day ) );
 						attendanceDetail.setRecordDateString( day );
 						attendanceDetail.setRecordDateString( day );
 						attendanceDetail.setRecordStatus( 0 );
 						attendanceDetail.setRecordStatus( 0 );
 						attendanceDetail.setBatchName( "系统补充" );
 						attendanceDetail.setBatchName( "系统补充" );

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

@@ -3,6 +3,7 @@ package com.x.attendance.assemble.control.service;
 import com.x.attendance.assemble.control.Business;
 import com.x.attendance.assemble.control.Business;
 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;
+import com.x.base.core.project.organization.Identity;
 import com.x.base.core.project.organization.Person;
 import com.x.base.core.project.organization.Person;
 import com.x.base.core.project.organization.Unit;
 import com.x.base.core.project.organization.Unit;
 import com.x.base.core.project.tools.ListTools;
 import com.x.base.core.project.tools.ListTools;
@@ -103,6 +104,26 @@ public class UserManagerService {
 			throw e;
 			throw e;
 		}
 		}
 	}
 	}
+
+	/**
+	 * 根据身份名称获取组织名称
+	 * @param identity
+	 * @return
+	 * @throws Exception
+	 */
+	public Unit getUnitWithIdentity( String identity ) throws Exception{
+		Business business = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			business = new Business(emc);
+			if( StringUtils.equalsAnyIgnoreCase( "xadmin", identity ) || StringUtils.equalsAnyIgnoreCase( "cipher", identity ) ){
+				return null;
+			}
+			String name =  business.organization().unit().getWithIdentity( identity );
+			return business.organization().unit().getObject(name);
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
 	
 	
 	/**
 	/**
 	 * 根据身份名称获取顶层组织名称
 	 * 根据身份名称获取顶层组织名称
@@ -317,6 +338,16 @@ public class UserManagerService {
 		}
 		}
 	}
 	}
 
 
+	public List<Person> listAllPersons() throws Exception {
+		Business business = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			business = new Business(emc);
+			return business.organization().person().listAllObject();
+		} catch ( Exception e ) {
+			throw e;
+		}
+	}
+
 	/**
 	/**
 	 * 根据人员姓名获取人员姓名
 	 * 根据人员姓名获取人员姓名
 	 * @param name
 	 * @param name
@@ -336,6 +367,38 @@ public class UserManagerService {
 		}
 		}
 	}
 	}
 
 
+	/**
+	 * 根据个人姓名,根据个人姓名获取主身份
+	 *
+	 * @param personName
+	 * @return
+	 * @throws Exception
+	 */
+	public String getMajorIdentityWithPerson(String personName) throws Exception {
+		List<String> identities = null;
+		Business business = null;
+		try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+			business = new Business(emc);
+			// 兼容一下传过来的perosnName有可能是个人,有可能是身份
+			personName = business.organization().person().get(personName);
+			identities = business.organization().identity().listWithPerson(personName);
+			if (ListTools.isNotEmpty( identities )) {
+				if( identities.size() == 1 ) {
+					return identities.get(0);
+				}
+				for (String identity : identities) {
+					Identity obj = business.organization().identity().getObject(identity);
+					if (obj!= null && obj.getMajor() !=null && obj.getMajor() ) {
+						return identity;
+					}
+				}
+			}
+			return null;
+		} catch (Exception e) {
+			throw e;
+		}
+	}
+
 	/**
 	/**
 	 * 根据人员身份信息获取人员姓名
 	 * 根据人员身份信息获取人员姓名
 	 * @param identityName
 	 * @param identityName