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(),"同步异常"); 
 | 
        } 
 | 
    } 
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
  
 | 
} 
 |