Commit c7a4184c by zhoupeng

提交导入组织架构openapi接口

parent 01502fdc
package com.rome.order.api.controller;
import com.rome.arch.core.clientobject.Response;
import com.rome.order.domain.service.SyncEmployeCdpService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 11:13:23
* @version: 1.0
* @Description:
* @copyright:
*/
@Slf4j
@RestController
@Api(value = "新Cdp同步员工(基础信息)", tags = "新Cdp同步员工(基础信息)")
@RequestMapping(value = "/api/synEmp")
public class SyncEmployeCdpController {
@Autowired
private SyncEmployeCdpService syncEmployeCdpService;
@PostMapping("/synAllEmpCdpBase")
@ApiOperation(value = "新Cdp同步查询员工(基础信息)")
public Response<Boolean> synAllEmpCdpBase(Integer pageNum) {
return Response.builderSuccess(syncEmployeCdpService.synAllEmpCdpBase(pageNum));
}
}
......@@ -12,4 +12,11 @@ public class RedisConstant {
*/
public static String QIDIAN_TENCENT_ACCESS_TOKEN = "qidian_tencent_access_token";
}
\ No newline at end of file
/**
* 组织架构
*/
public static final String DEPARTMENT_ORGANIZATION ="beidou_cdp_department_organization";
}
package com.rome.order.domain.service;
import com.rome.order.infrastructure.remote.dto.res.OrgDTO;
import java.util.List;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 17:31:40
* @version: 1.0
* @Description:
* @copyright:
*/
public interface OrganizationRedisService {
/**
* 批量添加组织机构信息并进行缓存
*
* @return
*/
Boolean synAllOrgRedis();
/**
* 从redis中获取组织机构
* @return
*/
List<OrgDTO> getAllOrgRedis();
}
package com.rome.order.domain.service;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 11:16:36
* @version: 1.0
* @Description:
* @copyright:
*/
public interface SyncEmployeCdpService {
/**
* 同步查询员工(基础信息) -(工单系统等)
*/
Boolean synAllEmpCdpBase(Integer pageNum);
}
package com.rome.order.domain.service.impl;
import com.alibaba.fastjson.JSON;
import com.rome.order.domain.constant.BaseConstant;
import com.rome.order.domain.constant.RedisConstant;
import com.rome.order.domain.service.OrganizationRedisService;
import com.rome.order.domain.util.PageInfo;
import com.rome.order.domain.util.RedisService;
import com.rome.order.infrastructure.remote.dto.res.OrgDTO;
import com.rome.order.infrastructure.remote.facade.OrganizationFacade;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 17:32:32
* @version: 1.0
* @Description:
* @copyright:
*/
@Service
@Slf4j
public class OrganizationRedisServiceImpl implements OrganizationRedisService {
@Autowired
private RedisService redisService;
@Resource
private OrganizationFacade organizationFacade;
@Override
public Boolean synAllOrgRedis() {
Object object = redisService.getValue(RedisConstant.DEPARTMENT_ORGANIZATION);
if(object!=null){
//先从redis进行删除
redisService.delete(RedisConstant.DEPARTMENT_ORGANIZATION);
}
List<OrgDTO> orgDTOList = this.getRemoteOrgCdpList();
if(!CollectionUtils.isEmpty(orgDTOList)){
// 组织机构存缓存(1天)
redisService.setValue(RedisConstant.DEPARTMENT_ORGANIZATION, JSON.toJSONString(orgDTOList),86400L);
}
return true;
}
@Override
public List<OrgDTO> getAllOrgRedis() {
List<OrgDTO> organizationRedisDTOS = new ArrayList<>();
Object cacheObject = redisService.getValue(RedisConstant.DEPARTMENT_ORGANIZATION);
if (Objects.nonNull(cacheObject)) {
organizationRedisDTOS = JSON.parseArray(cacheObject.toString(), OrgDTO.class);
}else{
organizationRedisDTOS = this.getRemoteOrgCdpList();
if(!CollectionUtils.isEmpty(organizationRedisDTOS)){
// 组织机构存缓存(1天)
redisService.setValue(RedisConstant.DEPARTMENT_ORGANIZATION, JSON.toJSONString(organizationRedisDTOS),86400L);
}
return organizationRedisDTOS;
}
return organizationRedisDTOS;
}
/**
* 远程-获取到所有组织架构信息
*/
public List<OrgDTO> getRemoteOrgCdpList() {
// 分页获取全量数据
int pageNum = BaseConstant.ONE;
int pageSize = BaseConstant.PAGE_SIZE;
List<OrgDTO> allList = new ArrayList<>();
log.info("------synAllOrg()------getRemoteOrgList全量同步开始-------");
while (true) {
PageInfo<OrgDTO> pageList = organizationFacade.getOrgPageList(pageNum, pageSize);
if (pageList == null) {
log.info("------synAllOrg()----getRemoteOrgList全量同步结束-------");
break;
}
List<OrgDTO> orgList = pageList.getList();
if (CollectionUtils.isEmpty(orgList)) {
log.info("-----synAllOrg()------getRemoteOrgList全量同步结束-------");
break;
} else {
// 处理同步的公司信息
allList.addAll(orgList);
if (orgList.size() < pageSize) {
log.info("-------synAllOrg()-------getRemoteOrgList全量同步结束-------");
break;
}
}
pageNum++;
}
return allList;
}
}
package com.rome.order.domain.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.github.pagehelper.PageInfo;
import com.rome.order.domain.service.OrganizationRedisService;
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.infrastructure.dataobject.SyncEmployeeCdpDO;
import com.rome.order.infrastructure.mapper.SyncEmployeeCdpMapper;
import com.rome.order.infrastructure.remote.constant.QiDianOpenApiRemoteConstant;
import com.rome.order.infrastructure.remote.constant.RemoteConstant;
import com.rome.order.infrastructure.remote.dto.req.EmpMainStaffsReqDTO;
import com.rome.order.infrastructure.remote.dto.res.EmpMainDataResDTO;
import com.rome.order.infrastructure.remote.dto.res.OrgDTO;
import com.rome.order.infrastructure.remote.facade.UserEmployeeFacade;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 11:17:15
* @version: 1.0
* @Description:
* @copyright:
*/
@Service
@Slf4j
public class SyncEmployeCdpServiceImpl implements SyncEmployeCdpService {
@Autowired
private UserEmployeeFacade userEmployeeFacade;
@Resource
private SyncEmployeeCdpMapper syncEmployeeCdpMapper;
@Autowired
private OrganizationRedisService organizationRedisService;
@Override
public Boolean synAllEmpCdpBase(Integer pageNum) {
List<OrgDTO> allOrg = organizationRedisService.getAllOrgRedis();
//全量同步员工数据
return this.synEmpCdp(null,pageNum,1,allOrg);
}
/**
* 同步员工数据
*/
private Boolean synEmpCdp(String startDate,Integer pageParamNum, Integer status, List<OrgDTO> allOrg) {
try {
//转换成Map
Map<String, List<OrgDTO>> orgDTOMap = this.getOrgDTOMap(allOrg);
// 分页获取全量数据
int pageNum = 1;
if(pageParamNum!=null){
pageNum=pageParamNum;
}
int pageSize = 100;
log.info("------synAllEmpCdp全量同步开始-------");
while (true) {
PageInfo<EmpMainDataResDTO> empResDTOPageInfo = userEmployeeFacade.syncEmpBase(pageNum, pageSize, startDate, status);
if(empResDTOPageInfo==null){
log.info("------synAllEmpCdp全量同步结束-------");
break;
}
List<EmpMainDataResDTO> empResList = empResDTOPageInfo.getList();
if(CollectionUtils.isEmpty(empResList)){
log.info("------synAllEmpCdp全量同步结束-------");
break;
}
// 处理同步的员工信息
this.dealthEmpCdpList(empResList,orgDTOMap);
if(empResList.size()<pageSize){
// 处理同步的员工信息
log.info("------synAllEmpCdp全量同步结束-------");
break;
}
pageNum ++;
}
log.info("------synAllEmpCdp全量同步结束-------");
return true;
} catch (Exception e) {
log.error("------synAllEmpCdp出现异常-----");
e.printStackTrace();
return false;
}
}
/**
* 获取对应的部门信息,类似于根据部门code去获取部门详情信息
* @param allOrg
* @return
*/
private Map<String, List<OrgDTO>> getOrgDTOMap(List<OrgDTO> allOrg) {
Map<String, List<OrgDTO>> orgMap = allOrg.stream().collect(
Collectors.groupingBy(a -> a.getCode()));
return orgMap;
}
/**
* 处理同步的员工信息
* @param empResList
*/
private void dealthEmpCdpList(List<EmpMainDataResDTO> empResList, Map<String, List<OrgDTO>> orgDTOMap){
empResList.forEach(s->{
s.setCreator(-1);
s.setCreatorName("system");
s.setIsDisable(0);
s.setUpdator(-1);
s.setUpdatorName("system");
});
//根据用户员工号进行查询
List<Long> userIds= empResList.parallelStream().filter(emp -> emp.getUserId() != null)
.map(EmpMainDataResDTO::getUserId).distinct().collect(Collectors.toList());
List<SyncEmployeeCdpDO> employeeCdpListByUserIds = syncEmployeeCdpMapper.findEmployeeCdpListByUserIds(userIds);
if(CollectionUtils.isEmpty(employeeCdpListByUserIds)){
//需要用户id 根据进行去重
empResList = empResList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getUserId()))), ArrayList::new));
syncEmployeeCdpMapper.batchSaveEmpCdp(empResList);
//同步腾讯
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)){
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()+"");
empMainStaffsReqDTO.setAccountName(empMainDataResDTO.getName());
empMainStaffsReqDTO.setEmail(empMainDataResDTO.getCompanyEmail());
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);
}
}
}
}
/**
* 同步导入组织架构和人员信息到企点
* @param staffs
*/
private String syncCdpEmpOrg(List<EmpMainStaffsReqDTO> staffs){
try {
String bodyStr = JSON.toJSONString(staffs);
log.info("-----同步导入组织架构和人员信息到企点/api/dataauth/authserver/openapi/org/sync入参信息----:{}",bodyStr);
String timestamp = DateUtils.convert(new Date(), DateUtils.YYYYMMDDHHMMSS);
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));
String result = HttpUtil.httpPost(QiDianOpenApiRemoteConstant.ORG_SYNC_URL, bodyStr,headers);
return result;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
......@@ -61,6 +61,26 @@ public class HttpUtil {
}
}
public static String httpPost(String url, String jsonStr,Map<String, String> headers) {
try {
HttpClient httpClient = HttpClientBuilder.create().build();
HttpPost httpPost = new HttpPost(url);
httpPost.addHeader(HTTP.CONTENT_TYPE, CONTENT_TYPE_VAL);
for (String key : headers.keySet()) {
httpPost.setHeader(key, headers.get(key));
}
StringEntity stringEntity = new StringEntity(jsonStr, UTF_8);
httpPost.setEntity(stringEntity);
HttpResponse response = httpClient.execute(httpPost);
return EntityUtils.toString(response.getEntity());
} catch (Exception e) {
log.error("http POST请求异常:", e);
throw new TradeException(RomeExceptionEnum.HTTP_ERROR);
}
}
public static String httpPost(String url) {
try {
HttpClient httpClient = HttpClientBuilder.create().build();
......
package com.rome.order.infrastructure.dataobject;
import lombok.Data;
import java.util.Date;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 10:38:02
* @version: 1.0
* @Description: 新的同步员工基础信息
* @copyright:
*/
@Data
public class SyncEmployeeCdpDO {
/**
* 主键id
*/
private Long id;
/**
* 同步来伊份用户id
*/
private Long userId;
/**
* 员工状态字段
*/
private String erPersonStatus;
/**
* 员工工号
*/
private String employeeNumber;
/**
* 员工类型
*/
private String employeeType;
/**
* 员工姓名
*/
private String name;
/**
* 性别:1-男,2-女
*/
private Integer gender;
/**
* 部门编码
*/
private String departmentCode;
/**
* 部门名称
*/
private String departmentName;
/**
* 手机号
*/
private String mobile;
/**
* 电话号
*/
private String phone;
/**
* 公司编码
*/
private String companyCode;
/**
* 公司名称
*/
private String companyName;
/**
* 公司邮箱
*/
private String companyEmail;
/**
* 是否同步创建员工 0-失败 1-成功
*/
private Integer isSyncEmployee;
/**
* 是否停用员工 0-企点正常激活 1-企点停用
*/
private Integer isDisable;
/**
* 错误信息
*/
private String errorMsg;
/**
* 创建人
*/
private Integer creator;
/**
* 创建人名称
*/
private String creatorName;
/**
* 修改时间
*/
private Date updateTime;
/**
* 修改人
*/
private Integer updater;
/**
* 修改人名称
*/
private String updaterName;
/**
* 删除标记 0-否 1是
*/
private Integer isDelete;
/**
* 重试次数(最多重试3次)
*/
private Integer resentNumber;
}
package com.rome.order.infrastructure.mapper;
import com.rome.order.infrastructure.dataobject.SyncEmployeeCdpDO;
import com.rome.order.infrastructure.remote.dto.res.EmpMainDataResDTO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 11:18:25
* @version: 1.0
* @Description:
* @copyright:
*/
@Mapper
public interface SyncEmployeeCdpMapper {
/**
* 批量添加同步员工信息
*
* @return
*/
int batchSaveEmpCdp(@Param("empList") List<EmpMainDataResDTO> empList);
/**
* 根据同步的员工号获取员工信息
*
* @param userIds
* @return
*/
List<SyncEmployeeCdpDO> findEmployeeCdpListByUserIds(@Param("userIds") List<Long> userIds);
}
package com.rome.order.infrastructure.remote.constant;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 16:04:12
* @version: 1.0
* @Description:
* @copyright:
*/
public class QiDianOpenApiRemoteConstant {
/**
* 导入组织架构openapi接口
*/
public static String ORG_SYNC_URL = "/api/dataauth/authserver/openapi/org/sync";
}
......@@ -149,4 +149,10 @@ public class RemoteConstant {
* 为空
*/
public static final String EMP = "";
/*
1-表示成功
*/
public static final String CODE="1";
}
package com.rome.order.infrastructure.remote.dto.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @Author: zhoupeng
* @createTime: 2023年08月29日 16:15:32
* @version: 1.0
* @Description:
* @copyright:
*/
@Data
public class EmpMainStaffsReqDTO {
@ApiModelProperty(value = "用户id")
private String accountId;
@ApiModelProperty(value = "用户名称")
private String accountName;
@ApiModelProperty(value = "部门名称")
private String fullDeptName;
@ApiModelProperty(value = "邮件")
private String email;
private String avatar;
}
......@@ -115,7 +115,7 @@ public class EmpMainDataResDTO {
private String staffType;
@ApiModelProperty(value = "用户id(B端)")
private Integer userId;
private Long userId;
@ApiModelProperty(value = "是否同步创建员工 0-失败 1-成功")
......@@ -154,4 +154,5 @@ public class EmpMainDataResDTO {
private Integer isDisable;
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.rome.order.infrastructure.mapper.SyncEmployeeCdpMapper">
<!-- 批量添加同步员工信息 -->
<insert id="batchSaveEmpCdp">
insert into sync_employee_cdp(
`user_id`,
`er_person_status`,
`employee_number`,
`employee_type`,
`name`,
`gender`,
`department_code`,
`department_name`,
`mobile`,
`phone`,
`company_code`,
`company_name`,
`company_email`,
`is_sync_employee`,
`is_disable`,
`error_msg`,
`creator`,
`creator_name`,
`updator`,
`updator_name`
) values
<foreach collection="empList" item="item" index="index" separator=",">
(
#{item.userId},
#{item.erPersonStatus},
#{item.employeeNumber},
#{item.employeeType},
#{item.name},
#{item.gender},
#{item.departmentCode},
#{item.departmentName},
#{item.mobile},
#{item.phone},
#{item.companyCode},
#{item.companyName},
#{item.companyEmail},
#{item.isSyncEmployee},
#{item.isDisable},
#{item.errorMsg},
#{item.creator},
#{item.creatorName},
#{item.updator},
#{item.updatorName}
)
</foreach>
</insert>
<!-- 根据同步的员工号获取员工信息 -->
<select id="findEmployeeCdpListByUserIds" parameterType="java.util.List" resultType="com.rome.order.infrastructure.dataobject.SyncEmployeeCdpDO">
SELECT
se.id,
se.user_id,
se.er_person_status,
se.employee_number,
se.employee_type,
se.name,
se.gender,
se.department_code,
se.department_name,
se.mobile,
se.phone,
se.company_code,
se.company_name,
se.company_email,
se.is_sync_employee,
se.is_disable,
se.is_sync_employee,
se.is_disable,
se.creator,
se.creator_name,
se.updator,
se.updator_name,
se.create_time,
se.update_time
FROM sync_employee_cdp se
where se.is_delete = 0
<if test="userIds != null and userIds.size() ">
and se.user_id in
<foreach collection="userIds" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</select>
</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