|
@@ -5755,122 +5755,153 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
@Override
|
|
|
public HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO, HttpServletRequest request) {
|
|
|
HttpRespMsg msg = new HttpRespMsg();
|
|
|
+
|
|
|
//需要补的时间
|
|
|
- double fillTime = monthVO.getStandardHours() - monthVO.getWorkingTime() - monthVO.getLeaveTime();
|
|
|
User user = userMapper.selectById(monthVO.getUserId());
|
|
|
TimeType timeType = timeTypeMapper.selectOne(new QueryWrapper<TimeType>().eq("company_id", user.getCompanyId()));
|
|
|
- yearMonth = yearMonth;
|
|
|
LocalDate time = LocalDate.parse(yearMonth, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ LocalDate now = LocalDate.now();
|
|
|
LocalDate startDate = time.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
LocalDate endDate = time.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ if (endDate.isAfter(now)) {
|
|
|
+ endDate = now;
|
|
|
+ }
|
|
|
if (monthVO.getWhether()!=0){
|
|
|
return msg;
|
|
|
}
|
|
|
//查询该员工所有日报
|
|
|
- List<HashMap<String, Object>> reportList = reportMapper.selectFill(monthVO.getUserId(), startDate, endDate);
|
|
|
- List<String> projectId = reportList.stream().map(r -> r.get("projectId").toString()).distinct().collect(Collectors.toList());
|
|
|
- if (projectId.size() == 0){
|
|
|
+ List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("creator_id", user.getId()).between("create_date", startDate, endDate));
|
|
|
+ List<Integer> projectIds = reportList.stream().map(Report::getProjectId).distinct().collect(Collectors.toList());
|
|
|
+ if (projectIds.size() == 0){
|
|
|
return msg;
|
|
|
}
|
|
|
//获取该公司上班和下班时间
|
|
|
- List<Map<String, Object>> startAndEndTime = reportMapper.selectMaps(new QueryWrapper<Report>().select("min(start_time) startTime", "max(end_time) endTime").eq("company_id", user.getCompanyId()));
|
|
|
- String workStartTime = "";
|
|
|
- String workEndTime = "";
|
|
|
- if (startAndEndTime.size() != 0){
|
|
|
- Map<String, Object> startAndEndTimeMap = startAndEndTime.get(0);
|
|
|
- workStartTime = startAndEndTimeMap.get("startTime")==null?"":startAndEndTimeMap.get("startTime").toString();
|
|
|
- workEndTime = startAndEndTimeMap.get("endTime")==null?"":startAndEndTimeMap.get("endTime").toString();
|
|
|
- }
|
|
|
- List<TimeAutoExclude> timeAutoExclude = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", user.getCompanyId()));
|
|
|
+// List<Map<String, Object>> startAndEndTime = reportMapper.selectMaps(new QueryWrapper<Report>().select("min(start_time) startTime", "max(end_time) endTime").eq("company_id", user.getCompanyId()));
|
|
|
+// String workStartTime = "";
|
|
|
+// String workEndTime = "";
|
|
|
+// if (startAndEndTime.size() != 0){
|
|
|
+// Map<String, Object> startAndEndTimeMap = startAndEndTime.get(0);
|
|
|
+// workStartTime = startAndEndTimeMap.get("startTime")==null?"":startAndEndTimeMap.get("startTime").toString();
|
|
|
+// workEndTime = startAndEndTimeMap.get("endTime")==null?"":startAndEndTimeMap.get("endTime").toString();
|
|
|
+// }
|
|
|
+// List<TimeAutoExclude> timeAutoExclude = timeAutoExcludeMapper.selectList(new QueryWrapper<TimeAutoExclude>().eq("company_id", user.getCompanyId()));
|
|
|
//遍历工作日
|
|
|
ArrayList<Report> reports = new ArrayList<>();
|
|
|
- for (LocalDate i = startDate; i.isEqual(endDate) || i.isBefore(endDate); i = i.plusDays(1)) {
|
|
|
+ for (LocalDate i = startDate; !i.isAfter(endDate); i = i.plusDays(1)) {
|
|
|
+ //跳过离职日期以后的日期
|
|
|
+ if (user.getIsActive() == 0 && i.isAfter(user.getInactiveDate())){
|
|
|
+ continue;
|
|
|
+ }
|
|
|
Boolean workDay = timeTypeService.isWorkDay(user.getCompanyId(), i);
|
|
|
if (workDay){
|
|
|
Double workTime = 0.0;
|
|
|
//添加该日日报进入集合
|
|
|
- ArrayList<HashMap<String, Object>> report = new ArrayList<>();
|
|
|
- for (HashMap<String, Object> map : reportList) {
|
|
|
- if(map.get("createDate").toString().equals(i.toString())){
|
|
|
+ ArrayList<Report> report = new ArrayList<>();
|
|
|
+ for (Report map : reportList) {
|
|
|
+ if(map.getCreateDate().toString().equals(i.toString())){
|
|
|
report.add(map);
|
|
|
- workTime += Double.parseDouble(map.get("workingTime").toString());
|
|
|
+ workTime += map.getWorkingTime();
|
|
|
}
|
|
|
}
|
|
|
- //如果该日工作时长没有填满
|
|
|
- if (workTime < monthVO.getAllday()){
|
|
|
+ //如果该日工作时长没有填满,考虑误差,workTime值为7.99, 和8.0相比,差值为0.01,所以用0.01来判断
|
|
|
+ if (workTime < monthVO.getAllday() - 0.01){
|
|
|
//改日可补时长
|
|
|
Double fillHour = monthVO.getAllday() - workTime;
|
|
|
- Report reportItem = new Report();
|
|
|
- reportItem.setCreatorId(user.getId());
|
|
|
- reportItem.setProjectId(Integer.valueOf(projectId.get(0)));
|
|
|
- reportItem.setCreateDate(i);
|
|
|
- reportItem.setCreateTime(LocalDateTime.now());
|
|
|
- reportItem.setContent("该工时为自动补全的工时");
|
|
|
- reportItem.setState(1);
|
|
|
- reportItem.setTimeType(0);
|
|
|
- reportItem.setIsOvertime(0);
|
|
|
- reportItem.setDepartmentAuditState(-1);
|
|
|
- reportItem.setDegreeId(-1);
|
|
|
- reportItem.setCompanyId(user.getCompanyId());
|
|
|
- reportItem.setProjectAuditorId(request.getHeader("token"));
|
|
|
- reportItem.setDeptId(user.getDepartmentId());
|
|
|
- reportItem.setReportTimeType(timeType.getType());
|
|
|
- if (workTime == 0){
|
|
|
- reportItem.setWorkingTime(monthVO.getAllday());
|
|
|
- if (reportItem.getReportTimeType().equals(2)){
|
|
|
- reportItem.setStartTime(workStartTime);
|
|
|
- reportItem.setEndTime(workEndTime);
|
|
|
- }
|
|
|
- }else {
|
|
|
- if (reportItem.getReportTimeType().equals(2)){
|
|
|
- //获取日报的最小开始时间和最大结束时间
|
|
|
- List<String> endTime = report.stream().map(m -> m.get("endTime")==null?"12:00":m.get("endTime").toString()).collect(Collectors.toList());
|
|
|
- String eTime = endTime.get(0);
|
|
|
- for (String s : endTime) {
|
|
|
- if (s.compareTo(eTime) < 0){
|
|
|
- eTime = s;
|
|
|
- }
|
|
|
- }
|
|
|
- reportItem.setStartTime(eTime);
|
|
|
- reportItem.setEndTime("23:50");
|
|
|
- }else {
|
|
|
- reportItem.setWorkingTime(fillHour);
|
|
|
+ //将fillHour平均分配到每个项目
|
|
|
+ Double fillHourPerProject = fillHour / projectIds.size();
|
|
|
+ //遍历项目
|
|
|
+ double sumHours = 0;
|
|
|
+ for (int pIndex = 0; pIndex<projectIds.size(); pIndex++) {
|
|
|
+ //最后一个了,就把剩下的时长给他
|
|
|
+ if (pIndex == projectIds.size() - 1) {
|
|
|
+ fillHourPerProject = fillHour - sumHours;
|
|
|
+ } else {
|
|
|
+ sumHours += fillHourPerProject;
|
|
|
}
|
|
|
|
|
|
- if (reportItem.getReportTimeType() == 2){
|
|
|
- SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
|
|
- try {
|
|
|
- long t = sdf.parse(reportItem.getEndTime()).getTime() - sdf.parse(reportItem.getStartTime()).getTime();
|
|
|
- int excludeTime = 0;
|
|
|
- if (timeAutoExclude.size() > 0) {
|
|
|
- for (TimeAutoExclude exclude : timeAutoExclude) {
|
|
|
- if (!(exclude.getEndTime().compareTo(reportItem.getStartTime()) < 0 || exclude.getStartTime().compareTo(reportItem.getEndTime()) > 0)) {
|
|
|
- //有交叉的情况,结束时间取较早的,开始时间取较晚的
|
|
|
- String mEndTime = exclude.getEndTime().compareTo(reportItem.getEndTime()) <0 ? exclude.getEndTime() : reportItem.getEndTime();
|
|
|
- String mStartTime = exclude.getStartTime().compareTo(reportItem.getStartTime()) > 0 ? exclude.getStartTime() : reportItem.getStartTime();
|
|
|
- //落在休息时间范围内,需要计算去掉的时间
|
|
|
- long subtractTime = sdf.parse(mEndTime).getTime() - sdf.parse(mStartTime).getTime();
|
|
|
- excludeTime += subtractTime;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- if (excludeTime > 0) {
|
|
|
- t -= excludeTime;//去掉休息时间
|
|
|
- }
|
|
|
-
|
|
|
- int minutes = (int)t/1000/60;
|
|
|
- double hours = minutes*1.0f/60;
|
|
|
- reportItem.setWorkingTime(hours);
|
|
|
- }catch (ParseException e) {
|
|
|
- e.printStackTrace();
|
|
|
- }
|
|
|
+ Report reportItem = new Report();
|
|
|
+ reportItem.setWorkingTime(fillHourPerProject);
|
|
|
+ reportItem.setCost(user.getCost().multiply(new BigDecimal(fillHourPerProject)));
|
|
|
+ reportItem.setCreatorId(user.getId());
|
|
|
+ reportItem.setProjectId(projectIds.get(pIndex));
|
|
|
+ reportItem.setCreateDate(i);
|
|
|
+ reportItem.setCreateTime(LocalDateTime.now());
|
|
|
+ if (timeType.getType() == 2 && timeType.getMultiWorktime() == 1) {
|
|
|
+ //一个项目下填报多个时间段的模式,content里面是Json数组
|
|
|
+ reportItem.setContent("[]");
|
|
|
+ } else {
|
|
|
+ reportItem.setContent("该工时为自动补全的工时");
|
|
|
}
|
|
|
+
|
|
|
+ reportItem.setState(1);
|
|
|
+ reportItem.setTimeType(0);
|
|
|
+ reportItem.setIsOvertime(0);
|
|
|
+ reportItem.setDepartmentAuditState(-1);
|
|
|
+ reportItem.setDegreeId(-1);
|
|
|
+ reportItem.setCompanyId(user.getCompanyId());
|
|
|
+ reportItem.setProjectAuditorId(request.getHeader("token"));
|
|
|
+ reportItem.setDeptId(user.getDepartmentId());
|
|
|
+ reportItem.setReportTimeType(timeType.getType());
|
|
|
+ reports.add(reportItem);
|
|
|
}
|
|
|
- reports.add(reportItem);
|
|
|
- fillTime -= reportItem.getWorkingTime();
|
|
|
- if(fillTime < 0){
|
|
|
- break;
|
|
|
- }
|
|
|
+
|
|
|
+
|
|
|
+// if (workTime == 0){
|
|
|
+// reportItem.setWorkingTime(monthVO.getAllday());
|
|
|
+// if (reportItem.getReportTimeType().equals(2)){
|
|
|
+// reportItem.setStartTime(workStartTime);
|
|
|
+// reportItem.setEndTime(workEndTime);
|
|
|
+// }
|
|
|
+// }else {
|
|
|
+// if (reportItem.getReportTimeType().equals(2)){
|
|
|
+// //获取日报的最小开始时间和最大结束时间
|
|
|
+// List<String> endTime = report.stream().map(m -> m.get("endTime")==null?"12:00":m.get("endTime").toString()).collect(Collectors.toList());
|
|
|
+// String eTime = endTime.get(0);
|
|
|
+// for (String s : endTime) {
|
|
|
+// if (s.compareTo(eTime) < 0){
|
|
|
+// eTime = s;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// reportItem.setStartTime(eTime);
|
|
|
+// reportItem.setEndTime("23:50");
|
|
|
+// }else {
|
|
|
+// reportItem.setWorkingTime(fillHour);
|
|
|
+// }
|
|
|
+//
|
|
|
+// if (reportItem.getReportTimeType() == 2){
|
|
|
+// SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
|
|
|
+// try {
|
|
|
+// long t = sdf.parse(reportItem.getEndTime()).getTime() - sdf.parse(reportItem.getStartTime()).getTime();
|
|
|
+// int excludeTime = 0;
|
|
|
+// if (timeAutoExclude.size() > 0) {
|
|
|
+// for (TimeAutoExclude exclude : timeAutoExclude) {
|
|
|
+// if (!(exclude.getEndTime().compareTo(reportItem.getStartTime()) < 0 || exclude.getStartTime().compareTo(reportItem.getEndTime()) > 0)) {
|
|
|
+// //有交叉的情况,结束时间取较早的,开始时间取较晚的
|
|
|
+// String mEndTime = exclude.getEndTime().compareTo(reportItem.getEndTime()) <0 ? exclude.getEndTime() : reportItem.getEndTime();
|
|
|
+// String mStartTime = exclude.getStartTime().compareTo(reportItem.getStartTime()) > 0 ? exclude.getStartTime() : reportItem.getStartTime();
|
|
|
+// //落在休息时间范围内,需要计算去掉的时间
|
|
|
+// long subtractTime = sdf.parse(mEndTime).getTime() - sdf.parse(mStartTime).getTime();
|
|
|
+// excludeTime += subtractTime;
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// if (excludeTime > 0) {
|
|
|
+// t -= excludeTime;//去掉休息时间
|
|
|
+// }
|
|
|
+//
|
|
|
+// int minutes = (int)t/1000/60;
|
|
|
+// double hours = minutes*1.0f/60;
|
|
|
+// reportItem.setWorkingTime(hours);
|
|
|
+// }catch (ParseException e) {
|
|
|
+// e.printStackTrace();
|
|
|
+// }
|
|
|
+// }
|
|
|
+// }
|
|
|
+// reports.add(reportItem);
|
|
|
+// fillTime -= reportItem.getWorkingTime();
|
|
|
+// if(fillTime < 0){
|
|
|
+// break;
|
|
|
+// }
|
|
|
}
|
|
|
}
|
|
|
}
|