PersonnelStructureDashboardHandler.java 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. package com.kingdee.eas.custom.perfweb.handler;
  2. import com.kingdee.bos.BOSException;
  3. import com.kingdee.bos.Context;
  4. import com.kingdee.bos.ctrl.swing.StringUtils;
  5. import com.kingdee.jdbc.rowset.IRowSet;
  6. import com.kingdee.eas.custom.perfweb.util.ReportFilterUtil;
  7. import com.kingdee.eas.custom.perfweb.util.ReportOrgUtil;
  8. import com.kingdee.eas.util.app.DbUtil;
  9. import com.kingdee.shr.base.syssetting.context.SHRContext;
  10. import com.kingdee.shr.base.syssetting.exception.SHRWebException;
  11. import com.kingdee.shr.base.syssetting.json.GridDataEntity;
  12. import com.kingdee.shr.base.syssetting.web.handler.ListHandler;
  13. import org.apache.log4j.Logger;
  14. import org.springframework.ui.ModelMap;
  15. import javax.servlet.http.HttpServletRequest;
  16. import javax.servlet.http.HttpServletResponse;
  17. import java.sql.SQLException;
  18. import java.util.ArrayList;
  19. import java.util.HashMap;
  20. import java.util.List;
  21. import java.util.Map;
  22. /**
  23. * 类名称: PersonnelStructureDashboardHandler
  24. * 功能描述: 人员结构看板报表(按公司统计在职人数及占比)
  25. * 创建日期: 2026-06-05
  26. * 作 者: 青梧
  27. * 版 本: 1.0
  28. *
  29. * 返回字段说明:
  30. * companyCode - 公司编码(FNUMBER)
  31. * companyName - 公司名称(合计行显示"合计")
  32. * personCount - 公司在职人数(FIsOnTheStrength=1)
  33. * percentage - 人数占全公司合计的百分比
  34. */
  35. public class PersonnelStructureDashboardHandler extends ListHandler {
  36. private static Logger logger = Logger.getLogger(PersonnelStructureDashboardHandler.class);
  37. Context ctx = SHRContext.getInstance().getContext();
  38. /**
  39. * 列表查询入口:遍历二级公司,统计各公司在职人数及占比,末尾追加合计行。
  40. */
  41. @Override
  42. protected GridDataEntity getGridRequestData(HttpServletRequest request, HttpServletResponse response, ModelMap modelMap) throws SHRWebException {
  43. logger.error("PersonnelStructureDashboardHandler getGridRequestData------------");
  44. GridDataEntity gridDataEntity = new GridDataEntity();
  45. try {
  46. List<CompanyData> companyList = getCompanyList();
  47. int totalCount = 0;
  48. List<Map<String, Object>> dataList = new ArrayList<>();
  49. for (CompanyData company : companyList) {
  50. int count = getActivePersonCount(company.getId());
  51. // 人数为0的公司不展示
  52. if (count == 0) {
  53. continue;
  54. }
  55. totalCount += count;
  56. Map<String, Object> row = new HashMap<>();
  57. row.put("companyCode", company.getCode()); // companyCode: 公司编码
  58. row.put("companyName", company.getName()); // companyName: 公司名称
  59. row.put("personCount", count); // personCount: 在职人数
  60. row.put("percentage", 0.0); // percentage: 占比(第二遍回填)
  61. dataList.add(row);
  62. }
  63. // 按总人数计算各公司占比
  64. for (Map<String, Object> row : dataList) {
  65. int count = (Integer) row.get("personCount");
  66. double percentage = totalCount > 0 ? (count * 100.0 / totalCount) : 0.0;
  67. row.put("percentage", String.format("%.2f", percentage) + "%");
  68. }
  69. Map<String, Object> totalRow = new HashMap<>();
  70. totalRow.put("companyCode", ""); // companyCode: 合计行留空
  71. totalRow.put("companyName", "合计"); // companyName: 合计标识
  72. totalRow.put("personCount", totalCount); // personCount: 全公司在职合计
  73. totalRow.put("percentage", totalCount > 0 ? "100.00%" : "0.00%"); // percentage: 100%
  74. dataList.add(totalRow);
  75. gridDataEntity.setRows(dataList);
  76. gridDataEntity.setTotal(dataList.size());
  77. gridDataEntity.setPage(1);
  78. gridDataEntity.setRecords(dataList.size());
  79. logger.error("人员结构看板报表数据查询成功,总记录数: " + dataList.size());
  80. } catch (SQLException e) {
  81. logger.error("数据库查询失败", e);
  82. throw new SHRWebException("数据查询失败: " + e.getMessage());
  83. } catch (BOSException e) {
  84. logger.error("业务异常", e);
  85. throw new SHRWebException("业务处理失败: " + e.getMessage());
  86. } catch (Exception e) {
  87. logger.error("未知异常", e);
  88. throw new SHRWebException("系统异常: " + e.getMessage());
  89. }
  90. ReportFilterUtil.applyGridUserData(request, gridDataEntity);
  91. return gridDataEntity;
  92. }
  93. /**
  94. * 查询二级公司列表(FLevel=2, 未封存)。
  95. */
  96. private List<CompanyData> getCompanyList() throws BOSException, SQLException {
  97. List<CompanyData> companyList = new ArrayList<>();
  98. StringBuilder sql = new StringBuilder();
  99. sql.append("SELECT FID, FNUMBER, FNAME_L2 FROM T_ORG_Admin ");
  100. sql.append("WHERE FLAYERTYPEID = '00000000-0000-0000-0000-00000000000262824988' ");
  101. sql.append("AND FIsSealUp = 0 ");
  102. sql.append("AND FLevel = 2 ");
  103. // 排除国际公司130及其下级
  104. sql.append("AND FNUMBER <> '").append(ReportOrgUtil.EXCLUDED_ORG_NUMBER).append("' ");
  105. ReportOrgUtil.appendExcludeOrg130(sql, "T_ORG_Admin", ctx);
  106. logger.error("查询公司列表SQL: " + sql.toString());
  107. IRowSet rs = DbUtil.executeQuery(ctx, sql.toString());
  108. while (rs.next()) {
  109. String id = rs.getString("FID");
  110. if (StringUtils.isEmpty(id)) {
  111. continue;
  112. }
  113. String code = rs.getString("FNUMBER");
  114. String name = rs.getString("FNAME_L2");
  115. companyList.add(new CompanyData(id, code, name));
  116. }
  117. logger.error("查询到公司数量: " + companyList.size());
  118. return companyList;
  119. }
  120. /**
  121. * 统计指定公司在职人数(FIsOnTheStrength=1),对应字段 personCount。
  122. */
  123. private int getActivePersonCount(String companyId) throws BOSException, SQLException {
  124. if (StringUtils.isEmpty(companyId)) {
  125. return 0;
  126. }
  127. StringBuilder sql = new StringBuilder();
  128. sql.append("SELECT COUNT(*) as personCount ");
  129. sql.append("FROM T_BD_PERSON person ");
  130. sql.append("LEFT JOIN T_HR_PersonPosition personPos ON person.FID = personPos.FPERSONID ");
  131. sql.append("LEFT JOIN T_HR_BDEmployeeType type ON type.FID = person.FEMPLOYEETYPEID ");
  132. sql.append("WHERE type.FIsOnTheStrength = 1 ");
  133. sql.append("AND personPos.FCompanyID = ? ");
  134. ReportOrgUtil.appendExcludeOrg130ById(sql, "personPos.FPersonDep", ctx);
  135. logger.error("查询公司在职人数SQL,companyId: " + companyId);
  136. IRowSet rs = DbUtil.executeQuery(ctx, sql.toString(), new Object[]{companyId});
  137. int count = 0;
  138. if (rs.next()) {
  139. count = rs.getInt("personCount");
  140. }
  141. return count;
  142. }
  143. /** 公司基础信息(id/code/name) */
  144. private static class CompanyData {
  145. private String id;
  146. private String code;
  147. private String name;
  148. public CompanyData(String id, String code, String name) {
  149. this.id = id;
  150. this.code = code;
  151. this.name = name;
  152. }
  153. public String getId() {
  154. return id;
  155. }
  156. public String getCode() {
  157. return code;
  158. }
  159. public String getName() {
  160. return name;
  161. }
  162. }
  163. }