فهرست منبع

考勤,新增统计导出功能,查询新增时间段作为查询条件

luojing 5 سال پیش
والد
کامیت
654d18ba27

+ 3 - 2
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/common/date/DateOperation.java

@@ -711,8 +711,9 @@ public class DateOperation {
 	 */
 	public static Date getLastDayOfMonth(Date date) {  
         Calendar calendar = convert(date);  
-        calendar.set(Calendar.DATE, calendar.getMaximum(Calendar.DATE));  
-        return calendar.getTime();  
+        //calendar.set(Calendar.DATE, calendar.getMaximum(Calendar.DATE));
+		calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH));
+		return calendar.getTime();
     }  
 	/** 
      * 将日期转换为日历 

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

@@ -965,8 +965,126 @@ public class AttendanceDetailFactory extends AbstractFactory {
 		for (int i = 0; i < vs.size(); i++) {
 			query.setParameter(i + 1, vs.get(i));
 		}
+		System.out.println("query=" +query.toString());
 		return query.setMaxResults(count).getResultList();
 	}
+
+	/**
+	 * 根据条件查询考勤信息ids(排除不参加考勤的人员)
+	 * @param wrapIn
+	 * @return
+	 * @throws Exception
+	 */
+	//根据人员和打卡日期查找打卡记录
+	public List<AttendanceDetail> listIdsWithFilterUn( WrapInFilter wrapIn ,List<String> unUnitNameList,List<String> personNameList )  throws Exception {
+		EntityManager em = this.entityManagerContainer().get( AttendanceDetail.class );
+		String order = wrapIn.getOrder();//排序方式
+		List<Object> vs = new ArrayList<>();
+		StringBuffer sql_stringBuffer = new StringBuffer();
+
+		if( order == null || order.isEmpty() ){
+			order = "DESC";
+		}
+
+		Integer index = 1;
+		sql_stringBuffer.append( "SELECT o FROM "+AttendanceDetail.class.getCanonicalName()+" o where 1=1" );
+
+		if ((null != wrapIn.getQ_empName()) && (!wrapIn.getQ_empName().isEmpty())) {
+			sql_stringBuffer.append(" and o.empName = ?" + (index));
+			vs.add( wrapIn.getQ_empName() );
+			index++;
+		}
+		if (null != wrapIn.getUnitNames() && wrapIn.getUnitNames().size()>0) {
+			sql_stringBuffer.append(" and o.unitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getUnitNames() );
+			index++;
+		}
+		if (null != wrapIn.getTopUnitNames() && wrapIn.getTopUnitNames().size() > 0 ) {
+			sql_stringBuffer.append(" and o.topUnitName in ( ?" + (index) + ")");
+			vs.add( wrapIn.getTopUnitNames() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleYear() ) && (!wrapIn.getCycleYear().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleYear = ?" + (index));
+			vs.add( wrapIn.getCycleYear() );
+			index++;
+		}
+		if ((null != wrapIn.getCycleMonth()) && (!wrapIn.getCycleMonth().isEmpty())) {
+			sql_stringBuffer.append(" and o.cycleMonth = ?" + (index));
+			vs.add( wrapIn.getCycleMonth() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_year() ) && (!wrapIn.getQ_year().isEmpty())) {
+			sql_stringBuffer.append(" and o.yearString = ?" + (index));
+			vs.add( wrapIn.getQ_year() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_month()) && (!wrapIn.getQ_month().isEmpty())) {
+			sql_stringBuffer.append(" and o.monthString = ?" + (index));
+			vs.add( wrapIn.getQ_month() );
+			index++;
+		}
+		if ((null != wrapIn.getQ_date()) && (!wrapIn.getQ_date().isEmpty())) {
+			sql_stringBuffer.append(" and o.recordDateString = ?" + (index));
+			vs.add( wrapIn.getQ_date() );
+			index++;
+		}
+
+		if ( wrapIn.getRecordStatus() != 999 ) {
+			sql_stringBuffer.append(" and o.recordStatus = ?" + (index));
+			vs.add( wrapIn.getRecordStatus() );
+			index++;
+		}
+
+		if (wrapIn.getIsAbsent() != null ) {
+			sql_stringBuffer.append(" and o.isAbsent = ?" + (index));
+			vs.add( wrapIn.getIsAbsent() );
+			index++;
+		}
+
+		if (wrapIn.getIsLate() != null ) {
+			sql_stringBuffer.append(" and o.isLate = ?" + (index));
+			vs.add( wrapIn.getIsLate() );
+			index++;
+		}
+
+		if (wrapIn.getIsLackOfTime() != null ) {
+			sql_stringBuffer.append(" and o.isLackOfTime = ?" + (index));
+			vs.add( wrapIn.getIsLackOfTime() );
+			index++;
+		}
+
+		if (wrapIn.getIsLeaveEarlier() != null ) {
+			sql_stringBuffer.append(" and o.isLeaveEarlier = ?" + (index));
+			vs.add( wrapIn.getIsLeaveEarlier() );
+			index++;
+		}
+
+		if (ListTools.isNotEmpty(unUnitNameList)) {
+			sql_stringBuffer.append(" and o.unitName not in ( ?" + (index) + ")");
+			vs.add( unUnitNameList );
+			index++;
+		}
+		if (ListTools.isNotEmpty(personNameList)) {
+			sql_stringBuffer.append(" and o.empName not in ( ?" + (index) + ")");
+			vs.add( personNameList );
+			index++;
+		}
+
+		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
+			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
+		}else{
+			sql_stringBuffer.append(" order by o.sequence " + order );
+		}
+		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceDetail.class );
+		for (int i = 0; i < vs.size(); i++) {
+			query.setParameter(i + 1, vs.get(i));
+		}
+		System.out.println("query=" +query.toString());
+		return query.getResultList();
+		/*cq.select( root.get(AttendanceDetail_.id ));
+		return em.createQuery(cq.where(p)).getResultList();*/
+	}
 	
 	/**
 	 * 查询上一页的文档信息数据

+ 12 - 1
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/factory/AttendanceSelfHolidayFactory.java

@@ -2,6 +2,7 @@ package com.x.attendance.assemble.control.factory;
 
 import com.x.attendance.assemble.control.AbstractFactory;
 import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.jaxrs.selfholiday.ActionListNextWithFilter;
 import com.x.attendance.assemble.control.jaxrs.selfholiday.WrapInFilter;
 import com.x.attendance.entity.AttendanceSelfHoliday;
 import com.x.attendance.entity.AttendanceSelfHoliday_;
@@ -122,7 +123,7 @@ public class AttendanceSelfHolidayFactory extends AbstractFactory {
 	 * @throws Exception
 	 */
 	@SuppressWarnings("unchecked")
-	public List<AttendanceSelfHoliday> listIdsNextWithFilter( String id, Integer count, Object sequence, WrapInFilter wrapIn ) throws Exception {
+	public List<AttendanceSelfHoliday> listIdsNextWithFilter( String id, Integer count, Object sequence, ActionListNextWithFilter.WrapIn wrapIn ) throws Exception {
 		//先获取上一页最后一条的sequence值,如果有值的话,以此sequence值作为依据取后续的count条数据
 		EntityManager em = this.entityManagerContainer().get( AttendanceSelfHoliday.class );
 		String order = wrapIn.getOrder();//排序方式
@@ -156,6 +157,15 @@ public class AttendanceSelfHolidayFactory extends AbstractFactory {
 			vs.add( wrapIn.getTopUnitNames() );
 			index++;
 		}
+		if (null != wrapIn.getStartdate() && null != wrapIn.getEnddate()) {
+			sql_stringBuffer.append(" and o.startTime >  ?" + (index) );
+			vs.add( wrapIn.getStartdate());
+			index++;
+
+			sql_stringBuffer.append(" and o.endTime < ?" + (index));
+			vs.add( wrapIn.getEnddate());
+			index++;
+		}
 		
 		if( StringUtils.isNotEmpty( wrapIn.getKey() )){
 			sql_stringBuffer.append(" order by o."+wrapIn.getKey()+" " + order );
@@ -164,6 +174,7 @@ public class AttendanceSelfHolidayFactory extends AbstractFactory {
 		}
 		
 		Query query = em.createQuery( sql_stringBuffer.toString(), AttendanceSelfHoliday.class );
+		System.out.println("query=" +query.toString());
 		//为查询设置所有的参数值
 		for (int i = 0; i < vs.size(); i++) {
 			query.setParameter(i + 1, vs.get(i));

+ 329 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attachment/ActionExportDetailWithFilter.java

@@ -0,0 +1,329 @@
+package com.x.attendance.assemble.control.jaxrs.attachment;
+
+import com.google.gson.JsonElement;
+import com.x.attendance.assemble.control.Business;
+import com.x.attendance.assemble.control.ExceptionWrapInConvert;
+import com.x.attendance.assemble.control.jaxrs.attendancedetail.WrapInFilter;
+import com.x.attendance.assemble.control.service.AttendanceEmployeeConfigServiceAdv;
+import com.x.attendance.assemble.control.service.UserManagerService;
+import com.x.attendance.entity.*;
+import com.x.base.core.container.EntityManagerContainer;
+import com.x.base.core.container.factory.EntityManagerContainerFactory;
+import com.x.base.core.project.http.ActionResult;
+import com.x.base.core.project.http.EffectivePerson;
+import com.x.base.core.project.jaxrs.WoFile;
+import com.x.base.core.project.logger.Logger;
+import com.x.base.core.project.logger.LoggerFactory;
+import com.x.base.core.project.tools.DateTools;
+import com.x.base.core.project.tools.ListTools;
+import org.apache.commons.lang3.BooleanUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+
+import javax.servlet.http.HttpServletRequest;
+import java.io.ByteArrayOutputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 导出统计明细
+ */
+public class ActionExportDetailWithFilter extends BaseAction {
+	
+	private static  Logger logger = LoggerFactory.getLogger(ActionExportDetailWithFilter.class);
+	private UserManagerService userManagerService = new UserManagerService();
+	protected AttendanceEmployeeConfigServiceAdv attendanceEmployeeConfigServiceAdv = new AttendanceEmployeeConfigServiceAdv();
+	
+	protected ActionResult<Wo> execute( HttpServletRequest request, EffectivePerson effectivePerson,
+										String q_topUnitName,
+										String q_unitName,
+										String q_empName,
+										String cycleYear,
+										String cycleMonth,
+										String q_date,
+										String isAbsent,
+										String isLackOfTime,
+										String isLate,
+										Boolean stream) throws Exception {
+		ActionResult<Wo> result = new ActionResult<>();
+		EffectivePerson currentPerson = this.effectivePerson(request);
+		List<String> ids = null;
+		List<AttendanceDetail> detailList = null;
+		Workbook wb = null;
+		Wo wo = null;
+		String fileName = null;
+		String sheetName = null;
+		Boolean check = true;
+		WrapInFilter wrapIn = new WrapInFilter();
+
+		long total = 0;
+		List<String> topUnitNames = new ArrayList<String>();
+		List<String> unitNames = new ArrayList<String>();
+		List<String> topUnitNames_tmp = null;
+		List<String> unitNames_tmp = null;
+		AttendanceScheduleSetting scheduleSetting_top = null;
+		AttendanceScheduleSetting scheduleSetting = null;
+
+
+		List<String> unUnitNameList = new ArrayList<String>();
+		List<String> personNameList = new ArrayList<String>();
+
+		try {
+			if(StringUtils.isNotEmpty(q_topUnitName) && !StringUtils.equals(q_topUnitName,"0")){
+				wrapIn.setQ_topUnitName(q_topUnitName);
+			}
+			if(StringUtils.isNotEmpty(q_unitName)&& !StringUtils.equals(q_unitName,"0")){
+				wrapIn.setQ_unitName(q_unitName);
+			}
+			if(StringUtils.isNotEmpty(q_empName)&& !StringUtils.equals(q_empName,"0")){
+				wrapIn.setQ_empName(q_empName);
+				wrapIn.setKey("recordDateString");
+			}
+			if(StringUtils.isNotEmpty(cycleYear)&& !StringUtils.equals(cycleYear,"0")){
+				wrapIn.setCycleYear(cycleYear);
+			}
+			if(StringUtils.isNotEmpty(cycleMonth)&& !StringUtils.equals(cycleMonth,"0")){
+				wrapIn.setCycleMonth(cycleMonth);
+			}
+			if(StringUtils.isNotEmpty(q_date)&& !StringUtils.equals(q_date,"0")){
+				wrapIn.setQ_date(q_date);
+			}
+			if(!StringUtils.equals(isAbsent,"0")){
+				wrapIn.setIsAbsent(BooleanUtils.toBoolean(isAbsent));
+			}
+			if(!StringUtils.equals(isLackOfTime,"0")){
+				wrapIn.setIsLackOfTime(BooleanUtils.toBoolean(isLackOfTime));
+			}
+			if(!StringUtils.equals(isLate,"0")){
+				wrapIn.setIsLate(BooleanUtils.toBoolean(isLate));
+			}
+		} catch (Exception e) {
+			check = false;
+			logger.error(e, currentPerson, request, null);
+		}
+		if(check){
+				// 处理一下顶层组织,查询下级顶层组织
+				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) {
+						Exception exception = new ExceptionAttendanceDetailProcess(e,
+								"根据顶层组织顶层组织列示所有下级组织名称发生异常!TopUnit:" + wrapIn.getQ_topUnitName());
+						result.error(exception);
+						logger.error(e, currentPerson, request, null);
+					}
+					if (topUnitNames_tmp != null && topUnitNames_tmp.size() > 0) {
+						for (String topUnitName : topUnitNames_tmp) {
+							topUnitNames.add(topUnitName);
+						}
+					}
+					wrapIn.setTopUnitNames(topUnitNames);
+				}
+
+				// 处理一下组织,查询下级组织
+				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) {
+						Exception exception = new ExceptionAttendanceDetailProcess(e,
+								"根据组织名称列示所有下级组织名称发生异常!Unit:" + wrapIn.getQ_unitName());
+						result.error(exception);
+						logger.error(e, currentPerson, request, null);
+					}
+					if (unitNames_tmp != null && unitNames_tmp.size() > 0) {
+						for (String unitName : unitNames_tmp) {
+							unitNames.add(unitName);
+						}
+					}
+					wrapIn.setUnitNames(unitNames);
+				}
+
+		}
+		if (check ) {
+			unUnitNameList = getUnUnitNameList();
+			personNameList = getUnPersonNameList();
+			try (EntityManagerContainer emc = EntityManagerContainerFactory.instance().create()) {
+				// 从数据库中查询符合条件的一页数据对象
+				Business business = new Business(emc);
+				/*ids = business.getAttendanceDetailFactory().listIdsWithFilterUn(wrapIn,unUnitNameList,personNameList);
+				detailList = business.getAttendanceDetailFactory().list(ids);*/
+				detailList = business.getAttendanceDetailFactory().listIdsWithFilterUn(wrapIn,unUnitNameList,personNameList);
+				logger.info("detailList======"+detailList.size() );
+			}catch (Exception e) {
+				logger.info("系统在查询符合条件的打卡记录时发生异常。" );
+				e.printStackTrace();
+			}
+
+		}
+		// 将结果组织成EXCEL		
+		if( check ) {
+			fileName = "统计打卡记录明细_"+ DateTools.formatDate(new Date())+".xls";
+			sheetName = "Sheet1";
+			wb = composeDetail( fileName, sheetName, detailList );
+		}
+		
+		if( check ) {
+			ByteArrayOutputStream bos = new ByteArrayOutputStream();
+			try {
+			    wb.write(bos);
+			    wo = new Wo(bos.toByteArray(), 
+						this.contentType(stream, fileName), 
+						this.contentDisposition(stream, fileName));
+			} finally {
+			    bos.close();
+			}
+		}		
+		result.setData(wo);
+		return result;
+	}
+
+	private Workbook composeDetail(String fileName, String sheetName, List<AttendanceDetail> detailList) {
+		AttendanceDetail attendanceDetail = null;
+		AttendanceAppealInfo attendanceAppealInfo = null;
+		
+		Workbook wb = new HSSFWorkbook();
+		Row row = null;
+		if (ListTools.isNotEmpty(detailList) ) {
+			// 创建新的表格
+			Sheet sheet = wb.createSheet(sheetName);
+			
+			// 先创建表头
+			row = sheet.createRow(0);
+			row.createCell(0).setCellValue("顶层组织名称");
+			row.createCell(1).setCellValue("组织名称");
+			row.createCell(2).setCellValue("姓名");
+			row.createCell(3).setCellValue("日期");
+			row.createCell(4).setCellValue("说明");
+			row.createCell(5).setCellValue("上午上班打卡时间");
+			row.createCell(6).setCellValue("上午下班打卡时间");
+			row.createCell(7).setCellValue("下午上班打卡时间");
+			row.createCell(8).setCellValue("下午下班打开时间");
+			row.createCell(9).setCellValue("考勤状态");
+			row.createCell(10).setCellValue("申诉状态");
+
+			for (int i = 0; i < detailList.size(); i++) {
+				attendanceDetail = detailList.get(i);
+				row = sheet.createRow(i + 1);
+				String topUnitName = attendanceDetail.getTopUnitName();
+				String unitName = attendanceDetail.getUnitName();
+				String empName = attendanceDetail.getEmpName();
+				if(StringUtils.isNotEmpty(topUnitName) && StringUtils.contains(topUnitName,"@")){
+					topUnitName = topUnitName.split("@")[0];
+				}
+				if(StringUtils.isNotEmpty(unitName) && StringUtils.contains(unitName,"@")){
+					unitName = unitName.split("@")[0];
+				}
+				if(StringUtils.isNotEmpty(empName) && StringUtils.contains(empName,"@")){
+					empName = empName.split("@")[0];
+				}
+				row.createCell(0).setCellValue(topUnitName);
+				row.createCell(1).setCellValue(unitName);
+				row.createCell(2).setCellValue(empName);
+				row.createCell(3).setCellValue(attendanceDetail.getRecordDateString());
+				row.createCell(4).setCellValue(attendanceDetail.getDescription());
+				row.createCell(5).setCellValue(attendanceDetail.getOnDutyTime());
+				row.createCell(6).setCellValue(attendanceDetail.getMorningOffDutyTime());
+				row.createCell(7).setCellValue(attendanceDetail.getAfternoonOnDutyTime());
+				row.createCell(8).setCellValue(attendanceDetail.getOffDutyTime());
+
+				if(attendanceDetail.getIsGetSelfHolidays()){
+					row.createCell(9).setCellValue("请假或外出报备");
+				}else if (attendanceDetail.getIsAbsent()) {
+					row.createCell(9).setCellValue("缺勤");
+				} else if (attendanceDetail.getIsLackOfTime()) {
+					row.createCell(9).setCellValue("工时不足");
+				} else if (attendanceDetail.getIsAbnormalDuty()) {
+					row.createCell(9).setCellValue("异常打卡");
+				}else if(attendanceDetail.getIsLeaveEarlier()){
+					row.createCell(9).setCellValue("早退");
+				} else if (attendanceDetail.getIsLate()) {
+					row.createCell(9).setCellValue("迟到");
+				} else {
+					row.createCell(9).setCellValue("正常");
+				}
+
+				switch(attendanceDetail.getAppealStatus()){
+					case 1 :
+						row.createCell(10).setCellValue("申诉中");
+						break;
+					case -1 :
+						row.createCell(10).setCellValue("申诉未通过");
+						break;
+					case 9 :
+						row.createCell(10).setCellValue("申诉通过");
+						break;
+					default :
+						row.createCell(10).setCellValue("未申诉");
+				}
+			}
+		}
+		return wb;
+	}
+
+	/**
+	 * 获取不需要考勤的组织
+	 * @return
+	 * @throws Exception
+	 */
+	protected  List<String> getUnUnitNameList() throws Exception {
+		List<String> unUnitNameList = new ArrayList<String>();
+
+		List<AttendanceEmployeeConfig> attendanceEmployeeConfigs = attendanceEmployeeConfigServiceAdv.listByConfigType("NOTREQUIRED");
+
+		if(ListTools.isNotEmpty(attendanceEmployeeConfigs)){
+			for (AttendanceEmployeeConfig attendanceEmployeeConfig : attendanceEmployeeConfigs) {
+				String unitName = attendanceEmployeeConfig.getUnitName();
+				String employeeName = attendanceEmployeeConfig.getEmployeeName();
+
+				if(StringUtils.isEmpty(employeeName) && StringUtils.isNotEmpty(unitName)){
+					unUnitNameList.add(unitName);
+					List<String> tempUnitNameList = userManagerService.listSubUnitNameWithParent(unitName);
+					if(ListTools.isNotEmpty(tempUnitNameList)){
+						for(String tempUnit:tempUnitNameList){
+							if(!ListTools.contains(unUnitNameList, tempUnit)){
+								unUnitNameList.add(tempUnit);
+							}
+						}
+					}
+				}
+			}
+		}
+		return unUnitNameList;
+	}
+
+	/**
+	 * 获取不需要考勤的人员
+	 * @return
+	 * @throws Exception
+	 */
+	protected  List<String> getUnPersonNameList() throws Exception {
+		List<String> personNameList = new ArrayList<String>();
+		List<AttendanceEmployeeConfig> attendanceEmployeeConfigs = attendanceEmployeeConfigServiceAdv.listByConfigType("NOTREQUIRED");
+
+		if(ListTools.isNotEmpty(attendanceEmployeeConfigs)){
+			for (AttendanceEmployeeConfig attendanceEmployeeConfig : attendanceEmployeeConfigs) {
+				String employeeName = attendanceEmployeeConfig.getEmployeeName();
+
+				if(StringUtils.isNotEmpty(employeeName) && !ListTools.contains(personNameList, employeeName)){
+					personNameList.add(employeeName);
+				}
+			}
+		}
+		return personNameList;
+	}
+
+	public static class Wo extends WoFile {
+		public Wo(byte[] bytes, String contentType, String contentDisposition) {
+			super(bytes, contentType, contentDisposition);
+		}
+	}
+
+}

+ 2 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attachment/BaseAction.java

@@ -2,10 +2,12 @@ package com.x.attendance.assemble.control.jaxrs.attachment;
 
 import com.x.attendance.assemble.common.date.DateOperation;
 import com.x.attendance.assemble.control.service.AttendanceImportFileInfoServiceAdv;
+import com.x.attendance.assemble.control.service.AttendanceScheduleSettingServiceAdv;
 import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 
 public class BaseAction extends StandardJaxrsAction {
 	protected AttendanceImportFileInfoServiceAdv importFileInfoServiceAdv = new AttendanceImportFileInfoServiceAdv();
+	protected AttendanceScheduleSettingServiceAdv attendanceScheduleSettingServiceAdv = new AttendanceScheduleSettingServiceAdv();
 	protected DateOperation dateOperation = new DateOperation();
 }
 

+ 16 - 0
o2server/x_attendance_assemble_control/src/main/java/com/x/attendance/assemble/control/jaxrs/attachment/ExceptionAttendanceDetailProcess.java

@@ -0,0 +1,16 @@
+package com.x.attendance.assemble.control.jaxrs.attachment;
+
+import com.x.base.core.project.exception.PromptException;
+
+class ExceptionAttendanceDetailProcess extends PromptException {
+
+	private static final long serialVersionUID = 1859164370743532895L;
+
+	public ExceptionAttendanceDetailProcess(Throwable e, String message ) {
+		super("用户在进行考勤打卡数据信息处理时发生异常!message:" + message, e );
+	}
+	
+	public ExceptionAttendanceDetailProcess(String message ) {
+		super("用户在进行考勤打卡数据信息处理时发生异常!message:" + message );
+	}
+}

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

@@ -1,17 +1,13 @@
 package com.x.attendance.assemble.control.jaxrs.attachment;
 
 import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
+import javax.ws.rs.*;
 import javax.ws.rs.container.AsyncResponse;
 import javax.ws.rs.container.Suspended;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
 
+import com.google.gson.JsonElement;
 import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
 import org.glassfish.jersey.media.multipart.FormDataParam;
 
@@ -27,6 +23,8 @@ import com.x.base.core.project.jaxrs.StandardJaxrsAction;
 import com.x.base.core.project.logger.Logger;
 import com.x.base.core.project.logger.LoggerFactory;
 
+import java.util.List;
+
 @Path("file")
 @JaxrsDescribe("附件操作")
 public class FileImportExportAction extends StandardJaxrsAction {
@@ -111,4 +109,30 @@ public class FileImportExportAction extends StandardJaxrsAction {
 		}
 		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
 	}
+
+	@JaxrsMethodDescribe(value = "导出符合过滤条件的打卡记录明细", action = ActionExportDetailWithFilter.class)
+	@GET
+	@Path("export/filter/{q_topUnitName}/{q_unitName}/{q_empName}/{cycleYear}/{cycleMonth}/{q_date}/{isAbsent}/{isLackOfTime}/{isLate}/stream/{stream}")
+	@Consumes(MediaType.APPLICATION_JSON)
+	public void detailsExportStream(@Suspended final AsyncResponse asyncResponse, @Context HttpServletRequest request,
+									@JaxrsParameterDescribe("公司,为空时输入0") @PathParam("q_topUnitName") String q_topUnitName,
+									@JaxrsParameterDescribe("部门,为空时输入0") @PathParam("q_unitName") String q_unitName,
+									@JaxrsParameterDescribe("员工,为空时输入0") @PathParam("q_empName") String q_empName,
+									@JaxrsParameterDescribe("统计周期年份,为空时输入0") @PathParam("cycleYear") String cycleYear,
+									@JaxrsParameterDescribe("统计周期月份,为空时输入0") @PathParam("cycleMonth") String cycleMonth,
+									@JaxrsParameterDescribe("统计具体日期,为空时输入0") @PathParam("q_date") String q_date,
+									@JaxrsParameterDescribe("是否缺勤,为空时输入0") @PathParam("isAbsent") String isAbsent,
+									@JaxrsParameterDescribe("是否工时不足,为空时输入0") @PathParam("isLackOfTime") String isLackOfTime,
+									@JaxrsParameterDescribe("是否迟到,为空时输入0") @PathParam("isLate") String isLate,
+								   @JaxrsParameterDescribe("用.APPLICATION_OCTET_STREAM头输出") @PathParam("stream") Boolean stream) {
+		ActionResult<ActionExportDetailWithFilter.Wo> result = new ActionResult<>();
+		EffectivePerson effectivePerson = this.effectivePerson(request);
+		try {
+			result = new ActionExportDetailWithFilter().execute(request, effectivePerson, q_topUnitName, q_unitName,q_empName,cycleYear,cycleMonth,q_date,isAbsent,isLackOfTime,isLate, stream);
+		} catch (Exception e) {
+			logger.error(e, effectivePerson, request, null);
+			result.error(e);
+		}
+		asyncResponse.resume(ResponseFactory.getEntityTagActionResultResponse(request, result));
+	}
 }

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

@@ -1,10 +1,12 @@
 package com.x.attendance.assemble.control.jaxrs.selfholiday;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 import javax.servlet.http.HttpServletRequest;
 
+import com.x.attendance.assemble.common.date.DateOperation;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.commons.lang3.StringUtils;
 
@@ -26,7 +28,7 @@ import com.x.base.core.project.logger.LoggerFactory;
 public class ActionListNextWithFilter extends BaseAction {
 	
 	private static  Logger logger = LoggerFactory.getLogger( ActionListNextWithFilter.class );
-	
+	protected DateOperation dateOperation = new DateOperation();
 	protected ActionResult<List<Wo>> execute( HttpServletRequest request, EffectivePerson effectivePerson, String id, Integer count, JsonElement jsonElement ) throws Exception {
 		ActionResult<List<Wo>> result = new ActionResult<>();
 		List<Wo> wraps = new ArrayList<>();
@@ -36,11 +38,29 @@ public class ActionListNextWithFilter extends BaseAction {
 		List<String> topUnitNames = new ArrayList<String>();
 		List<String> unitNames = new ArrayList<String>();
 		List<String> unitNameList = null;
-		WrapInFilter wrapIn = null;
+		WrapIn wrapIn = null;
 		Boolean check = true;
+		Date startDate = null;
+		Date endDate = null;
 		
 		try {
-			wrapIn = this.convertToWrapIn( jsonElement, WrapInFilter.class );
+			wrapIn = this.convertToWrapIn( jsonElement, WrapIn.class );
+			startDate = dateOperation.getDateFromString( wrapIn.getStartdateString() + " 00:00:00");
+			endDate = dateOperation.getDateFromString( wrapIn.getEnddateString() + " 23:59:59");
+
+			if( endDate == null ){
+				endDate = dateOperation.getLastDateInMonth( new Date() );
+			}
+
+			if( startDate == null ){
+				startDate = dateOperation.getFirstDateInMonth( new Date() );
+			}
+
+			if( startDate.after( endDate ) ){
+				startDate = dateOperation.getFirstDateInMonth( new Date() );
+			}
+			wrapIn.setStartdate(startDate);
+			wrapIn.setEnddate(endDate);
 		} catch (Exception e ) {
 			check = false;
 			Exception exception = new ExceptionWrapInConvert( e, jsonElement );
@@ -116,7 +136,44 @@ public class ActionListNextWithFilter extends BaseAction {
 		result.setData(wraps);
 		return result;
 	}
+	public static class WrapIn extends WrapInFilter{
+		String startdateString;
+		String enddateString;
+		Date startdate = null;
+		Date enddate = null;
+
+		public String getStartdateString() {
+			return startdateString;
+		}
 
+		public void setStartdateString(String startdateString) {
+			this.startdateString = startdateString;
+		}
+
+		public String getEnddateString() {
+			return enddateString;
+		}
+
+		public void setEnddateString(String enddateString) {
+			this.enddateString = enddateString;
+		}
+
+		public Date getStartdate() {
+			return startdate;
+		}
+
+		public void setStartdate(Date startdate) {
+			this.startdate = startdate;
+		}
+
+		public Date getEnddate() {
+			return enddate;
+		}
+
+		public void setEnddate(Date enddate) {
+			this.enddate = enddate;
+		}
+	}
 	public static class Wo extends AttendanceSelfHoliday  {
 		
 		private static final long serialVersionUID = -5076990764713538973L;

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

@@ -169,8 +169,8 @@ class AttendanceDetailAnalyseSignProxy2 {
 				if( middleDutyTime == null){
 					if ( isSelfHoliday_Afternoon || isSelfHoliday_Afternoon || isNotWorkDay ) {
 						logger.debug(debugger, "请假不计考勤,不算出勤");
-						detail.setIsAbsent(false);
-						detail.setAbsence(0.0);
+						/*detail.setIsAbsent(false);
+						detail.setAbsence(0.0);*/
 					} else {
 						logger.debug(debugger, "没请假,中午缺卡");
 						if( StringUtils.equals( "上午", detail.getAbnormalDutyDayTime()) ){
@@ -185,8 +185,8 @@ class AttendanceDetailAnalyseSignProxy2 {
 					if(middleDutyTime.before( morningEndTime )){
 						if(isSelfHoliday_Morning || isSelfHoliday_Afternoon || isNotWorkDay){
 							logger.debug( debugger, "请假、休息天不计考勤,不算出勤,不算早退" );
-							detail.setLeaveEarlierTimeDuration( 0L );
-							detail.setIsLeaveEarlier( false );
+							/*detail.setLeaveEarlierTimeDuration( 0L );
+							detail.setIsLeaveEarlier( false );*/
 						}else{
 							minutes = dateOperation.getMinutes( middleDutyTime, morningEndTime );//计算早退时长
 							detail.setLeaveEarlierTimeDuration(minutes); //早退时长
@@ -197,8 +197,8 @@ class AttendanceDetailAnalyseSignProxy2 {
 					if(middleDutyTime.after( afternoonStartTime )){
 						if( isSelfHoliday_Morning || isSelfHoliday_Afternoon || isNotWorkDay ){
 							logger.debug( debugger, "请过假了不算迟到" );
-							detail.setLateTimeDuration( 0L ); //请假了不算迟到
-							detail.setIsLate( false );//请假了不算迟到
+							/*detail.setLateTimeDuration( 0L ); //请假了不算迟到
+							detail.setIsLate( false );//请假了不算迟到*/
 						}else{
 							//迟到计算从上班时间开始计算,不是迟到起算时间
 							minutes = dateOperation.getMinutes( afternoonStartTime, middleDutyTime );