Bladeren bron

针对正北按照部门修改导出

yusm 3 weken geleden
bovenliggende
commit
f8716035af

+ 129 - 73
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -21,6 +21,7 @@ import com.management.platform.webservice.po.ProjectQueryResponse;
 import com.management.platform.webservice.po.ProjectTask;
 import com.management.platform.webservice.po.ServiceProduct;
 import com.management.platform.webservice.po.XmlResponseData;
+import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.CloseableHttpResponse;
@@ -83,6 +84,7 @@ import java.util.stream.Collectors;
  */
 @Service
 @Transactional
+@Slf4j
 public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> implements ProjectService {
     String pathPrefix = "/upload/";
     private final static Executor executor = Executors.newFixedThreadPool(3);//启用多线程
@@ -401,96 +403,150 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
                 wxCorpInfo = wxCorpInfoMapper.selectOne(new LambdaQueryWrapper<WxCorpInfo>().eq(WxCorpInfo::getCompanyId, companyId));
             }
 
-            //查找该时间段内公司的所有日报数据
+            // 查找该时间段内公司的所有日报数据
             List<Report> monthlyReport = reportMapper.selectList(
                     new QueryWrapper<Report>().select("project_id", "sum(working_time) as working_time", "create_date", "creator_id").between("create_date", startDate, lastDate)
                             .eq("company_id", targetUser.getCompanyId()).eq("state", 1).groupBy()
                             .groupBy("project_id", "create_date", "creator_id"));
-            //构建表头: 项目编号,项目名称,项目计划日期,日期, 员工姓名
+
+            // 获取所有项目列表
             List<Project> projectList = projectMapper.selectList(new QueryWrapper<Project>().select("id", "project_code", "project_name", "plan_start_date", "plan_end_date").eq("company_id", targetUser.getCompanyId()));
-            List<String> header = new ArrayList<>();
-            header.add("项目编号");
-            header.add("项目名称");
-            header.add("项目计划日期");
-            header.add("日期");
-            List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", targetUser.getCompanyId()));
-            for (User user : users) {
-                if (wxCorpInfo != null) {
-                    header.add("$userName="+user.getName()+"$");
-                } else {
-                    header.add(user.getName());
-                }
 
-            }
+            // 获取所有用户并按部门分组
+            List<User> allUsers = userMapper.selectList(new QueryWrapper<User>().eq("company_id", targetUser.getCompanyId()));
+            Map<Integer, List<User>> usersByDepartment = allUsers.stream().collect(Collectors.groupingBy(User::getDepartmentId));
+
+            // 获取部门信息
+            List<Department> departments = departmentMapper.selectList(new QueryWrapper<Department>()
+                    .in("department_id", usersByDepartment.keySet()));
+
+            // 准备多Sheet数据
+            List<List<String>>[] multiSheetList = new List[departments.size()];
+            String[] sheetsName = new String[departments.size()];
+
             DecimalFormat df = new DecimalFormat("0.0");
-            //构建表体
-            List<List<String>> body = new ArrayList<>();
-            body.add(header);
-            //按项目进行分组
-            Map<Integer, List<Report>> groupByProjectList = monthlyReport.stream().collect(Collectors.groupingBy(Report::getProjectId));
-            Iterator<Integer> it = groupByProjectList.keySet().iterator();
-            while (it.hasNext()) {
-                Integer projectId = it.next();
-                Project project = projectList.stream().filter(p->p.getId().equals(projectId)).findFirst().orElse(null);
-                if (project == null) {
-                    continue;
+
+            // 按项目进行分组
+            Map<Integer, List<Report>> groupByProjectList = monthlyReport.stream()
+                    .collect(Collectors.groupingBy(Report::getProjectId));
+
+            // 为每个部门创建Sheet数据
+            for (int deptIndex = 0; deptIndex < departments.size(); deptIndex++) {
+                Department department = departments.get(deptIndex);
+                List<User> deptUsers = usersByDepartment.get(department.getDepartmentId());
+
+                // 构建表头
+                List<String> header = new ArrayList<>();
+                header.add("项目编号");
+                header.add("项目名称");
+                header.add("项目计划日期");
+                header.add("日期");
+                for (User user : deptUsers) {
+                    if (wxCorpInfo != null) {
+                        header.add("$userName="+user.getName()+"$");
+                    } else {
+                        header.add(user.getName());
+                    }
                 }
-                List<Report> curProjectReportList = groupByProjectList.get(projectId);
-                //构建日期,按自然日期填充
-                for (int i=0;i<daysInMonth;i++){
-                    List<String> row = new ArrayList<>();
-                    row.add(project.getProjectCode());
-                    row.add(project.getProjectName());
-                    row.add((project.getPlanStartDate() != null?dtf.format(project.getPlanStartDate()):"未设置")+"至"+(project.getPlanEndDate() != null?dtf.format(project.getPlanEndDate()):"未设置"));
-                    LocalDate curDate = startDate.plusDays(i);
-                    row.add(dtf.format(curDate));
-                    boolean iWorkDay = WorkDayCalculateUtils.isWorkDay(curDate);
-                    //根据人员进行填充
-                    for (User user : users) {
-                        Report report = curProjectReportList.stream().filter(  r->r.getCreateDate().equals(curDate) && r.getCreatorId().equals(user.getId())).findFirst().orElse(null);
-                        if (report != null && user.getId().equals(report.getCreatorId())) {
-                            row.add(report.getWorkingTime().toString());
-                        } else {
-                            row.add(iWorkDay?"0":"休");
+
+                // 构建表体
+                List<List<String>> body = new ArrayList<>();
+                body.add(header);
+
+                // 处理每个项目的数据
+                for (Map.Entry<Integer, List<Report>> entry : groupByProjectList.entrySet()) {
+                    Integer projectId = entry.getKey();
+                    Project project = projectList.stream()
+                            .filter(p -> p.getId().equals(projectId))
+                            .findFirst().orElse(null);
+                    if (project == null) {
+                        continue;
+                    }
+
+                    List<Report> curProjectReportList = entry.getValue();
+
+                    // 按日期填充数据
+                    for (int i = 0; i < daysInMonth; i++) {
+                        List<String> row = new ArrayList<>();
+                        row.add(project.getProjectCode());
+                        row.add(project.getProjectName());
+                        row.add((project.getPlanStartDate() != null ? dtf.format(project.getPlanStartDate()) : "未设置") + "至" +
+                                (project.getPlanEndDate() != null ? dtf.format(project.getPlanEndDate()) : "未设置"));
+                        LocalDate curDate = startDate.plusDays(i);
+                        row.add(dtf.format(curDate));
+
+                        boolean isWorkDay = WorkDayCalculateUtils.isWorkDay(curDate);
+
+                        // 填充部门人员数据
+                        for (User user : deptUsers) {
+                            Report report = curProjectReportList.stream()
+                                    .filter(r -> r.getCreateDate().equals(curDate) && r.getCreatorId().equals(user.getId()))
+                                    .findFirst().orElse(null);
+                            if (report != null && user.getId().equals(report.getCreatorId())) {
+                                row.add(report.getWorkingTime().toString());
+                            } else {
+                                row.add(isWorkDay ? "0" : "休");
+                            }
                         }
+                        body.add(row);
+                    }
+
+                    // 项目小计
+                    List<String> projectSumRow = new ArrayList<>();
+                    projectSumRow.add("");
+                    projectSumRow.add("项目小合计");
+                    projectSumRow.add("");
+                    projectSumRow.add("");
+                    for (User user : deptUsers) {
+                        double sum = curProjectReportList.stream()
+                                .filter(r -> r.getCreatorId().equals(user.getId()))
+                                .mapToDouble(Report::getWorkingTime)
+                                .sum();
+                        projectSumRow.add(df.format(sum));
                     }
-                    //项目+日期 组合为一行数据
-                    body.add(row);
+                    body.add(projectSumRow);
                 }
-                //按项目进行合计
-                List<String> projectSumRow = new ArrayList<>();
-                projectSumRow.add("");
-                projectSumRow.add("项目小合计");
-                projectSumRow.add("");
-                projectSumRow.add("");
-                for (User user : users) {
-                    double sum = curProjectReportList.stream().filter(r->r.getCreatorId().equals(user.getId())).mapToDouble(Report::getWorkingTime).sum();
-                    projectSumRow.add(df.format(sum));
+
+                // 部门合计
+                List<String> deptSumRow = new ArrayList<>();
+                deptSumRow.add("");
+                deptSumRow.add("部门合计");
+                deptSumRow.add("");
+                deptSumRow.add("");
+                for (User user : deptUsers) {
+                    double sum = monthlyReport.stream()
+                            .filter(r -> r.getCreatorId().equals(user.getId()))
+                            .mapToDouble(Report::getWorkingTime)
+                            .sum();
+                    deptSumRow.add(df.format(sum));
                 }
-                body.add(projectSumRow);
-            }
-            //全部项目的个人合计
-            List<String> sumRow = new ArrayList<>();
-            sumRow.add("");
-            sumRow.add("总合计");
-            sumRow.add("");
-            sumRow.add("");
-            for (User user : users) {
-                double sum = monthlyReport.stream().filter(r->r.getCreatorId().equals(user.getId())).mapToDouble(Report::getWorkingTime).sum();
-                sumRow.add(df.format(sum));
-            }
-            body.add(sumRow);
-            String fileName = "月度工时明细表"+System.currentTimeMillis();
-            try {
-                return excelExportService.exportGeneralExcelByTitleAndList(wxCorpInfo,dingding,fileName , body, path);
-            } catch (Exception e) {
-                e.printStackTrace();
+                body.add(deptSumRow);
+
+                // 添加到多Sheet数据
+                multiSheetList[deptIndex] = body;
+                sheetsName[deptIndex] = department.getDepartmentName()+"_"+(deptIndex+1);
             }
+
+
+            /*for (String s : sheetsName) {
+                System.out.println("部门名称:==>"+s);
+            }*/
+
+            String fileName = "月度工时明细表" + System.currentTimeMillis();
+
+            return excelExportService.exportMultiSheetGeneralExcelByTitleAndList(
+                        wxCorpInfo,
+                        dingding,
+                        fileName,
+                        multiSheetList,
+                        path,
+                        sheetsName);
+
         } catch (Exception e) {
             e.printStackTrace();
             throw new RuntimeException(e);
         }
-        return httpRespMsg;
+
     }
 
     @Override