Commit 0f5c0643 by zhoupeng

提交导入组织架构openapi接口

parent e1bb8058
...@@ -35,12 +35,12 @@ public class QiDianController { ...@@ -35,12 +35,12 @@ public class QiDianController {
@GetMapping("/toSSOCallback") @GetMapping("/toSSOCallback")
@ApiOperation(value = "跳转至企点鉴权地址") @ApiOperation(value = "跳转至企点鉴权地址")
public void toSSOCallback(HttpServletRequest request, HttpServletResponse response) throws IOException { public String toSSOCallback(HttpServletRequest request, HttpServletResponse response) throws IOException {
String token = request.getParameter("token"); String token = request.getParameter("token");
log.info("-------跳转至企点鉴权地址token入参信息-------:{}", token); log.info("-------跳转至企点鉴权地址token入参信息-------:{}", token);
// 参数非空校验 // 参数非空校验
ParameterCheckUtils.noNull(ResponseMsg.PARAM_ERROR_TOKEN, token); ParameterCheckUtils.noNull(ResponseMsg.PARAM_ERROR_TOKEN, token);
response.sendRedirect(qiDianService.getSSOCallback(token)); return qiDianService.getSSOCallback(token);
} }
......
...@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.*; ...@@ -18,7 +18,7 @@ import org.springframework.web.bind.annotation.*;
@Slf4j @Slf4j
@RestController @RestController
@Api(value = "新Cdp同步员工(基础信息)", tags = "新Cdp同步员工(基础信息)") @Api(value = "新Cdp同步员工(基础信息)", tags = "新Cdp同步员工(基础信息)")
@RequestMapping(value = "/api/synEmp") @RequestMapping(value = "/api/synEmpCdp")
public class SyncEmployeCdpController { public class SyncEmployeCdpController {
@Autowired @Autowired
......
...@@ -6,9 +6,11 @@ import com.rome.order.domain.constant.RedisConstant; ...@@ -6,9 +6,11 @@ import com.rome.order.domain.constant.RedisConstant;
import com.rome.order.domain.service.OrganizationRedisService; import com.rome.order.domain.service.OrganizationRedisService;
import com.rome.order.domain.util.PageInfo; import com.rome.order.domain.util.PageInfo;
import com.rome.order.domain.util.RedisService; import com.rome.order.domain.util.RedisService;
import com.rome.order.infrastructure.remote.constant.RemoteConstant;
import com.rome.order.infrastructure.remote.dto.res.OrgDTO; import com.rome.order.infrastructure.remote.dto.res.OrgDTO;
import com.rome.order.infrastructure.remote.facade.OrganizationFacade; import com.rome.order.infrastructure.remote.facade.OrganizationFacade;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
...@@ -57,7 +59,7 @@ public class OrganizationRedisServiceImpl implements OrganizationRedisService { ...@@ -57,7 +59,7 @@ public class OrganizationRedisServiceImpl implements OrganizationRedisService {
public List<OrgDTO> getAllOrgRedis() { public List<OrgDTO> getAllOrgRedis() {
List<OrgDTO> organizationRedisDTOS = new ArrayList<>(); List<OrgDTO> organizationRedisDTOS = new ArrayList<>();
Object cacheObject = redisService.getValue(RedisConstant.DEPARTMENT_ORGANIZATION); Object cacheObject = redisService.getValue(RedisConstant.DEPARTMENT_ORGANIZATION);
if (Objects.nonNull(cacheObject)) { if (Objects.nonNull(cacheObject)&&!RemoteConstant.EMP.equals(cacheObject)) {
organizationRedisDTOS = JSON.parseArray(cacheObject.toString(), OrgDTO.class); organizationRedisDTOS = JSON.parseArray(cacheObject.toString(), OrgDTO.class);
}else{ }else{
organizationRedisDTOS = this.getRemoteOrgCdpList(); organizationRedisDTOS = this.getRemoteOrgCdpList();
......
...@@ -14,7 +14,9 @@ import com.rome.order.domain.constant.BaseConstant; ...@@ -14,7 +14,9 @@ import com.rome.order.domain.constant.BaseConstant;
import com.rome.order.domain.constant.QiDianConstant; import com.rome.order.domain.constant.QiDianConstant;
import com.rome.order.domain.constant.RedisConstant; import com.rome.order.domain.constant.RedisConstant;
import com.rome.order.domain.service.QiDianService; import com.rome.order.domain.service.QiDianService;
import com.rome.order.domain.util.*; import com.rome.order.domain.util.HttpUtil;
import com.rome.order.domain.util.Md5Utils;
import com.rome.order.domain.util.RedisService;
import com.rome.order.infrastructure.dataobject.SyncOrgDO; import com.rome.order.infrastructure.dataobject.SyncOrgDO;
import com.rome.order.infrastructure.remote.constant.QiDianRemoteConstant; import com.rome.order.infrastructure.remote.constant.QiDianRemoteConstant;
import com.rome.order.infrastructure.remote.constant.RemoteConstant; import com.rome.order.infrastructure.remote.constant.RemoteConstant;
...@@ -34,7 +36,10 @@ import org.springframework.stereotype.Service; ...@@ -34,7 +36,10 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.*; import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Service @Service
@Slf4j @Slf4j
...@@ -55,6 +60,17 @@ public class QiDianServiceImpl implements QiDianService { ...@@ -55,6 +60,17 @@ public class QiDianServiceImpl implements QiDianService {
@Value("${qidian.password:}") @Value("${qidian.password:}")
private String password; private String password;
private String corporationId="0";
private String secret="ajdjhfwjk123";
@Value("${beidou.openapiUrl:}")
private String beidouOpenapiUrl;
private String consoleUrl="https://beidou.test.laiyifen.com/console";
@Override @Override
public String getCacheToken() { public String getCacheToken() {
String key = RedisConstant.QIDIAN_TENCENT_ACCESS_TOKEN; String key = RedisConstant.QIDIAN_TENCENT_ACCESS_TOKEN;
...@@ -73,12 +89,9 @@ public class QiDianServiceImpl implements QiDianService { ...@@ -73,12 +89,9 @@ public class QiDianServiceImpl implements QiDianService {
@Override @Override
public String getSSOCallback(String code) { public String getSSOCallback(String code) {
//使用urlencode转义 //三方sso登录
String redirectUrlEncode = ServletUtils.urlEncode(redirectUrl); String result = this.login(code);
//跳转至企点鉴权地址 return result;
String url = QiDianConstant.SKIP_CALLBACK_URL + RemoteConstant.SKIP_SSOCALLBACK_URL + "?code=" + code + "&appid=" + QiDianConstant.APP_ID + "&redirect_url=" + redirectUrlEncode;
log.info("---getSSOCallbackUrl获取的地址为-----:{}", url);
return url;
} }
@Override @Override
...@@ -442,16 +455,12 @@ public class QiDianServiceImpl implements QiDianService { ...@@ -442,16 +455,12 @@ public class QiDianServiceImpl implements QiDianService {
@Override @Override
public String login(String code) { public String login(String code) {
try { try {
String url = String.format(RemoteConstant.SSO_LOGIN_API_URL, code); String url = String.format(beidouOpenapiUrl+RemoteConstant.SSO_LOGIN_API_URL, code,consoleUrl);
Map<String, String> headers = getSSOHeaderMap(); Map<String, String> headers = HttpUtil.getOpenApiHeaderMap(corporationId, secret);;
log.info("-----第三方sso登录------url:{},headers={}", url, JSONObject.toJSONString(headers)); log.info("-----第三方sso登录------url:{},headers={}", url, JSONObject.toJSONString(headers));
String result = HttpUtil.httpGet(url, headers); String result = HttpUtil.httpGet(url, headers);
log.info("-----第三方sso登录,result------:{}", result); log.info("-----第三方sso登录,result------:{}", result);
Map map = JSONObject.parseObject(result, Map.class); return result;
if (RemoteConstant.SSO_SUCCESS.equals(Integer.parseInt(map.get("code").toString()))) {
//todo 成功
}
return map.get("msg").toString();
} catch (Exception e) { } catch (Exception e) {
String errorMsg = e.getMessage(); String errorMsg = e.getMessage();
log.error("-----第三方sso登录报错了-------:{}", errorMsg); log.error("-----第三方sso登录报错了-------:{}", errorMsg);
...@@ -462,16 +471,12 @@ public class QiDianServiceImpl implements QiDianService { ...@@ -462,16 +471,12 @@ public class QiDianServiceImpl implements QiDianService {
@Override @Override
public String logout(String account) { public String logout(String account) {
try { try {
String url = String.format(RemoteConstant.SSO_LOGOUT_API_URL, account); String url = String.format(beidouOpenapiUrl+RemoteConstant.SSO_LOGOUT_API_URL, account);
Map<String, String> headers = getSSOHeaderMap(); Map<String, String> headers = HttpUtil.getOpenApiHeaderMap(corporationId, secret);
log.info("-----第三方sso用户退出登录------url:{},headers={}", url, JSONObject.toJSONString(headers)); log.info("-----第三方sso用户退出登录------url:{},headers={}", url, JSONObject.toJSONString(headers));
String result = HttpUtil.httpGet(url, headers); String result = HttpUtil.httpGet(url, headers);
log.info("-----第三方sso用户退出登录,result------:{}", result); log.info("-----第三方sso用户退出登录,result------:{}", result);
Map map = JSONObject.parseObject(result, Map.class); return result;
if (RemoteConstant.SSO_SUCCESS.equals(Integer.parseInt(map.get("code").toString()))) {
//todo 成功
}
return map.get("msg").toString();
} catch (Exception e) { } catch (Exception e) {
String errorMsg = e.getMessage(); String errorMsg = e.getMessage();
log.error("-----第三方sso登录报错了-------:{}", errorMsg); log.error("-----第三方sso登录报错了-------:{}", errorMsg);
...@@ -479,14 +484,5 @@ public class QiDianServiceImpl implements QiDianService { ...@@ -479,14 +484,5 @@ public class QiDianServiceImpl implements QiDianService {
} }
} }
private Map<String, String> getSSOHeaderMap() {
Map<String, String> headers = new HashMap<>();
String timestamp = DateUtils.convert(new Date(), DateUtils.YYYYMMDDHHMMSS);
headers.put("corporationId", "0");
headers.put("timestamp", timestamp);
headers.put("sign", HmacSHA256Util.getSign(timestamp));
return headers;
}
} }
...@@ -6,8 +6,6 @@ import com.github.pagehelper.PageInfo; ...@@ -6,8 +6,6 @@ import com.github.pagehelper.PageInfo;
import com.rome.order.domain.enums.ResponseMsg; import com.rome.order.domain.enums.ResponseMsg;
import com.rome.order.domain.service.OrganizationRedisService; import com.rome.order.domain.service.OrganizationRedisService;
import com.rome.order.domain.service.SyncEmployeCdpService; import com.rome.order.domain.service.SyncEmployeCdpService;
import com.rome.order.domain.util.DateUtils;
import com.rome.order.domain.util.HmacSHA256Util;
import com.rome.order.domain.util.HttpUtil; import com.rome.order.domain.util.HttpUtil;
import com.rome.order.domain.util.ParameterCheckUtils; import com.rome.order.domain.util.ParameterCheckUtils;
import com.rome.order.infrastructure.dataobject.SyncEmployeeCdpDO; import com.rome.order.infrastructure.dataobject.SyncEmployeeCdpDO;
...@@ -15,18 +13,20 @@ import com.rome.order.infrastructure.mapper.SyncEmployeeCdpMapper; ...@@ -15,18 +13,20 @@ import com.rome.order.infrastructure.mapper.SyncEmployeeCdpMapper;
import com.rome.order.infrastructure.remote.constant.QiDianOpenApiRemoteConstant; import com.rome.order.infrastructure.remote.constant.QiDianOpenApiRemoteConstant;
import com.rome.order.infrastructure.remote.constant.RemoteConstant; import com.rome.order.infrastructure.remote.constant.RemoteConstant;
import com.rome.order.infrastructure.remote.dto.req.EmpMainStaffsReqDTO; import com.rome.order.infrastructure.remote.dto.req.EmpMainStaffsReqDTO;
import com.rome.order.infrastructure.remote.dto.req.SyncCdpEmpOrgReqDTO;
import com.rome.order.infrastructure.remote.dto.res.EmpMainDataResDTO; import com.rome.order.infrastructure.remote.dto.res.EmpMainDataResDTO;
import com.rome.order.infrastructure.remote.dto.res.OrgDTO; import com.rome.order.infrastructure.remote.dto.res.OrgDTO;
import com.rome.order.infrastructure.remote.facade.UserEmployeeFacade; import com.rome.order.infrastructure.remote.facade.UserEmployeeFacade;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.*; import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
...@@ -50,6 +50,16 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService { ...@@ -50,6 +50,16 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService {
private OrganizationRedisService organizationRedisService; private OrganizationRedisService organizationRedisService;
@Value("${beidou.openapiUrl:}")
private String beidouOpenapiUrl;
@Value("${beidou.email:}")
private Boolean beidouEmail;
private String corporationId="0";
private String secret="ajdjhfwjk123";
@Override @Override
public Boolean synAllEmpCdpBase(Integer pageNum) { public Boolean synAllEmpCdpBase(Integer pageNum) {
List<OrgDTO> allOrg = organizationRedisService.getAllOrgRedis(); List<OrgDTO> allOrg = organizationRedisService.getAllOrgRedis();
...@@ -89,14 +99,9 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService { ...@@ -89,14 +99,9 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService {
@Override @Override
public String synProgress() { public String synProgress() {
try { try {
String timestamp = DateUtils.convert(new Date(), DateUtils.YYYYMMDDHHMMSS); Map<String, String> headers = HttpUtil.getOpenApiHeaderMap(corporationId, secret);
Map<String, String> headers=new HashMap<>();
headers.put("corporationId","0");
headers.put("timestamp",timestamp);
String sign = HmacSHA256Util.getSign(timestamp);
headers.put("sign",sign);
log.info("------指定某员工为企业管理员查询组织架构导入进度头部信息------:{}",JSON.toJSONString(headers)); log.info("------指定某员工为企业管理员查询组织架构导入进度头部信息------:{}",JSON.toJSONString(headers));
String result = HttpUtil.httpGet(QiDianOpenApiRemoteConstant.SYNC_PROGRESS_URL,headers); String result = HttpUtil.httpGet(beidouOpenapiUrl+QiDianOpenApiRemoteConstant.SYNC_PROGRESS_URL,headers);
log.info("----synProgress返回信息----:{}",result); log.info("----synProgress返回信息----:{}",result);
return result; return result;
} catch (Exception e) { } catch (Exception e) {
...@@ -105,6 +110,14 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService { ...@@ -105,6 +110,14 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService {
} }
} }
private Map<String,String> getEmailMap(){
List<String> employeeByEmail = syncEmployeeCdpMapper.findEmployeeByEmail();
if(CollectionUtils.isEmpty(employeeByEmail)){
return null;
}
Map<String, String> emailMap = employeeByEmail.stream().collect(Collectors.toMap(Function.identity(), Function.identity()));
return emailMap;
}
/** /**
* 同步员工数据 * 同步员工数据
...@@ -180,93 +193,121 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService { ...@@ -180,93 +193,121 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService {
List<SyncEmployeeCdpDO> employeeCdpListByUserIds = syncEmployeeCdpMapper.findEmployeeCdpListByUserIds(userIds); List<SyncEmployeeCdpDO> employeeCdpListByUserIds = syncEmployeeCdpMapper.findEmployeeCdpListByUserIds(userIds);
if(CollectionUtils.isEmpty(employeeCdpListByUserIds)){ if(CollectionUtils.isEmpty(employeeCdpListByUserIds)){
//需要用户id 根据进行去重 //需要用户id 根据进行去重
empResList = empResList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getUserId()))), ArrayList::new)); // empResList = empResList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getUserId()))), ArrayList::new));
syncEmployeeCdpMapper.batchSaveEmpCdp(empResList); syncEmployeeCdpMapper.batchSaveEmpCdp(empResList);
//同步腾讯 //同步腾讯
List<EmpMainStaffsReqDTO> staffs=new ArrayList<>(); this.orgSyncTecent( empResList, orgDTOMap);
for (EmpMainDataResDTO empMainDataResDTO: empResList) { }else{
EmpMainStaffsReqDTO empMainStaffsReqDTO=new EmpMainStaffsReqDTO(); //批量添加
//获取部门编码 ,根据部门编码去获取部门详细信息 List<EmpMainDataResDTO> batchAdd=new ArrayList<>();
String departmentCode = empMainDataResDTO.getDepartmentCode(); Map<Long, SyncEmployeeCdpDO> empMainMap = employeeCdpListByUserIds.stream().collect(Collectors.toMap(SyncEmployeeCdpDO::getUserId, Function.identity()));
if(!CollectionUtils.isEmpty(orgDTOMap)&&orgDTOMap.containsKey(departmentCode)){ for (EmpMainDataResDTO empResDTO: empResList) {
List<OrgDTO> orgDTOList = orgDTOMap.get(departmentCode); Long userId = empResDTO.getUserId();
OrgDTO orgDTO = orgDTOList.get(0); if(!empMainMap.containsKey(userId)){
List<String> fullDeptNames=new ArrayList<>(); batchAdd.add(empResDTO);
String name = orgDTO.getName(); }
fullDeptNames.add(name); }
//不断的查询上级部门,并获取部门名称,直到为空, if(!CollectionUtils.isEmpty(batchAdd)){
String parentDepartmentCode = orgDTO.getParentDepartmentCode(); syncEmployeeCdpMapper.batchSaveEmpCdp(batchAdd);
for (int i = 0; i <1000; i++) { //同步腾讯
//不断的去查询父级 this.orgSyncTecent( empResList, orgDTOMap);
if(orgDTOMap.containsKey(parentDepartmentCode)){ }
List<OrgDTO> orgDTOtTempList = orgDTOMap.get(parentDepartmentCode); }
OrgDTO orgDTOTemp = orgDTOtTempList.get(0); }
String parentDeptName = orgDTOTemp.getName();
//替换原来 /**
parentDepartmentCode=orgDTOTemp.getParentDepartmentCode(); * 同步组织架构到腾讯
if(StringUtils.isEmpty(parentDepartmentCode)){ * @param empResList
break; */
} private void orgSyncTecent( List<EmpMainDataResDTO> empResList,Map<String, List<OrgDTO>> orgDTOMap){
//同步腾讯
List<EmpMainStaffsReqDTO> staffs=new ArrayList<>();
for (EmpMainDataResDTO empMainDataResDTO: empResList) {
EmpMainStaffsReqDTO empMainStaffsReqDTO=new EmpMainStaffsReqDTO();
//获取部门编码 ,根据部门编码去获取部门详细信息
String departmentCode = empMainDataResDTO.getDepartmentCode();
if(!CollectionUtils.isEmpty(orgDTOMap)&&orgDTOMap.containsKey(departmentCode)){
List<OrgDTO> orgDTOList = orgDTOMap.get(departmentCode);
OrgDTO orgDTO = orgDTOList.get(0);
List<String> fullDeptNames=new ArrayList<>();
String name = orgDTO.getName();
fullDeptNames.add(name);
//不断的查询上级部门,并获取部门名称,直到为空,
String parentDepartmentCode = orgDTO.getParentDepartmentCode();
for (int i = 0; i <1000; i++) {
//不断的去查询父级
if(orgDTOMap.containsKey(parentDepartmentCode)){
List<OrgDTO> orgDTOtTempList = orgDTOMap.get(parentDepartmentCode);
OrgDTO orgDTOTemp = orgDTOtTempList.get(0);
String parentDeptName = orgDTOTemp.getName();
//替换原来
parentDepartmentCode=orgDTOTemp.getParentDepartmentCode();
if(StringUtils.isEmpty(parentDepartmentCode)){
fullDeptNames.add(parentDeptName); fullDeptNames.add(parentDeptName);
break;
} }
} fullDeptNames.add(parentDeptName);
if(!CollectionUtils.isEmpty(fullDeptNames)){
Collections.reverse(fullDeptNames);
String fullDeptName = fullDeptNames.stream().map(String::valueOf).collect(Collectors.joining("/"));
empMainStaffsReqDTO.setFullDeptName(fullDeptName);
} }
} }
empMainStaffsReqDTO.setAccountId(empMainDataResDTO.getUserId()+""); if(!CollectionUtils.isEmpty(fullDeptNames)){
empMainStaffsReqDTO.setAccountName(empMainDataResDTO.getName()); Collections.reverse(fullDeptNames);
empMainStaffsReqDTO.setEmail(empMainDataResDTO.getCompanyEmail()); //员工对应所有部门信息
staffs.add(empMainStaffsReqDTO); String fullDeptName = fullDeptNames.stream().map(String::valueOf).collect(Collectors.joining("/"));
} empMainStaffsReqDTO.setFullDeptName(fullDeptName);
String result = this.syncCdpEmpOrg(staffs); empMainDataResDTO.setDepartmentAll(fullDeptName);
//成功标识
Boolean successFlag=false;
String errMsg="";
if(StringUtils.isNotBlank(result)){
Map map = JSONObject.parseObject(result, Map.class);
if (Objects.nonNull(map.get("status"))) {
Object statusObj = map.get("status");
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(statusObj));
String code = jsonObject.getString("code");
String message=jsonObject.getString("message");
//返回为1 表示成功
if(RemoteConstant.CODE.equals(code)){
successFlag=true;
}else{
//其他的表示失败
errMsg=message;
}
} }
} }
//整个批次成功 empMainStaffsReqDTO.setAccountId(empMainDataResDTO.getUserId()+"");
if(successFlag){ empMainStaffsReqDTO.setAccountName(empMainDataResDTO.getName());
empResList.forEach(s->{ //判断数据库中对应的邮箱是否存在
s.setIsSyncEmployee(RemoteConstant.IS_SYNC_EMPLOYEE_SUCCESS); String companyEmail = empMainDataResDTO.getCompanyEmail();
}); if(beidouEmail){
empMainStaffsReqDTO.setEmail(companyEmail);
}else{ }else{
for (EmpMainDataResDTO s: empResList) { empMainStaffsReqDTO.setEmail(null);
s.setIsSyncEmployee(RemoteConstant.IS_SYNC_EMPLOYEE_FAIL); }
s.setErrorMsg(errMsg); staffs.add(empMainStaffsReqDTO);
}
String result = this.syncCdpEmpOrg(staffs);
//成功标识
Boolean successFlag=false;
String errMsg="";
if(StringUtils.isNotBlank(result)){
Map map = JSONObject.parseObject(result, Map.class);
if (Objects.nonNull(map.get("status"))) {
Object statusObj = map.get("status");
JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(statusObj));
String code = jsonObject.getString("code");
String message=jsonObject.getString("message");
//返回为1 表示成功
if(RemoteConstant.CODE.equals(code)){
successFlag=true;
}else{
//其他的表示失败
errMsg=message;
} }
} }
} }
//整个批次成功
if(successFlag){
empResList.forEach(s->{
s.setIsSyncEmployee(RemoteConstant.IS_SYNC_EMPLOYEE_SUCCESS);
});
}else{
for (EmpMainDataResDTO s: empResList) {
s.setIsSyncEmployee(RemoteConstant.IS_SYNC_EMPLOYEE_FAIL);
s.setErrorMsg(errMsg);
}
}
syncEmployeeCdpMapper.batchUpdateEmpCdp(empResList);
} }
private String orgSetAdminAccountId(String accountId){ private String orgSetAdminAccountId(String accountId){
try { try {
log.info("-----指定某员工为企业管理员/api/dataauth/authserver/openapi/org/set/admin入参信息----:{}",accountId); log.info("-----指定某员工为企业管理员/api/dataauth/authserver/openapi/org/set/admin入参信息----:{}",accountId);
String timestamp = DateUtils.convert(new Date(), DateUtils.YYYYMMDDHHMMSS); Map<String, String> headers = HttpUtil.getOpenApiHeaderMap(corporationId, secret);
Map<String, String> headers=new HashMap<>();
headers.put("corporationId","0");
headers.put("timestamp",timestamp);
String sign = HmacSHA256Util.getSign(timestamp);
headers.put("sign",sign);
log.info("------指定某员工为企业管理员/api/dataauth/authserver/openapi/org/set/admin头部信息------:{}",JSON.toJSONString(headers)); log.info("------指定某员工为企业管理员/api/dataauth/authserver/openapi/org/set/admin头部信息------:{}",JSON.toJSONString(headers));
String result = HttpUtil.httpGet(QiDianOpenApiRemoteConstant.SET_ADMIN_ACCOUNT_URL+accountId,headers); String result = HttpUtil.httpGet(beidouOpenapiUrl+QiDianOpenApiRemoteConstant.SET_ADMIN_ACCOUNT_URL+accountId,headers);
log.info("----orgSetAdminAccountId返回信息----:{}",result); log.info("----orgSetAdminAccountId返回信息----:{}",result);
return result; return result;
} catch (Exception e) { } catch (Exception e) {
...@@ -281,16 +322,13 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService { ...@@ -281,16 +322,13 @@ public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService {
*/ */
private String syncCdpEmpOrg(List<EmpMainStaffsReqDTO> staffs){ private String syncCdpEmpOrg(List<EmpMainStaffsReqDTO> staffs){
try { try {
String bodyStr = JSON.toJSONString(staffs); SyncCdpEmpOrgReqDTO syncCdpEmpOrgReqDTO=new SyncCdpEmpOrgReqDTO();
syncCdpEmpOrgReqDTO.setStaffs(staffs);
String bodyStr = JSON.toJSONString(syncCdpEmpOrgReqDTO);
log.info("-----同步导入组织架构和人员信息到企点/api/dataauth/authserver/openapi/org/sync入参信息----:{}",bodyStr); log.info("-----同步导入组织架构和人员信息到企点/api/dataauth/authserver/openapi/org/sync入参信息----:{}",bodyStr);
String timestamp = DateUtils.convert(new Date(), DateUtils.YYYYMMDDHHMMSS); Map<String, String> headers = HttpUtil.getOpenApiHeaderMap(corporationId, secret);
Map<String, String> headers=new HashMap<>();
headers.put("corporationId","0");
headers.put("timestamp",timestamp);
String sign = HmacSHA256Util.getSign(timestamp);
headers.put("sign",sign);
log.info("------同步导入组织架构和人员信息到企点/api/dataauth/authserver/openapi/org/sync头部信息------:{}",JSON.toJSONString(headers)); log.info("------同步导入组织架构和人员信息到企点/api/dataauth/authserver/openapi/org/sync头部信息------:{}",JSON.toJSONString(headers));
String result = HttpUtil.httpPost(QiDianOpenApiRemoteConstant.ORG_SYNC_URL, bodyStr,headers); String result = HttpUtil.httpPost(beidouOpenapiUrl+QiDianOpenApiRemoteConstant.ORG_SYNC_URL, bodyStr,headers);
log.info("----syncCdpEmpOrg返回信息----:{}",result); log.info("----syncCdpEmpOrg返回信息----:{}",result);
return result; return result;
} catch (Exception e) { } catch (Exception e) {
......
...@@ -359,6 +359,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils { ...@@ -359,6 +359,14 @@ public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
return new SimpleDateFormat(dateFormat).format(date); return new SimpleDateFormat(dateFormat).format(date);
} }
/**
* 获取时间搓
* @return
*/
public static String getUnixTimestamp() {
return String.valueOf(System.currentTimeMillis()/1000);
}
/** /**
* 推荐使用 getFormatDateTime(Object date) * 推荐使用 getFormatDateTime(Object date)
* *
......
...@@ -71,10 +71,9 @@ public class HmacSHA256Util { ...@@ -71,10 +71,9 @@ public class HmacSHA256Util {
* 获取请求头sign * 获取请求头sign
* @return * @return
*/ */
public static String getSign(String timestamp){ public static String getSign(String secret,String message){
try { try {
String enterpriseId = "0"; String str = HmacSHA256Util.hmacSHA256(secret, message);
String str = HmacSHA256Util.hmacSHA256(enterpriseId, timestamp);
String encodeStr = Base64.encodeBase64String(str.getBytes()); String encodeStr = Base64.encodeBase64String(str.getBytes());
return encodeStr; return encodeStr;
} catch (Exception e) { } catch (Exception e) {
......
...@@ -16,6 +16,7 @@ import org.apache.http.protocol.HTTP; ...@@ -16,6 +16,7 @@ import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils; import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
...@@ -178,4 +179,18 @@ public class HttpUtil { ...@@ -178,4 +179,18 @@ public class HttpUtil {
} }
} }
public static Map<String, String> getOpenApiHeaderMap(String corporationId,String secret) {
Map<String, String> headers = new HashMap<>();
String timestamp=DateUtils.getUnixTimestamp();
headers.put("corporationId", corporationId);
headers.put("timestamp", timestamp);
String sign = SignUtil.getSign(corporationId,secret,timestamp);
headers.put("sign", sign);
return headers;
}
} }
package com.rome.order.domain.util;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import sun.misc.BASE64Encoder;
/**
* @Author: zhoupeng
* @createTime: 2023年08月31日 11:49:01
* @version: 1.0
* @Description:
* @copyright:
*/
public class SignUtil {
private static final String SHA265 = "HmacSHA256";
private static final String SHA1 = "HmacSHA1";
/**
* 将加密后的字节数组转换成字符串
*
* @param b 字节数组
* @return 字符串
*/
private static String byteArrayToHexString(byte[] b) {
StringBuilder hs = new StringBuilder();
String stmp;
for (int n = 0; b != null && n < b.length; n++) {
stmp = Integer.toHexString(b[n] & 0XFF);
if (stmp.length() == 1) {
hs.append('0');
}
hs.append(stmp);
}
return hs.toString().toLowerCase();
}
/**
* sha256_HMAC加密
*
* @param source 消息
* @param secret 秘钥
* @param signatureMethod 加密类型
* @return 加密后字符串-base64
*/
private static byte[] sign(String source, String secret, String signatureMethod) {
byte[] bytes = {};
try {
Mac sha256HMAC = Mac.getInstance(signatureMethod);
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), signatureMethod);
sha256HMAC.init(secretKey);
bytes = sha256HMAC.doFinal(source.getBytes());
} catch (Exception e) {
System.out.println("sign error ===========" + e.getMessage());
}
return bytes;
}
// HmacSHA256加密,base64编码
public static String signToBase64BySHA256(String source, String secret) {
byte[] hmacSHA256Bytes = sign(source, secret, SHA265);
return new BASE64Encoder().encode(hmacSHA256Bytes);
}
// HmacSHA256加密,hex编码
public static String signToBaseHexBySHA256(String source, String secret) {
byte[] hmacSHA256Bytes = sign(source, secret, SHA265);
return byteArrayToHexString(hmacSHA256Bytes);
}
public static String getSign(String tenantId,String secret,String timestamp){
String sign = signToBase64BySHA256(tenantId + timestamp, secret);
return sign;
}
public static void main(String[] args) {
String tenantId = "0";
long timestamp = System.currentTimeMillis() / 1000;
System.out.println(timestamp);
String s = signToBase64BySHA256(tenantId + timestamp, "cdpentity123");
System.out.println(s);
}
}
...@@ -52,10 +52,6 @@ public class SyncEmployeeCdpDO { ...@@ -52,10 +52,6 @@ public class SyncEmployeeCdpDO {
private String name; private String name;
/**
* 性别:1-男,2-女
*/
private Integer gender;
/** /**
...@@ -70,17 +66,6 @@ public class SyncEmployeeCdpDO { ...@@ -70,17 +66,6 @@ public class SyncEmployeeCdpDO {
private String departmentName; private String departmentName;
/**
* 手机号
*/
private String mobile;
/**
* 电话号
*/
private String phone;
/** /**
......
...@@ -26,6 +26,12 @@ public interface SyncEmployeeCdpMapper { ...@@ -26,6 +26,12 @@ public interface SyncEmployeeCdpMapper {
*/ */
int batchSaveEmpCdp(@Param("empList") List<EmpMainDataResDTO> empList); int batchSaveEmpCdp(@Param("empList") List<EmpMainDataResDTO> empList);
/**
* 批量修改同步员工状态信息
* @param empList
* @return
*/
int batchUpdateEmpCdp(@Param("empList") List<EmpMainDataResDTO> empList);
/** /**
* 根据同步的员工号获取员工信息 * 根据同步的员工号获取员工信息
...@@ -35,4 +41,12 @@ public interface SyncEmployeeCdpMapper { ...@@ -35,4 +41,12 @@ public interface SyncEmployeeCdpMapper {
*/ */
List<SyncEmployeeCdpDO> findEmployeeCdpListByUserIds(@Param("userIds") List<Long> userIds); List<SyncEmployeeCdpDO> findEmployeeCdpListByUserIds(@Param("userIds") List<Long> userIds);
/**
* 查询所有的邮箱
* @param
* @return
*/
List<String> findEmployeeByEmail();
} }
package com.rome.order.infrastructure.remote.dto.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
* @Author: zhoupeng
* @createTime: 2023年08月31日 13:41:06
* @version: 1.0
* @Description:
* @copyright:
*/
@Data
public class SyncCdpEmpOrgReqDTO {
@ApiModelProperty(value = "导入企业组织架构信息")
List<EmpMainStaffsReqDTO> staffs;
}
...@@ -153,6 +153,7 @@ public class EmpMainDataResDTO { ...@@ -153,6 +153,7 @@ public class EmpMainDataResDTO {
@ApiModelProperty(value = "是否停用员工 0-企点正常激活 1-企点停用") @ApiModelProperty(value = "是否停用员工 0-企点正常激活 1-企点停用")
private Integer isDisable; private Integer isDisable;
@ApiModelProperty(value = "对应的所有部门")
private String departmentAll;
} }
...@@ -61,36 +61,36 @@ elasticjob: ...@@ -61,36 +61,36 @@ elasticjob:
elasticJobClass: com.rome.order.domain.task.SynByStartDateEmpBaseJob elasticJobClass: com.rome.order.domain.task.SynByStartDateEmpBaseJob
cron: 0 0 0/1 * * ? cron: 0 0 0/1 * * ?
shardingTotalCount: 1 shardingTotalCount: 1
SynFailEmployeeJob: # SynFailEmployeeJob:
shardingItemParameters: 0=0 # shardingItemParameters: 0=0
elasticJobClass: com.rome.order.domain.task.SynFailEmployeeJob # elasticJobClass: com.rome.order.domain.task.SynFailEmployeeJob
cron: 0 0/30 * * * ? # cron: 0 0/30 * * * ?
shardingTotalCount: 1 # shardingTotalCount: 1
SyncAllOrgJob: # SyncAllOrgJob:
shardingItemParameters: 0=0 # shardingItemParameters: 0=0
elasticJobClass: com.rome.order.domain.task.SyncAllOrgJob # elasticJobClass: com.rome.order.domain.task.SyncAllOrgJob
cron: 0 0 23 * * ? # cron: 0 0 23 * * ?
shardingTotalCount: 1 # shardingTotalCount: 1
SynFailOrgJob: # SynFailOrgJob:
shardingItemParameters: 0=0 # shardingItemParameters: 0=0
elasticJobClass: com.rome.order.domain.task.SynFailOrgJob # elasticJobClass: com.rome.order.domain.task.SynFailOrgJob
cron: 0 0/30 * * * ? # cron: 0 0/30 * * * ?
shardingTotalCount: 1 # shardingTotalCount: 1
SyncProductJob: # SyncProductJob:
shardingItemParameters: 0=0 # shardingItemParameters: 0=0
elasticJobClass: com.rome.order.domain.task.SyncProductJob # elasticJobClass: com.rome.order.domain.task.SyncProductJob
cron: 0 0 23 * * ? # cron: 0 0 23 * * ?
shardingTotalCount: 1 # shardingTotalCount: 1
reg-center: reg-center:
max-sleep-time-milliseconds: 8000 max-sleep-time-milliseconds: 8000
server-lists: '10.6.5.66:2181,10.6.5.67:2181,10.6.5.68:2181' server-lists: '10.6.5.66:2181,10.6.5.67:2181,10.6.5.68:2181'
base-sleep-time-milliseconds: 8000 base-sleep-time-milliseconds: 8000
namespace: lyf-qidian-api namespace: lyf-beidou-cdp-api
rocketmq: rocketmq:
nameServer: '10.6.5.12:9876' nameServer: '10.6.5.12:9876'
defaultBigRetryNum: 30 defaultBigRetryNum: 30
producer: producer:
group: lyf-qidian-api group: lyf-beidou-cdp-api
defaultSmallRetryNum: 20 defaultSmallRetryNum: 20
eureka: eureka:
client: client:
...@@ -158,6 +158,16 @@ tsa: ...@@ -158,6 +158,16 @@ tsa:
# 腾讯广告服务地址 # 腾讯广告服务地址
remote_address: https://api.e.qq.com/v1.1/ remote_address: https://api.e.qq.com/v1.1/
#openapi接口地址
beidou:
openapiUrl: https://beidou.test.laiyifen.com
#企业ID
corporationId: 0
#密钥
secret: ajdjhfwjk123
#是否同步邮件
email: false
...@@ -10,17 +10,15 @@ ...@@ -10,17 +10,15 @@
`employee_number`, `employee_number`,
`employee_type`, `employee_type`,
`name`, `name`,
`gender`,
`department_code`, `department_code`,
`department_name`, `department_name`,
`mobile`,
`phone`,
`company_code`, `company_code`,
`company_name`, `company_name`,
`company_email`, `company_email`,
`is_sync_employee`, `is_sync_employee`,
`is_disable`, `is_disable`,
`error_msg`, `error_msg`,
`department_all`,
`creator`, `creator`,
`creator_name`, `creator_name`,
`updator`, `updator`,
...@@ -33,17 +31,15 @@ ...@@ -33,17 +31,15 @@
#{item.employeeNumber}, #{item.employeeNumber},
#{item.employeeType}, #{item.employeeType},
#{item.name}, #{item.name},
#{item.gender},
#{item.departmentCode}, #{item.departmentCode},
#{item.departmentName}, #{item.departmentName},
#{item.mobile},
#{item.phone},
#{item.companyCode}, #{item.companyCode},
#{item.companyName}, #{item.companyName},
#{item.companyEmail}, #{item.companyEmail},
#{item.isSyncEmployee}, #{item.isSyncEmployee},
#{item.isDisable}, #{item.isDisable},
#{item.errorMsg}, #{item.errorMsg},
#{item.departmentAll},
#{item.creator}, #{item.creator},
#{item.creatorName}, #{item.creatorName},
#{item.updator}, #{item.updator},
...@@ -52,7 +48,25 @@ ...@@ -52,7 +48,25 @@
</foreach> </foreach>
</insert> </insert>
<!-- 批量修改同步员工信息 -->
<update id="batchUpdateEmpCdp" parameterType="java.util.List">
<foreach close="" collection="empList" index="index" item="item" open="" separator=";">
update sync_employee_cdp
<trim prefix="set" suffixOverrides=","
suffix="where user_id=#{item.userId}">
<if test="item.isSyncEmployee != null">
`is_sync_employee`=#{item.isSyncEmployee},
</if>
<if test="item.departmentAll != null and item.departmentAll!='' ">
`department_all`=#{item.departmentAll},
</if>
<if test="item.errorMsg != null and item.errorMsg!='' ">
`error_msg`=#{item.errorMsg},
</if>
resent_number = resent_number + 1
</trim>
</foreach>
</update>
<!-- 根据同步的员工号获取员工信息 --> <!-- 根据同步的员工号获取员工信息 -->
<select id="findEmployeeCdpListByUserIds" parameterType="java.util.List" resultType="com.rome.order.infrastructure.dataobject.SyncEmployeeCdpDO"> <select id="findEmployeeCdpListByUserIds" parameterType="java.util.List" resultType="com.rome.order.infrastructure.dataobject.SyncEmployeeCdpDO">
...@@ -63,11 +77,8 @@ ...@@ -63,11 +77,8 @@
se.employee_number, se.employee_number,
se.employee_type, se.employee_type,
se.name, se.name,
se.gender,
se.department_code, se.department_code,
se.department_name, se.department_name,
se.mobile,
se.phone,
se.company_code, se.company_code,
se.company_name, se.company_name,
se.company_email, se.company_email,
...@@ -91,5 +102,12 @@ ...@@ -91,5 +102,12 @@
</if> </if>
</select> </select>
<!-- 根据邮箱号进行查询 -->
<select id="findEmployeeByEmail" resultType="java.lang.String">
SELECT
se.company_email
FROM sync_employee_cdp se
where se.is_delete = 0 and se.company_email is not null group by se.company_email
</select>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment