|
@@ -21,6 +21,7 @@ import org.apache.poi.EncryptedDocumentException;
|
|
|
import org.apache.poi.hssf.usermodel.*;
|
|
|
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
|
|
|
import org.apache.poi.ss.usermodel.*;
|
|
|
+import org.apache.velocity.runtime.directive.contrib.For;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.beans.factory.annotation.Value;
|
|
|
import org.springframework.boot.web.client.RestTemplateBuilder;
|
|
@@ -49,6 +50,7 @@ import java.security.cert.X509Certificate;
|
|
|
import java.sql.Timestamp;
|
|
|
import java.text.DateFormat;
|
|
|
import java.text.DecimalFormat;
|
|
|
+import java.text.ParseException;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import java.time.Duration;
|
|
|
import java.time.LocalDate;
|
|
@@ -118,6 +120,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
@Resource
|
|
|
ReportExtraDegreeMapper reportExtraDegreeMapper;
|
|
|
@Resource
|
|
|
+ private ReportController reportController;
|
|
|
+ @Resource
|
|
|
WxCorpInfoService wxCorpInfoService;
|
|
|
@Resource
|
|
|
ProjectCategoryMapper projectCategoryMapper;
|
|
@@ -188,6 +192,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
@Resource
|
|
|
private ReportImportLogMapper reportImportLogMapper;
|
|
|
@Resource
|
|
|
+ private ProjectService projectService;
|
|
|
+ @Resource
|
|
|
private ReportAuditLogMapper reportAuditLogMapper;
|
|
|
@Resource
|
|
|
private ReportAlogMembdateMapper reportAlogMembdateMapper;
|
|
@@ -205,6 +211,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
private CorpwxJobResultMapper corpwxJobResultMapper;
|
|
|
@Autowired
|
|
|
RestTemplate restTemplate;
|
|
|
+ @Resource
|
|
|
+ private TimeAutoExcludeMapper timeAutoExcludeMapper;
|
|
|
|
|
|
@Resource
|
|
|
private ReportAuditLogService reportAuditLogService;
|
|
@@ -5803,6 +5811,138 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
|
|
|
|
|
|
@Override
|
|
|
public HttpRespMsg fillWorkingHours(String yearMonth, MonthWorkingTimeVO monthVO, HttpServletRequest request) {
|
|
|
- return null;
|
|
|
+ HttpRespMsg msg = new HttpRespMsg();
|
|
|
+ //需要补的时间
|
|
|
+ double fillTime = monthVO.getStandardHours() - monthVO.getWorkingTime() - monthVO.getLeaveTime();
|
|
|
+ User user = userMapper.selectById(monthVO.getUserId());
|
|
|
+ yearMonth = yearMonth;
|
|
|
+ LocalDate time = LocalDate.parse(yearMonth, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
|
|
+ LocalDate startDate = time.with(TemporalAdjusters.firstDayOfMonth());
|
|
|
+ LocalDate endDate = time.with(TemporalAdjusters.lastDayOfMonth());
|
|
|
+ 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){
|
|
|
+ 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").toString();
|
|
|
+ workEndTime = startAndEndTimeMap.get("endTime").toString();
|
|
|
+ }else {
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+ 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)) {
|
|
|
+ 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())){
|
|
|
+ report.add(map);
|
|
|
+ workTime += Double.parseDouble(map.get("workingTime").toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //如果该日工作时长没有填满
|
|
|
+ if (workTime < monthVO.getAllday()){
|
|
|
+ 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());
|
|
|
+ if (workTime == 0){
|
|
|
+ reportItem.setWorkingTime(monthVO.getAllday());
|
|
|
+ }else {
|
|
|
+ //获取日报的最小开始时间和最大结束时间
|
|
|
+ List<String> endTime = report.stream().map(m -> 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);
|
|
|
+ if (eTime.compareTo(workEndTime) < 0){
|
|
|
+ reportItem.setEndTime(workEndTime);
|
|
|
+ }else {
|
|
|
+ reportItem.setEndTime("22:00");
|
|
|
+ }
|
|
|
+ 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;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ reportService.saveBatch(reports);
|
|
|
+ return msg;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public HttpRespMsg fillAll(String month, String userId, Integer departmentId, Integer whether,HttpServletRequest request) {
|
|
|
+ HttpRespMsg empMonthHours = projectService.getEmpMonthHours(null, null, month, departmentId, userId, whether, request);
|
|
|
+ Map<String,Object> data = (Map<String, Object>) empMonthHours.data;
|
|
|
+ List<Map<String,Object>> resultList= (List<Map<String, Object>>) data.get("result");
|
|
|
+ for (Map<String, Object> map : resultList) {
|
|
|
+ MonthWorkingTimeVO monthWorkingTimeVO = new MonthWorkingTimeVO();
|
|
|
+ monthWorkingTimeVO.setAllday(Double.valueOf(map.get("allday").toString()));
|
|
|
+ monthWorkingTimeVO.setLeaveTime(Double.valueOf(map.get("leaveTime").toString()));
|
|
|
+ monthWorkingTimeVO.setName(map.get("name").toString());
|
|
|
+ monthWorkingTimeVO.setStandardHours(Double.valueOf(map.get("standardHours").toString()));
|
|
|
+ monthWorkingTimeVO.setUserId(map.get("userId").toString());
|
|
|
+ monthWorkingTimeVO.setWhether(Integer.valueOf(map.get("whether").toString()));
|
|
|
+ monthWorkingTimeVO.setWorkingTime(Double.valueOf(map.get("workingTime").toString()));
|
|
|
+ fillWorkingHours(month,monthWorkingTimeVO,request);
|
|
|
+ }
|
|
|
+ return new HttpRespMsg();
|
|
|
}
|
|
|
}
|