Selaa lähdekoodia

财务审核,填写

QuYueTing 1 kuukausi sitten
vanhempi
commit
a9b90d6b79

+ 20 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/ReportController.java

@@ -1586,6 +1586,15 @@ public class ReportController {
             }
         }
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String curDate = createDate[0];
+        LocalDate localDate = LocalDate.parse(curDate, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        localDate = localDate.withDayOfMonth(1);
+        int count2 = financialAuditMapper.selectCount(new QueryWrapper<FinancialAudit>().eq("company_id", company.getId()).eq("reportYrmnth", localDate).eq("review_status", 2));
+        if (count2 > 0) {
+            HttpRespMsg httpRespMsg = new HttpRespMsg();
+            httpRespMsg.setError("当月工时财务已锁定,无法填报");
+            return httpRespMsg;
+        }
         //对于正北(苏州和广州)需校验项目开始结束日期
         if (SysConstant.ZhengBeiCompIds.contains(company.getId())) {
             for (Report report : reportList) {
@@ -1606,6 +1615,17 @@ public class ReportController {
                     }
                 }
             }
+            //校验之前7天内是否有未提交的日报
+            LocalDate startDate = LocalDate.parse(curDate, dateTimeFormatter);
+            LocalDate endDate = startDate.minusDays(1);
+            startDate = startDate.minusDays(8);
+            List<String> missingReportDates = reportService.getUserMissingReportDates(user.getId(), dateTimeFormatter.format(startDate), dateTimeFormatter.format(endDate));
+            System.out.println("missingReportDates.size()=="+missingReportDates.size());
+            if (missingReportDates != null && missingReportDates.size() > 0) {
+                HttpRespMsg httpRespMsg = new HttpRespMsg();
+                httpRespMsg.setError("请按顺序填写近期日报:" + String.join(",", missingReportDates));
+                return httpRespMsg;
+            }
         }
 
         //如果锁定工作时长上限的话,需要校验每日的合计工作时长

+ 21 - 19
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/U8Controller.java

@@ -10,6 +10,7 @@ import org.springframework.web.bind.annotation.RestController;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 
+import java.net.SocketException;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 
@@ -38,34 +39,35 @@ public class U8Controller {
         LocalDate endDateLocal = now;
         LocalDate startDateLocal = now.minusDays(7);
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        HttpRespMsg msg = new HttpRespMsg();
         if (startDate == null) {
             startDate = formatter.format(startDateLocal);
         }
         if (endDate == null) {
             endDate = formatter.format(endDateLocal);
         }
-        if (syncOrder != null && syncOrder) {
-            //同步订单数据
-            erpOrderInfoService.syncData();
-        }
+        try {
+            if (syncOrder != null && syncOrder) {
+                //同步订单数据
+                erpOrderInfoService.syncData();
+            }
 
-        if (syncCard != null && syncCard) {
-            userFvTimeService.syncUserFvTime(HONGHU_COMP_ID, null, startDate, endDate);
-        }
-        if (syncLeave != null && syncLeave) {
-            try {
+            if (syncCard != null && syncCard) {
+                userFvTimeService.syncUserFvTime(HONGHU_COMP_ID, null, startDate, endDate);
+            }
+            if (syncLeave != null && syncLeave) {
                 leaveSheetService.syncHongHuLeaveSheet(startDate, endDate, HONGHU_COMP_ID);
-            } catch (Exception e) {
-                throw new RuntimeException(e);
             }
+            if (syncBusinessTrip != null && syncBusinessTrip) {
+                businessTripService.syncHongHuData(HONGHU_COMP_ID);
+            }
+            if (syncProject != null && syncProject) {
+                projectService.syncHongHuData(HONGHU_COMP_ID);
+            }
+        } catch (Exception e) {
+            System.err.println(e.getMessage());
+            msg.setError("网络请求异常,请检查U8中转服务状态!" + e.getMessage());
         }
-        if (syncBusinessTrip != null && syncBusinessTrip) {
-            businessTripService.syncHongHuData(HONGHU_COMP_ID);
-        }
-        if (syncProject != null && syncProject) {
-            projectService.syncHongHuData(HONGHU_COMP_ID);
-        }
-
-        return new HttpRespMsg();
+        return msg;
     }
 }

+ 26 - 9
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -938,9 +938,9 @@ public class UserCorpwxTimeController {
                 // 解析每个sheet的数据
                 parseSheetData(sheet, sheetName, allUserList, importedDataList, companyId, sdf);
                 //以下正式运行时需要注释掉,测试的时候只测试第一个表单
-                if (sheetIndex > 0) {
-                    break;
-                }
+//                if (sheetIndex == 0) {
+//                    break;
+//                }
             }
             
             if (importedDataList.isEmpty()) {
@@ -1160,6 +1160,9 @@ public class UserCorpwxTimeController {
             Optional<User> optional = targetUserList.stream()
                     .filter(tl -> tl.getName().equals(nameOrJobNumber))
                     .findFirst();
+            if (optional.isPresent()) {
+                System.out.println("通过targetUserList查找到:"+nameOrJobNumber);
+            }
             any = allUserList.stream()
                     .filter(u -> u.getName().equals(nameOrJobNumber) || 
                                 (u.getJobNumber() != null && u.getJobNumber().equals(nameOrJobNumber)) ||
@@ -1232,7 +1235,7 @@ public class UserCorpwxTimeController {
         // 按用户和日期分组
         Map<String, List<UserCorpwxTime>> groupedData = importedDataList.stream()
                 .collect(Collectors.groupingBy(item -> item.getName() + "_" + item.getCreateDate().format(dtf)));
-        
+        List<Report> updateReportList = new ArrayList<>();
         for (Map.Entry<String, List<UserCorpwxTime>> entry : groupedData.entrySet()) {
             List<UserCorpwxTime> dayDataList = entry.getValue();
             if (dayDataList.isEmpty()) {
@@ -1265,11 +1268,11 @@ public class UserCorpwxTimeController {
             
             // 比对工时
             if (Math.abs(importedWorkHours - systemWorkHours) > 0.01) { // 允许0.01的误差
-                System.out.println("=== 工时不一致,需要更新 ===");
-                System.out.println("用户: " + userName + " (" + user.getId() + ")");
-                System.out.println("日期: " + workDate.format(dtf));
-                System.out.println("导入工时: " + importedWorkHours);
-                System.out.println("系统工时: " + systemWorkHours);
+//                System.out.println("=== 工时不一致,需要更新 ===");
+//                System.out.println("用户: " + userName + " (" + user.getId() + ")"+ ", jobNumber=" + user.getJobNumber());
+//                System.out.println("日期: " + workDate.format(dtf));
+//                System.out.println("导入工时: " + importedWorkHours);
+//                System.out.println("系统工时: " + systemWorkHours);
                 
                 if (!existingReports.isEmpty()) {
                     // 按比例分配新的工时
@@ -1279,7 +1282,21 @@ public class UserCorpwxTimeController {
                 }
                 
                 System.out.println("========================");
+                updateReportList.addAll(existingReports);
+            }
+        }
+        System.out.println("需要改变的工时日报条数:"+updateReportList.size());
+        if (!updateReportList.isEmpty()) {
+            // 更新报告工时
+            for (Report report : updateReportList) {
+                User curUser = allUserList.stream().filter(u->u.getId().equals(report.getCreatorId())).findFirst().get();
+                Optional<User> optional = targetUserList.stream().filter(u->u.getCorpwxUserid().equals(curUser.getCorpwxUserid())).findFirst();
+                System.out.println("姓名: " + (optional.isPresent() ? optional.get().getName() : curUser.getName()) +
+                        "工号:" + curUser.getJobNumber() +
+                        ", 日期: " + dtf.format(report.getCreateDate()) +
+                        ", 导入分配工时: " + report.getWorkingTime());
             }
+            reportService.updateBatchById(updateReportList);
         }
     }
     

+ 9 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ReportService.java

@@ -191,4 +191,13 @@ public interface ReportService extends IService<Report> {
     HttpRespMsg updateJingYuOldReport(String startDate, String endDate);
 
     HttpRespMsg importNewDataZhengbei(Integer companyId, MultipartFile file, Boolean isPass, HttpServletRequest request);
+
+    /**
+     * 查询指定用户某段时间内未填写日报的日期
+     * @param userId 用户ID
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return 返回未填写日报的日期列表
+     */
+    List<String> getUserMissingReportDates(String userId, String startDate, String endDate);
 }

+ 72 - 77
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java

@@ -14348,90 +14348,85 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         String sumUrl = DataCollectTask.PREFIX_URL+"/dataCollect/getSqlServerProjectDataSum";
         String listUrl = DataCollectTask.PREFIX_URL+"/dataCollect/getSqlServerProjectDataList";
         Company company = companyMapper.selectById(honghuCompId);
-        try {
-            ResponseEntity<String> sumResponse = restTemplate.exchange(
-                    sumUrl,
-                    HttpMethod.GET,
-                    null,
-                    String.class
-            );
-            Integer totalNum = 0;
-            if (sumResponse.getStatusCode() == HttpStatus.OK) {
-                totalNum = Integer.parseInt(sumResponse.getBody());
-            } else {
-                System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
-            }
-            if(totalNum > 0){
-                int pageSize = 1000;
-                int offset = 0;
-                List<Project> toAddList = new ArrayList<>();
-                List<Project> toUpdateList = new ArrayList<>();
-                while (offset < totalNum) {
-                    HttpHeaders headers = new HttpHeaders();
-                    headers.setContentType(MediaType.APPLICATION_JSON);
-                    Map<String, Object> requestBody = new HashMap<>();
-                    requestBody.put("pageNo", offset);
-                    requestBody.put("pageSize", pageSize);
-                    HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
-                    ResponseEntity<List<Project>> listResponse = restTemplate.exchange(
-                            listUrl,
-                            HttpMethod.POST,
-                            requestEntity,
-                            new  ParameterizedTypeReference<List<Project>>(){}
-                    );
-                    if (listResponse.getStatusCode() == HttpStatus.OK) {
-                        List<Project> dataList = listResponse.getBody();
-                        if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
-                            List<String> collect = dataList.stream().map(Project::getProjectCode).distinct().collect(Collectors.toList());
-                            List<String> existIds = projectMapper.getExistIds(collect, honghuCompId);
-                            if(!org.springframework.util.CollectionUtils.isEmpty(existIds)){
-                                toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProjectCode())).collect(Collectors.toList()));
-                                toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProjectCode())).collect(Collectors.toList()));
-                            }else{
-                                toAddList.addAll(dataList);
-                            }
-                            if(!org.springframework.util.CollectionUtils.isEmpty(toAddList)){
-                                for (Project project : toAddList) {
-                                    //以项目编码前五为作为分类名称
-                                    String categoryName = project.getProjectCode().substring(0,5);
-                                    project.setCategoryName(categoryName);
-                                    ProjectCategory category = projectCategoryMapper.selectOne(new LambdaQueryWrapper<ProjectCategory>()
-                                            .eq(ProjectCategory::getCompanyId, honghuCompId)
-                                            .eq(ProjectCategory::getName, project.getCategoryName())
-                                            .last(" limit 1 ")
-                                    );
-                                    int categoryId;
-                                    if(null != category){
-                                        categoryId = category.getId();
-                                    }else{
-                                        ProjectCategory tmp = new ProjectCategory();
-                                        tmp.setName(project.getCategoryName());
-                                        tmp.setCompanyId(honghuCompId);
-                                        projectCategoryMapper.insert(tmp);
-                                        categoryId = tmp.getId();
-                                    }
-                                    if(0!= categoryId){
-                                        project.setCategory(categoryId);
-                                        projectMapper.insert(project);
-                                        if (company.getPackageProject() == 1) {
-                                            initGroup(honghuCompId,project.getId());
-                                        }
+        ResponseEntity<String> sumResponse = restTemplate.exchange(
+                sumUrl,
+                HttpMethod.GET,
+                null,
+                String.class
+        );
+        Integer totalNum = 0;
+        if (sumResponse.getStatusCode() == HttpStatus.OK) {
+            totalNum = Integer.parseInt(sumResponse.getBody());
+        } else {
+            System.out.println("请求失败,状态码: " + sumResponse.getStatusCode());
+        }
+        if(totalNum > 0){
+            int pageSize = 1000;
+            int offset = 0;
+            List<Project> toAddList = new ArrayList<>();
+            List<Project> toUpdateList = new ArrayList<>();
+            while (offset < totalNum) {
+                HttpHeaders headers = new HttpHeaders();
+                headers.setContentType(MediaType.APPLICATION_JSON);
+                Map<String, Object> requestBody = new HashMap<>();
+                requestBody.put("pageNo", offset);
+                requestBody.put("pageSize", pageSize);
+                HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
+                ResponseEntity<List<Project>> listResponse = restTemplate.exchange(
+                        listUrl,
+                        HttpMethod.POST,
+                        requestEntity,
+                        new  ParameterizedTypeReference<List<Project>>(){}
+                );
+                if (listResponse.getStatusCode() == HttpStatus.OK) {
+                    List<Project> dataList = listResponse.getBody();
+                    if(org.apache.commons.collections.CollectionUtils.isNotEmpty(dataList)){
+                        List<String> collect = dataList.stream().map(Project::getProjectCode).distinct().collect(Collectors.toList());
+                        List<String> existIds = projectMapper.getExistIds(collect, honghuCompId);
+                        if(!org.springframework.util.CollectionUtils.isEmpty(existIds)){
+                            toUpdateList.addAll(dataList.stream().filter(t -> existIds.contains(t.getProjectCode())).collect(Collectors.toList()));
+                            toAddList.addAll(dataList.stream().filter(t -> !existIds.contains(t.getProjectCode())).collect(Collectors.toList()));
+                        }else{
+                            toAddList.addAll(dataList);
+                        }
+                        if(!org.springframework.util.CollectionUtils.isEmpty(toAddList)){
+                            for (Project project : toAddList) {
+                                //以项目编码前五为作为分类名称
+                                String categoryName = project.getProjectCode().substring(0,5);
+                                project.setCategoryName(categoryName);
+                                ProjectCategory category = projectCategoryMapper.selectOne(new LambdaQueryWrapper<ProjectCategory>()
+                                        .eq(ProjectCategory::getCompanyId, honghuCompId)
+                                        .eq(ProjectCategory::getName, project.getCategoryName())
+                                        .last(" limit 1 ")
+                                );
+                                int categoryId;
+                                if(null != category){
+                                    categoryId = category.getId();
+                                }else{
+                                    ProjectCategory tmp = new ProjectCategory();
+                                    tmp.setName(project.getCategoryName());
+                                    tmp.setCompanyId(honghuCompId);
+                                    projectCategoryMapper.insert(tmp);
+                                    categoryId = tmp.getId();
+                                }
+                                if(0!= categoryId){
+                                    project.setCategory(categoryId);
+                                    projectMapper.insert(project);
+                                    if (company.getPackageProject() == 1) {
+                                        initGroup(honghuCompId,project.getId());
                                     }
                                 }
                             }
-                            if(!org.springframework.util.CollectionUtils.isEmpty(toUpdateList)){
-                                updateBatchById(toUpdateList);
-                            }
-                            toUpdateList.clear();
-                            toAddList.clear();
                         }
+                        if(!org.springframework.util.CollectionUtils.isEmpty(toUpdateList)){
+                            updateBatchById(toUpdateList);
+                        }
+                        toUpdateList.clear();
+                        toAddList.clear();
                     }
-                    offset += pageSize;
                 }
+                offset += pageSize;
             }
-        } catch (Exception e) {
-            System.out.println("请求发生异常: " + e.getMessage());
-            e.printStackTrace();
         }
     }
 

+ 113 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -252,6 +252,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     private SysRoleFunctionService sysRoleFunctionService;
     @Resource
     private FinanceMapper financeMapper;
+    private FinancialAuditMapper financialAuditMapper;
 
 
     //获取报告列表
@@ -3391,6 +3392,14 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             reason = "-";
         }
         Report oneReport = reportMapper.selectById(ids.get(0));
+        //获取日报所属月份,检查财务审核是否通过
+        LocalDate localDate = LocalDate.parse(date, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
+        localDate = localDate.withDayOfMonth(1);
+        int count = financialAuditMapper.selectCount(new QueryWrapper<FinancialAudit>().eq("company_id", company.getId()).eq("reportYrmnth", localDate).eq("review_status", 2));
+        if (count > 0) {
+            httpRespMsg.setError("当月工时财务已锁定,无法撤销");
+            return httpRespMsg;
+        }
         if(timeType.getReportAuditType()==5){
             //日报审核类型为5时,只有日报所属人员所在部门主要负责人或者有审核全公司日报的权限才能审核,或者填报人的直属审核人
             Integer roleId = user.getRoleId();
@@ -12846,6 +12855,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
     @Override
     public List<Map<String, Object>> getReportTimeLessThanCardTimeList(LocalDate firstDay, LocalDate lastDay, Integer deptId, String userId, Integer companyId, boolean getAll) {
+
         //获取自己的考勤未填满的记录
         boolean canViewAll = getAll;
         TimeType timeType = timeTypeMapper.selectById(companyId);
@@ -13266,4 +13276,107 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
 
         return resultList;
     }
+
+    /**
+     * 查询指定用户某段时间内未填写日报的日期
+     * 参考getNoReportUserList函数的逻辑实现
+     * @param userId 用户ID
+     * @param startDate 开始日期
+     * @param endDate 结束日期
+     * @return 返回未填写日报的日期列表
+     */
+    @Override
+    public List<String> getUserMissingReportDates(String userId, String startDate, String endDate) {
+        try {
+            // 获取指定用户信息
+            User targetUser = userMapper.selectById(userId);
+            Integer companyId = targetUser.getCompanyId();
+            if (targetUser == null) {
+                return null;
+            }
+            
+            TimeType timeType = timeTypeMapper.selectById(companyId);
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDate localStart = LocalDate.parse(startDate, dtf);
+            LocalDate localEnd = LocalDate.parse(endDate, dtf);
+            
+            // 获取该用户在指定时间段内的日报记录
+            List<Report> reportList = reportMapper.selectList(new QueryWrapper<Report>()
+                    .select("id,create_date,creator_id, state")
+                    .eq("creator_id", userId)
+                    .between("create_date", localStart, localEnd));
+            
+            // 获取请假数据,请假的不算漏填
+            List<LeaveSheet> leaveSheetList = leaveSheetMapper.selectList(new QueryWrapper<LeaveSheet>()
+                    .select("owner_id,start_date, end_date")
+                    .eq("company_id", companyId)
+                    .eq("owner_id", userId)
+                    .le("status", 1)
+                    .gt("end_date", localStart)
+                    .lt("start_date", localEnd));
+            
+            // 获取节假日设置
+            List<HolidaySetting> holidaySettingList = holidaySettingMapper.selectList(new QueryWrapper<HolidaySetting>().eq("company_id", companyId));
+            
+            // 企微请假查询
+            CompanyDingding companyDingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+            List<UserDingdingTime> userDdTimeList = null;
+            if (companyDingding != null) {
+                userDdTimeList = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
+                        .eq("company_id", companyId)
+                        .eq("dingding_userid", targetUser.getDingdingUserid())
+                        .between("work_date", localStart, localEnd));
+            }
+            
+            List<String> missingDates = new ArrayList<>();
+            long cnt = localStart.until(localEnd, ChronoUnit.DAYS);
+            
+            for (int i = 0; i <= cnt; i++) {
+                LocalDate date = localStart.plusDays(i);
+                
+                // 入职日期以前不需要填报
+                if (targetUser.getInductionDate() != null && date.isBefore(targetUser.getInductionDate())) {
+                    continue;
+                }
+                
+                // 当前日期在离职日期之后不需要填报
+                if (targetUser.getIsActive() == 0 && targetUser.getInactiveDate() != null && date.isAfter(targetUser.getInactiveDate())) {
+                    continue;
+                }
+                
+                // 去掉非工作日
+                Boolean workDay = timeTypeService.isWorkDay(companyId, date, timeType, holidaySettingList);
+                if (!workDay) {
+                    continue;
+                }
+                
+                // 检查是否请假
+                boolean leaveOnTheDay = leaveSheetList.stream().anyMatch(leaveSheet -> 
+                    leaveSheet.getOwnerId().equals(targetUser.getId()) &&
+                    ((date.isEqual(leaveSheet.getStartDate()) || date.isAfter(leaveSheet.getStartDate())) &&
+                     (date.isEqual(leaveSheet.getEndDate()) || date.isBefore(leaveSheet.getEndDate()))));
+                if (leaveOnTheDay) {
+                    continue;
+                }
+                
+                // 检查请假
+                if (userDdTimeList != null) {
+                    if (userDdTimeList.stream().anyMatch(d->d.getWorkDate().isEqual(date))) {
+                        //有考勤,检查是否有日报
+                        if (!reportList.stream().anyMatch(item ->
+                            item.getCreatorId().equals(targetUser.getId()) &&
+                            item.getCreateDate().isEqual(date) &&
+                            (item.getState() == 0 || item.getState() == 1))) {
+                            missingDates.add(date.format(dtf));
+                        }
+                    }
+                }
+            }
+            
+            return missingDates;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 }

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue

@@ -1588,7 +1588,7 @@ export default {
             return options;
         },
         choseTimePick(value, index) {
-            if (!value) {
+            if (value == null || value == undefined) {
                 return
             }
             //选中时间