Explorar el Código

泓浒需求:请假自动生成请假日报

QuYueTing hace 2 semanas
padre
commit
6b1f77dd49

+ 98 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java

@@ -2,13 +2,17 @@ package com.management.platform.task;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.management.platform.controller.ReportController;
 import com.management.platform.entity.*;
 import com.management.platform.entity.vo.TisTimeVO;
 import com.management.platform.mapper.*;
+import com.management.platform.service.LeaveSheetService;
 import com.management.platform.service.StagesService;
 import com.management.platform.service.TaskService;
+import com.management.platform.service.UserSalaryService;
 import com.management.platform.util.MessageUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.core.ParameterizedTypeReference;
 import org.springframework.http.*;
@@ -20,6 +24,7 @@ import org.springframework.util.CollectionUtils;
 import org.springframework.web.client.RestTemplate;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
 import java.text.SimpleDateFormat;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
@@ -45,6 +50,8 @@ public class DataCollectTask {
 
     @Resource
     private ProjectMapper projectMapper;
+    @Resource
+    private UserSalaryService userSalaryService;
 
     @Resource
     private ProjectCategoryMapper projectCategoryMapper;
@@ -67,6 +74,8 @@ public class DataCollectTask {
     private FinanceMonthlyWorktimeMapper financeMonthlyWorktimeMapper;
     @Resource
     private CompanyMapper companyMapper;
+    @Autowired
+    private LeaveSheetService leaveSheetService;
 
 
 //    private static HikariDataSource sqlServerDataSource;
@@ -355,7 +364,7 @@ public class DataCollectTask {
     }
 
     @Scheduled(cron = "0 0 2 * * ?")
-//@Scheduled(cron = "0 43 16 * * ?")
+//@Scheduled(cron = "0 35 8 * * ?")
     @Async
     public void leaveSheetTask(){
         if(isDev){return;}
@@ -413,19 +422,99 @@ public class DataCollectTask {
                             List<LeaveSheet> realDataList = dataList.stream().filter(t -> StringUtils.isNotBlank(t.getOwnerId())).collect(Collectors.toList());
                             if(!CollectionUtils.isEmpty(realDataList)){
                                 List<String> collect = realDataList.stream().map(LeaveSheet::getProcinstId).distinct().collect(Collectors.toList());
-                                List<String> existIds = leaveSheetMapper.getExistIds(collect,specialCompanyId);
-                                if(!CollectionUtils.isEmpty(existIds)){
-                                    toUpdateList.addAll(realDataList.stream().filter(t -> existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
-                                    toAddList.addAll(realDataList.stream().filter(t -> !existIds.contains(t.getProcinstId())).collect(Collectors.toList()));
-                                }else{
-                                    toAddList.addAll(realDataList);
+                                List<LeaveSheet> existLeaveSheetList = leaveSheetMapper.selectList(new LambdaQueryWrapper<LeaveSheet>().in(LeaveSheet::getProcinstId, collect).eq(LeaveSheet::getCompanyId, specialCompanyId));
+                                List<String> existIds = existLeaveSheetList.stream().map(LeaveSheet::getProcinstId).collect(Collectors.toList());
+//                                List<String> existIds = leaveSheetMapper.getExistIds(collect,specialCompanyId);
+                                for (LeaveSheet tmp : realDataList) {
+                                    Optional<LeaveSheet> first = existLeaveSheetList.stream().filter(t -> t.getProcinstId().equals(tmp.getProcinstId())).findFirst();
+                                    if (first.isPresent()) {
+                                        tmp.setId(first.get().getId());
+                                        toUpdateList.add(tmp);
+                                    } else {
+                                        toAddList.add(tmp);
+                                    }
                                 }
                                 if(!CollectionUtils.isEmpty(toAddList)){
                                     leaveSheetMapper.batchInsert(toAddList);
                                 }
                                 if(!CollectionUtils.isEmpty(toUpdateList)){
-                                    for (LeaveSheet tmp : toUpdateList) {
-                                        leaveSheetMapper.updateById(tmp);
+                                    leaveSheetService.updateBatchById(toUpdateList);
+                                }
+                                //自动生成审核通过的请假工时日报
+                                for (LeaveSheet tmp : realDataList) {
+                                    //获取某人每天请假的时长合计
+                                    String ownerId = tmp.getOwnerId();
+                                    User owner = userMapper.selectById(ownerId);
+                                    Project project = projectMapper.selectOne(new QueryWrapper<Project>().eq("project_code", "HH-GG-0000001").eq("company_id", specialCompanyId));
+                                    TaskGroup leaveGroup = taskGroupMapper.selectOne(new LambdaQueryWrapper<TaskGroup>().eq(TaskGroup::getProjectId, project.getId()).eq(TaskGroup::getName, "请假工时"));
+                                    for (LocalDate date = tmp.getStartDate(); date.compareTo(tmp.getEndDate()) <= 0; date = date.plusDays(1)) {
+                                        //先计算每一天的请假工时数合计
+                                        List<LeaveSheet> leaveSheetList = leaveSheetMapper.selectList(new LambdaQueryWrapper<LeaveSheet>()
+                                                .eq(LeaveSheet::getOwnerId, ownerId)
+                                                .eq(LeaveSheet::getCompanyId, specialCompanyId)
+                                                .le(LeaveSheet::getStartDate, date).gt(LeaveSheet::getEndDate, date));
+                                        if (!CollectionUtils.isEmpty(leaveSheetList)) {
+                                            double leaveHours = leaveSheetList.stream().mapToDouble(LeaveSheet::getTimeHours).sum();
+                                            if (leaveHours > 0) {
+                                                //跨天请假的
+                                                if (leaveHours > 8.0) {
+                                                    leaveHours = 8.0;
+                                                }
+                                                //检查当天是否已经生成了请假工时的日报
+                                                List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>().eq("company_id", specialCompanyId).eq("project_id", project.getId()).eq("create_date", date).eq("creator_id", ownerId));
+                                                //取第一条
+                                                Report oneReport = reportList.size() > 0?reportList.get(0):new Report();
+
+                                                if (oneReport.getId() != null) {
+                                                    if (!oneReport.getWorkingTime().equals(leaveHours)) {
+                                                        //更新时长
+                                                        reportMapper.updateById(new Report().setId(oneReport.getId()).setWorkingTime(leaveHours));
+                                                    }
+                                                } else {
+                                                    //生成请假工时的日报
+                                                    Report report = new Report();
+                                                    report.setProjectId(project.getId());
+                                                    report.setGroupId(leaveGroup.getId());
+                                                    report.setReportTimeType(1);
+                                                    report.setMultiWorktime(0);
+                                                    report.setContent("请假");
+                                                    report.setState(1);//自动生成的审核通过
+                                                    report.setCompanyId(specialCompanyId);
+                                                    report.setStage("-");
+                                                    report.setCreateDate(date);
+                                                    report.setCreatorId(ownerId);
+                                                    report.setDeptId(owner.getDepartmentId());
+                                                    report.setProjectAuditState(0);
+
+                                                    LocalDate now = LocalDate.now();
+                                                    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                                                    BigDecimal hourCost = null;
+                                                    if (owner.getCostApplyDate() != null) {
+                                                        //检查有效期
+                                                        if (owner.getCostApplyDate().compareTo(dtf.format(now)) > 0) {
+                                                            //取上一个历史成本
+                                                            List<UserSalary> list = userSalaryService.list(new QueryWrapper<UserSalary>().eq("user_id", owner.getId()).orderByDesc("indate").last("limit 2"));
+                                                            if (list.size() > 1) {
+                                                                hourCost = list.get(1).getCost();
+                                                            } else {
+                                                                //没有记录,又没有达到预设的起效时间,则默认为0
+                                                                hourCost = new BigDecimal(0);
+                                                            }
+                                                        } else {
+                                                            hourCost = owner.getCost();
+                                                        }
+                                                    } else {
+                                                        hourCost = owner.getCost();
+                                                    }
+                                                    if (hourCost == null) {
+                                                        hourCost = new BigDecimal(0);
+                                                    }
+                                                    //计算工时和成本
+                                                    report.setCost(hourCost.multiply(new BigDecimal(leaveHours)));
+                                                    reportMapper.insert(report);
+                                                }
+                                            }
+                                        }
                                     }
                                 }
                             }