| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- 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<String, List<Map<String, Object>>> 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<Map<String, Object>> personList = orgDataMap.get(orgId);
- int shouldAttendCount = 0; // 应出勤人数
- int actualAttendCount = 0; // 实际出勤人数
- int absentCount = 0; // 未出勤人数
- List<String> shouldAttendNames = new ArrayList<>(); // 应出勤人员名单
- List<String> actualAttendNames = new ArrayList<>(); // 实际出勤人员名单
- List<String> absentNames = new ArrayList<>(); // 未出勤人员名单
- if (personList != null && !personList.isEmpty()) {
- for (Map<String, Object> 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<String, List<Map<String, Object>>> getAttendanceData(String attendanceDate) throws SQLException, BOSException {
- Map<String, List<Map<String, Object>>> 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<String, Object> 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<Map<String, Object>> 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;
- }
- }
|