|
@@ -52,6 +52,7 @@ import java.time.LocalDate;
|
|
|
import java.time.LocalDateTime;
|
|
|
import java.time.format.DateTimeFormatter;
|
|
|
import java.time.format.DateTimeParseException;
|
|
|
+import java.time.temporal.ChronoUnit;
|
|
|
import java.util.*;
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
@@ -81,6 +82,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
@Resource
|
|
|
private TaskGroupMapper taskGroupMapper;
|
|
|
@Resource
|
|
|
+ private ProjectAuditorMapper projectAuditorMapper;
|
|
|
+ @Resource
|
|
|
private ReportService reportService;
|
|
|
@Resource
|
|
|
ReportExtraDegreeMapper reportExtraDegreeMapper;
|
|
@@ -233,11 +236,26 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
memb.put("cost", total);
|
|
|
double reportTime = 0;
|
|
|
if (rList.size() > 0) {
|
|
|
+ int state = 1;
|
|
|
for (Map<String, Object> m : rList) {
|
|
|
double t = (double) m.get("time");
|
|
|
reportTime += t;
|
|
|
+
|
|
|
+ //取最低的状态
|
|
|
+ if (state == 2) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (state == 0) {
|
|
|
+ if ((int)m.get("state") == 2) {
|
|
|
+ state = 2;
|
|
|
+ } else {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ state = (int)m.get("state");
|
|
|
+ }
|
|
|
}
|
|
|
- memb.put("state", rList.get(0).get("state"));
|
|
|
+ memb.put("state", state);
|
|
|
}
|
|
|
DecimalFormat df = new DecimalFormat("0.00");
|
|
|
memb.put("reportTime", df.format(reportTime));
|
|
@@ -268,15 +286,29 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
|
|
|
double reportTime = 0;
|
|
|
BigDecimal total = new BigDecimal(0);
|
|
|
+ int state = 1;
|
|
|
for (Map<String, Object> m : list2) {
|
|
|
double t = (double) m.get("time");
|
|
|
reportTime += t;
|
|
|
total = total.add((BigDecimal)m.get("cost"));
|
|
|
+ //取最低的状态
|
|
|
+ if (state == 2) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (state == 0) {
|
|
|
+ if ((int)m.get("state") == 2) {
|
|
|
+ state = 2;
|
|
|
+ } else {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ state = (int)m.get("state");
|
|
|
+ }
|
|
|
}
|
|
|
DecimalFormat df = new DecimalFormat("0.00");
|
|
|
map2.put("reportTime", df.format(reportTime));
|
|
|
map2.put("cost", total);
|
|
|
- map2.put("state", list2.get(0).get("state"));
|
|
|
+ map2.put("state", state);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -325,11 +357,25 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
map.put("cost", total);
|
|
|
double reportTime = 0;
|
|
|
if (list.size() > 0) {
|
|
|
+ int state = 1;
|
|
|
for (Map<String, Object> m : list) {
|
|
|
double t = (double) m.get("time");
|
|
|
reportTime += t;
|
|
|
+ //取最低的状态
|
|
|
+ if (state == 2) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (state == 0) {
|
|
|
+ if ((int)m.get("state") == 2) {
|
|
|
+ state = 2;
|
|
|
+ } else {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ state = (int)m.get("state");
|
|
|
+ }
|
|
|
}
|
|
|
- map.put("state", list.get(0).get("state"));
|
|
|
+ map.put("state", state);
|
|
|
}
|
|
|
DecimalFormat df = new DecimalFormat("0.00");
|
|
|
map.put("reportTime", df.format(reportTime));
|
|
@@ -417,6 +463,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
List<Project> allProjectList = projectMapper.selectList(new QueryWrapper<Project>()
|
|
|
.eq("company_id", userMapper.selectById(userId).getCompanyId()));
|
|
|
List<SubProject> subProjectList = integerList.size() > 0?subProjectMapper.selectList(new QueryWrapper<SubProject>().in("project_id",integerList)):new ArrayList<>();
|
|
|
+ List<ProjectAuditor> auditorList = integerList.size() > 0?projectAuditorMapper.selectList(new QueryWrapper<ProjectAuditor>().in("project_id", integerList)): new ArrayList<>();
|
|
|
|
|
|
List<UserRecentTask> taskList = integerList.size() > 0?userRecentTaskMapper.selectList(new QueryWrapper<UserRecentTask>().in("project_id", integerList).orderByDesc("id")):new ArrayList<>();
|
|
|
List<Profession> professions = professionMapper.selectList(new QueryWrapper<Profession>().eq("company_id", companyId));
|
|
@@ -491,6 +538,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
+ //项目的审核人
|
|
|
+ r.setAuditUserList(auditorList.stream().filter(au->au.getProjectId().equals(r.getProjectId())).collect(Collectors.toList()));
|
|
|
+ if (r.getProjectAuditorId() != null) {
|
|
|
+ Optional<ProjectAuditor> auItem = auditorList.stream().filter(au->au.getAuditorId().equals(r.getProjectAuditorId())).findFirst();
|
|
|
+ if (auItem.isPresent()) {
|
|
|
+ r.setProjectAuditorName(auItem.get().getAuditorName());
|
|
|
+ }
|
|
|
+ }
|
|
|
});
|
|
|
resultMap.put("report", reports);
|
|
|
//顺便再获取一下可分配时间
|
|
@@ -1743,34 +1798,34 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String month) {
|
|
|
+ public HttpRespMsg getUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
|
|
|
String token = request.getHeader("TOKEN");
|
|
|
User user = userMapper.selectById(token);
|
|
|
Integer companyId = user.getCompanyId();
|
|
|
|
|
|
- String startDate = month + "-01";
|
|
|
- LocalDate ld = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
- int year = ld.getYear();
|
|
|
- boolean isLerpYear = false;
|
|
|
- if (year%4==0&&year%100!=0) {
|
|
|
- isLerpYear = true;
|
|
|
- } else if (year%400==0) {
|
|
|
- isLerpYear = true;
|
|
|
- }
|
|
|
-
|
|
|
- int dm = ld.getMonthValue();
|
|
|
- int maxDaysOfMonth = 28;
|
|
|
- if (dm == 1 || dm == 3 || dm == 5 || dm == 7 || dm == 8 || dm == 10 || dm == 12) {
|
|
|
- maxDaysOfMonth = 31;
|
|
|
- } else if (dm == 2) {
|
|
|
- if (isLerpYear) {
|
|
|
- maxDaysOfMonth = 29;
|
|
|
- }
|
|
|
- } else {
|
|
|
- maxDaysOfMonth = 30;
|
|
|
- }
|
|
|
+// String startDate = month + "-01";
|
|
|
+// LocalDate ld = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+// int year = ld.getYear();
|
|
|
+// boolean isLerpYear = false;
|
|
|
+// if (year%4==0&&year%100!=0) {
|
|
|
+// isLerpYear = true;
|
|
|
+// } else if (year%400==0) {
|
|
|
+// isLerpYear = true;
|
|
|
+// }
|
|
|
+//
|
|
|
+// int dm = ld.getMonthValue();
|
|
|
+// int maxDaysOfMonth = 28;
|
|
|
+// if (dm == 1 || dm == 3 || dm == 5 || dm == 7 || dm == 8 || dm == 10 || dm == 12) {
|
|
|
+// maxDaysOfMonth = 31;
|
|
|
+// } else if (dm == 2) {
|
|
|
+// if (isLerpYear) {
|
|
|
+// maxDaysOfMonth = 29;
|
|
|
+// }
|
|
|
+// } else {
|
|
|
+// maxDaysOfMonth = 30;
|
|
|
+// }
|
|
|
|
|
|
- String endDate = month + "-"+maxDaysOfMonth;
|
|
|
+// String endDate = month + "-"+maxDaysOfMonth;
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
List<Map<String, Object>> list = null;
|
|
|
//分角色权限:管理员看全部的,部门负责人看自己部门的,个人只能看自己的。
|
|
@@ -1823,7 +1878,10 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
|
HashMap map = new HashMap();
|
|
|
List<Integer> days = new ArrayList<>();
|
|
|
- for (int i=1;i<=maxDaysOfMonth;i++) {
|
|
|
+ LocalDate localStartDate = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ LocalDate localEndDate = LocalDate.parse(startDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ long count = localStartDate.until(localEndDate, ChronoUnit.DAYS);
|
|
|
+ for (int i=1;i<=count;i++) {
|
|
|
days.add(i);
|
|
|
}
|
|
|
map.put("days", days);
|
|
@@ -1833,8 +1891,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
- public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String month) {
|
|
|
- HttpRespMsg msg = getUserDailyWorkTime(request, month);
|
|
|
+ public HttpRespMsg exportUserDailyWorkTime(HttpServletRequest request, String startDate, String endDate) {
|
|
|
+ HttpRespMsg msg = getUserDailyWorkTime(request, startDate, endDate);
|
|
|
String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
|
|
|
HashMap map = (HashMap) msg.data;
|
|
|
List<Integer> days = (List<Integer>)map.get("days");
|
|
@@ -1844,13 +1902,11 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
titleList.add("序号");
|
|
|
titleList.add("姓名");
|
|
|
days.forEach(d->{
|
|
|
- String dateStr = month + "-" + (d<10?"0"+d:d);
|
|
|
+ String dateStr = startDate;
|
|
|
LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ date = date.plusDays(d-1);
|
|
|
String chn = weekDayCHN[date.getDayOfWeek().getValue()-1];
|
|
|
- String m = month.split("-")[1];
|
|
|
- if (m.startsWith("0")) {
|
|
|
- m = m.substring(1);
|
|
|
- }
|
|
|
+ String m = ""+date.getMonthValue();
|
|
|
titleList.add(m+"."+d+"/"+chn);
|
|
|
});
|
|
|
dataList.add(titleList);
|
|
@@ -1862,8 +1918,12 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
//找到那一天的工作时间
|
|
|
List<Map<String, Object>> worktimeList = userMonthWork.worktimeList;
|
|
|
days.forEach(d->{
|
|
|
- String dateStr = month + "-" + (d<10?"0"+d:d);
|
|
|
- Optional<Map<String, Object>> op = worktimeList.stream().filter(m -> ((String) m.get("createDate")).equals(dateStr)).findFirst();
|
|
|
+ String dateStr = startDate;
|
|
|
+ LocalDate date = LocalDate.parse(dateStr, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ //计算当前遍历到的那一天
|
|
|
+ date = date.plusDays(d-1);
|
|
|
+ final String fDateStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(date);
|
|
|
+ Optional<Map<String, Object>> op = worktimeList.stream().filter(m -> ((String) m.get("createDate")).equals(fDateStr)).findFirst();
|
|
|
if (op.isPresent()) {
|
|
|
Map<String, Object> createDateHour = op.get();
|
|
|
dataItem.add(""+createDateHour.get("workingTime"));
|
|
@@ -1874,7 +1934,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
dataList.add(dataItem);
|
|
|
}
|
|
|
//生成excel文件导出
|
|
|
- String fileName = "人员每日工时统计_"+month.split("-")[1]+"月"+System.currentTimeMillis();
|
|
|
+ String fileName = "人员每日工时统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
|
|
|
String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
|
|
|
HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
httpRespMsg.data = resp;
|
|
@@ -2045,39 +2105,36 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
- if (reportList.size() == 0) {
|
|
|
- msg.setError("缺少工时数据");
|
|
|
- return msg;
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
//先删除老数据, 修改为批处理
|
|
|
long t1 = System.currentTimeMillis();
|
|
|
|
|
|
- DateTimeFormatter standFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
- HashMap<String, Object> dataMap = new HashMap<>();
|
|
|
- for (Report r : reportList) {
|
|
|
- //组合一下人员
|
|
|
- String date = standFormat.format(r.getCreateDate());
|
|
|
- if (dataMap.containsKey(date)) {
|
|
|
- List<String> userList = (List)dataMap.get(date);
|
|
|
- userList.add(r.getCreatorId());
|
|
|
- } else {
|
|
|
- List<String> newList = new ArrayList<>();
|
|
|
- newList.add(r.getCreatorId());
|
|
|
- dataMap.put(date, newList);
|
|
|
- }
|
|
|
- }
|
|
|
- LambdaQueryWrapper<Report> queryWrapper = new QueryWrapper<Report>().lambda();
|
|
|
- Iterator<String> it = dataMap.keySet().iterator();
|
|
|
-
|
|
|
- while (it.hasNext()) {
|
|
|
- String key = it.next();
|
|
|
- List<String> userList = (List)dataMap.get(key);
|
|
|
- queryWrapper.or(wrapper->wrapper.eq(Report::getCompanyId, companyId).eq(Report::getCreateDate, key).in(Report::getCreatorId, userList));
|
|
|
- }
|
|
|
- System.out.println(queryWrapper.getSqlSegment()+", "+queryWrapper.getSqlSelect()+", " + queryWrapper.getCustomSqlSegment());
|
|
|
- if (queryWrapper.getSqlSegment() != null) {
|
|
|
- reportMapper.delete(queryWrapper);
|
|
|
+// DateTimeFormatter standFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+// HashMap<String, Object> dataMap = new HashMap<>();
|
|
|
+// for (Report r : reportList) {
|
|
|
+// //组合一下人员
|
|
|
+// String date = standFormat.format(r.getCreateDate());
|
|
|
+// if (dataMap.containsKey(date)) {
|
|
|
+// List<String> userList = (List)dataMap.get(date);
|
|
|
+// userList.add(r.getCreatorId());
|
|
|
+// } else {
|
|
|
+// List<String> newList = new ArrayList<>();
|
|
|
+// newList.add(r.getCreatorId());
|
|
|
+// dataMap.put(date, newList);
|
|
|
+// }
|
|
|
+// }
|
|
|
+// LambdaQueryWrapper<Report> queryWrapper = new QueryWrapper<Report>().lambda();
|
|
|
+// Iterator<String> it = dataMap.keySet().iterator();
|
|
|
+//
|
|
|
+// while (it.hasNext()) {
|
|
|
+// String key = it.next();
|
|
|
+// List<String> userList = (List)dataMap.get(key);
|
|
|
+// //非审核通过的才能删除
|
|
|
+// queryWrapper.or(wrapper->wrapper.eq(Report::getCompanyId, companyId).eq(Report::getCreateDate, key).in(Report::getCreatorId, userList).ne(Report::getState, 1));
|
|
|
+// }
|
|
|
+// System.out.println(queryWrapper.getSqlSegment()+", "+queryWrapper.getSqlSelect()+", " + queryWrapper.getCustomSqlSegment());
|
|
|
+ if (reportList.size() > 0) {
|
|
|
+ reportMapper.deleteUserSameDayReport(companyId, reportList);
|
|
|
long t2 = System.currentTimeMillis();
|
|
|
System.out.println("删除耗时:" + (t2-t1));
|
|
|
//存储
|
|
@@ -2526,16 +2583,88 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
//管理员看全公司所有人
|
|
|
allRangeUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
|
|
|
}
|
|
|
- List<UserDailyWorkItem> userMonthWorks = new ArrayList<UserDailyWorkItem>();
|
|
|
-
|
|
|
+ List<UserDailyWorkItem> noReportDataList = new ArrayList<UserDailyWorkItem>();
|
|
|
+ //准备部门数据
|
|
|
+ List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
|
|
|
String lastUserId = null;
|
|
|
UserMonthWork lastUserData = null;
|
|
|
+ DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ LocalDate localStart = LocalDate.parse(startDate, dtf);
|
|
|
+ LocalDate localEnd = LocalDate.parse(endDate, dtf);
|
|
|
+ long cnt = localStart.until(localEnd, ChronoUnit.DAYS);
|
|
|
//按人员过滤
|
|
|
for (User curUser: allRangeUserList) {
|
|
|
-
|
|
|
+ for (int i=0;i<cnt; i++) {
|
|
|
+ LocalDate date = localStart.plusDays(i);
|
|
|
+ final String dateStr = dtf.format(date);
|
|
|
+ if (!list.stream().anyMatch(item->item.get("id").equals(curUser.getId())&&sdf.format((java.sql.Date)item.get("createDate")).equals(dateStr))) {
|
|
|
+ UserDailyWorkItem noRecord = new UserDailyWorkItem();
|
|
|
+ noRecord.userId = curUser.getId();
|
|
|
+ noRecord.createDate = dtf.format(date);
|
|
|
+ if (curUser.getDepartmentId() != null && curUser.getDepartmentId() != 0) {
|
|
|
+ noRecord.department = departmentList.stream().filter(d->d.getDepartmentId().equals(curUser.getDepartmentId())).findFirst().get().getDepartmentName();
|
|
|
+ } else {
|
|
|
+ noRecord.department = "无";
|
|
|
+ }
|
|
|
+ noRecord.name = curUser.getName();
|
|
|
+ noReportDataList.add(noRecord);
|
|
|
+ }
|
|
|
+ }
|
|
|
}
|
|
|
-
|
|
|
+ //排序
|
|
|
+ noReportDataList.sort(new Comparator<UserDailyWorkItem>() {
|
|
|
+ @Override
|
|
|
+ public int compare(UserDailyWorkItem o1, UserDailyWorkItem o2) {
|
|
|
+ if (o1.department.compareTo(o2.department) > 0) {
|
|
|
+ return -1;
|
|
|
+ } else if (o1.department.compareTo(o2.department) < 0) {
|
|
|
+ return 1;
|
|
|
+ } else {
|
|
|
+ if (o1.name.compareTo(o2.name) > 0) {
|
|
|
+ return 1;
|
|
|
+ } else if (o1.name.compareTo(o2.name) < 0) {
|
|
|
+ return -1;
|
|
|
+ } else {
|
|
|
+ if (o1.createDate.compareTo(o2.createDate) > 0) {
|
|
|
+ return 1;
|
|
|
+ } else {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+ msg.data = noReportDataList;
|
|
|
return msg;
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg exportNoReportUserList(HttpServletRequest request, String startDate, String endDate) {
|
|
|
+ HttpRespMsg msg = getNoReportUserList(request, startDate, endDate);
|
|
|
+ String[] weekDayCHN = {"周一","周二","周三","周四","周五","周六","周日"};
|
|
|
+ HashMap map = (HashMap) msg.data;
|
|
|
+ List<Integer> days = (List<Integer>)map.get("days");
|
|
|
+ List<UserDailyWorkItem> dailyWorkItems = (List<UserDailyWorkItem>) map.get("list");
|
|
|
+ List<List<String>> dataList = new ArrayList<>();
|
|
|
+ List<String> titleList = new ArrayList<>();
|
|
|
+ titleList.add("部门");
|
|
|
+ titleList.add("姓名");
|
|
|
+ titleList.add("未填日期");
|
|
|
+ for (int i=0;i<dailyWorkItems.size(); i++) {
|
|
|
+ UserDailyWorkItem dataItem = dailyWorkItems.get(i);
|
|
|
+ List<String> line = new ArrayList<>();
|
|
|
+ line.add(dataItem.department);
|
|
|
+ line.add(dataItem.name);
|
|
|
+ line.add(dataItem.createDate);
|
|
|
+ dataList.add(line);
|
|
|
+ }
|
|
|
+ //生成excel文件导出
|
|
|
+ String fileName = "人员每日工时统计_"+startDate+"至"+endDate+"_"+System.currentTimeMillis();
|
|
|
+ String resp = ExcelUtil.exportGeneralExcelByTitleAndList(fileName , dataList, path);
|
|
|
+ HttpRespMsg httpRespMsg = new HttpRespMsg();
|
|
|
+ httpRespMsg.data = resp;
|
|
|
+ return httpRespMsg;
|
|
|
+ }
|
|
|
+
|
|
|
}
|