ソースを参照

Merge branch 'master' of http://47.100.37.243:10080/wutt/manHourHousekeeper

山水共长天一色 3 年 前
コミット
4bad02488a
22 ファイル変更637 行追加575 行削除
  1. 13 14
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/aop/AopLogConfiguration.java
  2. 0 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/config/RefererInterceptor.java
  3. 62 3
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java
  4. 22 6
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java
  5. 2 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyDingdingService.java
  6. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/DingDingService.java
  7. 30 0
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java
  8. 137 132
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java
  9. 21 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ProjectServiceImpl.java
  10. 34 49
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java
  11. 0 2
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java
  12. 245 229
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java
  13. 40 10
      fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java
  14. 0 6
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml
  15. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml
  16. 1 1
      fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCorpwxTimeMapper.xml
  17. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue
  18. 3 2
      fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue
  19. 1 1
      fhKeeper/formulahousekeeper/timesheet/src/views/quanx/quanx.vue
  20. 10 7
      fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue
  21. 7 7
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/edit/index.vue
  22. 6 100
      fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

+ 13 - 14
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/aop/AopLogConfiguration.java

@@ -9,7 +9,10 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.context.request.RequestContextHolder;
 import org.springframework.web.context.request.ServletRequestAttributes;
 import javax.servlet.http.HttpServletRequest;
+import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Stream;
 
 /**
  * Author: 吴涛涛 cuiyi@itany.com
@@ -21,7 +24,13 @@ import java.util.Arrays;
 @Aspect
 @Configuration
 public class AopLogConfiguration {
-
+    public static String[] methods = {"importData", "editReport", "approve", "deny", "cancel", "batchApproveReport", "batchDenyReport"
+            , "loginByUserId", "getUserByCode"};
+    public static List<String> printMethods = new ArrayList<String>();
+    static {
+        printMethods = Arrays.asList(methods);
+    }
+    ;
     //切入点表达式
     @Pointcut("execution(public * com.management.*.controller.*.*(..))")
     public void logPointcut(){
@@ -36,13 +45,9 @@ public class AopLogConfiguration {
         ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
         if (requestAttributes == null) return;
         HttpServletRequest request = requestAttributes.getRequest();
-        if(request.getRequestURL().toString().contains("/imageProcessing")){
-            return;
-        }
         //打印请求内容
-
         String methodName = joinPoint.getSignature().getName();
-        if (!"loginAdmin".equals(methodName)) {
+        if (printMethods.contains(methodName)) {
             String reqUrl = request.getRequestURL().toString().replaceAll("http://localhost:10010/","");
             log.info("请求方法:"+reqUrl+", 参数: "+Arrays.toString(joinPoint.getArgs()));
         }
@@ -55,10 +60,7 @@ public class AopLogConfiguration {
     public void methodAfterReturning(Object o){
         ServletRequestAttributes requestAttributes = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
         if (requestAttributes == null) return;
-        HttpServletRequest request = requestAttributes.getRequest();
-        if(request.getRequestURL().toString().contains("/imageProcessing")){
-            return;
-        }
+
     }
 
     /**
@@ -70,10 +72,7 @@ public class AopLogConfiguration {
         if (requestAttributes == null) {
             return ;
         }
-        HttpServletRequest request = requestAttributes.getRequest();
-        if(request.getRequestURL().toString().contains("/imageProcessing")){
-            return;
-        }
+
         log.info("***************抛出异常***************");
         log.info("请求类方法:"+joinPoint.getSignature().getName());
         log.info("异常内容:"+e);

+ 0 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/config/RefererInterceptor.java

@@ -64,7 +64,6 @@ public class RefererInterceptor extends HandlerInterceptorAdapter {
                 resp.setStatus(HttpServletResponse.SC_NOT_FOUND);
                 return false;
             }
-            LOGGER.info("host="+host+", refer host="+url.getHost());
             boolean isSame = false;
             if (host.equals(url.getHost())) {
                 isSame = true;

+ 62 - 3
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -5,7 +5,10 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.CompanyDingding;
+import com.management.platform.entity.TimeType;
 import com.management.platform.entity.User;
+import com.management.platform.mapper.CompanyDingdingMapper;
+import com.management.platform.mapper.TimeTypeMapper;
 import com.management.platform.mapper.UserMapper;
 import com.management.platform.service.CompanyDingdingService;
 import com.management.platform.service.DingDingService;
@@ -18,9 +21,11 @@ import org.springframework.web.bind.annotation.*;
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
+import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
+import java.util.stream.Collectors;
 
 @RestController
 @RequestMapping("/dingding")
@@ -39,6 +44,11 @@ public class DingDingController {
     private CompanyDingdingService companyDingdingService;
     @Resource
     private UserMapper userMapper;
+    @Resource
+    private CompanyDingdingMapper companyDingdingMapper;
+    @Resource
+    private TimeTypeMapper timeTypeMapper;
+
 
     @RequestMapping("/callback")
     public Map<String, String> dingCallback(
@@ -48,6 +58,20 @@ public class DingDingController {
             @RequestBody(required = false) JSONObject body
     ) {
         System.out.println("接收到ding call back");
+        if (body == null) {
+            System.out.println("Body为NULL !!!!!,直接返回success");
+            DingCallbackCrypto callbackCrypto = null;
+            try {
+                callbackCrypto = new DingCallbackCrypto(token, aesKey, suiteKey);
+                Map<String, String> successMap = callbackCrypto.getEncryptedMap("success");
+                LocalDateTime now = LocalDateTime.now();
+                DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.SSS");
+                System.out.println(dtf.format(now)+" 给钉钉返回数据了:"+successMap);
+                return successMap;
+            } catch (DingCallbackCrypto.DingTalkEncryptException e) {
+                e.printStackTrace();
+            }
+        }
         bizLogger.info("接收到ding call back=" + body.toJSONString());
         try {
             // 1. 从http请求中获取加解密参数
@@ -280,15 +304,50 @@ public class DingDingController {
 //    }
 
     @RequestMapping("/syncUserWorkData")
-    public HttpRespMsg syncUserWorkData(Integer companyId, String workDate) {
-        dingDingService.syncUserWorkData(companyId, workDate);
+    public HttpRespMsg syncUserWorkData(Integer companyId, String startDate, String endDate) {
+        CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId).isNotNull("custom_appkey"));
+        HttpRespMsg msg = new HttpRespMsg();
+        if (startDate.compareTo(endDate) > 0) {
+            msg.setError("开始日期不能晚于结束日期");
+            return msg;
+        }
+
+        if (companyId != null) {
+            if (dingding == null) {
+                msg.setError("该公司没有设置customAppkey和customAppSecrt");
+                return msg;
+            } else {
+                long t1 = System.currentTimeMillis();
+                dingDingService.syncUserWorkData(dingding, startDate, endDate);
+                long t2 = System.currentTimeMillis();
+                System.out.println("总共耗时:"+(t2-t1)+"ms");
+            }
+        } else {
+            List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_dingding", 1));
+            List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
+            //企业内部应用才有权限调用
+            List<CompanyDingding> dingdingList = companyDingdingMapper.selectList(new QueryWrapper<CompanyDingding>().in("company_id", compIds)
+                    .isNotNull("custom_appkey"));
+            System.out.println("==========获取钉钉内部应用的数量是:"+dingdingList.size());
+            if (dingdingList.size() == 0) {
+                msg.setError("没有设置customAppkey和customAppSecrt的数据");
+                return msg;
+            } else {
+                long t1 = System.currentTimeMillis();
+                for (int i=0;i<dingdingList.size(); i++) {
+                    dingDingService.syncUserWorkData(dingdingList.get(i), startDate, endDate);
+                }
+                long t2 = System.currentTimeMillis();
+                System.out.println("总共耗时:"+(t2-t1)+"ms");
+            }
+        }
+
         return new HttpRespMsg();
     }
 
     @RequestMapping("/testWaitingApply")
     public HttpRespMsg testWaitingApply(Integer companyId) {
         CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-
         companyDingdingService.sendReportWaitingApplyMsg(companyId, companyDingding.getAgentId(),
                 4L, "040534176023851922");
         return new HttpRespMsg();

+ 22 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/TaskController.java

@@ -78,6 +78,8 @@ public class TaskController {
     private TaskExecutorMapper taskExecutorMapper;
     @Resource
     private TaskExecutorService taskExecutorService;
+    @Resource
+    private CompanyDingdingService companyDingdingService;
 
     @RequestMapping("/save")
     @Transactional
@@ -200,6 +202,22 @@ public class TaskController {
             msgRecepientList.forEach(msgRecepient->{
                 informationService.save(new Information().setType(1).setContent(String.valueOf(task.getProjectId())).setUserId(msgRecepient));
             });
+            List<User> recpUserList = userMapper.selectList(new QueryWrapper<User>().in("id", msgRecepientList));
+            if (recpUserList.get(0).getDingdingUserid() != null) {
+                //钉钉用户
+                CompanyDingding dingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", user.getCompanyId()));
+                LocalDate endDate = task.getEndDate();
+                String endStr = "";
+                if (endDate != null) {
+                    endStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(endDate);
+                }
+                companyDingdingService.sendNewTaskMsg(dingding, recpUserList.stream().map(User::getDingdingUserid).collect(Collectors.joining(",")),
+                        task.getName(), endStr);
+            } else if (recpUserList.get(0).getCorpwxUserid() != null) {
+                //企业微信用户
+
+            }
+
         }
         return msg;
     }
@@ -232,7 +250,6 @@ public class TaskController {
                 return msg;
             }
         }
-
         if (task.getTaskStatus() == 0) {
             task.setTaskStatus(1);
             task.setFinishDate(LocalDate.now());
@@ -263,11 +280,10 @@ public class TaskController {
         Task item = taskService.getById(task.getId());
         if (item.getParentTid() == null) {
             //只有第一级任务才更新项目进度, 非已撤销状态的
-            List<Task> all = taskService.list(new QueryWrapper<Task>().eq("project_id", item.getProjectId()).isNull("parent_tid").ne("task_status", 2));
-
-            if (all.size() > 0) {
-                long running = all.stream().filter(a -> a.getTaskStatus() == 1).count();
-                int progress = ((int) running) * 100 / all.size();
+            long allProjectTaskCount =  taskService.count(new QueryWrapper<Task>().eq("project_id", item.getProjectId()).isNull("parent_tid").ne("task_status", 2));
+            long finishTaskCount = taskService.count(new QueryWrapper<Task>().eq("project_id", item.getProjectId()).isNull("parent_tid").eq("task_status", 1));
+            if (allProjectTaskCount > 0) {
+                int progress = ((int) finishTaskCount) * 100 / (int)allProjectTaskCount;
                 Project project = new Project();
                 project.setId(item.getProjectId());
                 project.setProgress(progress);

+ 2 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/CompanyDingdingService.java

@@ -23,4 +23,6 @@ public interface CompanyDingdingService extends IService<CompanyDingding> {
     public void sendReportWaitingApplyMsg(Integer companyId, Long agentId, Long auditNum, String useridList);
 
     public void sendBusinessTripSettingMsg(Integer companyId, Long agentId, String useridList);
+
+    public void sendNewTaskMsg(CompanyDingding dingding, String userId, String title, String endDate);
 }

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

@@ -28,7 +28,7 @@ public interface DingDingService {
 
     void syncLeaveTime(Integer companyId, String userId, String startDate, String endDate);
 
-    void syncUserWorkData(Integer companyId, String workDate);
+    void syncUserWorkData(CompanyDingding dingding, String startDate, String endDate);
 
     void getCorpSelfDefSmartReport(CompanyDingding dingding);
 }

+ 30 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/CompanyDingdingServiceImpl.java

@@ -47,6 +47,8 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
     public static final String TEMPLATE_REPORT_WAITING_APPLY = "d871e80191d14ec8aeec3986aca3ce46";
     //出差待关联
     public static final String TEMPLATE_BUSTRIP_SETTING = "68cc6f3a150f4d869449e83a2f249b65";
+    //新任务
+    public static final String TEMPLATE_NEW_TASK = "b09b32a0431a47bdb791ba286e6d82ba";
 
 
 
@@ -168,6 +170,34 @@ public class CompanyDingdingServiceImpl extends ServiceImpl<CompanyDingdingMappe
         System.out.println(rsp.getBody());
     }
 
+    @Override
+    public void sendNewTaskMsg(CompanyDingding dingding, String ddUserid, String title, String endDate) {
+        //异步发送
+        new Thread(){
+            public void run() {
+                DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/message/corpconversation/sendbytemplate");
+                OapiMessageCorpconversationSendbytemplateRequest req = new OapiMessageCorpconversationSendbytemplateRequest();
+                req.setAgentId(dingding.getAgentId());
+                req.setUseridList(ddUserid);
+                req.setTemplateId(TEMPLATE_NEW_TASK);
+                JSONObject json = new JSONObject();
+                json.put("name", ""+title);
+                json.put("endDate", ""+endDate);
+                req.setData(json.toJSONString());
+
+                OapiMessageCorpconversationSendbytemplateResponse rsp = null;
+                try {
+                    rsp = client.execute(req, getCorpAccessToken(dingding));
+                } catch (ApiException e) {
+                    e.printStackTrace();
+                } catch (Exception exception) {
+                    exception.printStackTrace();
+                }
+                System.out.println(rsp.getBody());
+            }
+        }.start();
+    }
+
     private String getDDSuiteAccessToken() throws ApiException {
         if (DingDingServiceImpl.SUITE_ACCESS_TOKEN == null || DingDingServiceImpl.suiteTokenExpireTime < System.currentTimeMillis()) {
             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_suite_token");

+ 137 - 132
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -111,11 +111,7 @@ public class DingDingServiceImpl implements DingDingService {
     private LeaveSheetMapper leaveSheetMapper;
     @Resource
     private LeaveSheetService leaveSheetService;
-    //企业内部应用参数
-    @Value("${dingding.appkey}")
-    private String appkey;
-    @Value("${dingding.appsecret}")
-    private String appsecret;
+
     @Value("${configEnv.isPrivateDeploy}")
     private boolean isPrivateDeploy;//企业内部应用,私有化部署的情况
     @Override
@@ -1084,11 +1080,142 @@ public class DingDingServiceImpl implements DingDingService {
 
     //获取当天的员工考勤数据,包括打卡,请假/出差申请单; 仅企业内部应用有权限
     @Override
-    public void syncUserWorkData(Integer companyId, String workDate) {
-        if (companyId != null) {
-            //指定的某个公司
-            CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-            syncOneCompWorkData(dingding, workDate);
+    public void syncUserWorkData(CompanyDingding dingding, String startDate, String endDate) {
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDate sDate = LocalDate.parse(startDate, dateTimeFormatter);
+        LocalDate eDate = LocalDate.parse(endDate, dateTimeFormatter);
+        //循环每一天
+        int i=0;
+        while(true) {
+            LocalDate workDate = sDate.plusDays(i);
+            String wDate = dateTimeFormatter.format(workDate);
+            System.out.println("同步钉钉考勤假期出差第:"+i+"天, " + wDate);
+            sycUserOneDayWorkData(dingding, wDate);
+            //到达结束日期,结束了
+            if (workDate.isEqual(eDate)) {
+                break;
+            }
+            i++;
+        }
+    }
+
+    private void sycUserOneDayWorkData(CompanyDingding dingding, String workDate) {
+        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
+        String accessToken = null;
+        try {
+            accessToken = getInnerCorpToken(dingding);
+            for (User user : userList) {
+                DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getupdatedata");
+                OapiAttendanceGetupdatedataRequest req = new OapiAttendanceGetupdatedataRequest();
+                req.setUserid(user.getDingdingUserid());
+                req.setWorkDate(StringUtils.parseDateTime(workDate + " 00:00:00"));
+                OapiAttendanceGetupdatedataResponse rsp = null;
+                try {
+                    rsp = client.execute(req, accessToken);
+                    System.out.println(user.getName()+":"+rsp.getBody());
+                    JSONObject json = JSONObject.parseObject(rsp.getBody());
+                    JSONObject result = json.getJSONObject("result");
+                    //考勤数据
+                    JSONArray attendanceList = result.getJSONArray("attendance_result_list");
+                    UserDingdingTime cardTime = new UserDingdingTime();
+                    cardTime.setCompanyId(dingding.getCompanyId());
+                    cardTime.setUserId(user.getId());
+                    cardTime.setDingdingCorpid(dingding.getCorpid());
+                    cardTime.setDingdingUserid(user.getDingdingUserid());
+                    LocalDateTime onDutyEarleast = null;
+                    LocalDateTime offDutyLatest = null;
+
+                    for (int i=0;i<attendanceList.size(); i++) {
+                        JSONObject attItem = attendanceList.getJSONObject(i);
+                        String checkType = attItem.getString("check_type");
+                        String checkTime = attItem.getString("user_check_time");
+                        LocalDateTime dateTime = LocalDateTime.parse(checkTime, timeDtf);
+                        cardTime.setWorkDate(dateTime.toLocalDate());
+                        //计算周几
+                        cardTime.setWeekDay(cardTime.getWorkDate().getDayOfWeek().getValue());
+                        cardTime.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(cardTime.getWeekDay()));
+                        if ("OnDuty".equals(checkType)) {
+                            //上班时间
+                            cardTime.setStartTime(mmDtf.format(dateTime));
+                            onDutyEarleast = dateTime;
+                        } else {
+                            //下班
+                            cardTime.setEndTime(mmDtf.format(dateTime));
+                            offDutyLatest = dateTime;
+                        }
+                    }
+                    if (onDutyEarleast != null && offDutyLatest != null) {
+                        long seconds = (offDutyLatest.getSecond()- onDutyEarleast.getSecond());
+                        float hours = (offDutyLatest.getHour() - onDutyEarleast.getHour()) + seconds*1.0f/3600;
+                        cardTime.setWorkHours(hours);
+                        //对比,看看之前是否已经存了
+                        List<UserDingdingTime> old = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().eq("user_id", user.getId())
+                                .eq("work_date", cardTime.getWorkDate()));
+                        if (old.size() > 0) {
+                            cardTime.setId(old.get(0).getId());
+                        }
+                        userDingdingTimeService.saveOrUpdate(cardTime);
+                    }
+
+                    //请假和出差的审批单列表
+                    JSONArray approveList = result.getJSONArray("approve_list");
+                    for (int i=0;i<approveList.size(); i++) {
+                        JSONObject item = approveList.getJSONObject(i);
+                        String tagName = item.getString("tag_name");
+                        if ("出差".equals(tagName)) {
+                            BusinessTrip trip = new BusinessTrip();
+                            trip.setOwnerId(user.getId());
+                            trip.setOwnerName(user.getName());
+                            trip.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
+                            trip.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
+                            trip.setCompanyId(dingding.getCompanyId());
+                            Long cha = trip.getEndDate().toEpochDay() - trip.getStartDate().toEpochDay() + 1;
+                            trip.setDayCount(Integer.parseInt(cha.toString()));
+                            trip.setStatus(0);
+                            int cnt = businessTripMapper.selectCount(new QueryWrapper<BusinessTrip>().eq("owner_id", user.getId())
+                                    .eq("start_date", trip.getStartDate())
+                                    .eq("end_date", trip.getEndDate()));
+                            if (cnt == 0) {
+                                businessTripMapper.insert(trip);
+                            }
+                        } else if ("请假".equals(tagName)) {
+                            LeaveSheet sheet = new LeaveSheet();
+                            sheet.setOwnerId(user.getId());
+                            sheet.setOwnerName(user.getName());
+                            sheet.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
+                            sheet.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
+                            Long cha = sheet.getEndDate().toEpochDay() - sheet.getStartDate().toEpochDay() + 1;
+                            sheet.setTimeDays((float)cha);
+                            sheet.setCompanyId(dingding.getCompanyId());
+                            sheet.setStatus(0);
+                            String dLeaveType = item.getString("sub_type");
+                            if (!dLeaveType.endsWith("假")) dLeaveType = dLeaveType + "假";
+                            int leaveTypeIndex = -1;
+                            for (int t=0;t<Constant.LEAVE_TYPES.length; t++) {
+                                if (Constant.LEAVE_TYPES[t].equals(dLeaveType)) {
+                                    leaveTypeIndex = t;
+                                    break;
+                                }
+                            }
+                            if (leaveTypeIndex == -1) {
+                                leaveTypeIndex = Constant.LEAVE_TYPES.length-1;
+                            }
+                            sheet.setLeaveType(leaveTypeIndex);
+                            int cnt = leaveSheetMapper.selectCount(new QueryWrapper<LeaveSheet>().eq("owner_id", user.getId())
+                                    .eq("start_date", sheet.getStartDate())
+                                    .eq("end_date", sheet.getEndDate()));
+                            if (cnt == 0) {
+                                leaveSheetMapper.insert(sheet);
+                            }
+                        }
+                    }
+                } catch (ApiException e) {
+                    e.printStackTrace();
+                }
+
+            }
+        } catch (ApiException e) {
+            e.printStackTrace();
         }
     }
 
@@ -1222,128 +1349,6 @@ public class DingDingServiceImpl implements DingDingService {
         }
     }
 
-    //获取一个公司的用户考勤数据
-    private void syncOneCompWorkData(CompanyDingding dingding, String workDate) {
-        List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
-        String accessToken = null;
-        try {
-            accessToken = getInnerCorpToken(dingding);
-            for (User user : userList) {
-                DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/attendance/getupdatedata");
-                OapiAttendanceGetupdatedataRequest req = new OapiAttendanceGetupdatedataRequest();
-                req.setUserid(user.getDingdingUserid());
-                req.setWorkDate(StringUtils.parseDateTime(workDate + " 00:00:00"));
-                OapiAttendanceGetupdatedataResponse rsp = null;
-                try {
-                    rsp = client.execute(req, accessToken);
-                    System.out.println(user.getName());
-                    System.out.println(rsp.getBody());
-                    JSONObject json = JSONObject.parseObject(rsp.getBody());
-                    JSONObject result = json.getJSONObject("result");
-                    //考勤数据
-                    JSONArray attendanceList = result.getJSONArray("attendance_result_list");
-                    UserDingdingTime cardTime = new UserDingdingTime();
-                    cardTime.setCompanyId(dingding.getCompanyId());
-                    cardTime.setUserId(user.getId());
-                    cardTime.setDingdingCorpid(dingding.getCorpid());
-                    cardTime.setDingdingUserid(user.getDingdingUserid());
-                    LocalDateTime onDutyEarleast = null;
-                    LocalDateTime offDutyLatest = null;
-
-                    for (int i=0;i<attendanceList.size(); i++) {
-                        JSONObject attItem = attendanceList.getJSONObject(i);
-                        String checkType = attItem.getString("check_type");
-                        String checkTime = attItem.getString("user_check_time");
-                        LocalDateTime dateTime = LocalDateTime.parse(checkTime, timeDtf);
-                        cardTime.setWorkDate(dateTime.toLocalDate());
-                        //计算周几
-                        cardTime.setWeekDay(cardTime.getWorkDate().getDayOfWeek().getValue());
-                        cardTime.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(cardTime.getWeekDay()));
-                        if ("OnDuty".equals(checkType)) {
-                            //上班时间
-                            cardTime.setStartTime(mmDtf.format(dateTime));
-                            onDutyEarleast = dateTime;
-                        } else {
-                            //下班
-                            cardTime.setEndTime(mmDtf.format(dateTime));
-                            offDutyLatest = dateTime;
-                        }
-                    }
-                    if (onDutyEarleast != null && offDutyLatest != null) {
-                        long seconds = (offDutyLatest.getSecond()- onDutyEarleast.getSecond());
-                        float hours = (offDutyLatest.getHour() - onDutyEarleast.getHour()) + seconds*1.0f/3600;
-                        cardTime.setWorkHours(hours);
-                        //对比,看看之前是否已经存了
-                        List<UserDingdingTime> old = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>().eq("user_id", user.getId())
-                                .eq("work_date", cardTime.getWorkDate()));
-                        if (old.size() > 0) {
-                            cardTime.setId(old.get(0).getId());
-                        }
-                        userDingdingTimeService.saveOrUpdate(cardTime);
-                    }
-
-                    //请假和出差的审批单列表
-                    JSONArray approveList = result.getJSONArray("approve_list");
-                    for (int i=0;i<approveList.size(); i++) {
-                        JSONObject item = approveList.getJSONObject(i);
-                        String tagName = item.getString("tag_name");
-                        if ("出差".equals(tagName)) {
-                            BusinessTrip trip = new BusinessTrip();
-                            trip.setOwnerId(user.getId());
-                            trip.setOwnerName(user.getName());
-                            trip.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
-                            trip.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
-                            trip.setCompanyId(dingding.getCompanyId());
-                            Long cha = trip.getEndDate().toEpochDay() - trip.getStartDate().toEpochDay() + 1;
-                            trip.setDayCount(Integer.parseInt(cha.toString()));
-                            trip.setStatus(0);
-                            int cnt = businessTripMapper.selectCount(new QueryWrapper<BusinessTrip>().eq("owner_id", user.getId())
-                                    .eq("start_date", trip.getStartDate())
-                                    .eq("end_date", trip.getEndDate()));
-                            if (cnt == 0) {
-                                businessTripMapper.insert(trip);
-                            }
-                        } else if ("请假".equals(tagName)) {
-                            LeaveSheet sheet = new LeaveSheet();
-                            sheet.setOwnerId(user.getId());
-                            sheet.setOwnerName(user.getName());
-                            sheet.setStartDate(LocalDateTime.parse(item.getString("begin_time"), timeDtf).toLocalDate());
-                            sheet.setEndDate(LocalDateTime.parse(item.getString("end_time"), timeDtf).toLocalDate());
-                            Long cha = sheet.getEndDate().toEpochDay() - sheet.getStartDate().toEpochDay() + 1;
-                            sheet.setTimeDays((float)cha);
-                            sheet.setCompanyId(dingding.getCompanyId());
-                            sheet.setStatus(0);
-                            String dLeaveType = item.getString("sub_type");
-                            if (!dLeaveType.endsWith("假")) dLeaveType = dLeaveType + "假";
-                            int leaveTypeIndex = -1;
-                            for (int t=0;t<Constant.LEAVE_TYPES.length; t++) {
-                                if (Constant.LEAVE_TYPES[t].equals(dLeaveType)) {
-                                    leaveTypeIndex = t;
-                                    break;
-                                }
-                            }
-                            if (leaveTypeIndex == -1) {
-                                leaveTypeIndex = Constant.LEAVE_TYPES.length-1;
-                            }
-                            sheet.setLeaveType(leaveTypeIndex);
-                            int cnt = leaveSheetMapper.selectCount(new QueryWrapper<LeaveSheet>().eq("owner_id", user.getId())
-                                    .eq("start_date", sheet.getStartDate())
-                                    .eq("end_date", sheet.getEndDate()));
-                            if (cnt == 0) {
-                                leaveSheetMapper.insert(sheet);
-                            }
-                        }
-                    }
-                } catch (ApiException e) {
-                    e.printStackTrace();
-                }
-
-            }
-        } catch (ApiException e) {
-            e.printStackTrace();
-        }
-    }
-
     private void syncOneComp(CompanyDingding dingding, String targetUserId, String startDate, String endDate) {
         List<User> userList = new ArrayList<>();
         if (!StringUtils.isEmpty(targetUserId)) {

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

@@ -1681,7 +1681,16 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
-        msg.data = projectMapper.getOvertimeList(userId, user.getCompanyId(), startDate, endDate, projectId);
+        List<Map<String, Object>> list = projectMapper.getOvertimeList(userId, user.getCompanyId(), startDate, endDate, projectId);
+        boolean hasViewSalary = sysFunctionService.hasPriviledge(user.getRoleId(), "查看加班成本");
+        if (!hasViewSalary) {
+            //去掉权限
+            for (int i=0;i<list.size(); i++) {
+                Map<String, Object> item = list.get(i);
+                item.remove("cost");
+            }
+        }
+        msg.data = list;
         return msg;
     }
 
@@ -2175,7 +2184,17 @@ public class ProjectServiceImpl extends ServiceImpl<ProjectMapper, Project> impl
         HttpRespMsg msg = new HttpRespMsg();
         String token = request.getHeader("TOKEN");
         User user = userMapper.selectById(token);
-        msg.data = projectMapper.getOvertimeDetail(userId, user.getCompanyId(), startDate, endDate, projectId);
+        List<Map<String, Object>> list = projectMapper.getOvertimeDetail(userId, user.getCompanyId(), startDate, endDate, projectId);
+        boolean hasViewSalary = sysFunctionService.hasPriviledge(user.getRoleId(), "查看加班成本");
+        if (!hasViewSalary) {
+            //去掉权限
+            for (int i=0;i<list.size(); i++) {
+                Map<String, Object> item = list.get(i);
+                item.remove("cost");
+            }
+        }
+
+        msg.data = list;
         return msg;
     }
 

+ 34 - 49
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/ReportServiceImpl.java

@@ -607,8 +607,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                 }
             }
 
-            //把总秒数转为double后换算为小时并保留两位小数
-//            resultMap.put("time", new DecimalFormat("0.00").format((double) totalWorkingTime / 3600));
             //顺便返回该公司全部的项目
             resultMap.put("project", allProjectList);
             //顺便返回公司的工作时间设置
@@ -2017,7 +2015,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             allRangeUserList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId));
         }
         List<UserMonthWork> userMonthWorks = new ArrayList<UserMonthWork>();
-        List<UserDailyWorkItem> noReportDataList = new ArrayList<UserDailyWorkItem>();
         //准备部门数据
         List<Department> departmentList = departmentMapper.selectList(new QueryWrapper<Department>().eq("company_id", companyId));
         //获取所有同步的企业微信数据
@@ -2025,13 +2022,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
         List<Map> userCorpwxTimeMapList = userCorpwxTimeMapper.selectByAsk(companyId,startDate,endDate);
         LocalDateTime b=LocalDateTime.now();
         long l = Duration.between(a, b).toMillis();
-        System.out.println("查询耗时======================"+l+"毫秒");
         String lastUserId = null;
         UserMonthWork lastUserData = null;
-        List<String> fillReportUserIds = new ArrayList<>();
-        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
-        System.out.println("初始数据========="+userCorpwxTimeMapList.toString()+"=========size"+userCorpwxTimeMapList.size());
-        final CopyOnWriteArrayList<Map> cowList = new CopyOnWriteArrayList<Map>(userCorpwxTimeMapList);
         for (Map<String, Object> data : list) {
             String id = (String)data.get("id");
             String name = (String)data.get("name");
@@ -2039,24 +2031,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             Map<String, Object> map = new HashMap<>();
             String date = new SimpleDateFormat("yyyy-MM-dd").format((Date)data.get("createDate"));
             String corpwxUserid = (String) data.get("corpwxUserId");
-            List<Map> userCorpwxListOn = userCorpwxTimeMapList.stream().filter(mapList -> mapList.get("create_date").toString().equals(data.get("createDate").toString())
-                    && mapList.get("corpwx_userid").equals(corpwxUserid)).collect(Collectors.toList());
-            if(!userCorpwxListOn.isEmpty()){
-                Map mapCheck=userCorpwxListOn.get(0);
-                for (Map item : cowList) {
-                    if (item.get("corpwx_userid").equals(mapCheck.get("corpwx_userid"))&&item.get("create_date").toString().equals(mapCheck.get("create_date").toString())) {
-                        cowList.remove(item);
-                    }
-                }
-            }
-            if(!userCorpwxListOn.isEmpty()){
-                userCorpwxTimeMapList.remove(userCorpwxListOn.get(0));
-            }
-            if(!userCorpwxListOn.isEmpty()&&(double) data.get("workingTime")==0){
-                    map.put("workingTime", "请假");
-            }else{
-                map.put("workingTime", data.get("workingTime"));
-            }
+            map.put("workingTime", data.get("workingTime"));
             map.put("createDate", date);
             if (id.equals(lastUserId)) {
                 //同一个用户的数据
@@ -2074,21 +2049,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             }
             lastUserId = id;
         }
-        System.out.println("结束数据=========="+userCorpwxTimeMapList.toString()+"=========size"+userCorpwxTimeMapList.size());
-            for(UserMonthWork userMonthWork:userMonthWorks){
-                for(Map map:userCorpwxTimeMapList){
-                if(userMonthWork.corpwxUserId.equals(map.get("corpwx_userid"))){
-                    Map mapIt=new HashMap();
-                    mapIt.put("workingTime", "请假");
-                    String date = new SimpleDateFormat("yyyy-MM-dd").format((Date)map.get("create_date"));
-                    mapIt.put("createDate", date);
-                    userMonthWork.worktimeList.add(mapIt);
-                }
-            }
-        }
+
         LocalDateTime c=LocalDateTime.now();
-        long l1 = Duration.between(b, c).toMillis();
-        System.out.println("数据处理耗时==========="+l1+"毫秒");
         //计算未填的人员
         List<User> noReportUserList = allRangeUserList.stream()
                 .filter(au->!userMonthWorks.stream().anyMatch(mon->mon.userId.equals(au.getId())))
@@ -2098,6 +2060,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             UserMonthWork mon = new UserMonthWork();
             mon.userId = noR.getId();
             mon.name = noR.getName();
+            mon.corpwxUserId = noR.getCorpwxUserid();
             Optional<Department> find = departmentList.stream().filter(dept->dept.getDepartmentId().equals(noR.getDepartmentId())).findFirst();
             if (find.isPresent()) {
                 mon.departmentName = find.get().getDepartmentName();
@@ -2107,7 +2070,35 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             mon.worktimeList = new ArrayList<>();
             userMonthWorks.add(mon);
         });
-
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+        //对于全部的用户已填日报,对比请假的数据,进行填充
+        for (UserMonthWork userMonthWork : userMonthWorks) {
+            List<Map<String, Object>> worktimeList = userMonthWork.worktimeList;
+            //获取到该员工请假的数据
+            List<Map<String, Object>> curUserCorpTime = new ArrayList<>();
+            for (Map<String, Object> corpWx : userCorpwxTimeMapList) {
+                if (((String)corpWx.get("corpwx_userid")).equals(userMonthWork.corpwxUserId)) {
+                    curUserCorpTime.add(corpWx);
+                }
+            }
+
+            curUserCorpTime.forEach(corpTime->{
+                java.sql.Date leaveDate = (java.sql.Date)corpTime.get("create_date");
+                String leaveDateStr = sdf.format(leaveDate);
+                Optional<Map<String, Object>> find = worktimeList.stream().filter(w->((String)w.get("createDate")).equals(leaveDateStr)).findFirst();
+                if (find.isPresent()) {
+                    //打卡的有记录,加上请假
+                    String newStr = (double)find.get().get("workingTime")+"(请假"+(corpTime.get("ask_leave_time"))+"h)";
+                    find.get().put("workingTime", newStr);
+                } else {
+                    //没有对应的打卡记录,直接加上当天请假
+                    Map<String, Object> leaveMap = new HashMap<>();
+                    leaveMap.put("createDate", leaveDateStr);
+                    leaveMap.put("workingTime", "请假"+corpTime.get("ask_leave_time")+"h");
+                    worktimeList.add(leaveMap);
+                }
+            });
+        }
         HashMap map = new HashMap();
         List<HashMap> days = new ArrayList<HashMap>();
         DateTimeFormatter standFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
@@ -2298,8 +2289,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                         return msg;
                     }
                     User reportCreator = any.get();
-                    List<SimpleProjectime> timeCostList = new ArrayList<SimpleProjectime>();
-                    double totalTime = 0;
                     for (int i=projectNameStartIndex; i < projectNameStartIndex + projectList.size(); i++) {
                         if (row.getCell(i) == null) {
                             continue;
@@ -2312,7 +2301,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                                 String pName = projectList.get(i-projectNameStartIndex);
                                 Project project = allProjectList.stream().filter(p -> p.getProjectName().equals(pName)).findFirst().get();
                                 String subPName = subProjectList.get(i-projectNameStartIndex);
-                                totalTime += time;
                                 Report report = new Report();
                                 report.setCompanyId(companyId);
                                 report.setCreatorId(reportCreator.getId());
@@ -2407,7 +2395,6 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     log.setUserName(user.getName());
                     reportImportLogMapper.insert(log);
                 }
-
             } else {
                 msg.setError("工时数据不能为空");
             }
@@ -2433,9 +2420,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             } catch (IOException e) {
                 e.printStackTrace();
             }
-//            FileUtils.copyFileToDirectory(file, new File(path));
-//            file.deleteOnExit();//程序退出时删除临时文件
-            System.out.println(file.delete());
+            file.delete();
         }
         return msg;
     }
@@ -2913,7 +2898,7 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
                     if (!list.stream().anyMatch(item->item.get("id").equals(curUser.getId())&&sdf.format((java.sql.Date)item.get("createDate")).equals(dateStr))) {
                         UserDailyWorkItem noRecord = new UserDailyWorkItem();
                         noRecord.userId = curUser.getId();
-                        List<Map> userCorpwxListOn = userCorpwxTimeMapList.stream().filter(mapList -> mapList.get("create_date").toString().equals(dateStr)
+                        List<Map> userCorpwxListOn = userCorpwxTimeMapList.stream().filter(mapList -> sdf.format((java.sql.Date)mapList.get("create_date")).equals(dateStr)
                                 && mapList.get("corpwx_userid").equals(curUser.getCorpwxUserid())).collect(Collectors.toList());
                         if(!userCorpwxListOn.isEmpty()){
                                 noRecord.createDate = dtf.format(date)+"/请假";

+ 0 - 2
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/UserServiceImpl.java

@@ -719,8 +719,6 @@ public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements Us
                     } else {
                         System.out.println("没有更新");
                     }
-                } else {
-                    System.out.println("没有日报的成本需要更新");
                 }
             }
         } catch (NullPointerException e) {

+ 245 - 229
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -28,7 +28,9 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.time.*;
 import java.time.format.DateTimeFormatter;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static org.mockito.ArgumentMatchers.startsWith;
 
@@ -187,6 +189,7 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                     HttpMethod.POST, requestEntity, String.class);
             if (responseEntity.getStatusCode() == HttpStatus.OK) {
                 String resp = responseEntity.getBody();
+                System.out.println(resp);
                 JSONObject obj = JSONObject.parseObject(resp);
                 if (obj.getIntValue("errcode") == 0) {
                     WeiXinCorpController.SUITE_ACCESS_TOKEN = obj.getString("suite_access_token");
@@ -237,10 +240,6 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         }
         String url = null;
         try {
-            url = GET_CHECKIN_DAYDATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
-            HttpHeaders headers = new HttpHeaders();
-            headers.setContentType(MediaType.APPLICATION_JSON);
-            JSONObject reqParam = new JSONObject();
 
             startDateTime = startDateTime.withHour(0).withMinute(0).withSecond(0).withNano(0);
             System.out.println(startDateTime.toString());
@@ -249,276 +248,293 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             System.out.println(endDateTime.toString());
             long endTime = endDateTime.toEpochSecond(ZoneOffset.of("+8"));
             System.out.println("startTime="+startTime+",endTime="+endTime);
-            reqParam.put("starttime", startTime);
-            reqParam.put("endtime",  endTime);
 
-            DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
+            int batchCount = 1;
+            int batchSize = 100;
+            int totalLength = 1;
+            List<String> corpwxUserIds = new ArrayList<>();
             if (userId == null) {
                 //获取企业下的全部员工
                 List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("company_id", companyId).isNotNull("corpwx_userid").eq("is_active", 1));
                 System.out.println("获取考勤记录users size=="+users.size());
-                Object[] objects = users.stream().map(User::getCorpwxUserid).toArray();
-                for (Object obj : objects) {
-                    System.out.println((String)obj);
-                }
-                reqParam.put("useridlist",  objects);
+                corpwxUserIds = users.stream().map(User::getCorpwxUserid).collect(Collectors.toList());
+                totalLength = corpwxUserIds.size();
+                batchCount = totalLength/batchSize+(totalLength%batchSize==0?0:1);
             } else {
                 //指定获取员工
                 User user = userMapper.selectById(userId);
-                Object[] objects = new Object[1];
-                objects[0] = user.getCorpwxUserid();
-                reqParam.put("useridlist",  objects);
+                corpwxUserIds.add(user.getCorpwxUserid());
                 System.out.println("获取corpwxuserid=="+user.getCorpwxUserid()+"的考勤记录");
             }
+            //按批调用
+            for (int i=0;i<batchCount; i++) {
+                int fromIndex = i*batchSize;
+                int toIndex = (i+1) * batchSize;
+                if (toIndex > totalLength) toIndex = totalLength;
+                Object[] objects = corpwxUserIds.subList(fromIndex, toIndex).toArray(new String[0]);
+                reqOnceCardTime(corpInfo, startTime, endTime, objects);
+            }
 
-            HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
-            ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
-                    HttpMethod.POST, requestEntity, String.class);
-            if (responseEntity.getStatusCode() == HttpStatus.OK) {
-                String resp = responseEntity.getBody();
-                System.out.println(resp);
-                JSONObject json = JSONObject.parseObject(resp);
-                if (json.getIntValue("errcode") == 0) {
-                    JSONArray datas = json.getJSONArray("datas");
-                    for (int i=0;i<datas.size(); i++) {
-                        JSONObject jsonObject = datas.getJSONObject(i);
-                        JSONObject base_info = jsonObject.getJSONObject("base_info");
-                        String curUserid = base_info.getString("acctid");
-                        String name = base_info.getString("name");
-                        Long time = base_info.getLong("date");
-                        LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(time), ZoneId.systemDefault()).toLocalDate();
-                        UserCorpwxTime ct = new UserCorpwxTime();
-                        ct.setCompanyId(companyId);
-                        ct.setCorpwxUserid(curUserid);
-                        ct.setWxCorpid(corpInfo.getCorpid());
-                        ct.setCreateDate(localDate);
-                        //计算周几
-                        ct.setWeekDay(localDate.getDayOfWeek().getValue());
-                        ct.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(ct.getWeekDay()));
-                        JSONObject summary_info = jsonObject.getJSONObject("summary_info");
-                        int sTime = summary_info.getIntValue("earliest_time");//秒
-                        int eTime = summary_info.getIntValue("lastest_time");//秒
-                        int regular_work_sec = summary_info.getIntValue("regular_work_sec");//秒
-                        Integer standard_work_sec = summary_info.getInteger("standard_work_sec");
-
-
-                        ct.setStartTime(DateTimeUtil.getTimeFromSeconds(sTime));
-                        ct.setEndTime(DateTimeUtil.getTimeFromSeconds(eTime));
-                        //直接设置打卡时长,以企业微信的为准,不考虑漏打卡的情况
-                        ct.setCardTime(DateTimeUtil.getHoursFromSeconds(regular_work_sec));
-
-                        JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
+        } catch (Exception exception) {
+            exception.printStackTrace();
+        }
+
+        return msg;
+    }
+
+
+    private void reqOnceCardTime(WxCorpInfo corpInfo, long startTime, long endTime, Object[] objects) throws Exception {
+        DateTimeFormatter mdFormat = DateTimeFormatter.ofPattern("yyyy/M/d");
+        String url = GET_CHECKIN_DAYDATA.replace("ACCESS_TOKEN", getCorpAccessToken(corpInfo));
+        HttpHeaders headers = new HttpHeaders();
+        headers.setContentType(MediaType.APPLICATION_JSON);
+
+        JSONObject reqParam = new JSONObject();
+        reqParam.put("starttime", startTime);
+        reqParam.put("endtime",  endTime);
+        reqParam.put("useridlist",  objects);
+        HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
+        ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
+                HttpMethod.POST, requestEntity, String.class);
+
+        if (responseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = responseEntity.getBody();
+            System.out.println(resp);
+            JSONObject json = JSONObject.parseObject(resp);
+            if (json.getIntValue("errcode") == 0) {
+                JSONArray datas = json.getJSONArray("datas");
+                for (int i=0;i<datas.size(); i++) {
+                    JSONObject jsonObject = datas.getJSONObject(i);
+                    JSONObject base_info = jsonObject.getJSONObject("base_info");
+                    String curUserid = base_info.getString("acctid");
+                    String name = base_info.getString("name");
+                    Long time = base_info.getLong("date");
+                    LocalDate localDate = LocalDateTime.ofInstant(Instant.ofEpochSecond(time), ZoneId.systemDefault()).toLocalDate();
+                    UserCorpwxTime ct = new UserCorpwxTime();
+                    ct.setCompanyId(corpInfo.getCompanyId());
+                    ct.setCorpwxUserid(curUserid);
+                    ct.setWxCorpid(corpInfo.getCorpid());
+                    ct.setCreateDate(localDate);
+                    //计算周几
+                    ct.setWeekDay(localDate.getDayOfWeek().getValue());
+                    ct.setWeekDayTxt(DateTimeUtil.getWeekDayTxt(ct.getWeekDay()));
+                    JSONObject summary_info = jsonObject.getJSONObject("summary_info");
+                    int sTime = summary_info.getIntValue("earliest_time");//秒
+                    int eTime = summary_info.getIntValue("lastest_time");//秒
+                    int regular_work_sec = summary_info.getIntValue("regular_work_sec");//秒
+                    Integer standard_work_sec = summary_info.getInteger("standard_work_sec");
+
+
+                    ct.setStartTime(DateTimeUtil.getTimeFromSeconds(sTime));
+                    ct.setEndTime(DateTimeUtil.getTimeFromSeconds(eTime));
+                    //直接设置打卡时长,以企业微信的为准,不考虑漏打卡的情况
+                    ct.setCardTime(DateTimeUtil.getHoursFromSeconds(regular_work_sec));
+
+                    JSONArray holidayItems = jsonObject.getJSONArray("holiday_infos");
 //                        if (eTime == sTime) {
-                        //开始时间和结束时间一样,说明下班没有打卡,需要提取请假的最晚时间作为下班打卡时间
-                        String lastestOffworkTime = null;
-                        boolean needRecaculate = false;
-                        for (int t=0;t<holidayItems.size(); t++) {
-                            JSONObject holiday = holidayItems.getJSONObject(t);
-                            JSONObject spTitle = holiday.getJSONObject("sp_title");
-                            JSONArray data = spTitle.getJSONArray("data");
-                            for (int m=0;m<data.size(); m++) {
-                                String leaveText = data.getJSONObject(m).getString("text");
-                                if (leaveText.startsWith("请假")) {
-                                    //获取对应位置的请假时间段
-                                    String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
-                                    String[] s = string.split(" ");
-                                    //获取到请假的开始时间和结束时间
-                                    String leaveEnd = s[4];
-                                    String leaveStart = s[1];
-                                    //请假开始的日期和结束的日期
-                                    String dateStart = localDate.getYear() + "/" + s[0];
-                                    String dateEnd =  localDate.getYear() + "/" +s[3];
-                                    LocalDate sDate = LocalDate.parse(dateStart, mdFormat);
-                                    LocalDate eDate = LocalDate.parse(dateEnd, mdFormat);
-                                    if (sDate.isEqual(eDate)) {
-                                        //请假在一天内
+                    //开始时间和结束时间一样,说明下班没有打卡,需要提取请假的最晚时间作为下班打卡时间
+                    String lastestOffworkTime = null;
+                    boolean needRecaculate = false;
+                    for (int t=0;t<holidayItems.size(); t++) {
+                        JSONObject holiday = holidayItems.getJSONObject(t);
+                        JSONObject spTitle = holiday.getJSONObject("sp_title");
+                        JSONArray data = spTitle.getJSONArray("data");
+                        for (int m=0;m<data.size(); m++) {
+                            String leaveText = data.getJSONObject(m).getString("text");
+                            if (leaveText.startsWith("请假")) {
+                                //获取对应位置的请假时间段
+                                String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                String[] s = string.split(" ");
+                                //获取到请假的开始时间和结束时间
+                                String leaveEnd = s[4];
+                                String leaveStart = s[1];
+                                //请假开始的日期和结束的日期
+                                String dateStart = localDate.getYear() + "/" + s[0];
+                                String dateEnd =  localDate.getYear() + "/" +s[3];
+                                LocalDate sDate = LocalDate.parse(dateStart, mdFormat);
+                                LocalDate eDate = LocalDate.parse(dateEnd, mdFormat);
+                                if (sDate.isEqual(eDate)) {
+                                    //请假在一天内
+                                    if (leaveEnd.equals("下午")) {
+                                        if (leaveStart.equals("上午")) {
+                                            leaveEnd = "18:00";//上午和下午都请假,算全天
+                                            leaveStart = "09:00";
+                                        } else {
+                                            leaveStart = "14:00";
+                                            leaveEnd = "18:00";//请假的下班打卡时间,算上午结束的时间
+                                        }
+                                    } else if (leaveEnd.equals("上午")){
+                                        //上午请假
+                                        leaveEnd = "14:00";
+                                        leaveStart = "09:00";
+                                    }
+                                } else {
+                                    System.out.println("跨天请假@@@@");
+                                    System.out.println("当天=="+localDate+", sDate=" + sDate+", 比较="+(localDate.isEqual(sDate)));
+                                    //跨天请假
+                                    if (localDate.isEqual(sDate)) {
+                                        //当前日期就是最后一天,需判断上下午半天请假的情况
+                                        if (leaveStart.equals("上午")) {
+                                            leaveEnd = "18:00";//上午开始请假的算全天
+                                            leaveStart = "09:00";
+                                        } else {
+                                            leaveStart = "14:00";
+                                            leaveEnd = "18:00";//下午开始请假的,算半天
+                                        }
+                                    } else if (localDate.isEqual(eDate)) {
+                                        //当前日期就是最后一天,需判断上下午半天请假的情况
                                         if (leaveEnd.equals("下午")) {
-                                            if (leaveStart.equals("上午")) {
-                                                leaveEnd = "18:00";//上午和下午都请假,算全天
-                                                leaveStart = "09:00";
-                                            } else {
-                                                leaveStart = "14:00";
-                                                leaveEnd = "18:00";//请假的下班打卡时间,算上午结束的时间
-                                            }
+                                            leaveEnd = "18:00";//请假到最后一天的下午,就算是全天
+                                            leaveStart = "09:00";
                                         } else if (leaveEnd.equals("上午")){
                                             //上午请假
                                             leaveEnd = "14:00";
                                             leaveStart = "09:00";
                                         }
                                     } else {
-                                        System.out.println("跨天请假@@@@");
-                                        System.out.println("当天=="+localDate+", sDate=" + sDate+", 比较="+(localDate.isEqual(sDate)));
-                                        //跨天请假
-                                        if (localDate.isEqual(sDate)) {
-                                            //当前日期就是最后一天,需判断上下午半天请假的情况
-                                            if (leaveStart.equals("上午")) {
-                                                leaveEnd = "18:00";//上午开始请假的算全天
-                                                leaveStart = "09:00";
-                                            } else {
-                                                leaveStart = "14:00";
-                                                leaveEnd = "18:00";//下午开始请假的,算半天
-                                            }
-                                        } else if (localDate.isEqual(eDate)) {
-                                            //当前日期就是最后一天,需判断上下午半天请假的情况
-                                            if (leaveEnd.equals("下午")) {
-                                                leaveEnd = "18:00";//请假到最后一天的下午,就算是全天
-                                                leaveStart = "09:00";
-                                            } else if (leaveEnd.equals("上午")){
-                                                //上午请假
-                                                leaveEnd = "14:00";
-                                                leaveStart = "09:00";
-                                            }
-                                        } else {
-                                            //中间日期就是全天
-                                            leaveEnd = "00:00";
-                                            leaveStart = "00:00";
-                                            System.out.println("===中间天请假===");
-                                        }
+                                        //中间日期就是全天
+                                        leaveEnd = "00:00";
+                                        leaveStart = "00:00";
+                                        System.out.println("===中间天请假===");
                                     }
+                                }
 
-                                    //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
-                                    if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(leaveStart) > 0) {
-                                        ct.setStartTime(leaveStart);
-                                        needRecaculate = true;
-                                    }
-                                    if (ct.getEndTime().compareTo(leaveEnd) < 0) {
-                                        ct.setEndTime(leaveEnd);
-                                        needRecaculate = true;
-                                    }
-                                } else if (leaveText.startsWith("外出")) {
-                                    String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
-                                    String[] s = string.split(" ");
-                                    //获取到外出的开始时间和结束时间
-                                    String outEnd = s[4];
-                                    String outStart = s[1];
-
-                                    //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
-                                    if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(outStart) > 0) {
-                                        ct.setStartTime(outStart);
-                                        needRecaculate = true;
-                                    }
-                                    if (ct.getEndTime().compareTo(outEnd) < 0) {
-                                        ct.setEndTime(outEnd);
-                                        needRecaculate = true;
-                                    }
+                                //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
+                                if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(leaveStart) > 0) {
+                                    ct.setStartTime(leaveStart);
+                                    needRecaculate = true;
+                                }
+                                if (ct.getEndTime().compareTo(leaveEnd) < 0) {
+                                    ct.setEndTime(leaveEnd);
+                                    needRecaculate = true;
+                                }
+                            } else if (leaveText.startsWith("外出")) {
+                                String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                String[] s = string.split(" ");
+                                //获取到外出的开始时间和结束时间
+                                String outEnd = s[4];
+                                String outStart = s[1];
+
+                                //获取外出的最早的开始时间和最晚的结束时间最为当天考勤的最早和最晚时间
+                                if (ct.getStartTime().equals("00:00") || ct.getStartTime().compareTo(outStart) > 0) {
+                                    ct.setStartTime(outStart);
+                                    needRecaculate = true;
+                                }
+                                if (ct.getEndTime().compareTo(outEnd) < 0) {
+                                    ct.setEndTime(outEnd);
+                                    needRecaculate = true;
                                 }
                             }
                         }
-                        double timeDelta = 0;
-                        //时间有变化,需要重新计算
-                        if (needRecaculate) {
-                            timeDelta = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
-                            if (ct.getEndTime().compareTo("13:30") >= 0) {
-                                //重新计算打卡工时时,需要减去中间午休时间
-                                timeDelta -= 1.0;
-                            }
-                        } else {
-                            timeDelta = ct.getCardTime();
+                    }
+                    double timeDelta = 0;
+                    //时间有变化,需要重新计算
+                    if (needRecaculate) {
+                        timeDelta = DateTimeUtil.getHoursFromSeconds(DateTimeUtil.getSecondsFromTime(ct.getEndTime()) - DateTimeUtil.getSecondsFromTime(ct.getStartTime()));
+                        if (ct.getEndTime().compareTo("13:30") >= 0) {
+                            //重新计算打卡工时时,需要减去中间午休时间
+                            timeDelta -= 1.0;
                         }
+                    } else {
+                        timeDelta = ct.getCardTime();
+                    }
 
-                        System.out.println("上下班间隔时长为=="+timeDelta);
+                    System.out.println("上下班间隔时长为=="+timeDelta);
 //                        double hoursFromDouble = DateTimeUtil.getHoursFromDouble(hoursFromSeconds);
 //                        System.out.println("四舍五入后cardTime时间=="+hoursFromDouble);
 //                        ct.setCardTime(hoursFromSeconds);
 
-                        ct.setName(name);
-                        //解析请假和外出的情况
-                        JSONArray sp_items = jsonObject.getJSONArray("sp_items");
-                        for (int j=0;j<sp_items.size(); j++) {
-                            JSONObject spItem = sp_items.getJSONObject(j);
-                            switch (spItem.getInteger("type")) {
-                                case 1://请假
-                                    Double leaveTime = ct.getAskLeaveTime();
-                                    if (leaveTime == null) {
-                                        leaveTime = 0.0;
-                                    }
-                                    ct.setAskLeaveTime(leaveTime + DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration")));
-                                    break;
-                                case 2://补卡
-                                case 3://出差
-                                case 4://外出
-                                case 100://外勤
-                                    Double outdoorTime = ct.getOutdoorTime();
-                                    if (outdoorTime == null) {
-                                        outdoorTime = 0.0;
-                                    }
-                                    double otTime = DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration"));
-                                    if (otTime > 8.0) {
-                                        otTime = 8.0;
-                                    }
-                                    ct.setOutdoorTime(outdoorTime + otTime);
-                                    break;
-                            }
+                    ct.setName(name);
+                    //解析请假和外出的情况
+                    JSONArray sp_items = jsonObject.getJSONArray("sp_items");
+                    for (int j=0;j<sp_items.size(); j++) {
+                        JSONObject spItem = sp_items.getJSONObject(j);
+                        switch (spItem.getInteger("type")) {
+                            case 1://请假
+                                Double leaveTime = ct.getAskLeaveTime();
+                                if (leaveTime == null) {
+                                    leaveTime = 0.0;
+                                }
+                                ct.setAskLeaveTime(leaveTime + DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration")));
+                                break;
+                            case 2://补卡
+                            case 3://出差
+                            case 4://外出
+                            case 100://外勤
+                                Double outdoorTime = ct.getOutdoorTime();
+                                if (outdoorTime == null) {
+                                    outdoorTime = 0.0;
+                                }
+                                double otTime = DateTimeUtil.getHoursFromSeconds(spItem.getInteger("duration"));
+                                if (otTime > 8.0) {
+                                    otTime = 8.0;
+                                }
+                                ct.setOutdoorTime(outdoorTime + otTime);
+                                break;
                         }
+                    }
 
-                        //获取请假的最早和最晚时间
-                        for (int t=0;t<holidayItems.size(); t++) {
-                            JSONObject holiday = holidayItems.getJSONObject(t);
-                            JSONObject spTitle = holiday.getJSONObject("sp_title");
-                            JSONArray data = spTitle.getJSONArray("data");
-                            for (int m=0;m<data.size(); m++) {
-                                String leaveText = data.getJSONObject(m).getString("text");
-                                if (leaveText.startsWith("请假")) {
-                                    //获取对应位置的请假时间段
-                                    String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
-                                    String[] s = string.split(" ");
-                                    //获取到请假的开始时间和结束时间
-                                    String leaveStart = s[1];
-                                    String leaveEnd = s[4];
-
-                                    //检查请假时间段是否在打卡的时间范围内
-                                    if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
-                                        //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
-                                        System.out.println("====半天或者全天请假 =转化为8小时制下的时间="+(ct.getAskLeaveTime()/24*8.0));
-                                        ct.setAskLeaveTime(ct.getAskLeaveTime()/24*8.0);//转换成一天8小时工作制
-                                    } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
-                                        String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
-                                        System.out.println("请假时长=" + hourLeaveTime);
+                    //获取请假的最早和最晚时间
+                    for (int t=0;t<holidayItems.size(); t++) {
+                        JSONObject holiday = holidayItems.getJSONObject(t);
+                        JSONObject spTitle = holiday.getJSONObject("sp_title");
+                        JSONArray data = spTitle.getJSONArray("data");
+                        for (int m=0;m<data.size(); m++) {
+                            String leaveText = data.getJSONObject(m).getString("text");
+                            if (leaveText.startsWith("请假")) {
+                                //获取对应位置的请假时间段
+                                String string = holiday.getJSONObject("sp_description").getJSONArray("data").getJSONObject(m).getString("text");
+                                String[] s = string.split(" ");
+                                //获取到请假的开始时间和结束时间
+                                String leaveStart = s[1];
+                                String leaveEnd = s[4];
+
+                                //检查请假时间段是否在打卡的时间范围内
+                                if ("上午".equals(leaveEnd) || "下午".equals(leaveEnd)) {
+                                    //半天或者全天请假, 上面已经处理过结束时间为请假之前的时间了,此处不需要再处理了
+                                    System.out.println("====半天或者全天请假 =转化为8小时制下的时间="+(ct.getAskLeaveTime()/24*8.0));
+                                    ct.setAskLeaveTime(ct.getAskLeaveTime()/24*8.0);//转换成一天8小时工作制
+                                } else if (ct.getStartTime().compareTo(leaveStart) <= 0 && ct.getEndTime().compareTo(leaveEnd) >= 0) {
+                                    String hourLeaveTime = leaveText.replaceAll("请假", "").replaceAll("小时", "");
+                                    System.out.println("请假时长=" + hourLeaveTime);
 //                                        ct.setCardTime(ct.getCardTime() - Double.parseDouble(hourLeaveTime));
-                                    }
                                 }
                             }
                         }
-                        //校正请假时长
-                        if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() == 24.0) {
-                            ct.setAskLeaveTime(8.0);//24小时为一天,修正为8小时
-                        }
-                        //如果有出差的,但是没有打卡,则用出差的时间作为timeDelta
-                        if (timeDelta < 8.0 && ct.getOutdoorTime() > 0) {
-                            timeDelta += ct.getOutdoorTime();
-                        }
-                        double workHours = timeDelta - ct.getAskLeaveTime();
-                        if (workHours < 0) {
-                            workHours = 0;
-                        }
-                        System.out.println("工作时长=="+workHours);
-                        ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workHours));
+                    }
+                    //校正请假时长
+                    if (ct.getAskLeaveTime() != null && ct.getAskLeaveTime() == 24.0) {
+                        ct.setAskLeaveTime(8.0);//24小时为一天,修正为8小时
+                    }
+                    //如果有出差的,但是没有打卡,则用出差的时间作为timeDelta
+                    if (timeDelta < 8.0 && ct.getOutdoorTime() > 0) {
+                        timeDelta += ct.getOutdoorTime();
+                    }
+                    double workHours = timeDelta - ct.getAskLeaveTime();
+                    if (workHours < 0) {
+                        workHours = 0;
+                    }
+                    System.out.println("工作时长=="+workHours);
+                    ct.setWorkHours(DateTimeUtil.getHoursFromDouble(workHours));
 //                        if (regular_work_sec < standard_work_sec) {
 //                            ct.setWorkHours(DateTimeUtil.getHoursFromDouble(ct.getCardTime() + ct.getOutdoorTime()));
 //                        } else {
 //                            ct.setWorkHours(DateTimeUtil.getHoursFromDouble(ct.getCardTime()));
 //                        }
 
-                        UserCorpwxTime item = userCorpwxTimeMapper.selectOne(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", curUserid)
-                                            .eq("create_date", localDate));
-                        if (item != null) {
-                            ct.setId(item.getId());
-                            //已存在记录,进行更新
-                            userCorpwxTimeMapper.updateById(ct);
-                        } else {
-                            userCorpwxTimeMapper.insert(ct);
-                        }
+                    UserCorpwxTime item = userCorpwxTimeMapper.selectOne(new QueryWrapper<UserCorpwxTime>().eq("corpwx_userid", curUserid)
+                            .eq("create_date", localDate));
+                    if (item != null) {
+                        ct.setId(item.getId());
+                        //已存在记录,进行更新
+                        userCorpwxTimeMapper.updateById(ct);
+                    } else {
+                        userCorpwxTimeMapper.insert(ct);
                     }
-                } else {
-                    throw new Exception(json.toJSONString());
                 }
+            } else {
+                throw new Exception(json.toJSONString());
             }
-        } catch (Exception exception) {
-            exception.printStackTrace();
         }
-
-        return msg;
     }
-
-
 }

+ 40 - 10
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -41,6 +41,10 @@ public class TimingTask {
     //是否是开发环境
     @Value("${configEnv.isDev}")
     boolean isDev;
+    //是否是私有化部署
+    @Value("${configEnv.isPrivateDeploy}")
+    boolean isPrivateDeploy;
+
 
     @Value("${wx.template_report_fill}")
     public String TEMPLATE_REPORT_FILL;
@@ -106,10 +110,11 @@ public class TimingTask {
         }
     }
 
-    //每天0:11 同步昨天的钉钉考勤打卡记录
-    @Scheduled(cron = "0 11 0 ? * *")
+    //每天1:11 同步昨天的钉钉考勤打卡记录
+    @Scheduled(cron = "0 11 1 ? * *")
     private void synDingDingCardTime() {
         if (isDev) return;
+        if (isPrivateDeploy) return;//私有化部署不适合这种模式,使用下面的同步用户数据的方式
         LocalDateTime yestoday = LocalDateTime.now().minusDays(1);
         DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
         String yesStr = dateTimeFormatter.format(yestoday);
@@ -121,6 +126,33 @@ public class TimingTask {
         }
     }
 
+    //每天2:11 同步钉钉用户前2天到未来30天时间段的打卡,请假,出差数据
+    @Scheduled(cron = "0 11 2 ? * *")
+    private void synDingDingWorkData() {
+        if (isDev) return;
+        List<TimeType> timeTypeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_dingding", 1));
+        List<Integer> compIds = timeTypeList.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
+        //企业内部应用才有权限调用
+        List<CompanyDingding> dingdingList = companyDingdingService.list(new QueryWrapper<CompanyDingding>().in("company_id", compIds)
+                .isNotNull("custom_appkey"));
+        System.out.println("==========获取钉钉内部应用的数量是:"+dingdingList.size());
+        if (dingdingList.size() > 0) {
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+            LocalDateTime yestoday = LocalDateTime.now().minusDays(2);
+            String startDate = dtf.format(yestoday);
+            String endDate = dtf.format(yestoday.plusDays(32));
+            for (int i=0;i<dingdingList.size(); i++) {
+                System.out.println("钉钉公司:"+dingdingList.get(i).getCorpName());
+                long t1 = System.currentTimeMillis();
+                dingDingService.syncUserWorkData(dingdingList.get(i), startDate, endDate);
+                long t2 = System.currentTimeMillis();
+                System.out.println("同步 "+dingdingList.get(i).getCorpName()+", 总共耗时:"+(t2-t1)+"ms");
+            }
+        }
+    }
+
+
+
     //每天7点同步昨天的企业微信考勤考勤打卡记录
     @Scheduled(cron = "0 0 7 ? * *")
     private void synCorpWXCardTime() {
@@ -136,23 +168,22 @@ public class TimingTask {
     }
 
     //每天9点10分提醒去审核
-    @Scheduled(cron = "0 30 9 ? * *")
+    @Scheduled(cron = "0 10 9 ? * *")
     private void alertWaitingApprove() {
         if (isDev) return;
         List<CompanyDingding> list = companyDingdingService.list(new QueryWrapper<CompanyDingding>());
         for (CompanyDingding companyDingding : list) {
             List<Map<String, Object>> result = reportMapper.getWaitingApproveCnt(companyDingding.getCompanyId());
             for (Map<String, Object> map : result) {
-                if (companyDingding.getCompanyId() == 434) {
+//                if (companyDingding.getCompanyId() == 434) {
                     companyDingdingService.sendReportWaitingApplyMsg(companyDingding.getCompanyId(), companyDingding.getAgentId(),
                             (Long)map.get("num"), (String)map.get("auditorDDId"));
-                }
+//                }
             }
         }
     }
 
-
-    //每周日晚上11点 同步一次本月的考勤打卡记录
+    //每周日晚上11点 企业微信同步一次本月的考勤打卡记录
     @Scheduled(cron = "0 0 23 ? * 7")
     private void weeklySyncCorpWXCardTime() {
         if (isDev) return;
@@ -168,8 +199,8 @@ public class TimingTask {
         }
     }
 
-    //每个月6号早上6点同步上个月的企业微信考勤考勤打卡记录
-    @Scheduled(cron = "0 0 6 6 * ?")
+    //每个月2号早上6点同步上个月的企业微信考勤考勤打卡记录
+    @Scheduled(cron = "0 0 6 2 * ?")
     private void synMonthCorpWXCardTime() {
         if (isDev) return;
         LocalDateTime lastMonth = LocalDateTime.now().minusMonths(1);
@@ -392,6 +423,5 @@ public class TimingTask {
             System.out.println("推送失败:" + e.getMessage());
             e.printStackTrace();
         }
-
     }
 }

+ 0 - 6
fhKeeper/formulahousekeeper/management-platform/src/main/resources/application.yml

@@ -17,7 +17,6 @@ spring:
     url: jdbc:mysql://47.101.180.183:3306/man_dev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
     username: root
     password: HuoshiDB@2022
-
     hikari:
       maximum-pool-size: 10
       minimum-idle: 3
@@ -129,11 +128,6 @@ corpId: wwf11426cf618e1703
 token: Mhi7ehNX61UN4MB7PHnC
 encodingAesKey: PHVMkME1XMrImmGJZ4OZJxSysI7hFEhtDDUQrlHAfIS
 
-#钉钉企业内部应用参数
-dingding:
-  appkey: dingspmh9hturxaqbauc
-  appsecret: ivx71XoC_WUCSYkihioa-O7SvOpwGz8oJnTQjOgsg-K6jI1FPHB5Q5L1CBaf1I6j
-
 configEnv:
   isDev: true
   # 是否是私有化部署,企业内部应用

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/ProjectMapper.xml

@@ -80,7 +80,7 @@
     </select>
     <!--获取查询者所在公司每个项目的工时成本-->
     <select id="getParticipatedProject" resultType="java.util.Map">
-        SELECT id, project_name AS projectName, status, task_gp_incharge as taskGpIncharge
+        SELECT id, project_name AS projectName, status, task_gp_incharge as taskGpIncharge, project_desc as projectDesc
         FROM project
         WHERE id IN (
             SELECT project_id

+ 1 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/resources/mapper/UserCorpwxTimeMapper.xml

@@ -37,7 +37,7 @@
         ORDER BY a.create_date ASC
     </select>
     <select id="selectByAsk" resultType="java.util.Map">
-        select corpwx_userid ,create_date from user_corpwx_time where company_id=#{companyId} and ask_leave_time>0
+        select corpwx_userid ,create_date,ask_leave_time  from user_corpwx_time where company_id=#{companyId} and ask_leave_time>0
         <if test="startDate != null">
             AND create_date &gt;= #{startDate}
         </if>

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/awayOffice/awayOffice.vue

@@ -205,7 +205,7 @@
                     <el-table-column label="行程" width="120" align="center" v-if="!isDingding">
                         <template slot-scope="scope">{{scope.row.cityFrom + '-' + scope.row.cityTo}}</template>
                     </el-table-column>
-                    <el-table-column prop="indate" label="申请时间" width="150" align="center"></el-table-column>
+                    <el-table-column prop="indate" label="申请时间" width="150" align="center" v-if="!isDingding"></el-table-column>
                     <el-table-column label="出差天数" width="120" align="center">
                         <template slot-scope="scope">
                             <div>{{scope.row.dayCount}}天</div>

+ 3 - 2
fhKeeper/formulahousekeeper/timesheet/src/views/project/list.vue

@@ -197,7 +197,7 @@
                     <el-input v-model="addForm.name" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目名称" clearable></el-input>
                 </el-form-item>
                 <el-form-item label="项目描述" prop="projectDesc">
-                    <el-input v-model="addForm.projectDesc" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目描述" clearable></el-input>
+                    <el-input v-model="addForm.projectDesc" :disabled="!permissions.projectManagement && addForm.creatorId != user.id" placeholder="请输入项目描述" clearable maxlength="50" show-word-limit></el-input>
                 </el-form-item>
                 <el-form-item label="项目类型" prop="isPublic">
                     <el-select v-model="addForm.isPublic" style="width:32%;" @change="selectPublic" :disabled="!permissions.projectManagement && addForm.creatorId != user.id">
@@ -1737,7 +1737,8 @@ a {
                         baseOutsourcing: item.baseOutsourcing,
                         customerId:item.customerId==0?null:item.customerId,
                         taskGpIncharge: item.taskGpIncharge,
-                        category:item.category
+                        category:item.category,
+                        projectDesc: item.projectDesc
                     }
                     console.log("handleadd",item)
                     if(item.associateDegrees != null && item.associateDegrees != 'null' && item.associateDegrees != '') {

+ 1 - 1
fhKeeper/formulahousekeeper/timesheet/src/views/quanx/quanx.vue

@@ -286,7 +286,7 @@ export default {
         return data.label.indexOf(value) !== -1;
       },
         handleAdd(tex, tel, id) {
-          if(id.rolename == '超级管理员'){
+          if(id && id.rolename == '超级管理员'){
             this.$message('超级管理员为固定的默认角色无法编辑');
             return
           }

+ 10 - 7
fhKeeper/formulahousekeeper/timesheet/src/views/workReport/daily.vue

@@ -230,7 +230,7 @@
 
         <!-- 填写日报的dialog -->
         <el-dialog :title="isBatch==0?'填写日报':'批量填报'" :visible.sync="dialogVisible" width="60%" :close-on-click-modal="false" @closed="guanbi()">
-            <el-form ref="workForm" :model="workForm" :rules="workRules" label-width="100px">
+            <el-form ref="workForm" :model="workForm" :rules="workRules" label-width="120px">
                 <el-form-item label="选择人员" v-if="isSubstitude">
                     <el-input @focus="showChooseMembTree" v-model="workForm.userNames"
                     placeholder="请选择代填人员" ></el-input>
@@ -312,9 +312,9 @@
                         </div>
                     </el-form-item>
                     
-                    <el-form-item label="投入项目" :prop="'domains.' + index + '.projectId'"
-                        :rules="{ required: true, message: '请选择投入项目', trigger: ['change','blur'] }">
-                        <el-select v-model="domain.projectId" placeholder="请选择项目" style="width:200px;" clearable="true"  filterable="true"
+                    <el-form-item :label="user.companyId==781?'工作任务':'投入项目'" :prop="'domains.' + index + '.projectId'"
+                        :rules="{ required: true, message: user.companyId==781?'请选择工作任务':'请选择投入项目', trigger: ['change','blur'] }">
+                        <el-select v-model="domain.projectId" :placeholder="user.companyId==781?'请选择工作任务':'请选择项目'" style="width:200px;" clearable="true"  filterable="true"
                         @change="selectProject(domain, index)"
                         :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)">
                             <el-option v-for="item in projectList" :disabled="item.status>=2" :key="item.id" :label="item.projectName" :value="item.id"></el-option>
@@ -336,6 +336,9 @@
                         <el-link type="primary" v-if="workForm.domains[index].state == 0 || workForm.domains[index].state == 2"
                             :underline="false" style="margin-left:10px;" @click="copyProject(index)">复制</el-link>
                     </el-form-item>
+                    <el-form-item :label="user.companyId==781?'描述':'项目描述'" v-if="user.company.packageProject==0&&domain.projectId&&projectList.filter(p=>p.id == domain.projectId)[0].projectDesc">
+                        <span>{{projectList.filter(p=>p.id == domain.projectId)[0].projectDesc}}</span>
+                    </el-form-item>
 
                     <el-form-item label="任务分组" v-if="user.company.packageProject == 1">
                         <!-- 任务分组 -->
@@ -353,7 +356,7 @@
                             <el-option v-for="item in domain.stages" :key="item.id" :label="item.stagesName" :value="item.stagesName"></el-option>
                         </el-select>
                     </el-form-item>
-                    <el-form-item label="项目审核人">
+                    <el-form-item :label="user.companyId==781?'审核人':'项目审核人'">
                         <el-select v-model="domain.projectAuditorId" :disabled="!canEdit" @change="$forceUpdate()">
                             <el-option v-for="item in domain.auditUserList" :label="item.auditorName" :value="item.auditorId" :key="item.id"></el-option>
                         </el-select>
@@ -396,8 +399,8 @@
                             <el-option v-for="item in domain.taskList" :key="item.taskId" :label="item.taskName" :value="item.taskId"></el-option>
                         </el-select>
                     </el-form-item>
-                    <el-form-item label="工作事项" :prop="'domains.' + index + '.content'" >
-                        <el-input v-model="domain.content" type="textarea" :rows="4" placeholder="请填写工作事项" clearable
+                    <el-form-item :label="user.companyId==781?'具体内容与结果':'工作事项'" :prop="'domains.' + index + '.content'" >
+                        <el-input v-model="domain.content" type="textarea" :rows="4" placeholder="请填写" clearable
                          :disabled="workForm.domains.length==0?true:(workForm.domains[index].state>=2?false:true)"></el-input>
                     </el-form-item>
                     </div>

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

@@ -24,14 +24,14 @@
                 
                 <van-tag v-if="index>0&&canEdit" color="#fff" 
                 @click="delPro(index)" style="border: 1px solid #ff0000;padding:5px;margin-left:10px;"
-                 icon="plus" type="default" ><span style="color:#666;padding: 0 5px;">删除项目</span></van-tag>
+                 icon="plus" type="default" ><span style="color:#666;padding: 0 5px;">删除</span></van-tag>
                 </div>
                 <!-- <van-icon v-if="index>0&&canEdit" class="form_del" name="delete" @click="delPro(index)" /> -->
 
-                <van-cell-group :title="'项目' + (index+1)">
+                <van-cell-group :title="(user.companyId==781?'任务':'项目') + (index+1)">
                     <!-- <div>请选择投入项目</div> -->
-                    <van-field  readonly  name="projectId" clickable :value="item.projectName" label="投入项目" placeholder="请选择投入项目" @click="clickPicker(index, item)"
-                    :rules="[{ required: true, message: '请选择项目' }]" />
+                    <van-field  readonly  name="projectId" clickable :value="item.projectName" :label="user.companyId==781?'工作任务':'投入项目'" :placeholder="user.companyId==781?'请选择工作任务':'请选择项目'" @click="clickPicker(index, item)"
+                    :rules="[{ required: true, message: user.companyId==781?'请选择任务':'请选择项目' }]" />
 
                    
 
@@ -61,7 +61,7 @@
                     </van-popup>
                     <!-- 审核人 -->
                     <van-field  readonly  name="projectAuditorId" v-if="item.auditUserList != null && item.auditUserList.length > 0" clickable
-                        :value="item.projectAuditorName" label="项目审核人" placeholder="请选择审核人" 
+                        :value="item.projectAuditorName" :label="user.companyId==781?'审核人':'项目审核人'" placeholder="请选择审核人" 
                     @click="clickPickAuditor(index, item)" />
                     <van-popup v-model="item.showPickerAuditor" position="bottom">
                         <van-picker show-toolbar :columns="item.auditUserList" value-key="auditorName" @confirm="choseAuditor" 
@@ -165,7 +165,7 @@
                         </template>
                     </van-cell>
                     <van-field class="form_input" :disabled = "!canEdit"
-                    v-model="item.content" name="content" type="textarea" label="工作事项" placeholder="请输入工作事项" 
+                    v-model="item.content" name="content" type="textarea" :label="user.companyId==781?'具体内容与结果':'工作事项'" placeholder="请输入" 
                     rows="3" autosize  />
                     </div>
                     
@@ -263,7 +263,7 @@
             <div style="text-align:center;" >
             <van-tag v-if="canEdit" size="large" style="text-align:center;margin:10px;padding:12px;margin-bottom:120px;border: 1px solid #20a0ff;"
                 :disabled="!canEdit" @click="addNewPro" 
-                icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 50px;"> + 新增项目  </span></van-tag>
+                icon="plus" color="#ffffff" ><span style="color:#999;text-align:center;padding: 0 50px;"> + 新增{{user.companyId==781?'任务':'项目'}}  </span></van-tag>
             </div>  
             <div class="form_btn" style="position:fixed; bottom:0px;width:100%;">
                 <div style="padding-bottom:10px;">

+ 6 - 100
fhKeeper/formulahousekeeper/timesheet_h5/src/views/index/index.vue

@@ -84,90 +84,7 @@
                     icon: 'todo-list-o'
                 });
             }
-            // if (this.user.role == 0) {
-            //     //普通员工
-            //     if (this.user.manageDeptId != 0 && this.user.company.packageEngineering == 1) {
-            //         this.routers.push(
-            //         {
-            //             name: '部门审核',
-            //             url: '/department_review',
-            //             icon: 'todo-list-o'
-            //         });
-            //     }
-            //     if (this.user.leader) {
-            //         this.routers.push({
-            //             name: '项目报告审核',
-            //             url: '/review',
-            //             icon: 'todo-list-o'
-            //         });
-            //     } 
-            // } else if (this.user.role == 1 || this.user.role == 2 || this.user.role == 5){
-            // // } else if (this.user.role == 1 || this.user.role == 2){
-            //     if (this.user.company.packageEngineering == 1) {
-            //         this.routers.push(
-            //         {
-            //             name: '部门审核',
-            //             url: '/department_review',
-            //             icon: 'todo-list-o'
-            //         });
-            //     }
-                
-            //     this.routers.push({
-            //             name: '项目报告审核',
-            //             url: '/review',
-            //             icon: 'todo-list-o'
-            //         });
-            //     this.routers.push({
-            //             name: '项目管理',
-            //             url: '/project',
-            //             icon: 'label-o'
-            //         });
-                
-            //         // 自己加的
-            //     // this.routers.push({
-            //     //         name: '导入日报审核',
-            //     //         url: '/audit',
-            //     //         icon: 'label-o'
-            //     //     });
-            // } else {
-            //     if (this.user.manageDeptId != 0 && this.user.company.packageEngineering == 1) {
-            //         this.routers.push(
-            //         {
-            //             name: '部门审核',
-            //             url: '/department_review',
-            //             icon: 'todo-list-o'
-            //         });
-            //     }
-            //     if (this.user.role == 3||this.user.role == 5||this.user.role == 6) {//项目管理员,公司领导,公司高层
-            //         this.routers.push({
-            //             name: '项目管理',
-            //             url: '/project',
-            //             icon: 'label-o'
-            //         });
-            //     }
-            //     if (this.user.leader) {
-            //         this.routers.push({
-            //             name: '项目报告审核',
-            //             url: '/review',
-            //             icon: 'todo-list-o'
-            //         });
-            //     }
-            // }
-            // if(this.user.role == 1 || this.user.role == 2) {
-            //     this.routers.push({
-            //         name: '导入日报审核',
-            //         url: '/audit',
-            //         icon: 'label-o'
-            //     });
-            // } else {
-            //     if(this.user.role == 6 && this.user.timeType.needDeptAudit == 1) {
-            //         this.routers.push({
-            //             name: '导入日报审核',
-            //             url: '/audit',
-            //             icon: 'label-o'
-            //         });
-            //     }
-            // }
+            
             this.routers.push({
                                 name: '消息记录',
                                 url: '/msg',
@@ -186,11 +103,11 @@
             //                     info: this.unreadNum
             //                 });
             // if (this.user.companyId==634 || this.user.companyId==7 || this.user.companyId==431) {
-                this.routers.push({
-                                name: '请假审批',
-                                url: '/exaLeave',
-                                icon: 'todo-list-o',
-                            });
+                // this.routers.push({
+                //                 name: '请假审批',
+                //                 url: '/exaLeave',
+                //                 icon: 'todo-list-o',
+                //             });
             // }
             
             this.getMessage();
@@ -276,17 +193,6 @@
                     }
                 }
             },
-            getGoods() {
-                let url = "/goods"; // /api/goods
-                this.$axios
-                    .get(url)
-                    .then(res => {
-                    console.log("res", res);
-                    })
-                    .catch(err => {
-                    console.log("err", err);
-                    });
-            },
             //获取消息
             getMessage() {
                 this.$axios.post("/information/list", {