|
@@ -61,6 +61,7 @@ import java.text.*;
|
|
|
import java.time.*;
|
|
|
import java.time.chrono.ChronoLocalDate;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.temporal.TemporalAdjuster;
|
|
|
import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.CountDownLatch;
|
|
@@ -11258,7 +11259,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
|
|
|
|
|
|
//获取FTE报表数据
|
|
|
@Override
|
|
|
- public HttpRespMsg getFTEData(Integer pageIndex, Integer pageSize, String month, String area, HttpServletRequest request) {
|
|
|
+ public HttpRespMsg getFTEData(Integer pageIndex, Integer pageSize,String monthStart,String monthEnd, String area, HttpServletRequest request) {
|
|
|
HttpRespMsg httpRespMsg =new HttpRespMsg();
|
|
|
User targetUser = userMapper.selectById(request.getHeader("token"));
|
|
|
List<SysRichFunction> functionAllList = sysFunctionMapper.getRoleFunctions(targetUser.getRoleId(), "全部部门FTE报表");
|
|
@@ -11286,10 +11287,10 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
|
|
|
List<Map<String,Object>> resultList = null;
|
|
|
String startDate = null;
|
|
|
String endDate = null;
|
|
|
- System.out.println("month==="+month);
|
|
|
- LocalDate time = LocalDate.parse(month, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
- startDate = time.with(TemporalAdjusters.firstDayOfMonth()).toString();
|
|
|
- endDate = time.with(TemporalAdjusters.lastDayOfMonth()).toString();
|
|
|
+ LocalDate timeStart = LocalDate.parse(monthStart, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ LocalDate timeEnd = LocalDate.parse(monthEnd, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ startDate = timeStart.with(TemporalAdjusters.firstDayOfMonth()).toString();
|
|
|
+ endDate = timeEnd.with(TemporalAdjusters.lastDayOfMonth()).toString();
|
|
|
int days = WorkDayCalculateUtils.getWorkDaysListInRange(startDate, endDate, 0).size();
|
|
|
TimeType allDay = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", targetUser.getCompanyId()));
|
|
|
Float monthTime = days * allDay.getAllday();
|
|
@@ -11321,7 +11322,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
|
|
|
|
|
|
//导出FTE报表数据
|
|
|
@Override
|
|
|
- public HttpRespMsg exportFTEData(String month, String area,HttpServletRequest request) {
|
|
|
+ public HttpRespMsg exportFTEData(String monthStart,String monthEnd, String area,HttpServletRequest request) {
|
|
|
HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
User user = userMapper.selectById(request.getHeader("token"));
|
|
|
WxCorpInfo wxCorpInfo = wxCorpInfoMapper.selectOne(new QueryWrapper<WxCorpInfo>().eq("company_id", user.getCompanyId()));
|
|
@@ -11330,7 +11331,13 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
|
|
|
if (userCustoms.size() != 0){
|
|
|
customName = userCustoms.get(0).getName();
|
|
|
}
|
|
|
- HttpRespMsg fteData = getFTEData(null, null, month, area, request);
|
|
|
+ HttpRespMsg fteData = getFTEData(null, null, monthStart,monthEnd, area, request);
|
|
|
+ LocalDate timeStart = LocalDate.parse(monthStart, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ LocalDate timeEnd = LocalDate.parse(monthEnd, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ timeStart=timeStart.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
+ timeEnd=timeEnd.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ //计算日期区间一共几个月
|
|
|
+ Period period = Period.between(timeStart, timeEnd);
|
|
|
Map<String, Object> data = (Map<String, Object>) (Map<String, Object>) fteData.data;
|
|
|
List<Map<String, Object>> resultList = (List<Map<String, Object>>) data.get("resultList");
|
|
|
Float monthTime = (Float) data.get("monthTime");
|
|
@@ -11340,11 +11347,15 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
|
|
|
Integer no = 0;
|
|
|
titleList.add(customName);
|
|
|
titleList.add("序号");
|
|
|
- titleList.add("CRC姓名");
|
|
|
+ titleList.add("姓名");
|
|
|
+ titleList.add("部门");
|
|
|
titleList.add("项目号");
|
|
|
titleList.add("项目名称");
|
|
|
titleList.add("工时(H)");
|
|
|
titleList.add("FTE(工时/当月工时基数)");
|
|
|
+ if(user.getCompanyId()==876){
|
|
|
+ titleList.add("FTE(工时/固定工时基数(163.125))");
|
|
|
+ }
|
|
|
titleList.add("非项目工时(H)(当月工时基数-项目工时合计工时数)");
|
|
|
dataList.add(titleList);
|
|
|
subtitle.add("");
|
|
@@ -11353,199 +11364,97 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
|
|
|
subtitle.add("");
|
|
|
subtitle.add("");
|
|
|
subtitle.add("");
|
|
|
+ subtitle.add("");
|
|
|
+ subtitle.add("");
|
|
|
+ if(user.getCompanyId()==876){
|
|
|
+ titleList.add("");
|
|
|
+ }
|
|
|
subtitle.add("当月工时:" + monthTime);
|
|
|
dataList.add(subtitle);
|
|
|
- Float pTimeSum = 0.0F;
|
|
|
- Float pFteSum = 0.0F;
|
|
|
- Float aTimeSum = 0.0F;
|
|
|
- Float aFteSum = 0.0F;
|
|
|
- for (int i = 0; i < resultList.size(); i++) {
|
|
|
- if(resultList.get(i).get("workTime") == null){
|
|
|
- resultList.get(i).put("workTime",0);
|
|
|
- }
|
|
|
- if(resultList.get(i).get("projectName") == null){
|
|
|
- resultList.get(i).put("projectName","");
|
|
|
- }
|
|
|
- if(resultList.get(i).get("projectCode") == null){
|
|
|
- resultList.get(i).put("projectCode","");
|
|
|
- }
|
|
|
- if (!resultList.get(i).containsKey("area")){
|
|
|
- resultList.get(i).put("area","无");
|
|
|
- }else if(org.apache.commons.lang3.StringUtils.isBlank(resultList.get(i).get("area").toString())){
|
|
|
- resultList.get(i).put("area","无");
|
|
|
- }
|
|
|
- ArrayList<String> row = new ArrayList<>();
|
|
|
- if (i == 0){
|
|
|
- no += 1;
|
|
|
- row.add(resultList.get(i).get("area").toString());
|
|
|
- row.add(no + "");
|
|
|
- if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
|
|
|
- row.add(resultList.get(i).get("corpwx_userid") + "");
|
|
|
- }else {
|
|
|
- row.add(resultList.get(i).get("userName") + "");
|
|
|
+ Map<String, List<Map<String, Object>>> listMap = resultList.stream().collect(Collectors.groupingBy(i -> String.valueOf(i.get("area"))));
|
|
|
+ List<String> areaList = resultList.stream().map(i -> String.valueOf(i.get("area"))).distinct().collect(Collectors.toList());
|
|
|
+ for (String areaName : areaList) {
|
|
|
+ List<Map<String, Object>> mapList = listMap.get(areaName);
|
|
|
+ Map<String, List<Map<String, Object>>> listMap1 = mapList.stream().collect(Collectors.groupingBy(m -> String.valueOf(m.get("id"))));
|
|
|
+ List<String> userIdList = resultList.stream().map(i -> String.valueOf(i.get("id"))).distinct().collect(Collectors.toList());
|
|
|
+ for (String userId : userIdList) {
|
|
|
+ no+=1;
|
|
|
+ List<Map<String, Object>> maps = listMap1.get(userId);
|
|
|
+ if(maps==null){
|
|
|
+ continue;
|
|
|
}
|
|
|
- row.add(resultList.get(i).get("projectCode") + "");
|
|
|
- row.add(resultList.get(i).get("projectName") + "");
|
|
|
-
|
|
|
- Float workTime = Float.valueOf(resultList.get(i).get("workTime").toString());
|
|
|
- row.add(workTime + "");
|
|
|
- pTimeSum += workTime;
|
|
|
- aTimeSum += workTime;
|
|
|
-
|
|
|
- Float FTE = Float.valueOf(resultList.get(i).get("workTime").toString()) / monthTime;
|
|
|
- row.add(new BigDecimal(FTE).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- pFteSum += FTE;
|
|
|
- aFteSum += FTE;
|
|
|
-
|
|
|
- row.add("");
|
|
|
-
|
|
|
- dataList.add(row);
|
|
|
- }else if(resultList.get(i).get("area").equals(resultList.get(i - 1).get("area"))){
|
|
|
- if (resultList.get(i).get("id").equals(resultList.get(i - 1).get("id"))){
|
|
|
- row.add("");
|
|
|
- row.add("");
|
|
|
- row.add("");
|
|
|
- row.add(resultList.get(i).get("projectCode") + "");
|
|
|
- row.add(resultList.get(i).get("projectName") + "");
|
|
|
-
|
|
|
- Float workTime = Float.valueOf(resultList.get(i).get("workTime").toString());
|
|
|
- row.add(workTime + "");
|
|
|
- pTimeSum += workTime;
|
|
|
- aTimeSum += workTime;
|
|
|
-
|
|
|
- Float FTE = Float.valueOf(resultList.get(i).get("workTime").toString()) / monthTime;
|
|
|
- row.add(new BigDecimal(FTE).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- pFteSum += FTE;
|
|
|
- aFteSum += FTE;
|
|
|
-
|
|
|
- row.add("");
|
|
|
-
|
|
|
- dataList.add(row);
|
|
|
- }else {
|
|
|
- ArrayList<String> sum = new ArrayList<>();
|
|
|
- sum.add("");
|
|
|
- sum.add("");
|
|
|
- sum.add("合计");
|
|
|
- sum.add("");
|
|
|
- sum.add("");
|
|
|
- sum.add(new BigDecimal(pTimeSum).setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
- sum.add(new BigDecimal(pFteSum).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- sum.add(new BigDecimal(monthTime - pTimeSum).setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
- pTimeSum = 0.0F;
|
|
|
- pFteSum = 0.0F;
|
|
|
- dataList.add(sum);
|
|
|
-
|
|
|
- no += 1;
|
|
|
- row.add("");
|
|
|
- row.add(no + "");
|
|
|
+ //计算当前人员的合计
|
|
|
+ for (int i = 0; i < maps.size(); i++) {
|
|
|
+ Map<String, Object> map = maps.get(i);
|
|
|
+ List<String> item=new ArrayList<>();
|
|
|
+ if(i==0){
|
|
|
+ item.add(areaName);
|
|
|
+ item.add(no+"");
|
|
|
+ }else {
|
|
|
+ item.add("");
|
|
|
+ item.add("");
|
|
|
+ }
|
|
|
if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
|
|
|
- row.add(resultList.get(i).get("corpwx_userid") + "");
|
|
|
+ item.add("$userName="+map.get("wxUserId") + "$");
|
|
|
+ item.add("$departmentName="+map.get("wxdeptId") + "$");
|
|
|
}else {
|
|
|
- row.add(resultList.get(i).get("userName") + "");
|
|
|
+ item.add(map.get("userName") + "");
|
|
|
+ item.add(map.get("departmentName") + "");
|
|
|
+ }
|
|
|
+ item.add(String.valueOf(map.get("projectCode")));
|
|
|
+ item.add(String.valueOf(map.get("projectName")));
|
|
|
+ Float workTime = Float.valueOf(map.get("workTime").toString());
|
|
|
+ item.add(workTime + "");
|
|
|
+ Float FTE = Float.valueOf(map.get("workTime").toString()) / monthTime;
|
|
|
+ item.add(new BigDecimal(FTE).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
+ if(user.getCompanyId()==876){
|
|
|
+ Float FTERegular = Float.valueOf(map.get("workTime").toString()) / (Float.valueOf(String.valueOf("163.125"))*(period.getMonths()+1));
|
|
|
+ item.add(new BigDecimal(FTERegular).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
}
|
|
|
- row.add(resultList.get(i).get("projectCode") + "");
|
|
|
- row.add(resultList.get(i).get("projectName") + "");
|
|
|
-
|
|
|
- Float workTime = Float.valueOf(resultList.get(i).get("workTime").toString());
|
|
|
- row.add(workTime + "");
|
|
|
- pTimeSum += workTime;
|
|
|
- aTimeSum += workTime;
|
|
|
-
|
|
|
- Float FTE = Float.valueOf(resultList.get(i).get("workTime").toString()) / monthTime;
|
|
|
- row.add(new BigDecimal(FTE).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- pFteSum += FTE;
|
|
|
- aFteSum += FTE;
|
|
|
-
|
|
|
- row.add("");
|
|
|
-
|
|
|
- dataList.add(row);
|
|
|
+ item.add("");
|
|
|
+ dataList.add(item);
|
|
|
}
|
|
|
-
|
|
|
- }else {
|
|
|
- ArrayList<String> pSum = new ArrayList<>();
|
|
|
- pSum.add("");
|
|
|
- pSum.add("");
|
|
|
- pSum.add("合计");
|
|
|
- pSum.add("");
|
|
|
- pSum.add("");
|
|
|
- pSum.add(new BigDecimal(pTimeSum).setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
- pSum.add(new BigDecimal(pFteSum).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- pSum.add(new BigDecimal(monthTime - pTimeSum).setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
- pTimeSum = 0.0F;
|
|
|
- pFteSum = 0.0F;
|
|
|
-
|
|
|
- dataList.add(pSum);
|
|
|
-
|
|
|
- ArrayList<String> sum = new ArrayList<>();
|
|
|
- sum.add("");
|
|
|
- sum.add("");
|
|
|
- sum.add(customName + "合计");
|
|
|
- sum.add("");
|
|
|
- sum.add("");
|
|
|
- sum.add(new BigDecimal((aTimeSum)).setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
- //sum.add(new BigDecimal(aFteSum).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- sum.add("");
|
|
|
- sum.add(new BigDecimal((monthTime - aTimeSum)).setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
- pTimeSum = 0.0F;
|
|
|
- pFteSum = 0.0F;
|
|
|
- aTimeSum = 0.0F;
|
|
|
- aFteSum = 0.0F;
|
|
|
- dataList.add(sum);
|
|
|
-
|
|
|
- ArrayList<String> n = new ArrayList<>();
|
|
|
- n.add("");
|
|
|
- dataList.add(n);
|
|
|
-
|
|
|
- no += 1;
|
|
|
- row.add(resultList.get(i).get("area")==null?"无":resultList.get(i).get("area").toString());
|
|
|
- row.add(no + "");
|
|
|
+ //增加人员合计行
|
|
|
+ List<String> item=new ArrayList<>();
|
|
|
+ item.add("合计");
|
|
|
+ item.add("");
|
|
|
if (wxCorpInfo != null && wxCorpInfo.getSaasSyncContact().equals(1)){
|
|
|
- row.add(resultList.get(i).get("corpwx_userid") + "");
|
|
|
+ item.add("$userName="+maps.get(0).get("wxUserId") + "$");
|
|
|
+ item.add("$departmentName="+maps.get(0).get("wxdeptId") + "$");
|
|
|
}else {
|
|
|
- row.add(resultList.get(i).get("userName") + "");
|
|
|
- }
|
|
|
- row.add(resultList.get(i).get("projectCode") + "");
|
|
|
- row.add(resultList.get(i).get("projectName") + "");
|
|
|
-
|
|
|
- Float workTime = Float.valueOf(resultList.get(i).get("workTime").toString());
|
|
|
- row.add(workTime + "");
|
|
|
- pTimeSum += workTime;
|
|
|
- aTimeSum += workTime;
|
|
|
-
|
|
|
- Float FTE = Float.valueOf(resultList.get(i).get("workTime").toString()) / monthTime;
|
|
|
- row.add(new BigDecimal(FTE).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- pFteSum += FTE;
|
|
|
- aFteSum += FTE;
|
|
|
-
|
|
|
- row.add("");
|
|
|
-
|
|
|
- dataList.add(row);
|
|
|
- }
|
|
|
-
|
|
|
- if (i == resultList.size()-1){
|
|
|
- ArrayList<String> pSum = new ArrayList<>();
|
|
|
- pSum.add("");
|
|
|
- pSum.add("");
|
|
|
- pSum.add("合计");
|
|
|
- pSum.add("");
|
|
|
- pSum.add("");
|
|
|
- pSum.add(new BigDecimal(pTimeSum).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- pSum.add(new BigDecimal(pFteSum).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- pSum.add(new BigDecimal((monthTime - pTimeSum)).setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
- dataList.add(pSum);
|
|
|
-
|
|
|
- ArrayList<String> sum = new ArrayList<>();
|
|
|
- sum.add("");
|
|
|
- sum.add("");
|
|
|
- sum.add(customName + "合计");
|
|
|
- sum.add("");
|
|
|
- sum.add("");
|
|
|
- sum.add(aTimeSum.toString());
|
|
|
- //sum.add(new BigDecimal(aFteSum).setScale(2, RoundingMode.HALF_UP) + "");
|
|
|
- sum.add("");
|
|
|
- sum.add(new BigDecimal((monthTime - aTimeSum)).setScale(2, RoundingMode.HALF_UP).toString());
|
|
|
- dataList.add(sum);
|
|
|
- }
|
|
|
+ item.add(maps.get(0).get("userName") + "");
|
|
|
+ item.add(maps.get(0).get("departmentName") + "");
|
|
|
+ }
|
|
|
+ item.add("");
|
|
|
+ item.add("");
|
|
|
+ double workTimeSum = maps.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("workTime")))).sum();
|
|
|
+ item.add(new BigDecimal(workTimeSum).setScale(2,RoundingMode.HALF_UP)+"");
|
|
|
+ double FTESum = maps.stream().mapToDouble(m -> {
|
|
|
+ return Float.valueOf(m.get("workTime").toString()) / monthTime;
|
|
|
+ }).sum();
|
|
|
+ item.add(new BigDecimal(FTESum).setScale(2,RoundingMode.HALF_UP)+"");
|
|
|
+ if(user.getCompanyId()==876){
|
|
|
+ double FTERegularSum = maps.stream().mapToDouble(m -> {
|
|
|
+ return Float.valueOf(m.get("workTime").toString()) / (Float.valueOf(String.valueOf("163.125"))*(period.getMonths()+1));
|
|
|
+ }).sum();
|
|
|
+ item.add(new BigDecimal(FTERegularSum).setScale(2,RoundingMode.HALF_UP)+"");
|
|
|
+ }
|
|
|
+ item.add(new BigDecimal(monthTime-workTimeSum).setScale(2,RoundingMode.HALF_UP)+"");
|
|
|
+ dataList.add(item);
|
|
|
+ }
|
|
|
+ //增加自定义维度合计行
|
|
|
+ List<String> item=new ArrayList<>();
|
|
|
+ item.add("合计");
|
|
|
+ item.add("");
|
|
|
+ item.add("");
|
|
|
+ item.add("");
|
|
|
+ item.add("");
|
|
|
+ double workTimeSum = mapList.stream().mapToDouble(m -> Double.valueOf(String.valueOf(m.get("workTime")))).sum();
|
|
|
+ item.add(new BigDecimal(workTimeSum).setScale(2,RoundingMode.HALF_UP)+"");
|
|
|
+ item.add("");
|
|
|
+ item.add("");
|
|
|
+ item.add(new BigDecimal((monthTime-workTimeSum)).setScale(2,RoundingMode.HALF_UP)+"");
|
|
|
+ dataList.add(item);
|
|
|
}
|
|
|
String fileName = "FTE报表"+System.currentTimeMillis();
|
|
|
try {
|