Ver código fonte

Merge remote-tracking branch 'origin/master'

yusm 3 dias atrás
pai
commit
e4edde72dc

+ 12 - 5
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/controller/DataCollectController.java

@@ -329,10 +329,14 @@ public class DataCollectController {
 
 
     @RequestMapping("/getWorkDayDataSum")
-    public String getWorkDayDataSum() {
-        String sqlCount = "select count(*) from att_work_hour_day where create_date >= DATE_SUB(CURDATE(), INTERVAL 14 DAY) and come1 is not null and go1 is not null";
+    public String getWorkDayDataSum(@RequestBody PageBO pageBO) {
+        String sqlCount = "select count(*) from att_work_hour_day where "+
+                (pageBO.getStartDate() == null ? "attendance_date >= DATE_SUB(CURDATE(), INTERVAL 14 DAY)" : (String.format("date_format(attendance_date,'%%Y-%%m-%%d') between '%s' and '%s'", pageBO.getStartDate(), pageBO.getEndDate())))
+                + (pageBO.getJobNumber() == null ? "" : (String.format(" and emp_no = '%s'", pageBO.getJobNumber())))
+                +" and come1 is not null and go1 is not null";
         int totalCount = 0;
         try (Connection connection = mysqlDataSource.getConnection()) {
+            System.out.println("getWorkDayDataSum 查询Sql="+sqlCount);
             PreparedStatement countStmt = connection.prepareStatement(sqlCount);
             ResultSet countRs = countStmt.executeQuery();
             if (countRs.next()) {
@@ -348,7 +352,10 @@ public class DataCollectController {
     @RequestMapping("/getWorkDayDataList")
     public List<UserFvTime> getWorkDayDataList(@RequestBody PageBO pageBO) {
         String sqlQuery = " select id,emp_no,emp_name,attendance_date,come1,go1,if(worktime_total_hour=0,off_hour,worktime_total_hour) as worktime_total_hour,overtime_total_hour " +
-                " from att_work_hour_day  where create_date >= DATE_SUB(CURDATE(), INTERVAL 14 DAY) and come1 is not null and go1 is not null order by id limit ?,? ";
+                " from att_work_hour_day  where "+
+                (pageBO.getStartDate() == null ? "attendance_date >= DATE_SUB(CURDATE(), INTERVAL 14 DAY)" : (String.format("date_format(attendance_date,'%%Y-%%m-%%d') between '%s' and '%s'", pageBO.getStartDate(), pageBO.getEndDate())))
+                + (pageBO.getJobNumber() == null ? "" : (String.format(" and emp_no = '%s'", pageBO.getJobNumber())))
+                +" and come1 is not null and go1 is not null order by id limit ?,? ";
         List<UserFvTime> resList = new ArrayList<>();
         SimpleDateFormat sdfYmd = new SimpleDateFormat("yyyy-MM-dd");
 
@@ -367,8 +374,8 @@ public class DataCollectController {
                     userFvTime.setUserId(resultSet.getString("emp_no"));
                     userFvTime.setWorkDate(null==resultSet.getDate("attendance_date")?null:LocalDate.parse(sdfYmd.format(resultSet.getDate("attendance_date")), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                     String startTime = resultSet.getString("come1");
-                    //从9:00开始计算,小于9:00的以9:00为准,向上取30分钟, 比如9:09,就转换为9:30
-                    if (startTime.compareTo("09:00") < 0) {
+                    //从9:05开始计算,小于9:05的以9:00为准,向上取30分钟, 比如9:09,就转换为9:30
+                    if (startTime.compareTo("09:05") <= 0) {
                         startTime = "09:00";
                     }
                     String[] startTimeArr = startTime.split(":");

+ 3 - 0
fhKeeper/formulahousekeeper/collectdata/src/main/java/com/management/collectdata/entity/bo/PageBO.java

@@ -6,4 +6,7 @@ import lombok.Data;
 public class PageBO {
     private int pageNo = 0;
     private int pageSize = 10;
+    private String jobNumber;
+    private String startDate;
+    private String endDate;
 }

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

@@ -1572,6 +1572,11 @@ public class ReportController {
                         return httpRespMsg;
                     }
                 }
+                if (!StringUtils.isEmpty(report.getExtraField4()) && StringUtils.isEmpty(report.getExtraField5())) {
+                    HttpRespMsg httpRespMsg = new HttpRespMsg();
+                    httpRespMsg.setError("选择了工单号["+report.getExtraField4()+"],对应的行号必填");
+                    return httpRespMsg;
+                }
             }
 
             List<String> collect = reportList.stream().filter(r -> !StringUtils.isEmpty(r.getExtraField4())).map(Report::getExtraField4).collect(Collectors.toList());
@@ -2007,6 +2012,10 @@ public class ReportController {
                 }
             }
         }
+        if (comTimeType.getFillOvertime() == 0) {
+            //不允许填报加班
+            reportList.forEach(r->r.setIsOvertime(0));
+        }
         HttpRespMsg httpRespMsg = reportService.editReport(reportList, createDate.length > 0 ? createDate[0] : null, targetUserList, hourCost, user.getCompanyId(), summary, weeklyAttachment);
         //填报自动通过功能:【上海绎维】、【火石演示】、【博通容合】、【威派格】使用;以及设置了自动审核通过的公司
         if (company.getId() == 862 || company.getId() == 3344 || company.getId() == 936 || comTimeType.getAutoProjectApprove()) {

+ 6 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserCorpwxTimeController.java

@@ -835,11 +835,17 @@ public class UserCorpwxTimeController {
         list.forEach(l->{
             l.setCompanyId(companyId);
             l.setWxCorpid(wxCorpInfo.getCorpid());
+            if (l.getWorkHours() == null) {
+                msg.setError("数据格式有误:" +l.getName()+","+l.getCreateDate());
+            }
             //工作时长四舍五入
             l.setWorkHours(DateTimeUtil.getHalfHoursFromDouble(l.getWorkHours()));
             l.setWeekDay(l.getCreateDate().getDayOfWeek().getValue());
             l.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(l.getWeekDay()));
         });
+        if (msg.code.equals("error")) {
+            return msg;
+        }
         //处理人员,调用企业微信的通讯录搜索接口
         List<String> userNameList = list.stream().map(UserCorpwxTime::getName).distinct().collect(Collectors.toList());
         try {

+ 19 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/UserFvTimeController.java

@@ -448,9 +448,26 @@ public class UserFvTimeController {
     }
 
     @RequestMapping("/syncHongHuFvTime")
-    public HttpRespMsg syncHongHuFvTime() {
+    public HttpRespMsg syncHongHuFvTime(String userId, String startDate, String endDate) {
         HttpRespMsg httpRespMsg = new HttpRespMsg();
-        userFvTimeService.syncUserFvTime(7536);
+        userFvTimeService.syncUserFvTime(7536, userId, startDate, endDate);
+        //查询返回
+        if (startDate == null || endDate == null) {
+            httpRespMsg.setError("请指定日期范围");
+            return httpRespMsg;
+        }
+        QueryWrapper<UserFvTime> eq = new QueryWrapper<UserFvTime>().eq("company_id", 7536).between("work_date", startDate, endDate);
+        if (userId != null) {
+            eq.eq("user_id", userId);
+        }
+        List<UserFvTime> userFvTimeList = userFvTimeService.list(eq);
+        if (userId != null) {
+            if (userFvTimeList.size() > 0) {
+                httpRespMsg.setData(userFvTimeList.get(0));
+            }
+        } else {
+            httpRespMsg.setData(userFvTimeList);
+        }
         return httpRespMsg;
     }
 

+ 22 - 15
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/ExcelParserService.java

@@ -4,6 +4,7 @@ import com.management.platform.entity.UserCorpwxTime;
 import org.apache.poi.ss.usermodel.*;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
@@ -23,7 +24,6 @@ public class ExcelParserService {
 
             // 获取表头行
             Row headerRow = sheet.getRow(0);
-            List<String> ignoreDates = new ArrayList<>();
             // 从第二行开始解析数据(假设第一行是表头)
             for (int i = 2; i <= sheet.getLastRowNum(); i++) {
                 Row row = sheet.getRow(i);
@@ -31,8 +31,6 @@ public class ExcelParserService {
 
                 // 获取姓名和部门
                 String name = getCellValue(row.getCell(0));
-                String department = getCellValue(row.getCell(2));
-
                 // 从第4列开始是日期列
                 for (int col = 3; col < row.getLastCellNum(); col++) {
                     Cell dateCell = headerRow.getCell(col);
@@ -42,7 +40,6 @@ public class ExcelParserService {
 
                     // 解析日期(格式如:03-01\n周六)
                     String dateStr = getCellValue(dateCell);
-                    if (ignoreDates.contains(dateStr)) continue;
                     String[] dateParts = dateStr.split("\n");
                     if (dateParts.length < 1) continue;
 
@@ -67,16 +64,21 @@ public class ExcelParserService {
                             //次日最晚打卡
                             Cell nextDateCell = headerRow.getCell(col + 1);
                             String nextDateStr = getCellValue(nextDateCell);
-                            Cell nextDayTime = row.getCell(col + 1);
-                            String nextDayTimeStr = getCellValue(nextDayTime);
-                            String[] nextDayTimes = nextDayTimeStr.split("\n");
-                            if (nextDayTimes[nextDayTimes.length -1].compareTo("12:00") < 0) {
-                                //次日上午打卡结束
-                                String nextDayEndTime = "次日"+nextDayTimes[nextDayTimes.length -1];
-                                times = new String[2];
-                                times[0] = sTime;
-                                times[1] = nextDayEndTime;
-                                ignoreDates.add(nextDateStr);
+                            if (!StringUtils.isEmpty(nextDateStr)) {
+                                Cell nextDayTime = row.getCell(col + 1);
+                                String nextDayTimeStr = getCellValue(nextDayTime);
+                                if (!StringUtils.isEmpty(nextDayTimeStr) && !"-".equals(nextDayTimeStr)) {
+                                    String[] nextDayTimes = nextDayTimeStr.split("\n");
+                                    if (nextDayTimes[nextDayTimes.length -1].compareTo("12:00") < 0) {
+                                        //次日上午打卡结束
+                                        String nextDayEndTime = "次日"+nextDayTimes[nextDayTimes.length -1];
+                                        times = new String[2];
+                                        times[0] = sTime;
+                                        times[1] = nextDayEndTime;
+                                        //跳过下一个日期
+                                        col++;
+                                    }
+                                }
                             }
                         }
                     }
@@ -145,11 +147,16 @@ public class ExcelParserService {
         // 简单计算工作时长(小时)
         // 实际应用中需要更精确的计算,考虑午休时间等
         String[] startParts = startTime.split(":");
+        boolean isEndNextDay = endTime.startsWith("次日");
+        if (endTime.startsWith("次日")) {
+            endTime = endTime.substring(3);
+            System.out.println("去掉次日后="+endTime);
+        }
         String[] endParts = endTime.split(":");
 
         int startHour = Integer.parseInt(startParts[0]);
         int startMinute = Integer.parseInt(startParts[1]);
-        int endHour = Integer.parseInt(endParts[0]);
+        int endHour = Integer.parseInt(endParts[0]) + (isEndNextDay ? 24 : 0);
         int endMinute = Integer.parseInt(endParts[1]);
 
         double hours = (endHour - startHour) + (endMinute - startMinute) / 60.0;

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/UserFvTimeService.java

@@ -13,5 +13,5 @@ import com.baomidou.mybatisplus.extension.service.IService;
  */
 public interface UserFvTimeService extends IService<UserFvTime> {
 
-    public void syncUserFvTime(Integer specialCompanyId);
+    public void syncUserFvTime(Integer specialCompanyId, String userId,  String startDate, String endDate);
 }

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

@@ -5104,7 +5104,7 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
 
 
                 for(int i=0;i<leaveSheetList.size();i++){
-                    GanttDataItem curItem = new GanttDataItem();;
+                    GanttDataItem curItem = new GanttDataItem();
                     if (!leaveSheetList.get(i).getOwnerId().equals(lsLastItemId)) {
                         //抽取父级对象,人员名称
                         int finalI = i;

+ 1 - 4
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -890,10 +890,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     UserFvTime time = userFvTimeList.get(0);
                     resultMap.put("time", time);
                 }
-                //针对泓浒,前端不显示考勤时间
-                if (companyId != 7536) {
-                    showRefresh = true;
-                }
+                showRefresh = true;
             } else if (timeType.getShowCorpwxCardtime() == 1) {
                 User user = userMapper.selectById(userId);
                 List<UserCorpwxTime> corpwxTimes = null;

+ 27 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserFvTimeServiceImpl.java

@@ -38,16 +38,37 @@ public class UserFvTimeServiceImpl extends ServiceImpl<UserFvTimeMapper, UserFvT
     private UserMapper userMapper;
 
     @Override
-    public void syncUserFvTime(Integer specialCompanyId) {
+    public void syncUserFvTime(Integer specialCompanyId, String userId, String startDate, String endDate) {
         RestTemplate restTemplate = new RestTemplate();
         String sumUrl = PREFIX_URL+"/dataCollect/getWorkDayDataSum";
         String listUrl = PREFIX_URL+"/dataCollect/getWorkDayDataList";
 
         try {
+            List<UserFvTime> toAddList = new ArrayList<>();
+            List<UserFvTime> toUpdateList = new ArrayList<>();
+            LambdaQueryWrapper<User> eq = new LambdaQueryWrapper<User>().eq(User::getCompanyId, specialCompanyId);
+            if (StringUtils.isNotBlank(userId)) {
+                eq.eq(User::getId, userId);
+            }
+            List<User> users = userMapper.selectList(eq);
+            String targetJobNumber = null;
+            //获取指定用户的考勤
+            if (StringUtils.isNotBlank(userId)) {
+                targetJobNumber = users.get(0).getJobNumber();
+            }
+            Map<String, Object> requestBody = new HashMap<>();
+            requestBody.put("jobNumber", targetJobNumber);
+            requestBody.put("startDate", startDate);
+            requestBody.put("endDate", endDate);
+            requestBody.put("pageNo", 0);
+            requestBody.put("pageSize", 0);
+            HttpHeaders headers = new HttpHeaders();
+            headers.setContentType(MediaType.APPLICATION_JSON);
+            HttpEntity<Object> requestEntity = new HttpEntity<>(requestBody, headers);
             ResponseEntity<String> sumResponse = restTemplate.exchange(
                     sumUrl,
-                    HttpMethod.GET,
-                    null,
+                    HttpMethod.POST,
+                    requestEntity,
                     String.class
             );
             Integer totalNum = 0;
@@ -59,18 +80,12 @@ public class UserFvTimeServiceImpl extends ServiceImpl<UserFvTimeMapper, UserFvT
             if(totalNum > 0){
                 int pageSize = 1000;
                 int offset = 0;
-                List<UserFvTime> toAddList = new ArrayList<>();
-                List<UserFvTime> toUpdateList = new ArrayList<>();
-                List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().eq(User::getCompanyId, specialCompanyId));
+
                 Map<String, User> userMap = users.stream().filter(t -> StringUtils.isNotBlank(t.getJobNumber()))
                         .collect(Collectors.toMap(User::getJobNumber, t -> t));
                 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<UserFvTime>> listResponse = restTemplate.exchange(
                             listUrl,
                             HttpMethod.POST,
@@ -118,6 +133,8 @@ public class UserFvTimeServiceImpl extends ServiceImpl<UserFvTimeMapper, UserFvT
                     toAddList.clear();
                     offset += pageSize;
                 }
+            } else {
+                System.out.println("无数据");
             }
         } catch (Exception e) {
             System.out.println("请求发生异常: " + e.getMessage());

+ 6 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/DataCollectTask.java

@@ -284,7 +284,12 @@ public class DataCollectTask {
     public void workDayTask(){
         if(isDev){return;}
         if(isPrivateDeploy) return;
-        userFvTimeService.syncUserFvTime(specialCompanyId);
+        //自动同步过去7天内的数据(不含今天)
+        LocalDate now = LocalDate.now();
+        LocalDate endDate = now.minusDays(1);
+        LocalDate startDate = now.minusDays(8);
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        userFvTimeService.syncUserFvTime(specialCompanyId, null, formatter.format(startDate),formatter.format(endDate));
     }
 
     @Scheduled(cron = "0 0 2 * * ?")