|
|
@@ -13,6 +13,7 @@ import com.ruoyi.common.utils.SecurityUtils;
|
|
|
import com.ruoyi.common.utils.StringUtils;
|
|
|
import com.ruoyi.common.utils.bean.BeanValidators;
|
|
|
import com.ruoyi.common.utils.file.FileUtils;
|
|
|
+import com.ruoyi.common.utils.poi.ExcelUtil;
|
|
|
import com.ruoyi.project.bo.MyMonthDays;
|
|
|
import com.ruoyi.project.bo.ProjectStaffRecordInput;
|
|
|
import com.ruoyi.project.bo.ProjectStaffRecordOut;
|
|
|
@@ -44,6 +45,10 @@ import java.io.ByteArrayOutputStream;
|
|
|
import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
+import java.time.*;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
+import java.time.temporal.TemporalAdjusters;
|
|
|
import java.util.*;
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
import java.util.stream.Collectors;
|
|
|
@@ -358,6 +363,8 @@ public class ProjectStaffRecordServiceImpl implements ProjectStaffRecordService
|
|
|
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+
|
|
|
/**
|
|
|
* 项目重新计算统计值
|
|
|
*/
|
|
|
@@ -767,4 +774,172 @@ public class ProjectStaffRecordServiceImpl implements ProjectStaffRecordService
|
|
|
}
|
|
|
return myDuration;
|
|
|
}
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public List<Map<String,Object>> getMonthClock(Integer id, String yearMonth) {
|
|
|
+ ProjectTask projectTask = projectTaskMapper.selectByPrimaryKey(Long.valueOf(id));
|
|
|
+ SysDept sysDept = deptService.selectDeptByPid(projectTask.getId());
|
|
|
+ String projectName=projectTask.getName();
|
|
|
+ String departmentName=sysDept.getDeptName();
|
|
|
+ String companyName=sysDept.getCompanyName();
|
|
|
+ if (sysDept.getCompanyId()==null){
|
|
|
+ companyName=sysDept.getDeptName();
|
|
|
+ }
|
|
|
+ LocalDate startDate = LocalDate.parse(yearMonth, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ startDate=startDate.withDayOfMonth(1);
|
|
|
+ int year=startDate.getYear();
|
|
|
+ int month=startDate.getMonthValue();
|
|
|
+ int lastMonth = month;
|
|
|
+ if(startDate.getMonthValue()== Month.DECEMBER.getValue()){
|
|
|
+ month=1;
|
|
|
+ year=startDate.getYear()+1;
|
|
|
+ }else {
|
|
|
+ lastMonth=startDate.getMonthValue()+1;
|
|
|
+ }
|
|
|
+ LocalDate endDate = LocalDate.of(year,lastMonth,1);
|
|
|
+ List<ProjectStaffRecord> monthClock = projectStaffRecordMapper.getMonthClock(id, startDate, endDate);
|
|
|
+ monthClock = monthClock.stream().filter(e -> e.getAid() == 48).collect(Collectors.toList());
|
|
|
+ LocalDate lastDay = startDate.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ //获取当月每天与星期
|
|
|
+ List<Map<String, Object>> list = getDaysMap(lastDay, startDate);
|
|
|
+ List<Map<String,Object>> listData = new ArrayList<>();
|
|
|
+ //将数据与表头匹配
|
|
|
+ for (ProjectStaffRecord e : monthClock) {
|
|
|
+ //先匹配是否存在这个人,不存证则需要新增
|
|
|
+ LocalDate recordTime = e.getRecordTime().toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
|
|
|
+ if (listData.isEmpty()){
|
|
|
+ pushDate(e, list, recordTime, listData);
|
|
|
+ }else {
|
|
|
+ boolean flag = false;
|
|
|
+ for (Map<String, Object> m : listData) {
|
|
|
+ String name = (String) m.get("name");
|
|
|
+ if (name.equals(e.getName())){
|
|
|
+ flag=true;
|
|
|
+ //存在则需要匹配存入
|
|
|
+ List<Map<String, Object>> maps = (List<Map<String, Object>>) m.get("data");
|
|
|
+ for (Map<String, Object> map2 : maps) {
|
|
|
+ Integer date = (Integer) map2.get("date");
|
|
|
+ Integer dayOfMonth = recordTime.getDayOfMonth();
|
|
|
+ //比对日期,如果日期有参数相加,没有则赋值
|
|
|
+ if (dayOfMonth.equals(date)) {
|
|
|
+ Double o = (Double) map2.get("projectDuration");
|
|
|
+ if (o==null){
|
|
|
+ map2.put("projectDuration", e.getDuration());
|
|
|
+ }else {
|
|
|
+ map2.put("projectDuration", o+e.getDuration());
|
|
|
+ }
|
|
|
+ map2.put("notDuration", 8- e.getDuration()>0?8- e.getDuration():0);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!flag){
|
|
|
+ pushDate(e, list, recordTime, listData);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //将数据统计,计算出所有工时与分摊率
|
|
|
+ pushDurationAndProportion(listData);
|
|
|
+ System.out.println("projectName:"+projectName);
|
|
|
+ System.out.println("depName:"+departmentName);
|
|
|
+ System.out.println("companyName:"+companyName);
|
|
|
+
|
|
|
+ return listData;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void getMonthClockExport(Integer id, String yearMonth, HttpServletResponse response) {
|
|
|
+ ProjectTask projectTask = projectTaskMapper.selectByPrimaryKey(Long.valueOf(id));
|
|
|
+ SysDept sysDept = deptService.selectDeptByPid(projectTask.getId());
|
|
|
+ String projectName=projectTask.getName();
|
|
|
+ String departmentName=sysDept.getDeptName();
|
|
|
+ String companyName=sysDept.getCompanyName();
|
|
|
+ if (sysDept.getCompanyId()==null){
|
|
|
+ companyName=sysDept.getDeptName();
|
|
|
+ }
|
|
|
+ LocalDate startDate = LocalDate.parse(yearMonth, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ startDate=startDate.withDayOfMonth(1);
|
|
|
+ int year=startDate.getYear();
|
|
|
+ int month=startDate.getMonthValue();
|
|
|
+ List<Map<String, Object>> listData = getMonthClock(id, yearMonth);
|
|
|
+ ExcelUtil<Object> util = new ExcelUtil<>(Object.class);
|
|
|
+ util.exportProjectMonthClockExcel(response,listData, projectName, departmentName, companyName, year,month);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void pushDurationAndProportion(List<Map<String, Object>> listData) {
|
|
|
+ for (Map<String, Object> map : listData) {
|
|
|
+ BigDecimal projectDuration = new BigDecimal(0);
|
|
|
+ BigDecimal notDuration = new BigDecimal(0);
|
|
|
+ List<Map<String, Object>> maps = (List<Map<String, Object>>) map.get("data");
|
|
|
+ for (Map<String, Object> map2 : maps) {
|
|
|
+ if (map2.get("projectDuration")!=null){
|
|
|
+ projectDuration = projectDuration.add(new BigDecimal(map2.get("projectDuration").toString()));
|
|
|
+ }
|
|
|
+ if (map2.get("notDuration")!=null){
|
|
|
+ notDuration = notDuration.add(new BigDecimal(map2.get("notDuration").toString()));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ map.put("projectDuration", projectDuration);
|
|
|
+ map.put("notDuration", notDuration);
|
|
|
+ BigDecimal counts = projectDuration.add(notDuration);
|
|
|
+ map.put("projectProportion", projectDuration.divide(counts,2, RoundingMode.HALF_UP));
|
|
|
+ map.put("notProportion", notDuration.divide(counts,2, RoundingMode.HALF_UP));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private List<Map<String, Object>> getDaysMap(LocalDate lastDay, LocalDate startDate) {
|
|
|
+ List<Map<String,Object>> list =new ArrayList<>();
|
|
|
+ //先计算出月份表头
|
|
|
+ for (int i = 1; i < lastDay.getDayOfMonth(); i++){
|
|
|
+ startDate = startDate.plusDays(1);
|
|
|
+ Map<String,Object> map = new HashMap<>();
|
|
|
+ map.put("date", startDate.getDayOfMonth());
|
|
|
+ DayOfWeek dayOfWeek = startDate.getDayOfWeek();
|
|
|
+ switch (dayOfWeek){
|
|
|
+ case MONDAY:
|
|
|
+ map.put("week","一");
|
|
|
+ break;
|
|
|
+ case TUESDAY:
|
|
|
+ map.put("week","二");
|
|
|
+ break;
|
|
|
+ case WEDNESDAY:
|
|
|
+ map.put("week","三");
|
|
|
+ break;
|
|
|
+ case THURSDAY:
|
|
|
+ map.put("week","四");
|
|
|
+ break;
|
|
|
+ case FRIDAY:
|
|
|
+ map.put("week","五");
|
|
|
+ break;
|
|
|
+ case SATURDAY:
|
|
|
+ map.put("week","六");
|
|
|
+ break;
|
|
|
+ case SUNDAY:
|
|
|
+ map.put("week","日");
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ map.put("projectDuration", null);
|
|
|
+ map.put("notDuration", null);
|
|
|
+ list.add(map);
|
|
|
+ }
|
|
|
+ return list;
|
|
|
+ }
|
|
|
+
|
|
|
+ private void pushDate(ProjectStaffRecord e, List<Map<String, Object>> list, LocalDate recordTime, List<Map<String, Object>> listData) {
|
|
|
+ Map<String,Object> map = new LinkedHashMap<>();
|
|
|
+ map.put("name", e.getName());
|
|
|
+ //找出匹配的日期并设置时间
|
|
|
+ for (Map<String, Object> map2 : list) {
|
|
|
+ Integer date = (Integer) map2.get("date");
|
|
|
+ if (recordTime.getDayOfMonth()==date) {
|
|
|
+ map2.put("projectDuration", e.getDuration());
|
|
|
+ map2.put("notDuration", 8- e.getDuration()>0?8- e.getDuration():0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ map.put("data", list);
|
|
|
+ listData.add(map);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|