Browse Source

微信请假同步

cs 2 years ago
parent
commit
8ceff3469f

+ 5 - 0
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/entity/TimeType.java

@@ -389,6 +389,11 @@ public class TimeType extends Model<TimeType> {
     @TableField("not_allowed_no_attendance")
     private Integer notAllowedNoAttendance;
 
+    /**
+     * 是否需要微信请假
+     */
+    @TableField("wx_leave")
+    private Integer wxLeave;
 
     @Override
     protected Serializable pkVal() {

+ 204 - 192
fhKeeper/formulahousekeeper/management-platform/src/main/java/com/management/platform/service/impl/WxCorpInfoServiceImpl.java

@@ -384,12 +384,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
             JSONObject reqParam = new JSONObject();
             reqParam.put("auth_corpid", corpInfo.getCorpid());
             reqParam.put("permanent_code", corpInfo.getPermanentCode());
-
-            System.out.println("SuiteAccessToken为:"+getSuiteAccessToken());
-            System.out.println("CompanyId为:"+corpInfo.getCompanyId());
-            System.out.println("Corpid为:"+corpInfo.getCorpid());
-            System.out.println("PermanentCode"+corpInfo.getPermanentCode());
-
+//            System.out.println("SuiteAccessToken为:"+getSuiteAccessToken());
+//            System.out.println("CompanyId为:"+corpInfo.getCompanyId());
+//            System.out.println("Corpid为:"+corpInfo.getCorpid());
+//            System.out.println("PermanentCode为:"+corpInfo.getPermanentCode());
             HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
             ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
                     HttpMethod.POST, requestEntity, String.class);
@@ -1131,13 +1129,201 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         }
     }
 
-    //查询某时间段的微信请假审批单号及详情
+    //查询微信请假单详情
+    private List<LeaveSheet> wxLeaveDetail(String startTime,String endTime,List<String> fail,String accessToken,WxCorpInfo wxCorpInfo){
+        String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token=ACCESS_TOKEN";
+        String detailUrl = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=ACCESS_TOKEN";
+        HttpHeaders headers = new HttpHeaders();
+        RestTemplate restTemplate = new RestTemplate();
+        ArrayList<LeaveSheet> result = new ArrayList<>();
+        MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
+        headers.setContentType(type);
+        headers.add("Accept", MediaType.APPLICATION_JSON.toString());
+        //批量获取审批单号
+        ArrayList<HashMap> list = new ArrayList<>();
+        HashMap<String, String> record_type = new HashMap<>();
+        list.add(record_type);
+        record_type.put("key", "record_type");
+        record_type.put("value", "1");
+        JSONObject requestMap = new JSONObject();
+        requestMap.put("starttime", startTime);
+        requestMap.put("endtime", endTime);
+        requestMap.put("cursor", 0);
+        requestMap.put("size", 100);
+        requestMap.put("filters", list);
+        HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
+        ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
+        if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
+            String resp = ResponseEntity.getBody();
+            JSONObject json = JSONObject.parseObject(resp);
+            Object[] sp_no_lists = json.getJSONArray("sp_no_list").toArray();
+            //查询每个审批号审批详情
+            for (int i = 0; i < sp_no_lists.length; i++) {
+                detailUrl = detailUrl.replace("ACCESS_TOKEN", accessToken);
+                JSONObject detailMap = new JSONObject();
+                detailMap.put("sp_no", sp_no_lists[i]);
+                HttpEntity<JSONObject> detailEntity = new HttpEntity<>(detailMap, headers);
+                ResponseEntity<String> detailResponseEntity = restTemplate.postForEntity(detailUrl, detailEntity, String.class);
+                if(ResponseEntity.getStatusCode() == HttpStatus.OK){
+                    //封装请假单数据
+                    String detailResp = detailResponseEntity.getBody();
+                    JSONObject infoJson = JSONObject.parseObject(detailResp).getJSONObject("info");
+                    //审核状态
+                    Integer sp_status = infoJson.getInteger("sp_status");
+                    switch (sp_status){
+                        //审批中
+                        case 1:
+                            sp_status=1;
+                            break;
+                        //已通过
+                        case 2:
+                            sp_status=0;
+                            break;
+                        //已驳回
+                        case 3:
+                            sp_status=2;
+                            break;
+                        //已撤销
+                        case 4:
+                            sp_status=3;
+                            break;
+                        //通过后撤销
+                        case 5:
+                            sp_status=5;
+                            break;
+                        //通过后撤销
+                        case 6:
+                            sp_status=6;
+                            break;
+                        //7-已删除
+                        case 7:
+                            sp_status=7;
+                            break;
+                        default:
+                            sp_status=8;
+                    }
+                    //审批申请提交时间,Unix时间戳
+                    LocalDateTime applyTime = LocalDateTime.ofEpochSecond(Long.parseLong(infoJson.getString("apply_time")), 0, ZoneOffset.ofHours(8));
+                    //申请人姓名
+                    String applyer = infoJson.getString("applyer");
+                    String userId = JSONObject.parseObject(applyer).getString("userid");
+                    User user = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", userId));
+                    String name = user==null?userId:user.getName();
+                    //审批人姓名
+                    String approverUserId = infoJson.getJSONArray("sp_record").getJSONObject(0)
+                            .getJSONArray("details").getJSONObject(0)
+                            .getJSONObject("approver").getString("userid");
+                    User approverUser = new User();
+                    if (approverUserId!=null&&approverUserId!=""){
+                        approverUser = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", approverUserId));
+                    }
+                    String approverName = approverUser==null?approverUserId:approverUser.getName();
+                    JSONArray contents = infoJson.getJSONObject("apply_data")
+                            .getJSONArray("contents");
+                    //请假类型
+                    JSONObject vacation = contents.getJSONObject(0)
+                            .getJSONObject("value")
+                            .getJSONObject("vacation");
+                    String text = vacation.getJSONObject("selector")
+                            .getJSONArray("options").getJSONObject(0)
+                            .getJSONArray("value").getJSONObject(0)
+                            .getString("text");
+                    //请假事由
+                    String remark = contents.getJSONObject(1).getJSONObject("value").getString("text");
+                    Integer leave_type = 0;
+                    switch (text){
+                        case "事假":
+                            leave_type = 0;
+                            break;
+                        case "病假":
+                            leave_type = 1;
+                            break;
+                        case "年假":
+                            leave_type = 2;
+                            break;
+                        case "产假":
+                            leave_type = 3;
+                            break;
+                        case "婚假":
+                            leave_type = 4;
+                            break;
+                        case "丧假":
+                            leave_type = 5;
+                            break;
+                        case "调休假":
+                            leave_type = 6;
+                            break;
+                        case "陪产假":
+                            leave_type = 7;
+                            break;
+                        case "其他":
+                            leave_type = 8;
+                            break;
+                    }
+                    //请假开始时间
+                    JSONObject date_range = vacation.getJSONObject("attendance")
+                            .getJSONObject("date_range");
+                    String startDate =date_range.getString("new_begin");
+                    SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
+                    long startDateTemp = Long.valueOf(startDate);
+                    String startDateString = sdf.format(new Date(startDateTemp * 1000L));
+                    DateTimeFormatter startfmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                    LocalDate sDate = LocalDate.parse(startDateString, startfmt);
+                    //请假结束时间
+                    String endDate = date_range.getString("new_end");
+                    long endDatetemp = Long.valueOf(endDate);
+                    String endDateString = sdf.format(new Date(endDatetemp * 1000L));
+                    DateTimeFormatter endfmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+                    LocalDate eDate = LocalDate.parse(endDateString, endfmt);
+                    //请假时长
+                    String timeHours = date_range.getString("new_duration");
+                    String leaveType = date_range.getString("type");
+                    LeaveSheet leaveSheet = new LeaveSheet();
+                    leaveSheet.setProcinstId(sp_no_lists[i].toString());
+                    leaveSheet.setIsFinalAudit(1);
+                    leaveSheet.setIndate(applyTime);
+                    leaveSheet.setOwnerName(name);
+                    leaveSheet.setOwnerId(user==null?"":user.getId());
+                    leaveSheet.setCompanyId(user.getCompanyId());
+                    leaveSheet.setTel(user.getPhone()==null?"":user.getPhone());
+                    //审批人信息
+                    leaveSheet.setAuditorName(approverName);
+                    leaveSheet.setAuditorId(approverUser==null?"":approverUser.getId());
+                    //请假日期
+                    leaveSheet.setStartDate(sDate);
+                    leaveSheet.setEndDate(eDate);
+                    //请假类型
+                    leaveSheet.setLeaveType(leave_type);
+                    leaveSheet.setStatus(sp_status);
+                    //请假说明
+                    leaveSheet.setRemark(remark==null?"":remark);
+                    //请假时长和天数
+                    float time = Float.parseFloat(timeHours);
+                    if("hour".equals(leaveType)){
+                        leaveSheet.setTimeType(1);
+                        leaveSheet.setTimeHours(time/3600);
+                    }else{
+                        leaveSheet.setTimeType(0);
+                        leaveSheet.setTimeHours(time/3600);
+                        leaveSheet.setTimeDays(time/3600/24);
+                    }
+                    result.add(leaveSheet);
+                }
+            }
+        }else{
+            fail.add(wxCorpInfo.getCorpFullName());
+            System.err.println(wxCorpInfo.getCorpFullName()+"审批单查询失败");
+        }
+        return result;
+    }
+
+    //更新审核中的请假单以及查询某时间段的微信请假审批单号
     @Override
     public List<LeaveSheet> wxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos,List<LeaveSheet> approvalLeave) throws Exception {
-        //存储更新失败的公司名称
-        List<String> fail = new ArrayList<>();
         String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token=ACCESS_TOKEN";
         String detailUrl = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=ACCESS_TOKEN";
+        //存储更新失败的公司名称
+        List<String> fail = new ArrayList<>();
         HttpHeaders headers = new HttpHeaders();
         RestTemplate restTemplate = new RestTemplate();
         ArrayList<LeaveSheet> result = new ArrayList<>();
@@ -1147,10 +1333,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
         for (WxCorpInfo wxCorpInfo : wxCorpInfos) {
             //更新Access_token
             String accessToken = getCorpAccessToken(wxCorpInfo);
-            if (StringUtils.isEmpty(accessToken)){
-                System.out.println(wxCorpInfo.getCorpName()+"accessToken获取失败");
-                continue;
-            }
+//            if (StringUtils.isEmpty(accessToken)){
+//                System.out.println(wxCorpInfo.getCorpName()+"accessToken获取失败");
+//                fail.add(wxCorpInfo.getCorpName());
+//                continue;
+//            }
             url = url.replace("ACCESS_TOKEN", accessToken);
             //查询并更新审核中的审批单
             System.out.println("+++++++++++++++++++开始查询并更新审核中的审批单+++++++++++++++++++");
@@ -1221,192 +1408,17 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
                 }
             }
             System.out.println("+++++++++++++++++++++开始同步昨天请假信息+++++++++++++++++++++");
-            //批量获取审批单号
-            ArrayList<HashMap> list = new ArrayList<>();
-            HashMap<String, String> record_type = new HashMap<>();
-            list.add(record_type);
-            record_type.put("key", "record_type");
-            record_type.put("value", "1");
-            JSONObject requestMap = new JSONObject();
-            requestMap.put("starttime", startTime);
-            requestMap.put("endtime", endTime);
-            requestMap.put("cursor", 0);
-            requestMap.put("size", 100);
-            requestMap.put("filters", list);
-            HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
-            ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
-            if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
-                String resp = ResponseEntity.getBody();
-                JSONObject json = JSONObject.parseObject(resp);
-                Object[] sp_no_lists = json.getJSONArray("sp_no_list").toArray();
-                //查询每个审批号审批详情
-                for (int i = 0; i < sp_no_lists.length; i++) {
-                    detailUrl = detailUrl.replace("ACCESS_TOKEN", accessToken);
-                    JSONObject detailMap = new JSONObject();
-                    detailMap.put("sp_no", sp_no_lists[i]);
-                    HttpEntity<JSONObject> detailEntity = new HttpEntity<>(detailMap, headers);
-                    ResponseEntity<String> detailResponseEntity = restTemplate.postForEntity(detailUrl, detailEntity, String.class);
-                    if(ResponseEntity.getStatusCode() == HttpStatus.OK){
-                        //封装请假单数据
-                        String detailResp = detailResponseEntity.getBody();
-                        JSONObject infoJson = JSONObject.parseObject(detailResp).getJSONObject("info");
-                        //审核状态
-                        Integer sp_status = infoJson.getInteger("sp_status");
-                        switch (sp_status){
-                            //审批中
-                            case 1:
-                                sp_status=1;
-                                break;
-                            //已通过
-                            case 2:
-                                sp_status=0;
-                                break;
-                            //已驳回
-                            case 3:
-                                sp_status=2;
-                                break;
-                            //已撤销
-                            case 4:
-                                sp_status=3;
-                                break;
-                            //通过后撤销
-                            case 5:
-                                sp_status=5;
-                                break;
-                            //通过后撤销
-                            case 6:
-                                sp_status=6;
-                                break;
-                            //7-已删除
-                            case 7:
-                                sp_status=7;
-                                break;
-                            default:
-                                sp_status=8;
-                        }
-                        //审批申请提交时间,Unix时间戳
-                        LocalDateTime applyTime = LocalDateTime.ofEpochSecond(Long.parseLong(infoJson.getString("apply_time")), 0, ZoneOffset.ofHours(8));
-                        //申请人姓名
-                        String applyer = infoJson.getString("applyer");
-                        String userId = JSONObject.parseObject(applyer).getString("userid");
-                        User user = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", userId));
-                        String name = user==null?userId:user.getName();
-                        //审批人姓名
-                        String approverUserId = infoJson.getJSONArray("sp_record").getJSONObject(0)
-                                .getJSONArray("details").getJSONObject(0)
-                                .getJSONObject("approver").getString("userid");
-                        User approverUser = new User();
-                        if (approverUserId!=null&&approverUserId!=""){
-                            approverUser = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", approverUserId));
-                        }
-                        String approverName = approverUser==null?approverUserId:approverUser.getName();
-                        JSONArray contents = infoJson.getJSONObject("apply_data")
-                                .getJSONArray("contents");
-                        //请假类型
-                        JSONObject vacation = contents.getJSONObject(0)
-                                .getJSONObject("value")
-                                .getJSONObject("vacation");
-                        String text = vacation.getJSONObject("selector")
-                                .getJSONArray("options").getJSONObject(0)
-                                .getJSONArray("value").getJSONObject(0)
-                                .getString("text");
-                        //请假事由
-                        String remark = contents.getJSONObject(1).getJSONObject("value").getString("text");
-                        Integer leave_type = 0;
-                        switch (text){
-                            case "事假":
-                                leave_type = 0;
-                                break;
-                            case "病假":
-                                leave_type = 1;
-                                break;
-                            case "年假":
-                                leave_type = 2;
-                                break;
-                            case "产假":
-                                leave_type = 3;
-                                break;
-                            case "婚假":
-                                leave_type = 4;
-                                break;
-                            case "丧假":
-                                leave_type = 5;
-                                break;
-                            case "调休假":
-                                leave_type = 6;
-                                break;
-                            case "陪产假":
-                                leave_type = 7;
-                                break;
-                            case "其他":
-                                leave_type = 8;
-                                break;
-                        }
-                        //请假开始时间
-                        JSONObject date_range = vacation.getJSONObject("attendance")
-                                .getJSONObject("date_range");
-                        String startDate =date_range.getString("new_begin");
-                        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
-                        long startDateTemp = Long.valueOf(startDate);
-                        String startDateString = sdf.format(new Date(startDateTemp * 1000L));
-                        DateTimeFormatter startfmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-                        LocalDate sDate = LocalDate.parse(startDateString, startfmt);
-                        //请假结束时间
-                        String endDate = date_range.getString("new_end");
-                        long endDatetemp = Long.valueOf(endDate);
-                        String endDateString = sdf.format(new Date(endDatetemp * 1000L));
-                        DateTimeFormatter endfmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
-                        LocalDate eDate = LocalDate.parse(endDateString, endfmt);
-                        //请假时长
-                        String timeHours = date_range.getString("new_duration");
-                        String leaveType = date_range.getString("type");
-                        LeaveSheet leaveSheet = new LeaveSheet();
-                        leaveSheet.setProcinstId(sp_no_lists[i].toString());
-                        leaveSheet.setIsFinalAudit(1);
-                        leaveSheet.setIndate(applyTime);
-                        leaveSheet.setOwnerName(name);
-                        leaveSheet.setOwnerId(user==null?"":user.getId());
-                        leaveSheet.setCompanyId(user.getCompanyId());
-                        leaveSheet.setTel(user.getPhone()==null?"":user.getPhone());
-                        //审批人信息
-                        leaveSheet.setAuditorName(approverName);
-                        leaveSheet.setAuditorId(approverUser==null?"":approverUser.getId());
-                        //请假日期
-                        leaveSheet.setStartDate(sDate);
-                        leaveSheet.setEndDate(eDate);
-                        //请假类型
-                        leaveSheet.setLeaveType(leave_type);
-                        leaveSheet.setStatus(sp_status);
-                        //请假说明
-                        leaveSheet.setRemark(remark==null?"":remark);
-                        //请假时长和天数
-                        float time = Float.parseFloat(timeHours);
-                        if("hour".equals(leaveType)){
-                            leaveSheet.setTimeType(1);
-                            leaveSheet.setTimeHours(time/3600);
-                        }else{
-                            leaveSheet.setTimeType(0);
-                            leaveSheet.setTimeHours(time/3600);
-                            leaveSheet.setTimeDays(time/3600/24);
-                        }
-                        result.add(leaveSheet);
-                    }else{
-                        System.err.println(sp_no_lists[i]+"审批单详情查询失败");
-                    }
-                }
-            }else{
-                fail.add(wxCorpInfo.getCorpFullName());
-                System.err.println(wxCorpInfo.getCorpFullName()+"审批单查询失败");
-            }
+
         }
         if (fail.size() == 0){
             System.err.println("全部同步成功");
         }else{
-            System.out.print("同步失败的公司有:");
+            System.err.println("总共"+fail.size()+"个公司同步失败");
+            System.err.print("同步失败的公司有:");
             for (String s : fail) {
                 System.err.print(s+",");
-                System.out.println();
             }
+            System.out.println();
         }
         return result;
     }