| package doumeemes.core.utils.dingding; | 
|   | 
| import com.alibaba.fastjson.JSONArray; | 
| import com.alibaba.fastjson.JSONObject; | 
| import com.dingtalk.api.DefaultDingTalkClient; | 
| import com.dingtalk.api.DingTalkClient; | 
| import com.dingtalk.api.request.*; | 
| import com.dingtalk.api.response.*; | 
| import com.google.gson.JsonObject; | 
| import com.taobao.api.ApiException; | 
| import doumeemes.core.constants.ResponseStatus; | 
| import doumeemes.core.exception.BusinessException; | 
| import doumeemes.core.utils.Constants; | 
| import doumeemes.core.utils.dingding.bean.CompanyUserDTO; | 
| import doumeemes.dao.business.model.Company; | 
| import doumeemes.dao.business.model.CompanyUser; | 
| import doumeemes.dao.business.model.Department; | 
| import doumeemes.dao.ext.vo.CompanyUserExtListVO; | 
| import doumeemes.service.ext.CompanyExtService; | 
| import io.swagger.util.Json; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
|   | 
| import java.util.ArrayList; | 
| import java.util.Date; | 
| import java.util.List; | 
| import java.util.Objects; | 
|   | 
| /** | 
|  * 钉钉业务数据同步类 | 
|  * | 
|  * @Author : Rk | 
|  * @create 2023/6/16 14:02 | 
|  */ | 
| public class DingDingSyncUtil { | 
|   | 
|     //文档地址: | 
|     //https://open.dingtalk.com/document/orgapp/queries-the-complete-information-of-a-department-user | 
|   | 
|   | 
|     /** | 
|      * 获取钉钉 用户信息 根据用户ID  userid(钉钉方) | 
|      */ | 
|     public static CompanyUser  getDingDingUserInfo(String userId,String accessToken){ | 
|         try { | 
|             CompanyUser companyUser = new CompanyUser(); | 
|             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/get"); | 
|             OapiV2UserGetRequest req = new OapiV2UserGetRequest(); | 
|             req.setUserid(userId); | 
|             req.setLanguage("zh_CN"); | 
|             OapiV2UserGetResponse rsp = client.execute(req, accessToken); | 
|             if(rsp.getErrcode()!=Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(),"同步异常"); | 
|             } | 
|             JSONObject jsonObject = JSONObject.parseObject(rsp.getBody()).getJSONObject("result"); | 
|             companyUser.setDeleted(Constants.ZERO); | 
|             companyUser.setCreateTime(new Date()); | 
|             companyUser.setName(jsonObject.getString("name")); | 
|             companyUser.setPhone(jsonObject.getString("mobile")); | 
|             companyUser.setPhoneAuthStatus(Integer.toString(Constants.ZERO)); | 
|             companyUser.setCode(null); | 
|             companyUser.setPosition(jsonObject.getString("title")); | 
|             JSONArray deptIdArray = jsonObject.getJSONArray("dept_id_list"); | 
|             if(!Objects.isNull(deptIdArray)&&deptIdArray.size()>Constants.ZERO){ | 
|                 companyUser.setDepartmentId((Integer)deptIdArray.get(Constants.ZERO)); | 
|             } | 
|             companyUser.setStatus(Constants.ZERO); | 
|             companyUser.setDdUnionid(jsonObject.getString("unionid")); | 
|             companyUser.setDdUserid(jsonObject.getString("userid")); | 
|             System.out.println(jsonObject); | 
|             return companyUser; | 
|         } catch (ApiException e) { | 
|             e.printStackTrace(); | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(),"同步异常"); | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 获取钉钉 部门信息 | 
|      */ | 
|     public static Department getDingDingDepartInfo(Company company,Long ddDeptId,String accessToken){ | 
|         try { | 
|             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/get"); | 
|             OapiV2DepartmentGetRequest req = new OapiV2DepartmentGetRequest(); | 
|             req.setDeptId(ddDeptId); | 
|             req.setLanguage("zh_CN"); | 
|             OapiV2DepartmentGetResponse rsp = client.execute(req, accessToken); | 
|             //处理返回信息 | 
|             if(rsp.getErrcode()!=Constants.ZERO){ | 
|                 throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(),"同步异常"); | 
|             } | 
|             JSONObject jsonObject = JSONObject.parseObject(rsp.getBody()).getJSONObject("result"); | 
|             Department department = new Department(); | 
|             department.setCreateTime(new Date()); | 
|             department.setDeleted(Constants.ZERO); | 
|             department.setType(Constants.DEPART_TYPE.depart); | 
|             department.setDdDeptId(jsonObject.getLong("dept_id")); | 
|             department.setName(jsonObject.getString("name")); | 
|             department.setParentId(jsonObject.getInteger("parent_id")); | 
|             department.setStatus(Constants.ZERO); | 
|             department.setCompanyId(company.getId()); | 
|             return department; | 
|         } catch (ApiException e) { | 
|             e.printStackTrace(); | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(),"同步异常"); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 获取钉钉 所有部门信息 | 
|      */ | 
|     public static List<Department> getDingDingDepartListInfo(CompanyUserExtListVO companyUser, Long departId){ | 
|         try { | 
|             List<Department> departmentList = new ArrayList<>(); | 
|             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/department/listsub"); | 
|             OapiV2DepartmentListsubRequest req = new OapiV2DepartmentListsubRequest(); | 
|             //如果 departId 为空 则同步最高级数据 | 
|             if(Objects.isNull(departId)){ | 
|                 req.setDeptId(departId); | 
|             } | 
|             req.setLanguage("zh_CN"); | 
|             //TODO 获取access_token信息 | 
|             OapiV2DepartmentListsubResponse rsp = client.execute(req, "access_token"); | 
|             //TODO 处理返回信息 | 
|             if(rsp.getErrcode().equals(Constants.ZERO)){ | 
|                 JSONArray jsonArray = JSONArray.parseArray(rsp.getBody()); | 
|                 for (int i = 0; i < jsonArray.size(); i++) { | 
|                     JSONObject jsonObject = jsonArray.getJSONObject(i); | 
|                     Department department = new Department(); | 
|                     department.setCreateTime(new Date()); | 
|                     department.setDeleted(Constants.ZERO); | 
|                     department.setDdDeptId(jsonObject.getLong("dept_id")); | 
|                     department.setName(jsonObject.getString("name")); | 
|                     department.setParentId(jsonObject.getInteger("parent_id")); | 
|                     department.setCompanyId(companyUser.getId()); | 
|                     departmentList.add(department); | 
|                 } | 
|             } | 
|             System.out.println(rsp.getBody()); | 
|             return departmentList; | 
|         } catch (ApiException e) { | 
|             e.printStackTrace(); | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(),"同步异常"); | 
|         } | 
|     } | 
|   | 
|   | 
|   | 
|     /** | 
|      * 获取部门信息下 所有用户ID | 
|      * @param companyId | 
|      * @param departId | 
|      */ | 
|     public static void getDingDingDepartUserIdListInfo(Integer companyId ,Long departId){ | 
|         try { | 
|             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/user/listid"); | 
|             OapiUserListidRequest req = new OapiUserListidRequest(); | 
|             req.setDeptId(departId); | 
|             //TODO 获取access_token信息 | 
|             OapiUserListidResponse rsp = client.execute(req, "access_token"); | 
|             //TODO 处理返回信息 | 
|             if(rsp.getErrcode().equals(Constants.ZERO)){ | 
|                 JSONObject jsonObject = JSONObject.parseObject(rsp.getBody()); | 
|   | 
|             } | 
|             System.out.println(rsp.getBody()); | 
|         } catch (ApiException e) { | 
|             e.printStackTrace(); | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 获取部门下 用户信息 | 
|      * @param department  部门信息 | 
|      * @param cursor  起始序号 | 
|      */ | 
|     public static CompanyUserDTO getDingDingDepartUserListInfo(Company company,Department department,Long cursor){ | 
|         try { | 
|             CompanyUserDTO companyUserDTO = new CompanyUserDTO(); | 
|             DingTalkClient client = new DefaultDingTalkClient("https://oapi.dingtalk.com/topapi/v2/user/list"); | 
|             OapiV2UserListRequest req = new OapiV2UserListRequest(); | 
|             req.setDeptId(Long.valueOf(department.getId())); | 
|             //分页查询的游标,最开始传0,后续传返回参数中的next_cursor值 | 
|             req.setCursor(cursor); | 
|             //分页大小 | 
|             req.setSize(10L); | 
|             req.setContainAccessLimit(false); | 
|             req.setLanguage("zh_CN"); | 
|             //TODO 获取access_token信息 | 
|             OapiV2UserListResponse rsp = client.execute(req, ""); | 
|             //TODO 处理返回信息 | 
|             if(rsp.getErrcode().equals(Constants.ZERO)){ | 
|                 List<CompanyUser> companyUserList = new ArrayList<>(); | 
|                 JSONObject jsonObject = JSONObject.parseObject(rsp.getBody()); | 
|                 Boolean hasMore = jsonObject.getBoolean("has_more"); | 
|                 companyUserDTO.setHasMore(hasMore); | 
|                 Long nextCursor = jsonObject.getLong("next_cursor"); | 
|                 companyUserDTO.setNextCursor(nextCursor); | 
|                 JSONArray jsonArray = jsonObject.getJSONArray("list"); | 
|                 for (int i = 0; i < jsonArray.size(); i++) { | 
|                     JSONObject jsonObjectChild = jsonArray.getJSONObject(i); | 
|                     CompanyUser companyUser = new CompanyUser(); | 
|                     companyUser.setDeleted(Constants.ZERO); | 
|                     companyUser.setCreateTime(new Date()); | 
|                     companyUser.setName(jsonObjectChild.getString("name")); | 
|                     companyUser.setPhone(jsonObjectChild.getString("mobile")); | 
|                     companyUser.setPosition(jsonObjectChild.getString("title")); | 
|                     companyUser.setPhoneAuthStatus(Integer.toString(Constants.ZERO)); | 
|                     //TODO 员工二维码 | 
|                     companyUser.setCode(null); | 
|                     companyUser.setDepartmentId(department.getId()); | 
|                     companyUser.setStatus(Constants.ZERO); | 
|                     companyUser.setDdUnionid(jsonObjectChild.getString("unionid")); | 
|                     companyUser.setDdUserid(jsonObjectChild.getString("userid")); | 
|                     companyUserList.add(companyUser); | 
|                 } | 
|                 companyUserDTO.setCompanyUserList(companyUserList); | 
|             } | 
|             System.out.println(rsp.getBody()); | 
|             return companyUserDTO; | 
|         } catch (ApiException e) { | 
|             e.printStackTrace(); | 
|             throw new BusinessException(ResponseStatus.ERR_STATUS.getCode(),"同步异常"); | 
|         } | 
|     } | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
|   | 
| } |