package com.kingdee.eas.custom.ats.handler; import com.alibaba.fastjson.JSONObject; import com.kingdee.bos.BOSException; import com.kingdee.bos.ctrl.swing.StringUtils; import com.kingdee.bos.metadata.entity.FilterInfo; import com.kingdee.bos.metadata.entity.FilterItemCollection; import com.kingdee.bos.metadata.entity.FilterItemInfo; import com.kingdee.bos.metadata.query.util.CompareType; import com.kingdee.jdbc.rowset.IRowSet; import com.kingdee.shr.base.syssetting.context.SHRContext; import com.kingdee.shr.base.syssetting.exception.SHRWebException; import com.kingdee.shr.base.syssetting.json.GridDataEntity; import com.kingdee.shr.base.syssetting.web.handler.ListHandler; import com.kingdee.util.DateTimeUtils; import org.apache.log4j.Logger; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.sql.SQLException; import java.util.*; /** * 类名称: AttendanceDayStatListHandler * 功能描述: 考勤日统计列表处理器 * 创建日期: 2026-05-26 14:54 * 作 者: 青梧 * 版 本: 1.0 */ public class AttendanceDayStatListHandler extends ListHandler { private static Logger logger = Logger.getLogger(AttendanceDayStatListHandler.class); @Override protected void afterGetListData(HttpServletRequest request, HttpServletResponse response, GridDataEntity gridDataEntity) throws SHRWebException { List rows = gridDataEntity.getRows(); // 获取过滤条件中的考勤日期 String fastFilterItems = request.getParameter("fastFilterItems"); logger.error("fastFilterItems---" + fastFilterItems); String attendanceDate = null; if (!StringUtils.isEmpty(fastFilterItems)) { try { JSONObject filterJson = JSONObject.parseObject(fastFilterItems); // 尝试多种方式获取日期值 if (filterJson.containsKey("attendanceDate")) { Object attendanceDateObj = filterJson.get("attendanceDate"); // 如果是JSONObject,尝试获取date或values字段 if (attendanceDateObj instanceof JSONObject) { JSONObject dateObj = (JSONObject) attendanceDateObj; // 先尝试直接获取date字段 if (dateObj.containsKey("values")) { Object valuesObj = dateObj.get("values"); if (valuesObj instanceof JSONObject) { JSONObject values = (JSONObject) valuesObj; if (values.containsKey("date")) { attendanceDate = values.getString("date"); } } else if (valuesObj instanceof String) { attendanceDate = (String) valuesObj; } } } // 如果是字符串,直接使用 else if (attendanceDateObj instanceof String) { attendanceDate = (String) attendanceDateObj; } } } catch (Exception e) { logger.error("解析考勤日期失败", e); } } if (StringUtils.isEmpty(attendanceDate)) { // 如果没有传入日期,默认使用当天 attendanceDate = DateTimeUtils.format(new Date(), "yyyy-MM-dd"); } logger.error("查询考勤日期: " + attendanceDate); try { // 查询考勤数据 Map>> orgDataMap = getAttendanceData(attendanceDate); // 遍历每一行数据,填充统计信息 for (int i = 0; i < rows.size(); i++) { Map map = (Map) rows.get(i); String orgId = map.get("id").toString().trim(); // 获取该组织的考勤人员列表 List> personList = orgDataMap.get(orgId); int shouldAttendCount = 0; // 应出勤人数 int actualAttendCount = 0; // 实际出勤人数 int absentCount = 0; // 未出勤人数 List shouldAttendNames = new ArrayList<>(); // 应出勤人员名单 List actualAttendNames = new ArrayList<>(); // 实际出勤人员名单 List absentNames = new ArrayList<>(); // 未出勤人员名单 if (personList != null && !personList.isEmpty()) { for (Map personData : personList) { Integer s50 = (Integer) personData.get("s50"); Integer s51 = (Integer) personData.get("s51"); String personName = (String) personData.get("personName"); // s50=1 表示应出勤 if (s50 != null && s50 == 1) { shouldAttendCount++; if (personName != null) { shouldAttendNames.add(personName); } // s51=1 表示实际出勤 if (s51 != null && s51 == 1) { actualAttendCount++; if (personName != null) { actualAttendNames.add(personName); } } else { // s51=0 或 NULL 表示未出勤 absentCount++; if (personName != null) { absentNames.add(personName); } } } } } // 将统计数据放入返回结果中 map.put("shouldAttendCount", shouldAttendCount); map.put("actualAttendCount", actualAttendCount); map.put("absentCount", absentCount); map.put("shouldAttendNames", String.join(",", shouldAttendNames)); map.put("actualAttendNames", String.join(",", actualAttendNames)); map.put("absentNames", String.join(",", absentNames)); } } catch (Exception e) { logger.error("查询考勤统计数据失败", e); throw new SHRWebException("查询考勤统计数据失败: " + e.getMessage()); } } /** * 重写快速过滤方法,处理adminOrg和attendanceDate过滤条件 * 1. 移除 attendanceDate (不用于组织查询) * 2. 将 adminOrg 转换为 id (用于组织过滤) */ @Override protected FilterInfo getFastFilter(HttpServletRequest request) throws SHRWebException { FilterInfo filterInfo = new FilterInfo(); FilterItemCollection filterItems = filterInfo.getFilterItems(); try { String fastFilterItems = request.getParameter("fastFilterItems"); if (!StringUtils.isEmpty(fastFilterItems)) { JSONObject filterJson = JSONObject.parseObject(fastFilterItems); // 处理adminOrg过滤条件:将 adminOrg 转换为 id if (filterJson.containsKey("adminOrg")) { Object adminOrgObj = filterJson.get("adminOrg"); if (adminOrgObj instanceof JSONObject) { JSONObject adminOrgJson = (JSONObject) adminOrgObj; String orgId = adminOrgJson.getString("values"); Boolean isIncludeSub = adminOrgJson.getBoolean("isIncludeSub"); isIncludeSub = true; if (!StringUtils.isEmpty(orgId)) { logger.info("处理adminOrg过滤条件,组织ID: " + orgId + ", 包含下级: " + isIncludeSub); // 添加id过滤条件 if (isIncludeSub != null && isIncludeSub) { // 包含下级:使用 longNumber LIKE 查询当前组织及所有下级组织 // 需要获取该组织的longNumber try { String longNumber = getOrgLongNumber(orgId); if (longNumber != null) { filterItems.add(new FilterItemInfo("longNumber", longNumber + "%", CompareType.LIKE)); logger.info("包含当前组织及下级组织,使用longNumber: " + longNumber); } else { // 如果获取不到longNumber,使用id精确匹配 filterItems.add(new FilterItemInfo("id", orgId)); } } catch (Exception e) { logger.error("获取组织longNumber失败", e); filterItems.add(new FilterItemInfo("id", orgId)); } } else { // 不包含下级:精确匹配 filterItems.add(new FilterItemInfo("id", orgId)); } } } } } } catch (Exception e) { logger.error("处理fastFilterItems失败", e); } return filterInfo; } /** * 查询考勤数据 * * @param attendanceDate 考勤日期 yyyy-MM-dd * @return Map<组织ID, 人员数据列表> */ public Map>> getAttendanceData(String attendanceDate) throws SQLException, BOSException { Map>> resultMap = new HashMap<>(); StringBuilder sql = new StringBuilder(); sql.append("SELECT result.s50, result.s51, person.fName_l2 AS personName, result.FADMINORGUNITID "); sql.append("FROM T_HR_ATS_AttendanceResult result "); sql.append("LEFT JOIN T_BD_PERSON person ON person.fid = result.FPROPOSERID "); sql.append("WHERE result.fattencedate = {ts '").append(attendanceDate).append(" 00:00:00'} "); sql.append("AND result.s50 = 1 "); logger.error("考勤统计SQL: " + sql.toString()); IRowSet rs = com.kingdee.eas.util.app.DbUtil.executeQuery(SHRContext.getInstance().getContext(), sql.toString()); while (rs.next()) { String orgId = rs.getString("FADMINORGUNITID"); if (orgId == null || orgId.trim().isEmpty()) { continue; } Map personData = new HashMap<>(); personData.put("s50", rs.getInt("s50")); personData.put("s51", rs.getInt("s51")); personData.put("personName", rs.getString("personName")); if (resultMap.containsKey(orgId)) { resultMap.get(orgId).add(personData); } else { List> personList = new ArrayList<>(); personList.add(personData); resultMap.put(orgId, personList); } } return resultMap; } /** * 获取组织的longNumber * * @param orgId 组织ID * @return longNumber */ private String getOrgLongNumber(String orgId) throws SQLException, BOSException { StringBuilder sql = new StringBuilder(); sql.append("SELECT FLONGNUMBER FROM T_ORG_ADMIN WHERE FID = '").append(orgId).append("' "); logger.info("查询组织longNumber SQL: " + sql.toString()); IRowSet rs = com.kingdee.eas.util.app.DbUtil.executeQuery(SHRContext.getInstance().getContext(), sql.toString()); if (rs.next()) { return rs.getString("FLONGNUMBER"); } return null; } }