提交 f5994bb5 authored 作者: 000516's avatar 000516

人员上下级关系,来自飞书组织架构只修改【区域销售部】部门下员工

上级 9b57084c
package com.sfa.job.domain.qince.dao;
import com.sfa.job.pojo.qince.response.QinceEmployeeDto;
import java.util.List;
import java.util.Set;
/**
* @author : liqiulin
* @date : 2025-12-05 17
......@@ -7,6 +12,6 @@ package com.sfa.job.domain.qince.dao;
*/
public interface IQinceEmployeeDao {
String getQcIdByEmpCode(String empCode);
void userResigned(String empQcId);
List<QinceEmployeeDto> selectListByEmpcodes(Set<String> keySet);
}
......@@ -2,11 +2,17 @@ package com.sfa.job.domain.qince.dao;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.sfa.common.core.enums.qince.QinceEmpStatus;
import com.sfa.common.core.utils.bean.BeanUtils;
import com.sfa.job.domain.qince.entity.QinceEmployee;
import com.sfa.job.domain.qince.mapper.QinceEmployeeMapper;
import com.sfa.job.pojo.qince.response.QinceEmployeeDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Set;
/**
* @author : liqiulin
* @date : 2025-12-05 17
......@@ -32,4 +38,16 @@ public class QinceEmployeeDaoImpl implements IQinceEmployeeDao {
public void userResigned(String empQcId) {
qinceEmployeeMapper.userResigned(empQcId);
}
/**
* 根据code批量查询
*/
@Override
public List<QinceEmployeeDto> selectListByEmpcodes(Set<String> keySet) {
LambdaQueryWrapper<QinceEmployee> qw = new LambdaQueryWrapper<>();
qw.in(QinceEmployee::getEmpCode, keySet);
qw.in(QinceEmployee::getEmpStatus, QinceEmpStatus.NORMAL.getStatus());
List<QinceEmployee> qcEmployees = qinceEmployeeMapper.selectList(qw);
return BeanUtils.transitionDtos(qcEmployees, QinceEmployeeDto.class);
}
}
......@@ -22,6 +22,16 @@ public interface ISysUserDao {
void updateOffboardDate(String employeeNo, Date offboardDate);
/**
* @return 离职人员信息
*/
List<String> selectResignedUsers();
void updateUserLeader();
/**
* @Return key:员工工号;value:上级工号
*/
Map<String, String> selectListEmpAndLeader();
}
......@@ -45,6 +45,7 @@ public class SysUserDaoImpl implements ISysUserDao{
sysUser.setRoleName("");
sysUser.setWorkCityName(jo.getString("city"));
sysUser.setStatus(StatusType.INVALID.getType()+"");
sysUser.setLeaderFsOpenId(jo.getString("leader_user_id"));
// 根据username(工号)查询
SysUser sysUserOld = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUserName, sysUser.getUserName()));
......@@ -82,4 +83,15 @@ public class SysUserDaoImpl implements ISysUserDao{
public List<String> selectResignedUsers() {
return sysUserMapper.selectResignedUsers();
}
@Override
public void updateUserLeader() {
sysUserMapper.updateUserLeader();
}
@Override
public Map<String, String> selectListEmpAndLeader() {
List<HashMap<String, String>> empAndLeaders = sysUserMapper.selectListEmpAndLeader();
return empAndLeaders.stream().collect(Collectors.toMap(m -> m.get("user_name"), m -> m.get("leader_emp_code")));
}
}
......@@ -46,6 +46,9 @@ public class SysUser implements Serializable {
*/
private String fsUserId;
private String fsOpenId;
private String leaderFsOpenId;
private String leaderEmpCode;
private String leaderEmpName;
/**
* 用户邮箱
......
......@@ -32,6 +32,10 @@ public interface SysUserMapper extends BaseMapper<SysUser> {
List<String> selectResignedUsers();
void putById(SysUser sysUser);
void updateUserLeader();
List<HashMap<String, String>> selectListEmpAndLeader();
}
......
package com.sfa.job.pojo.qince.response;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
/**
* @author : liqiulin
* @date : 2025-12-29 17
* @describe :
*/
@Data
public class QinceEmployeeDto {
/**
* 主键id
*/
private Integer id;
/**
* 勤策的员工唯一标识
*/
private String qcId;
/**
* 来源第三方系统的员工唯一标识
*/
private String empId;
/**
* 员工登录帐号
*/
private String empCode;
/**
* 姓名
*/
private String empName;
/**
* 员工别名
*/
private String aliasName;
/**
* 人员编码
*/
private String employeeCode;
/**
* 员工手机号码
*/
private String empMobile;
/**
* 员工手机地区码
*/
private String mobileDistrictCode;
/**
* 固定电话,示例:025-68736873
*/
private String empTel;
/**
* 来源第三方系统隶属部门
*/
private String empOrgId;
/**
* 隶属部门编码
*/
private String empOrgCode;
/**
* 勤策部门唯一标识
*/
private String waiqin365OrgId;
/**
* 来源第三方系统,员工上级唯一标识
*/
private String empParentId;
/**
* 员工上级编码
*/
private String parentCode;
/**
* 勤策员工上级唯一标识
*/
private String waiqin365ParentId;
/**
* 员工账号状态。0:销户,1:正常,2:停用
*/
private String empStatus;
/**
* 手机卡绑定。0:不绑定,1:绑定
*/
private String empImsiBinding;
/**
* 勤策经销商唯一标识
*/
private String dealerId;
/**
* 经销商中文名称
*/
private String dealerName;
/**
* 创建时间
*/
private String createTime;
/**
* 修改时间
*/
private String modifyTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
......@@ -7,10 +7,7 @@ package com.sfa.job.service.qince;
*/
public interface IQinceDealerQueryService {
void updateQinceDealerInfo();
void queryCusVisitRecord();
void updateQinceStore();
}
package com.sfa.job.service.qince;
/**
* @author : liqiulin
* @date : 2025-12-29 17
* @describe :
*/
public interface IQinceEmpAndDeptService {
void syncQinceDealerInfo();
}
......@@ -2,12 +2,9 @@ package com.sfa.job.service.qince.impl;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.sfa.job.domain.feishu.dao.IQinceMarketEmployeeDao;
import com.sfa.job.domain.qince.dao.IQinceClienteleStoreDao;
import com.sfa.job.domain.system.dao.ISysDeptDao;
import com.sfa.job.domain.system.dao.ISysUserDao;
import com.sfa.job.pojo.feishu.response.QinceMarketEmployeeDto;
import com.sfa.job.pojo.qince.response.QinceClienteleStoreDto;
import com.sfa.job.service.qince.IQinceDealerQueryService;
......@@ -34,10 +31,6 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
@Autowired
private IQinceMarketEmployeeDao qinceMarketEmployeeDao;
@Autowired
private ISysDeptDao sysDeptDao;
@Autowired
private ISysUserDao sysUserDao;
@Autowired
private QinCeUtils qinCeUtils;
@Override
......@@ -50,18 +43,12 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
log.info("push qc 经销商(架构): 今日无新增/修改经销商");
return;
}
// 查询部门Map<部门编码,部门名称>,人员Map<工号,姓名>
// Map<String,String> deptMap = sysDeptDao.getDeptCodeAndNameMap();
// Map<String,String> userMap = sysUserDao.getUserNoAndNameMap();
/**
* 2. 反写勤策中的自定义字段:大区、战区
*/
for (QinceMarketEmployeeDto mDto : mDtos) {
try {
Map<String, Object> ext1 = new HashMap<>();
// String dqtq = "BM0020".equals(mDto.getDqDeptCode()) ? "北京特区" : deptMap.get(mDto.getDqDeptCode());
ext1.put("dealer_ext_key", "大区");
ext1.put("dealer_ext_value",mDto.getDqDeptName());
......@@ -73,9 +60,6 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
params.put("dealer_id", mDto.getDealerCode());
params.put("exts", Arrays.asList(ext1, ext2));
params.put("dealer_emp_code", mDto.getFEmpNo());
// params.put("dealer_manager", mDto.getFEmpName());
String url = qinCeUtils.builderUrl(QinCeUtils.MODIFY_DEALER, params);
qinCeUtils.postQC(url, params);
log.info("push qc 经销商(架构)success:{}:{}", mDto.getDealerName(), JSONObject.toJSONString(params));
......@@ -104,7 +88,7 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
String queryDate = DateUtil.yesterday().toString(DatePattern.NORM_DATE_PATTERN);
Map<String, Object> params = qinCeUtils.queryCusVisitRecordParams(queryDate);
String url = qinCeUtils.builderUrl(QinCeUtils.QUERY_CUS_VISIT_RECORD, params);
JSONArray recordsJson = qinCeUtils.postArray(url, params);
qinCeUtils.postArray(url, params);
} catch (Exception e) {
log.error("查询城市经理客户拜访失败:{}", e.getMessage());
}
......@@ -126,9 +110,6 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
List<QinceMarketEmployeeDto> mDtos = qinceMarketEmployeeDao.selectByDealerCodes(groupStores.keySet());
Map<String, QinceMarketEmployeeDto> dealerMap = mDtos.stream().collect(Collectors.toMap(dto -> dto.getDealerCode(), dto -> dto));
// Map<String,String> deptMap = sysDeptDao.getDeptCodeAndNameMap();
// Map<String,String> userMap = sysUserDao.getUserNoAndNameMap();
for (Map.Entry<String, List<QinceClienteleStoreDto>> storesEntry : groupStores.entrySet()) {
QinceMarketEmployeeDto mDto = dealerMap.get(storesEntry.getKey());
if (mDto == null){
......@@ -136,7 +117,6 @@ public class QinceDealerQueryServiceImpl implements IQinceDealerQueryService {
continue;
}
List<QinceClienteleStoreDto> stores = storesEntry.getValue();
// String dqtq = "BM0020".equals(mDto.getDqDeptCode()) ? "北京特区" : deptMap.get(mDto.getDqDeptCode());
pushQinceStoreInfo(stores, mDto);
log.info("push qc 终端(架构/负责人)success:{}:{}", mDto.getDealerName(),stores.size());
}
......
package com.sfa.job.service.qince.impl;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import com.sfa.common.core.utils.StringUtils;
import com.sfa.common.core.utils.sdk.FeiShuUtils;
import com.sfa.job.domain.qince.dao.IQinceEmployeeDao;
import com.sfa.job.domain.system.dao.ISysUserDao;
import com.sfa.job.pojo.qince.response.QinceEmployeeDto;
import com.sfa.job.service.qince.IQinceEmpAndDeptService;
import com.sfa.job.util.QinCeUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.groovy.util.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author : liqiulin
* @date : 2025-12-29 17
* @describe :
*/
@Slf4j
@Service
public class QinceEmpAndDeptServiceImpl implements IQinceEmpAndDeptService {
@Autowired
private QinCeUtils qinCeUtils;
@Autowired
private ISysUserDao sysUserDao;
@Autowired
private IQinceEmployeeDao qinceEmployeeDao;
@Override
public void syncQinceDealerInfo() {
// 查询飞书的上下级关系(仅区域销售部)
Map<String, String> empCodeAndLeader = sysUserDao.selectListEmpAndLeader();
log.info("飞书区域销售部共【{}】人", empCodeAndLeader.size());
List<QinceEmployeeDto> qinceEmployeeDtos = qinceEmployeeDao.selectListByEmpcodes(empCodeAndLeader.keySet());
Set<String> leaderCodes = new HashSet<>(empCodeAndLeader.values());
List<QinceEmployeeDto> leaderDtos = qinceEmployeeDao.selectListByEmpcodes(leaderCodes);
Map<String, String> leaderQcIdMap = leaderDtos.stream().collect(Collectors.toMap(m -> m.getEmpCode(), m -> m.getQcId()));
log.info("飞书关联勤策区域销售部共【{}】人", qinceEmployeeDtos.size());
for (QinceEmployeeDto empDto : qinceEmployeeDtos) {
String logtext;
try {
String leaderCode = empCodeAndLeader.get(empDto.getEmpCode());
String leaderQcId = leaderQcIdMap.get(leaderCode);
// 如果上级为空或上级未发生变化,则不处理
if (StringUtils.isBlank(leaderCode) || StringUtils.isBlank(leaderQcId) || leaderCode.equals(empDto.getParentCode()) ) {
continue;
}
Map<String, Object> params = qinCeUtils.putUserLeaderParams(empDto.getQcId(), leaderQcId);
String url = qinCeUtils.builderUrl(QinCeUtils.MODIFY_USER, params);
qinCeUtils.postQC(url, params);
logtext = "更新勤策【" + empDto.getEmpCode() + ":" + empDto.getEmpName() + "】的上级Leader信息【" + leaderCode + "】成功";
log.info(logtext);
} catch (Exception e) {
logtext = "更新勤策【" + empDto.getEmpCode() + ":" + empDto.getEmpName() + "】的上级Leader信息失败:" + e.getMessage();
log.error(logtext);
}
FeiShuUtils.pustRoot("https://open.feishu.cn/open-apis/bot/v2/hook/9793c485-d2a0-49bc-961e-578deb3b1912", logtext);
}
}
}
......@@ -70,8 +70,8 @@ public class DeptAndUserServiceImpl implements IDeptAndUserService {
}
insertOrUpdateUsers(users,dept.getDeptId());
}
sysUserDao.updateDeptLeader();
sysUserDao.updateUserLeader();
}
@Override
......
......@@ -98,6 +98,13 @@ public class QinCeUtils {
return params;
}
public Map<String,Object> putUserLeaderParams(String qcId,String leaderQcId){
Map<String,Object> params = new HashMap<>();
params.put("id",qcId);
params.put("waiqin365_parent_id", leaderQcId);
return params;
}
public JSONObject postQC(String url, Object params) throws Exception {
String requestBody = HttpUtil.createPost(url).contentType("application/json;charset=utf-8").header("","").body(JSONObject.toJSONString(params)).execute().body();
......
package com.sfa.job.xxljob.qince;
import com.sfa.job.service.qince.IQinceDealerQueryService;
import com.sfa.job.service.qince.IQinceEmpAndDeptService;
import com.xxl.job.core.handler.annotation.XxlJob;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -15,7 +16,9 @@ import org.springframework.stereotype.Component;
@Slf4j
public class QinceCoreTask {
@Autowired
private IQinceDealerQueryService qinceCoreService;
private IQinceDealerQueryService qinceDealerQueryService;
@Autowired
private IQinceEmpAndDeptService qinceEmpAndDeptService;
/**
* 回写勤策-经销商大区、战区信息
......@@ -24,7 +27,7 @@ public class QinceCoreTask {
@XxlJob("qince_modify_dealer")
public void qinceCoreTask() {
log.info("回写勤策-经销商大区、战区信息 start");
qinceCoreService.updateQinceDealerInfo();
qinceDealerQueryService.updateQinceDealerInfo();
log.info("回写勤策-经销商大区、战区信息 end");
}
......@@ -34,17 +37,29 @@ public class QinceCoreTask {
@XxlJob("qince_modify_store")
public void qinceCoreStore(){
log.info("回写勤策-终端详情 start");
qinceCoreService.updateQinceStore();
qinceDealerQueryService.updateQinceStore();
log.info("回写勤策-终端详情 end");
}
/**
* 同步完飞书组织架构(sync_feishu_user)
* 同步勤策t-1人员信息(qince_employee_task)
* 根据飞书上下级关系,同步勤策上下级信息
*/
@XxlJob("qince_modify_emp_leader")
public void syncQinceDealerInfo() {
log.info("同步勤策员工上下级关系 start");
qinceEmpAndDeptService.syncQinceDealerInfo();
log.info("同步勤策员工上下级关系 end");
}
/**
* 暂停开发
*/
// @XxlJob("qince_cus_visit_record")
public void queryCusVisitRecord() {
log.info("查询勤策客户拜访记录 start");
qinceCoreService.queryCusVisitRecord();
qinceDealerQueryService.queryCusVisitRecord();
log.info("查询勤策客户拜访记录 start");
}
}
......@@ -119,7 +119,22 @@
work_city_name = #{workCityName},
update_by = #{updateBy},
fs_open_id = #{fsOpenId},
leader_fs_open_id = #{leaderFsOpenId},
update_user_id = #{updateUserId}
where user_id = #{userId}
</update>
<update id="updateUserLeader">
update sys_user su1 inner join sys_user su2 on su1.leader_fs_open_id = su2.fs_open_id
set su1.leader_emp_code = su2.user_name,su1.leader_emp_name = su2.nick_name
where su1.del_flag = 0;
</update>
<select id="selectListEmpAndLeader" resultType="java.util.HashMap">
select user_name,leader_emp_code
from sys_user
where del_flag = '0'
and leader_emp_code is not null
and dept_id in (select dept_id from sys_dept where del_flag = '0' and ancestors like '1,2731,2732%')
</select>
</mapper>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论