package com.ruoyi.system.service.impl.staff;
|
|
import com.alibaba.fastjson.JSONObject;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.ruoyi.common.core.exception.ServiceException;
|
import com.ruoyi.common.core.utils.StringUtils;
|
import com.ruoyi.common.core.utils.uuid.IdUtils;
|
import com.ruoyi.common.redis.service.RedisService;
|
import com.ruoyi.common.security.utils.SecurityUtils;
|
import com.ruoyi.system.api.constant.AppErrorConstant;
|
import com.ruoyi.system.api.constant.SecurityConstant;
|
import com.ruoyi.system.api.domain.dto.MerEditUserDto;
|
import com.ruoyi.system.api.domain.dto.MgtBaseGetDto;
|
import com.ruoyi.system.api.domain.dto.MgtShopStaffEditDto;
|
import com.ruoyi.system.api.domain.poji.sys.SysDept;
|
import com.ruoyi.system.api.domain.poji.sys.SysUser;
|
import com.ruoyi.system.api.domain.vo.MgtUserTaskMsgVo;
|
import com.ruoyi.system.api.service.RemoteShopService;
|
import com.ruoyi.system.domain.dto.MgtStaffEditDto;
|
import com.ruoyi.system.domain.dto.MgtStaffPageDto;
|
import com.ruoyi.system.domain.dto.MgtSysStaffImportDto;
|
import com.ruoyi.system.api.domain.poji.sys.SysStaff;
|
import com.ruoyi.system.domain.dto.MgtWxCPStaffDto;
|
import com.ruoyi.system.domain.vo.DeptSimpleVo;
|
import com.ruoyi.system.domain.vo.MgtDeptStaffListVo;
|
import com.ruoyi.system.domain.vo.MgtStaffPageVo;
|
import com.ruoyi.system.mapper.staff.SysStaffMapper;
|
import com.ruoyi.system.service.staff.SysStaffService;
|
import com.ruoyi.system.service.staff.SysWxCpService;
|
import com.ruoyi.system.service.sys.ISysDeptService;
|
import com.ruoyi.system.service.sys.ISysUserService;
|
import com.ruoyi.system.util.QiYeUtils;
|
import me.chanjar.weixin.common.error.WxErrorException;
|
import me.chanjar.weixin.cp.api.WxCpService;
|
import me.chanjar.weixin.cp.bean.message.WxCpMessage;
|
import me.chanjar.weixin.cp.bean.message.WxCpMessageSendResult;
|
import org.springframework.beans.factory.annotation.Qualifier;
|
import org.springframework.stereotype.Service;
|
|
import javax.annotation.Resource;
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Map;
|
import java.util.concurrent.TimeUnit;
|
import java.util.function.Function;
|
import java.util.stream.Collectors;
|
|
/**
|
* <p>
|
* 平台员工 服务实现类
|
* </p>
|
*
|
* @author jqs
|
* @since 2023-06-13
|
*/
|
@Service
|
public class SysStaffServiceImpl extends ServiceImpl<SysStaffMapper, SysStaff> implements SysStaffService {
|
|
@Resource
|
private SysStaffMapper sysStaffMapper;
|
|
@Resource
|
private ISysUserService sysUserService;
|
|
@Resource
|
private RedisService redisService;
|
|
@Resource
|
private RemoteShopService remoteShopService;
|
|
@Resource
|
private SysWxCpService sysWxCpService;
|
|
@Resource
|
private ISysDeptService sysDeptService;
|
|
@Resource
|
@Qualifier("wxService")
|
private WxCpService wxCpService;
|
|
|
/**
|
* @description 获取部门员工列表
|
* @author jqs
|
* @date 2023/6/13 10:14
|
* @param
|
* @return List<MgtDeptStaffListVo>
|
*/
|
@Override
|
public List<MgtDeptStaffListVo> listMgtDeptStaff(Long deptId,Long userId){
|
return sysStaffMapper.listMgtDeptStaff(deptId,userId);
|
}
|
|
/**
|
* @description 通过权限获取部门员工列表
|
* @author jqs
|
* @date 2023/6/21 10:24
|
* @param userId
|
* @return List<MgtDeptStaffListVo>
|
*/
|
@Override
|
public List<MgtDeptStaffListVo>listMgtDeptStaffByPermission(Long userId){
|
List<MgtDeptStaffListVo> deptStaffListVoList;
|
// 获取当前登陆人的可视权限
|
SysUser sysUser = sysUserService.selectUserById(userId);
|
// 如果当前登陆人权限是查看部门数据
|
Long deptId = null;
|
// 如果当前登陆人是查看个人数据
|
Long userId1 = null;
|
if (sysUser!=null){
|
String dataScope = sysUser.getDataScope();
|
if (!sysUser.getUserName().equals("admin")){
|
if (org.springframework.util.StringUtils.hasLength(dataScope)){
|
switch (dataScope){
|
case "3":
|
// 本部门数据 查询当前登陆人属于哪个部门 查询这个部门下所有员工关联的所有店铺
|
deptId = sysUser.getDeptId();
|
break;
|
case "5":
|
// 仅个人数据 查询当前登陆人关联店铺下的用户
|
userId1 = sysUser.getUserId();
|
break;
|
}
|
}
|
}
|
}
|
deptStaffListVoList = sysStaffMapper.listMgtDeptStaff(deptId,userId1);
|
return deptStaffListVoList;
|
}
|
|
/**
|
* @description getBYUserId
|
* @param userId
|
* @return SysStaff
|
* @author jqs34
|
* @date 2023/6/18 21:01
|
*/
|
@Override
|
public SysStaff getByUserId(Long userId){
|
LambdaQueryWrapper<SysStaff> queryWrapper = new LambdaQueryWrapper();
|
queryWrapper.eq(SysStaff::getDelFlag,0);
|
queryWrapper.eq(SysStaff::getUserId,userId);
|
return this.getOne(queryWrapper, false);
|
}
|
|
|
/**
|
* @description mgtStaffEdit
|
* @param mgtStaffEditDto
|
* @return void
|
* @author jqs34
|
* @date 2023/6/18 20:59
|
*/
|
@Override
|
public void mgtStaffEdit(MgtStaffEditDto mgtStaffEditDto){
|
SysStaff sysStaff;
|
SysUser sysUser;
|
LambdaQueryWrapper<SysStaff> queryWrapper = new LambdaQueryWrapper();
|
queryWrapper.eq(SysStaff::getDelFlag,0);
|
queryWrapper.eq(SysStaff::getStaffMobile,mgtStaffEditDto.getStaffMobile());
|
SysStaff sysStaffSame = this.getOne(queryWrapper, false);
|
SysDept sysDept = sysDeptService.selectDeptById(mgtStaffEditDto.getDeptId());
|
if(StringUtils.isBlank(mgtStaffEditDto.getStaffAvatar())){
|
mgtStaffEditDto.setStaffAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/default.png");
|
}
|
if(mgtStaffEditDto.getSysUserId()!=null){
|
if(sysStaffSame!=null&&!sysStaffSame.getUserId().equals(mgtStaffEditDto.getSysUserId())){
|
throw new ServiceException(AppErrorConstant.STAFF_MOBILE_DOUBLE);
|
}
|
sysStaff = this.getByUserId(mgtStaffEditDto.getSysUserId());
|
sysUser = sysUserService.selectUserById(mgtStaffEditDto.getSysUserId());
|
sysUser.setUserName(mgtStaffEditDto.getStaffMobile());
|
sysUser.setPhonenumber(mgtStaffEditDto.getStaffMobile());
|
sysUser.setNickName(mgtStaffEditDto.getStaffName());
|
sysUser.setAvatar(mgtStaffEditDto.getStaffAvatar());
|
sysUser.setEmail(mgtStaffEditDto.getStaffEmail());
|
sysUserService.updateOnlyUser(sysUser);
|
}else{
|
if(sysStaffSame!=null){
|
throw new ServiceException(AppErrorConstant.STAFF_MOBILE_DOUBLE);
|
}
|
sysStaff = new SysStaff();
|
String staffId = IdUtils.simpleUUID();
|
sysStaff.setStaffId(staffId);
|
sysStaff.setDelFlag(0);
|
sysUser = new SysUser();
|
sysUser.setDelFlag("0");
|
sysUser.setUserType("00");
|
sysUser.setUserName(mgtStaffEditDto.getStaffMobile());
|
sysUser.setPhonenumber(mgtStaffEditDto.getStaffMobile());
|
sysUser.setNickName(mgtStaffEditDto.getStaffName());
|
sysUser.setAvatar(mgtStaffEditDto.getStaffAvatar());
|
sysUser.setEmail(mgtStaffEditDto.getStaffEmail());
|
String password = "123456";
|
sysUser.setPassword(SecurityUtils.encryptPassword(password));
|
sysUser.setDeptId(mgtStaffEditDto.getDeptId());
|
sysUser = sysUserService.registerUser(sysUser);
|
sysStaff.setUserId(sysUser.getUserId());
|
}
|
sysStaff.setStaffName(mgtStaffEditDto.getStaffName());
|
sysStaff.setStaffMobile(mgtStaffEditDto.getStaffMobile());
|
sysStaff.setStaffEmail(mgtStaffEditDto.getStaffEmail());
|
sysStaff.setStaffPost(mgtStaffEditDto.getStaffPost());
|
sysStaff.setStaffAvatar(mgtStaffEditDto.getStaffAvatar());
|
sysStaff.setHeadFlag(mgtStaffEditDto.getHeadFlag());
|
sysStaff.setWxUserId(mgtStaffEditDto.getWxUserId());
|
this.saveOrUpdate(sysStaff);
|
//同步修改商户员工信息
|
MgtShopStaffEditDto mgtShopStaffEditDto = new MgtShopStaffEditDto();
|
mgtShopStaffEditDto.setUserId(sysStaff.getUserId());
|
mgtShopStaffEditDto.setStaffName(sysStaff.getStaffName());
|
mgtShopStaffEditDto.setStaffMobile(sysStaff.getStaffMobile());
|
mgtShopStaffEditDto.setStaffAvatar(sysStaff.getStaffAvatar());
|
remoteShopService.editMgtShopStaff(mgtShopStaffEditDto);
|
//如果wxUserId和wxDeptId不为空 同步到企业微信
|
if(sysStaff.getWxUserId()!=null&&sysDept.getWxDeptId()!=null){
|
log.debug("同步员工到企业微信:"+mgtStaffEditDto.getStaffName());
|
MgtWxCPStaffDto mgtWxCPStaffDto = new MgtWxCPStaffDto();
|
mgtWxCPStaffDto.setWxDeptId(sysDept.getWxDeptId());
|
mgtWxCPStaffDto.setWxUserId(mgtStaffEditDto.getWxUserId());
|
mgtWxCPStaffDto.setStaffName(mgtStaffEditDto.getStaffName());
|
mgtWxCPStaffDto.setStaffMobile(mgtStaffEditDto.getStaffMobile());
|
mgtWxCPStaffDto.setStaffPost(mgtStaffEditDto.getStaffPost());
|
mgtWxCPStaffDto.setStaffEmail(mgtStaffEditDto.getStaffEmail());
|
mgtWxCPStaffDto.setHeadFlag(mgtStaffEditDto.getHeadFlag());
|
sysWxCpService.addWxCpStaff(mgtWxCPStaffDto);
|
}
|
}
|
|
/**
|
* @description mgtDeleteStaff
|
* @param mgtBaseGetDto
|
* @return void
|
* @author jqs34
|
* @date 2023/6/18 22:00
|
*/
|
@Override
|
public void mgtDeleteStaff(MgtBaseGetDto mgtBaseGetDto){
|
Long userId = Long.valueOf(mgtBaseGetDto.getId());
|
SysStaff sysStaff = this.getByUserId(userId);
|
sysStaff.setDelFlag(1);
|
sysStaff.setStaffMobile(sysStaff.getStaffMobile()+":已删除");
|
this.saveOrUpdate(sysStaff);
|
sysUserService.deleteUserById(userId);
|
}
|
|
/**
|
* @description
|
* @author jqs
|
* @date 2023/6/25 17:52
|
* @param page
|
* @param mgtStaffPageDto
|
* @return List<MgtStaffPageVo>
|
*/
|
@Override
|
public List<MgtStaffPageVo> pageMgtStaff(Page page, MgtStaffPageDto mgtStaffPageDto){
|
return sysStaffMapper.pageMgtStaff(page, mgtStaffPageDto);
|
}
|
|
/**
|
* @description
|
* @author jqs
|
* @date 2023/7/14 9:52
|
* @param mobile
|
* @return SysStaff
|
*/
|
@Override
|
public SysStaff getByMobile(String mobile){
|
LambdaQueryWrapper<SysStaff> queryWrapper = new LambdaQueryWrapper();
|
queryWrapper.eq(SysStaff::getDelFlag,0);
|
queryWrapper.eq(SysStaff::getStaffMobile,mobile);
|
return this.getOne(queryWrapper,false);
|
}
|
|
|
|
|
|
/**
|
* @description 获取企业微信token
|
* @author jqs
|
* @date 2023/7/18 19:35
|
* @param
|
* @return String
|
*/
|
private String getQYToken(){
|
String accessToken = redisService.getCacheObject(SecurityConstant.QY_TOKEN);
|
if(StringUtils.isBlank(accessToken)){
|
try {
|
accessToken = QiYeUtils.getAccessTokenByQY();
|
JSONObject jsonAccessToken = JSONObject.parseObject(accessToken);
|
String errcode = jsonAccessToken.getString("errcode");
|
String errmsg = jsonAccessToken.getString("errmsg");
|
if(errcode.equals("0")){
|
accessToken = jsonAccessToken.getString("access_token");
|
Long expiresIn = jsonAccessToken.getLong("expires_in");
|
expiresIn = expiresIn -100;
|
redisService.setCacheObject(SecurityConstant.QY_TOKEN,accessToken,expiresIn, TimeUnit.SECONDS);
|
}else{
|
throw new ServiceException(errmsg);
|
}
|
} catch (Exception e) {
|
throw new RuntimeException(e);
|
}
|
}
|
return accessToken;
|
}
|
|
|
/**
|
* @description 编辑商户员工
|
* @author jqs
|
* @date 2023/7/19 19:42
|
* @param merEditUserDto
|
* @return void
|
*/
|
@Override
|
public void editSysStaffInfo(MerEditUserDto merEditUserDto){
|
SysStaff sysStaff = this.getByUserId(merEditUserDto.getUserId());
|
Integer editType = merEditUserDto.getEditType();
|
switch (editType){
|
case 1:
|
sysStaff.setStaffName(merEditUserDto.getEditValue());
|
break;
|
case 2:
|
sysStaff.setStaffAvatar(merEditUserDto.getEditValue());
|
break;
|
case 3:
|
break;
|
case 4:
|
break;
|
default:
|
break;
|
}
|
this.saveOrUpdate(sysStaff);
|
}
|
|
/**
|
* @description 导入员工
|
* @author jqs
|
* @date 2023/8/18 16:04
|
* @param
|
* @return void
|
*/
|
@Override
|
public String importSysStaff(List<MgtSysStaffImportDto> staffImportDtoList){
|
if (StringUtils.isNull(staffImportDtoList) || staffImportDtoList.size() == 0) {
|
throw new ServiceException("导入数据不能为空!");
|
}
|
int successNum = 0;
|
int failureNum = 0;
|
StringBuilder successMsg = new StringBuilder();
|
StringBuilder failureMsg = new StringBuilder();
|
SysStaff sysStaff;
|
Date nowTime = new Date();
|
String mobile;
|
String userName;
|
String department;
|
String departmentFirst;
|
String departmentSecond;
|
String departmentThird;
|
int lastIndex;
|
int firstIndex;
|
int secondIndex;
|
int thirdIndex;
|
DeptSimpleVo deptSimpleVo;
|
SysUser sysUser;
|
List<DeptSimpleVo> deptSimpleVoList = sysStaffMapper.listSimpleDept();
|
Map<String, DeptSimpleVo> deptMap = deptSimpleVoList.stream()
|
.collect(Collectors.toMap(DeptSimpleVo::getDeptName, Function.identity()));
|
for (MgtSysStaffImportDto entity : staffImportDtoList) {
|
try {
|
if(StringUtils.isNotBlank(entity.getMobile())){
|
if(StringUtils.isNotBlank(entity.getUserStatus())&&entity.getUserStatus().equals("禁用")){
|
continue;
|
}
|
department = entity.getDepartment();
|
lastIndex = department.indexOf(";");
|
department = (lastIndex != -1) ? department.substring(0, lastIndex) : department;
|
firstIndex = department.lastIndexOf("/");
|
secondIndex = department.lastIndexOf('/', firstIndex - 1);
|
thirdIndex = department.lastIndexOf('/', secondIndex - 1);
|
departmentFirst = department.substring(firstIndex + 1);
|
deptSimpleVo = deptMap.get(departmentFirst);
|
if(deptSimpleVo==null){
|
departmentSecond = department.substring(secondIndex + 1, firstIndex);
|
deptSimpleVo = deptMap.get(departmentSecond);
|
}
|
if(deptSimpleVo==null){
|
departmentThird = department.substring(thirdIndex + 1, secondIndex);
|
deptSimpleVo = deptMap.get(departmentThird);
|
}
|
if(deptSimpleVo!=null&&StringUtils.isNotBlank(entity.getMobile())){
|
LambdaQueryWrapper<SysStaff> queryWrapper = new LambdaQueryWrapper();
|
queryWrapper.eq(SysStaff::getDelFlag,0);
|
queryWrapper.eq(SysStaff::getStaffMobile,entity.getMobile());
|
SysStaff sysStaffSame = this.getOne(queryWrapper, false);
|
if(sysStaffSame!=null){
|
sysStaffSame.setStaffName(entity.getStaffName());
|
sysStaffSame.setStaffPost(entity.getPost());
|
sysStaffSame.setWxUserId(entity.getUserName());
|
if(StringUtils.isNotBlank(entity.getEmail())){
|
sysStaffSame.setStaffEmail(entity.getEmail());
|
}
|
this.saveOrUpdate(sysStaffSame);
|
sysUser = sysUserService.selectUserById(sysStaffSame.getUserId());
|
sysUser.setDeptId(deptSimpleVo.getDeptId());
|
sysUser.setNickName(entity.getStaffName());
|
if(entity.getGender().equals("男")){
|
sysUser.setSex("0");
|
}else if(entity.getGender().equals("女")){
|
sysUser.setSex("1");
|
}else{
|
sysUser.setSex("2");
|
}
|
if(StringUtils.isNotBlank(entity.getEmail())){
|
sysUser.setEmail(entity.getEmail());
|
}
|
sysUserService.updateOnlyUser(sysUser);
|
successNum = successNum + 1;
|
}else{
|
MgtStaffEditDto mgtStaffEditDto = new MgtStaffEditDto();
|
mgtStaffEditDto.setDeptId(deptSimpleVo.getDeptId());
|
mgtStaffEditDto.setStaffName(entity.getStaffName());
|
mgtStaffEditDto.setStaffMobile(entity.getMobile());
|
mgtStaffEditDto.setStaffEmail(entity.getEmail());
|
mgtStaffEditDto.setStaffPost(entity.getPost());
|
mgtStaffEditDto.setStaffAvatar("https://hongruitang.oss-cn-beijing.aliyuncs.com/2023/8/26/362e964917304255aaa36a874063d198.jpg");
|
mgtStaffEditDto.setHeadFlag("0");
|
mgtStaffEditDto.setWxUserId(entity.getUserName());
|
this.mgtStaffEdit(mgtStaffEditDto);
|
successNum = successNum + 1;
|
}
|
}
|
}
|
} catch (Exception e) {
|
failureNum++;
|
String msg = "<br/>" + failureNum + "员工 " + entity.getStaffName() + " 导入失败:";
|
failureMsg.append(msg + e.getMessage());
|
log.error(msg, e);
|
}
|
}
|
if (failureNum > 0) {
|
failureMsg.insert(0, "很抱歉,导入失败!共 " + failureNum + " 条数据格式不正确,错误如下:");
|
throw new ServiceException(failureMsg.toString());
|
} else {
|
successMsg.insert(0, "恭喜您,数据已全部导入成功!共 " + successNum + " 条,数据如下:");
|
}
|
return successMsg.toString();
|
}
|
|
/**
|
* @description 通过id获取员工列表
|
* @author jqs
|
* @date 2023/9/5 10:02
|
* @param userIdList
|
* @return List<SysStaff>
|
*/
|
@Override
|
public List<SysStaff> listSysStaffByIds(List<Long> userIdList){
|
return sysStaffMapper.listSysStaffByIds(userIdList);
|
}
|
|
/**
|
* @description 企业微信消息推送
|
* @author jqs
|
* @date 2023/8/29 11:05
|
* @return void
|
*/
|
@Override
|
public void sendTaskMessage(){
|
//获取员工任务列表
|
List<MgtUserTaskMsgVo> userTaskMsgVoList = remoteShopService.getTaskMsgList().getData();
|
WxCpMessage message;
|
SysStaff sysStaff;
|
if(userTaskMsgVoList!=null&&!userTaskMsgVoList.isEmpty()){
|
//循环发送消息
|
for(MgtUserTaskMsgVo mgtUserTaskMsgVo : userTaskMsgVoList){
|
sysStaff = this.getByUserId(mgtUserTaskMsgVo.getUserId());
|
if(sysStaff!=null&& StringUtils.isNotBlank(sysStaff.getWxUserId())){
|
message = new WxCpMessage();
|
message.setAgentId(1000024);
|
message.setToUser(sysStaff.getWxUserId());
|
message.setMsgType("text");
|
message.setContent(mgtUserTaskMsgVo.getTaskTitle()+"今日需要任务跟进,请注意!");
|
try {
|
WxCpMessageSendResult result = wxCpService.getMessageService().send(message);
|
System.out.println(result);
|
} catch (WxErrorException e) {
|
throw new RuntimeException(e);
|
}
|
}
|
}
|
}
|
}
|
}
|