Prechádzať zdrojové kódy

钉钉同步考勤,出差,请假数据。兼容定制开发模式。

seyason 3 rokov pred
rodič
commit
1e3c34ff26

+ 14 - 18
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/controller/DingDingController.java

@@ -223,7 +223,6 @@ public class DingDingController {
             msg.setError(e.getMessage());
             return msg;
         }
-
     }
 
     @RequestMapping("/getUserByCode")
@@ -243,11 +242,9 @@ public class DingDingController {
         return dingDingService.syncCorpInfo(corpid);
     }
 
-
     @RequestMapping("/syncCorpAgent")
     public HttpRespMsg syncCorpAgent(String corpid) {
         return dingDingService.syncCorpAgent(corpid);
-
     }
 
     @RequestMapping("/getUnActiveCorp")
@@ -275,16 +272,15 @@ public class DingDingController {
         dingDingService.syncCardTime(companyId, userId, startDate, endDate);
         return new HttpRespMsg();
     }
-
-    @RequestMapping("/syncLeaveTime")
-    public HttpRespMsg syncLeaveTime(Integer companyId, String userId, String startDate, String endDate) {
-        dingDingService.syncLeaveTime(companyId, userId, startDate, endDate);
-        return new HttpRespMsg();
-    }
+//
+//    @RequestMapping("/syncLeaveTime")
+//    public HttpRespMsg syncLeaveTime(Integer companyId, String userId, String startDate, String endDate) {
+//        dingDingService.syncLeaveTime(companyId, userId, startDate, endDate);
+//        return new HttpRespMsg();
+//    }
 
     @RequestMapping("/syncUserWorkData")
     public HttpRespMsg syncUserWorkData(Integer companyId, String workDate) {
-
         dingDingService.syncUserWorkData(companyId, workDate);
         return new HttpRespMsg();
     }
@@ -297,12 +293,12 @@ public class DingDingController {
                 4L, "040534176023851922");
         return new HttpRespMsg();
     }
-
-    @RequestMapping("/testCorpVal")
-    public HttpRespMsg testCorpVal(Integer companyId) {
-        CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
-
-        dingDingService.getCorpSelfDefSmartReport(companyDingding);
-        return new HttpRespMsg();
-    }
+//
+//    @RequestMapping("/testCorpVal")
+//    public HttpRespMsg testCorpVal(Integer companyId) {
+//        CompanyDingding companyDingding = companyDingdingService.getOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
+//
+//        dingDingService.getCorpSelfDefSmartReport(companyDingding);
+//        return new HttpRespMsg();
+//    }
 }

+ 25 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/CompanyDingding.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2021-12-23
+ * @since 2022-04-29
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -60,6 +60,30 @@ public class CompanyDingding extends Model<CompanyDingding> {
     @TableField("agent_id")
     private Long agentId;
 
+    /**
+     * 企业内部应用appkey
+     */
+    @TableField("custom_appkey")
+    private String customAppkey;
+
+    /**
+     * 企业内部应用appsecret
+     */
+    @TableField("custom_appsecret")
+    private String customAppsecret;
+
+    /**
+     * 企业内部应用token
+     */
+    @TableField("inner_token")
+    private String innerToken;
+
+    /**
+     * 企业内部应用token过期时间
+     */
+    @TableField("inner_expire_time")
+    private LocalDateTime innerExpireTime;
+
 
     @Override
     protected Serializable pkVal() {

+ 13 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -15,7 +15,7 @@ import lombok.experimental.Accessors;
  * </p>
  *
  * @author Seyason
- * @since 2022-04-24
+ * @since 2022-04-28
  */
 @Data
 @EqualsAndHashCode(callSuper = false)
@@ -174,6 +174,18 @@ public class TimeType extends Model<TimeType> {
     @TableField("only_importreport")
     private Integer onlyImportreport;
 
+    /**
+     * 填写日报显示钉钉打卡时长
+     */
+    @TableField("show_dd_cardtime")
+    private Integer showDdCardtime;
+
+    /**
+     * 填写日报显示企业微信打卡时长
+     */
+    @TableField("show_corpwx_cardtime")
+    private Integer showCorpwxCardtime;
+
 
     @Override
     protected Serializable pkVal() {

+ 120 - 127
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/DingDingServiceImpl.java

@@ -369,15 +369,19 @@ public class DingDingServiceImpl implements DingDingService {
     /**
      * 获取钉钉内部企业的token
      */
-    private OapiGettokenResponse getInnerCorpToken() throws ApiException {
-        DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/gettoken");
-        OapiGettokenRequest request = new OapiGettokenRequest();
-        request.setAppkey(appkey);
-        request.setAppsecret(appsecret);
-        request.setHttpMethod("GET");
-        OapiGettokenResponse response = client.execute(request);
-        System.out.println(response.getBody());
-        return response;
+    private String getInnerCorpToken(CompanyDingding dingding) throws ApiException {
+        if (dingding.getInnerToken() == null || LocalDateTime.now().isAfter(dingding.getInnerExpireTime())) {
+            DefaultDingTalkClient client= new DefaultDingTalkClient("https://oapi.dingtalk.com/service/get_corp_token");
+            OapiServiceGetCorpTokenRequest req= new OapiServiceGetCorpTokenRequest();
+            req.setAuthCorpid(dingding.getCorpid());
+            OapiServiceGetCorpTokenResponse response= client.execute(req,dingding.getCustomAppkey(),dingding.getCustomAppsecret(),"anything");
+            if (!response.isSuccess()) {
+                System.err.println("获取企业内部token:"+response.getErrorCode()+":"+response.getErrmsg());
+            }
+            dingding.setInnerToken(response.getAccessToken());
+            dingding.setInnerExpireTime(LocalDateTime.now().plusSeconds(response.getExpiresIn()));
+        }
+        return dingding.getInnerToken();
     }
 
     /**
@@ -1085,14 +1089,6 @@ public class DingDingServiceImpl implements DingDingService {
             //指定的某个公司
             CompanyDingding dingding = companyDingdingMapper.selectOne(new QueryWrapper<CompanyDingding>().eq("company_id", companyId));
             syncOneCompWorkData(dingding, workDate);
-        } else {
-            //全部的
-            List<TimeType> timeTypes = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_dingding", 1));
-            List<Integer> companyIds = timeTypes.stream().map(TimeType::getCompanyId).collect(Collectors.toList());
-            List<CompanyDingding> dingdingList = companyDingdingMapper.selectList(new QueryWrapper<CompanyDingding>().in("company_id", companyIds));
-            for (CompanyDingding dingding : dingdingList) {
-                syncOneCompWorkData(dingding, workDate);
-            }
         }
     }
 
@@ -1231,124 +1227,123 @@ public class DingDingServiceImpl implements DingDingService {
         List<User> userList = userMapper.selectList(new QueryWrapper<User>().eq("company_id", dingding.getCompanyId()));
         String accessToken = null;
         try {
-            accessToken = getInnerCorpToken().getAccessToken();
-        } catch (ApiException e) {
-            e.printStackTrace();
-        }
-        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;
+            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());
+                    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);
                     }
-                    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;
+                    //请假和出差的审批单列表
+                    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);
                             }
-                        }
-                        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();
-            }
 
+            }
+        } 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)) {
@@ -1382,8 +1377,8 @@ public class DingDingServiceImpl implements DingDingService {
         OapiAttendanceListRecordResponse rsp = null;
         try {
             rsp = client.execute(req, accessToken);
-            System.out.println(rsp);
             if (rsp.getErrcode() == 0) {
+                System.out.println(rsp.getBody());
                 //正常
                 JSONArray array = JSONObject.parseObject(rsp.getBody()).getJSONArray("recordresult");
                 List<DdingCardTimeItem> list = new ArrayList<DdingCardTimeItem>();
@@ -1464,12 +1459,10 @@ public class DingDingServiceImpl implements DingDingService {
             } else {
                 //报错了
                 System.err.println("同步钉钉考勤报错 "+rsp.getErrcode()+":"+rsp.getErrmsg());
-                System.err.println("同步钉钉考勤报错 "+rsp.getErrcode()+":"+rsp.getErrmsg());
             }
         } catch (ApiException e) {
             e.printStackTrace();
         }
-        System.out.println(rsp.getBody());
     }
 
 

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

@@ -81,6 +81,8 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
     @Resource
     CompanyDingdingMapper companyDingdingMapper;
     @Resource
+    UserCorpwxTimeMapper userCorpwxTimeMapper;
+    @Resource
     WxCorpInfoMapper wxCorpInfoMapper;
     @Resource
     private InformationServiceImpl informationService;
@@ -586,13 +588,21 @@ public class ReportServiceImpl extends ServiceImpl<ReportMapper, Report> impleme
             });
             resultMap.put("report", reports);
             TimeType timeType = timeTypeMapper.selectById(companyId);
-            if (timeType.getSyncDingding() == 1) {
+            if (timeType.getShowDdCardtime() == 1) {
                 List<UserDingdingTime> dingdingTimes = userDingdingTimeMapper.selectList(new QueryWrapper<UserDingdingTime>()
                         .eq("user_id", userId).eq("work_date", date));
                 if (dingdingTimes.size() > 0) {
                     UserDingdingTime time = dingdingTimes.get(0);
                     resultMap.put("time", time);
                 }
+            } else if (timeType.getShowCorpwxCardtime() == 1) {
+                User user = userMapper.selectById(userId);
+                List<UserCorpwxTime> corpwxTimes = userCorpwxTimeMapper.selectList(new QueryWrapper<UserCorpwxTime>()
+                        .eq("corpwx_userid", user.getCorpwxUserid()).eq("create_date", date));
+                if (corpwxTimes.size() > 0) {
+                    UserCorpwxTime time = corpwxTimes.get(0);
+                    resultMap.put("time", time);
+                }
             }
 
             //把总秒数转为double后换算为小时并保留两位小数

+ 18 - 1
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/task/TimingTask.java

@@ -9,6 +9,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.management.platform.entity.*;
 import com.management.platform.mapper.*;
 import com.management.platform.service.CompanyDingdingService;
+import com.management.platform.service.DingDingService;
 import com.management.platform.service.WxCorpInfoService;
 import com.management.platform.util.*;
 import me.chanjar.weixin.mp.api.WxMpInMemoryConfigStorage;
@@ -74,6 +75,8 @@ public class TimingTask {
     private ProjectMapper projectMapper;
     @Resource
     private CompanyDingdingService companyDingdingService;
+    @Resource
+    private DingDingService dingDingService;
 
     //检查项目到期,距离到期时间3天内的,每天提醒
     @Scheduled(cron = "0 0 10 ? * *")
@@ -88,7 +91,6 @@ public class TimingTask {
         System.out.println("即将超期项目=="+list.size());
 
         for (Project p : list) {
-
             Period period = Period.between(start, p.getPlanEndDate());
             int days = period.getDays();
             List<Map<String, Object>> userList = userMapper.getProjectPushUserList(p.getId());
@@ -104,6 +106,21 @@ public class TimingTask {
         }
     }
 
+    //每天0:11 同步昨天的钉钉考勤打卡记录
+    @Scheduled(cron = "0 11 0 ? * *")
+    private void synDingDingCardTime() {
+        if (isDev) return;
+        LocalDateTime yestoday = LocalDateTime.now().minusDays(1);
+        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        String yesStr = dateTimeFormatter.format(yestoday);
+        List<TimeType> typeList = timeTypeMapper.selectList(new QueryWrapper<TimeType>().eq("sync_dingding", 1));
+        for (TimeType type : typeList) {
+            Integer companyId = type.getCompanyId();
+            System.out.println("钉钉同步:companyId="+companyId);
+            dingDingService.syncCardTime(companyId, null, yesStr, yesStr);
+        }
+    }
+
     //每天7点同步昨天的企业微信考勤考勤打卡记录
     @Scheduled(cron = "0 0 7 ? * *")
     private void synCorpWXCardTime() {

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

@@ -12,11 +12,15 @@
         <result column="access_token" property="accessToken" />
         <result column="expire_time" property="expireTime" />
         <result column="agent_id" property="agentId" />
+        <result column="custom_appkey" property="customAppkey" />
+        <result column="custom_appsecret" property="customAppsecret" />
+        <result column="inner_token" property="innerToken" />
+        <result column="inner_expire_time" property="innerExpireTime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        corpid, corp_name, auth_user_id, indate, company_id, access_token, expire_time, agent_id
+        corpid, corp_name, auth_user_id, indate, company_id, access_token, expire_time, agent_id, custom_appkey, custom_appsecret, inner_token, inner_expire_time
     </sql>
 
 </mapper>

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

@@ -29,11 +29,13 @@
         <result column="sync_dingding" property="syncDingding" />
         <result column="is_cro" property="isCro" />
         <result column="only_importreport" property="onlyImportreport" />
+        <result column="show_dd_cardtime" property="showDdCardtime" />
+        <result column="show_corpwx_cardtime" property="showCorpwxCardtime" />
     </resultMap>
 
     <!-- 通用查询结果列 -->
     <sql id="Base_Column_List">
-        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name, finance_audit, overtime_ratio, sync_dingding, is_cro, only_importreport
+        company_id, allday, am, pm, month_days, hour_cost_input_type, type, pay_overtime, alert_time, multi_worktime, fix_monthcost, fill_months, custom_degree_active, custom_degree_name, alert_msg, sync_corpwx_time, need_dept_audit, report_workflow, custom_data_active, custom_data_name, finance_audit, overtime_ratio, sync_dingding, is_cro, only_importreport, show_dd_cardtime, show_corpwx_cardtime
     </sql>
 
 </mapper>

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

@@ -4272,12 +4272,12 @@
                         formData.append("draft", this.isDraft);
 
                         //检查workingTime合计
-                        if (this.reportTimeType.type == 1 && this.user.timeType.syncDingding==1) {
+                        if (this.reportTimeType.type == 1 && this.workForm.time) {
                             var totalTime = 0;
                             for (var t=0;t<this.workForm.domains.length; t++) {
                                 totalTime += this.workForm.domains[t].workingTime;
                             }
-                            if (totalTime > this.workForm.time.workHours) {
+                            if (this.workForm.time.workHours > 0 && totalTime > this.workForm.time.workHours) {
                                 this.$message({
                                         message: "填报工时之和不能超过考勤总工时("+this.workForm.time.workHours+"h)",
                                         type: "error"