|
@@ -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
|