|
|
@@ -15,6 +15,7 @@ import com.jeeplus.modules.WorkKnowledgeBase.entity.WorkKnowledgeBasePoint;
|
|
|
import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBasePointDetailService;
|
|
|
import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBasePointExchangeService;
|
|
|
import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBasePointService;
|
|
|
+import com.jeeplus.modules.WorkKnowledgeBase.service.WorkKnowledgeBaseTreeService;
|
|
|
import com.jeeplus.modules.sys.entity.User;
|
|
|
import com.jeeplus.modules.sys.service.OfficeService;
|
|
|
import com.jeeplus.modules.sys.utils.UserUtils;
|
|
|
@@ -57,6 +58,9 @@ public class WorkKnowledgeBasePointController extends BaseController {
|
|
|
@Autowired
|
|
|
private WorkKnowledgeBasePointExchangeService pointExchangeService;
|
|
|
|
|
|
+ @Autowired
|
|
|
+ private WorkKnowledgeBaseTreeService treeService;
|
|
|
+
|
|
|
@ModelAttribute
|
|
|
public WorkKnowledgeBasePoint get(@RequestParam(required=false) String id) {
|
|
|
WorkKnowledgeBasePoint entity = null;
|
|
|
@@ -308,93 +312,318 @@ public class WorkKnowledgeBasePointController extends BaseController {
|
|
|
// 查询所有员工积分统计(支持日期筛选,已按部门、姓名排序)
|
|
|
List<WorkKnowledgeBasePoint> employeeList = workKnowledgeBasePointDetailService.findAllEmployeePointStats(queryParam);
|
|
|
|
|
|
- // 公共表头
|
|
|
- List<String> metricHeaders = Arrays.asList(
|
|
|
- "上传文档数量|uploadCount",
|
|
|
- "贡献积分额度|createPoint",
|
|
|
- "审核文档数量|auditCount",
|
|
|
- "审核积分额度|auditPoint",
|
|
|
- "阅读积分额度|readPoint",
|
|
|
- "点赞积分额度|likePoint",
|
|
|
- "已兑换积分额度|exchangePoint"
|
|
|
+ // 构建时间范围标识(如传入了日期筛选)
|
|
|
+ String dateRangeSuffix = "";
|
|
|
+ if (StringUtils.isNotBlank(queryParam.getBeginDate()) || StringUtils.isNotBlank(queryParam.getEndDate())) {
|
|
|
+ String startDate = StringUtils.isNotBlank(queryParam.getBeginDate()) ? queryParam.getBeginDate() : "不限";
|
|
|
+ String endDate = StringUtils.isNotBlank(queryParam.getEndDate()) ? queryParam.getEndDate() : "不限";
|
|
|
+ dateRangeSuffix = "(" + startDate + " 至 " + endDate + ")";
|
|
|
+ }
|
|
|
+
|
|
|
+ // 定义固定的7个业务指标列(第一行表头)
|
|
|
+ List<String> firstRowHeaders = Arrays.asList(
|
|
|
+ "上传文档数量",
|
|
|
+ "贡献积分额度",
|
|
|
+ "审核文档数量",
|
|
|
+ "审核积分额度",
|
|
|
+ "阅读积分额度",
|
|
|
+ "点赞积分额度",
|
|
|
+ "已兑换积分额度"
|
|
|
+ );
|
|
|
+
|
|
|
+ // 获取知识库分类树结构(一级分类列表,用于第二行表头细分)
|
|
|
+ java.util.Map<String, List<String>> categoryTreeMap = treeService.getCategoryTreeForExport();
|
|
|
+ List<String> categoryNames = new ArrayList<>(categoryTreeMap.keySet());
|
|
|
+
|
|
|
+ // 7个业务指标对应的数据字段key(与entity中的getter对应)
|
|
|
+ List<String> columnKeys = Arrays.asList(
|
|
|
+ "uploadCount", "createPoint", "auditCount", "auditPoint",
|
|
|
+ "readPoint", "likePoint", "exchangePoint"
|
|
|
);
|
|
|
+
|
|
|
+ // 构建第二行表头:每个固定列下包含"总量"+各一级分类
|
|
|
+ List<List<String>> secondRowHeaders = new ArrayList<>();
|
|
|
+ for (String columnHeader : firstRowHeaders) {
|
|
|
+ List<String> subHeaders = new ArrayList<>();
|
|
|
+ subHeaders.add("总量");
|
|
|
+ for (String categoryName : categoryNames) {
|
|
|
+ subHeaders.add(categoryName);
|
|
|
+ }
|
|
|
+ secondRowHeaders.add(subHeaders);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 收集所有用户ID
|
|
|
+ List<String> userIds = employeeList.stream()
|
|
|
+ .map(emp -> emp.getUserId())
|
|
|
+ .filter(StringUtils::isNotBlank)
|
|
|
+ .collect(Collectors.toList());
|
|
|
+
|
|
|
+ // ========== 分别查询7个业务指标的分类数据 ==========
|
|
|
+
|
|
|
+ // 1. 上传文档数量(按一级分类统计用户上传的文档数)
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> uploadCountByCategory = new java.util.HashMap<>();
|
|
|
+ if (!userIds.isEmpty() && !categoryNames.isEmpty()) {
|
|
|
+ List<java.util.Map<String, Object>> results =
|
|
|
+ workKnowledgeBasePointDetailService.countUploadDocsByTreeNodeIds(categoryNames, userIds, queryParam.getBeginDate(), queryParam.getEndDate());
|
|
|
+ for (java.util.Map<String, Object> result : results) {
|
|
|
+ String userId = (String) result.get("userId");
|
|
|
+ String treeName = (String) result.get("treeName");
|
|
|
+ Integer count = ((Number) result.get("docCount")).intValue();
|
|
|
+ uploadCountByCategory.computeIfAbsent(userId, k -> new java.util.HashMap<>())
|
|
|
+ .put(treeName, count);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 2. 贡献积分额度(change_type=1,创建积分)
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> createPointByCategory = new java.util.HashMap<>();
|
|
|
+ if (!userIds.isEmpty() && !categoryNames.isEmpty()) {
|
|
|
+ List<java.util.Map<String, Object>> results =
|
|
|
+ workKnowledgeBasePointDetailService.sumPointsByTreeNodeIdsAndChangeType(categoryNames, userIds, 1, queryParam.getBeginDate(), queryParam.getEndDate());
|
|
|
+ for (java.util.Map<String, Object> result : results) {
|
|
|
+ String userId = (String) result.get("userId");
|
|
|
+ String treeName = (String) result.get("treeName");
|
|
|
+ Integer point = ((Number) result.get("totalPoint")).intValue();
|
|
|
+ createPointByCategory.computeIfAbsent(userId, k -> new java.util.HashMap<>())
|
|
|
+ .put(treeName, point);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 3. 审核文档数量(按一级分类统计用户审核的文档数)
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> auditCountByCategory = new java.util.HashMap<>();
|
|
|
+ if (!userIds.isEmpty() && !categoryNames.isEmpty()) {
|
|
|
+ List<java.util.Map<String, Object>> results =
|
|
|
+ workKnowledgeBasePointDetailService.countAuditDocsByTreeNodeIds(categoryNames, userIds, queryParam.getBeginDate(), queryParam.getEndDate());
|
|
|
+ for (java.util.Map<String, Object> result : results) {
|
|
|
+ String userId = (String) result.get("userId");
|
|
|
+ String treeName = (String) result.get("treeName");
|
|
|
+ Integer count = ((Number) result.get("docCount")).intValue();
|
|
|
+ auditCountByCategory.computeIfAbsent(userId, k -> new java.util.HashMap<>())
|
|
|
+ .put(treeName, count);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 4. 审核积分额度(change_type=2,审核积分)
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> auditPointByCategory = new java.util.HashMap<>();
|
|
|
+ if (!userIds.isEmpty() && !categoryNames.isEmpty()) {
|
|
|
+ List<java.util.Map<String, Object>> results =
|
|
|
+ workKnowledgeBasePointDetailService.sumPointsByTreeNodeIdsAndChangeType(categoryNames, userIds, 2, queryParam.getBeginDate(), queryParam.getEndDate());
|
|
|
+ for (java.util.Map<String, Object> result : results) {
|
|
|
+ String userId = (String) result.get("userId");
|
|
|
+ String treeName = (String) result.get("treeName");
|
|
|
+ Integer point = ((Number) result.get("totalPoint")).intValue();
|
|
|
+ auditPointByCategory.computeIfAbsent(userId, k -> new java.util.HashMap<>())
|
|
|
+ .put(treeName, point);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 5. 阅读积分额度(change_type=3,阅读积分)
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> readPointByCategory = new java.util.HashMap<>();
|
|
|
+ if (!userIds.isEmpty() && !categoryNames.isEmpty()) {
|
|
|
+ List<java.util.Map<String, Object>> results =
|
|
|
+ workKnowledgeBasePointDetailService.sumPointsByTreeNodeIdsAndChangeType(categoryNames, userIds, 3, queryParam.getBeginDate(), queryParam.getEndDate());
|
|
|
+ for (java.util.Map<String, Object> result : results) {
|
|
|
+ String userId = (String) result.get("userId");
|
|
|
+ String treeName = (String) result.get("treeName");
|
|
|
+ Integer point = ((Number) result.get("totalPoint")).intValue();
|
|
|
+ readPointByCategory.computeIfAbsent(userId, k -> new java.util.HashMap<>())
|
|
|
+ .put(treeName, point);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 6. 点赞积分额度(change_type=4,点赞积分)
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> likePointByCategory = new java.util.HashMap<>();
|
|
|
+ if (!userIds.isEmpty() && !categoryNames.isEmpty()) {
|
|
|
+ List<java.util.Map<String, Object>> results =
|
|
|
+ workKnowledgeBasePointDetailService.sumPointsByTreeNodeIdsAndChangeType(categoryNames, userIds, 4, queryParam.getBeginDate(), queryParam.getEndDate());
|
|
|
+ for (java.util.Map<String, Object> result : results) {
|
|
|
+ String userId = (String) result.get("userId");
|
|
|
+ String treeName = (String) result.get("treeName");
|
|
|
+ Integer point = ((Number) result.get("totalPoint")).intValue();
|
|
|
+ likePointByCategory.computeIfAbsent(userId, k -> new java.util.HashMap<>())
|
|
|
+ .put(treeName, point);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 7. 已兑换积分额度(point<0,兑换积分)
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> exchangePointByCategory = new java.util.HashMap<>();
|
|
|
+ if (!userIds.isEmpty() && !categoryNames.isEmpty()) {
|
|
|
+ List<java.util.Map<String, Object>> results =
|
|
|
+ workKnowledgeBasePointDetailService.sumExchangePointsByTreeNodeIds(categoryNames, userIds, queryParam.getBeginDate(), queryParam.getEndDate());
|
|
|
+ for (java.util.Map<String, Object> result : results) {
|
|
|
+ String userId = (String) result.get("userId");
|
|
|
+ String treeName = (String) result.get("treeName");
|
|
|
+ Integer point = ((Number) result.get("totalPoint")).intValue();
|
|
|
+ exchangePointByCategory.computeIfAbsent(userId, k -> new java.util.HashMap<>())
|
|
|
+ .put(treeName, point);
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- ExportKnowledgeBaseExcel excel = new ExportKnowledgeBaseExcel();
|
|
|
+ // 业务指标字段与entity getter的映射
|
|
|
+ java.util.Map<String, String> columnGetterMap = new java.util.LinkedHashMap<>();
|
|
|
+ columnGetterMap.put("uploadCount", "getUploadCount");
|
|
|
+ columnGetterMap.put("createPoint", "getCreatePoint");
|
|
|
+ columnGetterMap.put("auditCount", "getAuditCount");
|
|
|
+ columnGetterMap.put("auditPoint", "getAuditPoint");
|
|
|
+ columnGetterMap.put("readPoint", "getReadPoint");
|
|
|
+ columnGetterMap.put("likePoint", "getLikePoint");
|
|
|
+ columnGetterMap.put("exchangePoint", "getExchangePoint");
|
|
|
|
|
|
- // ========== 1. 公司级汇总 ==========
|
|
|
- List<String> companyHeaders = new ArrayList<>();
|
|
|
- companyHeaders.add("公司汇总|label");
|
|
|
- companyHeaders.addAll(metricHeaders);
|
|
|
+ ExportKnowledgeBaseExcel excel = new ExportKnowledgeBaseExcel();
|
|
|
|
|
|
+ // ========== 1. 公司级汇总(双表头)==========
|
|
|
List<Map<String, Object>> companyData = new ArrayList<>();
|
|
|
- if (!employeeList.isEmpty()) {
|
|
|
- Map<String, Object> companyRow = new LinkedHashMap<>();
|
|
|
- companyRow.put("label", "公司汇总");
|
|
|
- companyRow.put("uploadCount", employeeList.stream().mapToInt(e -> e.getUploadCount() != null ? e.getUploadCount() : 0).sum());
|
|
|
- companyRow.put("createPoint", employeeList.stream().mapToInt(e -> e.getCreatePoint() != null ? e.getCreatePoint() : 0).sum());
|
|
|
- companyRow.put("auditCount", employeeList.stream().mapToInt(e -> e.getAuditCount() != null ? e.getAuditCount() : 0).sum());
|
|
|
- companyRow.put("auditPoint", employeeList.stream().mapToInt(e -> e.getAuditPoint() != null ? e.getAuditPoint() : 0).sum());
|
|
|
- companyRow.put("readPoint", employeeList.stream().mapToInt(e -> e.getReadPoint() != null ? e.getReadPoint() : 0).sum());
|
|
|
- companyRow.put("likePoint", employeeList.stream().mapToInt(e -> e.getLikePoint() != null ? e.getLikePoint() : 0).sum());
|
|
|
- companyRow.put("exchangePoint", employeeList.stream().mapToInt(e -> e.getExchangePoint() != null ? e.getExchangePoint() : 0).sum());
|
|
|
- companyData.add(companyRow);
|
|
|
+ Map<String, Object> companyRow = new LinkedHashMap<>();
|
|
|
+ companyRow.put("label", "公司汇总");
|
|
|
+
|
|
|
+ for (int i = 0; i < firstRowHeaders.size(); i++) {
|
|
|
+ String columnKey = columnKeys.get(i);
|
|
|
+ List<String> subHeaders = secondRowHeaders.get(i);
|
|
|
+
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> dataSource;
|
|
|
+ switch (i) {
|
|
|
+ case 0: dataSource = uploadCountByCategory; break;
|
|
|
+ case 1: dataSource = createPointByCategory; break;
|
|
|
+ case 2: dataSource = auditCountByCategory; break;
|
|
|
+ case 3: dataSource = auditPointByCategory; break;
|
|
|
+ case 4: dataSource = readPointByCategory; break;
|
|
|
+ case 5: dataSource = likePointByCategory; break;
|
|
|
+ case 6: dataSource = exchangePointByCategory; break;
|
|
|
+ default: dataSource = new java.util.HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ for (String subHeader : subHeaders) {
|
|
|
+ String dataKey = columnKey + "_" + subHeader;
|
|
|
+ if ("总量".equals(subHeader)) {
|
|
|
+ // 总量从 employeeList 累加
|
|
|
+ int total = employeeList.stream().mapToInt(emp -> {
|
|
|
+ try {
|
|
|
+ java.lang.reflect.Method m = emp.getClass().getMethod(columnGetterMap.get(columnKey));
|
|
|
+ Number val = (Number) m.invoke(emp);
|
|
|
+ return val != null ? val.intValue() : 0;
|
|
|
+ } catch (Exception e) { return 0; }
|
|
|
+ }).sum();
|
|
|
+ companyRow.put(dataKey, total);
|
|
|
+ } else {
|
|
|
+ // 分类数据从分类查询结果获取
|
|
|
+ int categorySum = employeeList.stream()
|
|
|
+ .mapToInt(emp -> {
|
|
|
+ java.util.Map<String, Integer> points = dataSource.get(emp.getUserId());
|
|
|
+ return points != null && points.containsKey(subHeader) ? points.get(subHeader) : 0;
|
|
|
+ }).sum();
|
|
|
+ companyRow.put(dataKey, categorySum);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
- excel.addSheet("公司级", "公司级积分统计汇总", companyHeaders, companyData);
|
|
|
-
|
|
|
- // ========== 2. 部门级汇总 ==========
|
|
|
- List<String> deptHeaders = new ArrayList<>();
|
|
|
- deptHeaders.add("部门|officeName");
|
|
|
- deptHeaders.addAll(metricHeaders);
|
|
|
+ companyData.add(companyRow);
|
|
|
+
|
|
|
+ excel.addDoubleHeaderSheet("公司级", "公司级积分统计汇总" + dateRangeSuffix,
|
|
|
+ Arrays.asList("名称|label"), firstRowHeaders, secondRowHeaders, columnKeys, companyData);
|
|
|
|
|
|
- // 按部门分组汇总
|
|
|
- Map<String, Map<String, Object>> deptMap = new LinkedHashMap<>();
|
|
|
+ // ========== 2. 部门级汇总(双表头)==========
|
|
|
+ // 按部门分组
|
|
|
+ java.util.Map<String, List<WorkKnowledgeBasePoint>> deptMap = new LinkedHashMap<>();
|
|
|
for (WorkKnowledgeBasePoint emp : employeeList) {
|
|
|
String dept = emp.getOfficeName() != null ? emp.getOfficeName() : "未分配部门";
|
|
|
- Map<String, Object> deptRow = deptMap.computeIfAbsent(dept, k -> {
|
|
|
- Map<String, Object> m = new LinkedHashMap<>();
|
|
|
- m.put("officeName", k);
|
|
|
- m.put("uploadCount", 0);
|
|
|
- m.put("createPoint", 0);
|
|
|
- m.put("auditCount", 0);
|
|
|
- m.put("auditPoint", 0);
|
|
|
- m.put("readPoint", 0);
|
|
|
- m.put("likePoint", 0);
|
|
|
- m.put("exchangePoint", 0);
|
|
|
- return m;
|
|
|
- });
|
|
|
- deptRow.put("uploadCount", (int) deptRow.get("uploadCount") + (emp.getUploadCount() != null ? emp.getUploadCount() : 0));
|
|
|
- deptRow.put("createPoint", (int) deptRow.get("createPoint") + (emp.getCreatePoint() != null ? emp.getCreatePoint() : 0));
|
|
|
- deptRow.put("auditCount", (int) deptRow.get("auditCount") + (emp.getAuditCount() != null ? emp.getAuditCount() : 0));
|
|
|
- deptRow.put("auditPoint", (int) deptRow.get("auditPoint") + (emp.getAuditPoint() != null ? emp.getAuditPoint() : 0));
|
|
|
- deptRow.put("readPoint", (int) deptRow.get("readPoint") + (emp.getReadPoint() != null ? emp.getReadPoint() : 0));
|
|
|
- deptRow.put("likePoint", (int) deptRow.get("likePoint") + (emp.getLikePoint() != null ? emp.getLikePoint() : 0));
|
|
|
- deptRow.put("exchangePoint", (int) deptRow.get("exchangePoint") + (emp.getExchangePoint() != null ? emp.getExchangePoint() : 0));
|
|
|
+ deptMap.computeIfAbsent(dept, k -> new ArrayList<>()).add(emp);
|
|
|
}
|
|
|
- excel.addSheet("部门级", "部门级积分统计汇总", deptHeaders, new ArrayList<>(deptMap.values()));
|
|
|
-
|
|
|
- // ========== 3. 员工级明细 ==========
|
|
|
- List<String> empHeaders = new ArrayList<>();
|
|
|
- empHeaders.add("部门|officeName");
|
|
|
- empHeaders.add("姓名|userName");
|
|
|
- empHeaders.addAll(metricHeaders);
|
|
|
+
|
|
|
+ List<Map<String, Object>> deptData = new ArrayList<>();
|
|
|
+ for (java.util.Map.Entry<String, List<WorkKnowledgeBasePoint>> entry : deptMap.entrySet()) {
|
|
|
+ String deptName = entry.getKey();
|
|
|
+ List<WorkKnowledgeBasePoint> deptEmps = entry.getValue();
|
|
|
+
|
|
|
+ Map<String, Object> row = new LinkedHashMap<>();
|
|
|
+ row.put("officeName", deptName);
|
|
|
+
|
|
|
+ for (int i = 0; i < firstRowHeaders.size(); i++) {
|
|
|
+ String columnKey = columnKeys.get(i);
|
|
|
+ List<String> subHeaders = secondRowHeaders.get(i);
|
|
|
+
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> dataSource;
|
|
|
+ switch (i) {
|
|
|
+ case 0: dataSource = uploadCountByCategory; break;
|
|
|
+ case 1: dataSource = createPointByCategory; break;
|
|
|
+ case 2: dataSource = auditCountByCategory; break;
|
|
|
+ case 3: dataSource = auditPointByCategory; break;
|
|
|
+ case 4: dataSource = readPointByCategory; break;
|
|
|
+ case 5: dataSource = likePointByCategory; break;
|
|
|
+ case 6: dataSource = exchangePointByCategory; break;
|
|
|
+ default: dataSource = new java.util.HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ for (String subHeader : subHeaders) {
|
|
|
+ String dataKey = columnKey + "_" + subHeader;
|
|
|
+ if ("总量".equals(subHeader)) {
|
|
|
+ int total = deptEmps.stream().mapToInt(emp -> {
|
|
|
+ try {
|
|
|
+ java.lang.reflect.Method m = emp.getClass().getMethod(columnGetterMap.get(columnKey));
|
|
|
+ Number val = (Number) m.invoke(emp);
|
|
|
+ return val != null ? val.intValue() : 0;
|
|
|
+ } catch (Exception e) { return 0; }
|
|
|
+ }).sum();
|
|
|
+ row.put(dataKey, total);
|
|
|
+ } else {
|
|
|
+ int categorySum = deptEmps.stream()
|
|
|
+ .mapToInt(emp -> {
|
|
|
+ java.util.Map<String, Integer> points = dataSource.get(emp.getUserId());
|
|
|
+ return points != null && points.containsKey(subHeader) ? points.get(subHeader) : 0;
|
|
|
+ }).sum();
|
|
|
+ row.put(dataKey, categorySum);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ deptData.add(row);
|
|
|
+ }
|
|
|
+
|
|
|
+ excel.addDoubleHeaderSheet("部门级", "部门级积分统计汇总" + dateRangeSuffix,
|
|
|
+ Arrays.asList("部门名称|officeName"), firstRowHeaders, secondRowHeaders, columnKeys, deptData);
|
|
|
|
|
|
+ // ========== 3. 员工级明细(双表头)==========
|
|
|
List<Map<String, Object>> empData = new ArrayList<>();
|
|
|
for (WorkKnowledgeBasePoint emp : employeeList) {
|
|
|
Map<String, Object> row = new LinkedHashMap<>();
|
|
|
row.put("officeName", emp.getOfficeName() != null ? emp.getOfficeName() : "未分配部门");
|
|
|
row.put("userName", emp.getUserName() != null ? emp.getUserName() : "");
|
|
|
- row.put("uploadCount", emp.getUploadCount() != null ? emp.getUploadCount() : 0);
|
|
|
- row.put("createPoint", emp.getCreatePoint() != null ? emp.getCreatePoint() : 0);
|
|
|
- row.put("auditCount", emp.getAuditCount() != null ? emp.getAuditCount() : 0);
|
|
|
- row.put("auditPoint", emp.getAuditPoint() != null ? emp.getAuditPoint() : 0);
|
|
|
- row.put("readPoint", emp.getReadPoint() != null ? emp.getReadPoint() : 0);
|
|
|
- row.put("likePoint", emp.getLikePoint() != null ? emp.getLikePoint() : 0);
|
|
|
- row.put("exchangePoint", emp.getExchangePoint() != null ? emp.getExchangePoint() : 0);
|
|
|
+
|
|
|
+ for (int i = 0; i < firstRowHeaders.size(); i++) {
|
|
|
+ String columnKey = columnKeys.get(i);
|
|
|
+ List<String> subHeaders = secondRowHeaders.get(i);
|
|
|
+
|
|
|
+ java.util.Map<String, java.util.Map<String, Integer>> dataSource;
|
|
|
+ switch (i) {
|
|
|
+ case 0: dataSource = uploadCountByCategory; break;
|
|
|
+ case 1: dataSource = createPointByCategory; break;
|
|
|
+ case 2: dataSource = auditCountByCategory; break;
|
|
|
+ case 3: dataSource = auditPointByCategory; break;
|
|
|
+ case 4: dataSource = readPointByCategory; break;
|
|
|
+ case 5: dataSource = likePointByCategory; break;
|
|
|
+ case 6: dataSource = exchangePointByCategory; break;
|
|
|
+ default: dataSource = new java.util.HashMap<>();
|
|
|
+ }
|
|
|
+
|
|
|
+ for (String subHeader : subHeaders) {
|
|
|
+ String dataKey = columnKey + "_" + subHeader;
|
|
|
+ if ("总量".equals(subHeader)) {
|
|
|
+ try {
|
|
|
+ java.lang.reflect.Method m = emp.getClass().getMethod(columnGetterMap.get(columnKey));
|
|
|
+ Number val = (Number) m.invoke(emp);
|
|
|
+ row.put(dataKey, val != null ? val.intValue() : 0);
|
|
|
+ } catch (Exception e) {
|
|
|
+ row.put(dataKey, 0);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ java.util.Map<String, Integer> points = dataSource.get(emp.getUserId());
|
|
|
+ row.put(dataKey, points != null && points.containsKey(subHeader) ? points.get(subHeader) : 0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
empData.add(row);
|
|
|
}
|
|
|
- excel.addSheet("员工级", "员工级积分统计明细", empHeaders, empData);
|
|
|
+
|
|
|
+ excel.addDoubleHeaderSheet("员工级", "员工级积分统计明细" + dateRangeSuffix,
|
|
|
+ Arrays.asList("部门名称|officeName", "用户姓名|userName"), firstRowHeaders, secondRowHeaders, columnKeys, empData);
|
|
|
|
|
|
- String fileName = "积分统计三级导出_" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
|
|
|
+ String fileName = "知识库统计表_" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
|
|
|
excel.write(response, fileName);
|
|
|
excel.dispose();
|
|
|
|