package com.kidgrow.usercenter.service.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.kidgrow.common.constant.CommonConstant; import com.kidgrow.common.constant.SecurityConstants; import com.kidgrow.common.model.*; import com.kidgrow.common.service.impl.SuperServiceImpl; import com.kidgrow.common.utils.StringUtils; import com.kidgrow.redis.util.RedisConstant; import com.kidgrow.redis.util.RedisUtils; import com.kidgrow.usercenter.mapper.*; import com.kidgrow.usercenter.model.SysDepartment; import com.kidgrow.usercenter.model.SysDoctor; import com.kidgrow.usercenter.model.SysHospital; import com.kidgrow.usercenter.model.SysRoleUser; import com.kidgrow.usercenter.service.ISysDoctorService; import com.kidgrow.usercenter.service.ISysUserOrgService; import com.kidgrow.usercenter.service.ISysUserService; import com.kidgrow.usercenter.vo.SysDoctorDto; import com.kidgrow.usercenter.vo.SysDoctorVo; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.MapUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cglib.beans.BeanCopier; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletRequest; import java.util.*; import java.util.stream.Collectors; /** * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020
* * @version 1.0 * @Description:
* @Project: 用户中心
* @CreateDate: Created in 2020-04-02 14:02:50
* @Author: liuke */ @Slf4j @Service public class SysDoctorServiceImpl extends SuperServiceImpl implements ISysDoctorService { /** * 列表 * * @param params * @return */ @Autowired private ISysUserService iSysUserService; @Autowired private SysUserMapper sysUserMapper; @Autowired private PasswordEncoder passwordEncoder; @Autowired private ISysUserOrgService sysUserOrgService; @Autowired private RedisUtils redisUtils; @Autowired private SysRoleOrganizationServiceImpl SysRoleOrganizationServiceImpl; @Autowired private SysRoleMapper sysRoleMapper; @Autowired private SysHospitalMapper sysHospitalMapper; @Autowired private SysDepartmentMapper sysDepartmentMapper; @Autowired private SysUserRoleMapper sysUserRoleMapper; @Autowired private SysUserServiceImpl sysUserServiceImpl; // private final String HOSPITAL_ADMIN="hospital_admin"; @Override public PageResult findList(Map params, SysUser user) { Page page = new Page<>(MapUtils.getInteger(params, "page"), MapUtils.getInteger(params, "limit")); //添加权限 SysRoleOrganizationServiceImpl.getRoleOrg(params, user); List list = baseMapper.findList(page, params); List listvo = new ArrayList<>(); list.forEach(e -> { SysDoctorDto vo = new SysDoctorDto(); BeanCopier beanCopier = BeanCopier.create(SysDoctor.class, SysDoctorVo.class, false); beanCopier.copy(e, vo, null); //查询用户的登录账号; if (e.getUserId() != null) { SysUser sysUser = iSysUserService.getById(e.getUserId()); if (sysUser != null) { vo.setUsername(sysUser.getUsername()); } QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("user_id", e.getUserId()); List roleUserList = sysUserRoleMapper.selectList(queryWrapper); List collect = roleUserList.stream().map(roleUser -> roleUser.getRoleId()).collect(Collectors.toList()); vo.setRoles(collect); } listvo.add(vo); }); return PageResult.builder().data(listvo).code(0).count(page.getTotal()).build(); } /** * 根据SysDoctor对象当做查询条件进行查询 * * @param sysDoctor * @return SysDoctor */ @Override public SysDoctor findByObject(SysDoctor sysDoctor) { return baseMapper.findByObject(sysDoctor); } @Override public boolean delete(Long id) { //查询user表 SysDoctor sysDoctor = baseMapper.selectById(id); if (sysDoctor != null && sysDoctor.getUserId() != null) { boolean b = iSysUserService.deleteNoContact(sysDoctor.getUserId()); } sysDoctor.setIsDel(true); int i = baseMapper.updateById(sysDoctor); return true; } /** * 根据userid删除医生数据 * * @param userId * @return */ @Override public int deleteByUserId(Long userId) { Map params = new HashMap<>(); params.put("userId", userId); return baseMapper.deleteByMap(params); } /** * 统计医生的数量 * * @param datatype 业务类型 * 0 自注册医生 * 1 签约医生 * 2 医答医生 * 3 C端医生 * 4 H端医生 * 5 待审核医生 * @return */ @Override public int chartDoctor(int datatype) { return baseMapper.chartDoctor(datatype); } @Override public ResultBody enable(Map params) { Long aLong = MapUtils.getLong(params, "id"); SysDoctor sysDoctor = baseMapper.selectById(aLong); Boolean enabled = MapUtils.getBoolean(params, "enabled"); if (sysDoctor != null && sysDoctor.getUserId() != null) { SysUser byId = iSysUserService.getById(sysDoctor.getUserId()); if (byId != null) { byId.setEnabled(enabled); iSysUserService.updateById(byId); } } if (sysDoctor != null) { sysDoctor.setEnabled(enabled); baseMapper.updateById(sysDoctor); } else { return ResultBody.failed("禁用失败"); } return ResultBody.ok(0, "禁用成功"); } @Override @Transactional(rollbackFor = Exception.class) public ResultBody saveOrUpdateSer(SysDoctorDto sysDoctor, HttpServletRequest request, SysUser user) { String id = request.getHeader(SecurityConstants.USER_ID_HEADER); if (null == sysDoctor) { return ResultBody.failed("请填写信息"); } else { Boolean flag = false; if (sysDoctor.getDoctorType() != 2) { if (sysDoctor.getRoles() == null || sysDoctor.getRoles().size() <= 0) { return ResultBody.failed("选择一个角色"); } } SysHospital sysHospital = sysHospitalMapper.selectById(sysDoctor.getHospitalId()); SysDepartment sysDepartment = sysDepartmentMapper.selectById(sysDoctor.getDepartmentId()); if (sysDoctor.getId() == null) { /** * 限制只有创建医生的个数 * */ if (sysUserServiceImpl.departmetAccountsCount(sysDoctor.getDepartmentId()) <= 0) { return ResultBody.failed("该部门创建人数已经达到上限"); } Long sysUserId = null; //保存部门信息 ResultBody resultBody = this.saveFenjiekou(sysDoctor, id, sysHospital, sysDepartment, null); if (resultBody.getCode() == 0) { sysUserId = (Long) resultBody.getData(); } else { return resultBody; } //保存doctor的数据 SysDoctor sysDoc = new SysDoctor(); BeanCopier beanCopier = BeanCopier.create(SysDoctorDto.class, SysDoctor.class, false); beanCopier.copy(sysDoctor, sysDoc, null); sysDoc.setUserId(sysUserId); if (user.getOrganizations() != null) { List organizations = user.getOrganizations(); sysDoc.setCreateUserOrgCode(organizations.get(organizations.size() - 1).getOrgCode()); } baseMapper.insert(sysDoc); } else { //更新 SysDoctor getOne = baseMapper.selectById(sysDoctor.getId()); if (getOne.getDoctorType() != 2 && sysDoctor.getDoctorType() != 2) { QueryWrapper queryrole = new QueryWrapper(); queryrole.eq("user_id", getOne.getUserId()); List list = sysUserRoleMapper.selectList(queryrole); //如果是本来是管理员的话,不用走判读管理员的方法 if (!list.isEmpty()) { List collect = list.stream().map(e -> e.getRoleId()).collect(Collectors.toList()); if (!collect.contains(CommonConstant.HOSPITAL_ADMIN_ID)) { /** * 管理员只有一个 */ if (isSupperRole(sysDoctor)) { return ResultBody.failed("该部门已经有管理员"); } } } else { /** * 管理员只有一个 */ if (isSupperRole(sysDoctor)) { return ResultBody.failed("该部门已经有管理员"); } } Map columnMap = new HashMap<>(); columnMap.put("user_id", getOne.getUserId()); boolean b = sysUserOrgService.removeByMap(columnMap); //保存将sys_user_org SysUserOrg sysUserOrg = new SysUserOrg(); sysUserOrg.setUserId(getOne.getUserId()); sysUserOrg.setEnabled(true); sysUserOrg.setFromId(sysDoctor.getDepartmentId()); sysUserOrg.setFromLevel(CommonConstant.SYSTEM_ORG_DEP_LEVEL); sysUserOrg.setOrgId(sysDepartment.getOrgId()); sysUserOrg.setCreateTime(new Date()); List sysUserOrgs=new ArrayList<>(); sysUserOrgs.add(sysUserOrg); sysUserOrgService.saveOrUpdate(sysUserOrg); SysUserOrg sysGongsi = new SysUserOrg(); sysGongsi.setUserId(getOne.getUserId()); sysGongsi.setOrgId(sysHospital.getOrgId()); sysGongsi.setFromId(sysDoctor.getHospitalId()); sysGongsi.setFromLevel(CommonConstant.SYSTEM_ORG_HOS_LEVEL); sysGongsi.setEnabled(true); sysUserOrgs.add(sysGongsi); sysUserOrgService.saveOrUpdate(sysGongsi); baseMapper.updateById(sysDoctor); if (redisUtils.hHasKey(RedisConstant.USER_ORGANIZATION, getOne.getUserId().toString())) { redisUtils.hdel(RedisConstant.USER_ORGANIZATION, getOne.getUserId().toString()); } redisUtils.hset(RedisConstant.USER_ORGANIZATION, getOne.getUserId().toString(), sysUserOrgs); //角色更换 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("user_id", getOne.getUserId()); int delete = sysUserRoleMapper.delete(queryWrapper); sysDoctor.getRoles().forEach(e -> { SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setRoleId(e); sysRoleUser.setUserId(getOne.getUserId()); int insert = sysUserRoleMapper.insert(sysRoleUser); }); } else if (getOne.getDoctorType() == 2 && sysDoctor.getDoctorType() != 2) { /** * 管理员只有一个 */ if (isSupperRole(sysDoctor)) { return ResultBody.failed("该部门已经有管理员"); } ResultBody resultBody = this.saveFenjiekou(sysDoctor, id, sysHospital, sysDepartment, getOne); Long sysUserId = null; if (resultBody.getCode() == 0) { sysUserId = (Long) resultBody.getData(); } else { return resultBody; } sysDoctor.setUserId(sysUserId); baseMapper.updateById(sysDoctor); } else if (getOne.getDoctorType() != 2 && sysDoctor.getDoctorType() == 2) { //将组织删除 Map columnMap = new HashMap<>(); columnMap.put("user_id", getOne.getUserId()); boolean b = sysUserOrgService.removeByMap(columnMap); SysUser byId = iSysUserService.getById(getOne.getUserId()); //将角色删除 QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("user_id", getOne.getUserId()); int delete = sysUserRoleMapper.delete(queryWrapper); if (byId != null) { byId.setDel(true); boolean b1 = iSysUserService.updateById(byId); } redisUtils.hdel(RedisConstant.USER_ORGANIZATION, getOne.getUserId().toString()); sysDoctor.setUserId(null); baseMapper.updateById(sysDoctor); //将用户删除 SysUser sysUser = new SysUser(); sysUser.setId(getOne.getUserId()); sysUser.setDel(true); sysUserMapper.deleteById(sysUser); } else if (getOne.getDoctorType() == 2 && sysDoctor.getDoctorType() == 2) { baseMapper.updateById(sysDoctor); } } } return ResultBody.ok(); } //是否可以使是超管角色 public Boolean isSupperRole(SysDoctorDto sysDoctor) { Boolean flag = false; /** * 限制管理员只有一个 */ if (sysDoctor.getDoctorType() != 2) { if (sysDoctor.getRoles().contains(CommonConstant.HOSPITAL_ADMIN_ID)) { //查询一个部门下的所有医生 QueryWrapper wrapper = new QueryWrapper(); wrapper.eq("is_del", 0); wrapper.eq("enabled", 1); wrapper.eq("department_id", sysDoctor.getDepartmentId()); List doctoerList = this.baseMapper.selectList(wrapper); if (doctoerList.size() > 0) { //查询role——user List collect = doctoerList.stream().map(e -> e.getUserId()).collect(Collectors.toList()); wrapper = new QueryWrapper(); wrapper.in("user_id", collect); List list = this.sysUserRoleMapper.selectList(wrapper); for (SysRoleUser sysRoleUser : list) { if (sysRoleUser.getRoleId().equals(CommonConstant.HOSPITAL_ADMIN_ID)) { flag = true; } } } } } return flag; } //保存的分接口 public ResultBody saveFenjiekou(SysDoctorDto sysDoctor, String id, SysHospital sysHospital, SysDepartment sysDepartment, SysDoctor getOne) { Long sysUserId = null; /** * 管理员只有一个 */ if (isSupperRole(sysDoctor)) { return ResultBody.failed("该部门已经有管理员"); } if (sysDoctor.getDoctorType() != 2) { SysUser sysUser = new SysUser(); //保存 sysUser.setUsername(sysDoctor.getUsername()); sysUser.setPassword(passwordEncoder.encode(sysDoctor.getPassword())); sysUser.setNickname(sysDoctor.getDoctorName()); sysUser.setHeadImgUrl(sysDoctor.getDoctorLogo()); sysUser.setMobile(sysDoctor.getDoctorTel()); sysUser.setType(UserType.DOCTOR.name()); sysUser.setTenantId(CommonConstant.H_TENANT); sysUser.setCreateTime(new Date()); sysUser.setDefaultAuth(true); SysUser byId = iSysUserService.getById(id); if (byId != null) { sysUser.setCreateUserId(byId.getId()); sysUser.setCreateUserName(byId.getUsername()); } //做判断是否注册过手机号; QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("username", sysDoctor.getDoctorTel()); queryWrapper.eq("enabled", 1); queryWrapper.eq("is_del", 0); Integer integer = sysUserMapper.selectCount(queryWrapper); if (integer > 0) { return ResultBody.failed("该手机号已经注册"); } if (getOne != null && getOne.getUserId() != null) { Map map = new HashMap<>(); map.put("id", getOne.getUserId()); map.put("enabled", 1); map.put("is_del", 1); List sysUsers = sysUserMapper.selectByMap(map); if (sysUsers != null && !sysUsers.isEmpty()) { sysUser.setId(sysUsers.get(sysUsers.size() - 1).getId()); } } if (sysUser.getId() != null) { //更新 sysUser.setDel(false); iSysUserService.updateById(sysUser); } else { //保存 iSysUserService.save(sysUser); } sysUserId = sysUser.getId(); //保存一个角色 sysDoctor.getRoles().forEach(e -> { SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setRoleId(e); sysRoleUser.setUserId(sysUser.getId()); int insert = sysUserRoleMapper.insert(sysRoleUser); }); List sysUserOrgs=new ArrayList<>(); //保存将sys_user_org 保存部门 SysUserOrg sysUserOrg = new SysUserOrg(); sysUserOrg.setUserId(sysUser.getId()); sysUserOrg.setFromId(sysDoctor.getDepartmentId()); sysUserOrg.setFromLevel(CommonConstant.SYSTEM_ORG_DEP_LEVEL); sysUserOrg.setOrgId(sysDepartment.getOrgId()); sysUserOrgs.add(sysUserOrg); //保存公司 sysUserOrgService.saveOrUpdate(sysUserOrg); SysUserOrg sysGongsi = new SysUserOrg(); sysGongsi.setUserId(sysUser.getId()); sysGongsi.setOrgId(sysHospital.getOrgId()); sysGongsi.setFromId(sysDoctor.getHospitalId()); sysGongsi.setFromLevel(CommonConstant.SYSTEM_ORG_DEP_LEVEL); sysUserOrgService.saveOrUpdate(sysGongsi); sysUserOrgs.add(sysGongsi); //保存到Redis boolean hset = redisUtils.hset(RedisConstant.USER_ORGANIZATION, sysUserOrg.getUserId().toString(), sysUserOrgs); } return ResultBody.ok().data(sysUserId); } @Override public List findByMap(Map map) { map.put("enabled", 1); map.put("is_del", 0); return baseMapper.selectByMap(map); } @Override @Transactional(rollbackFor = Exception.class) public ResultBody setAdminDoctor(Map params) { Long id = MapUtils.getLong(params, "id"); Long adminId = MapUtils.getLong(params, "adminId"); if (id > 0 && adminId > 0) { Map map = new HashMap<>(); map.put("user_id", adminId); map.put("is_admin_user", 1); map.put("is_del", 0); map.put("enabled", 1); List sysDoctors = baseMapper.selectByMap(map); if (sysDoctors == null || sysDoctors.size() <= 0) { return ResultBody.failed("当前操作用户不是管理员"); } SysDoctor sysDoctor = sysDoctors.get(0); //先检查操作用户是否管理员 if (sysDoctor != null) { if (sysDoctor.getIsAdminUser()) { //将超级管理员的角色设为普通角色 SysRoleUser sysRoleUser = new SysRoleUser(); sysRoleUser.setUserId(adminId); sysRoleUser.setRoleId(CommonConstant.HOSPITAL_DOCTOR_ID); QueryWrapper queryWrapper = new QueryWrapper(); queryWrapper.eq("user_id", adminId); // queryWrapper.eq("role_id", CommonConstant.HOSPITAL_ADMIN_ID); int delete = sysUserRoleMapper.delete(queryWrapper); int update = sysUserRoleMapper.insert(sysRoleUser); //现将操作人员设为非管理角色 sysDoctor.setIsAdminUser(false); if (baseMapper.updateById(sysDoctor) > 0) { //再将新用户设为管理 sysDoctor = baseMapper.selectById(id); if (sysDoctor != null) { if (!sysDoctor.getIsAdminUser()) { //现将普通人员设为管理角色 sysRoleUser = new SysRoleUser(); sysRoleUser.setUserId(sysDoctor.getUserId()); sysRoleUser.setRoleId(CommonConstant.HOSPITAL_ADMIN_ID); queryWrapper = new QueryWrapper(); queryWrapper.eq("user_id", sysDoctor.getUserId()); // queryWrapper.eq("role_id", CommonConstant.HOSPITAL_DOCTOR_ID); sysUserRoleMapper.delete(queryWrapper); sysUserRoleMapper.insert(sysRoleUser); sysDoctor.setIsAdminUser(true); if (baseMapper.updateById(sysDoctor) > 0) { return ResultBody.ok().data(true).msg("管理员设置成功!"); } else { return ResultBody.failed("设为管理失败!").data(false); } } else { return ResultBody.failed("设为管理失败,改用户就是管理员!").data(false); } } else { return ResultBody.failed("用户信息有误!").data(false); } } else { return ResultBody.failed("设为管理失败!").data(false); } } else { return ResultBody.failed("当前操作用户不是管理员!").data(false); } } else { return ResultBody.failed("用户信息有误!").data(false); } } else { return ResultBody.failed("业务参数有误!").data(false); } } /** * 判断用户名是否管理员 * * @param userName * @return */ @Override public ResultBody userIsAdmin(String userName) { if (StringUtils.isNotBlank(userName)) { SysDoctor sysDoctor = baseMapper.userIsAdmin(userName); if (sysDoctor != null) { return ResultBody.ok().data(sysDoctor.getIsAdminUser()); } else { return ResultBody.failed().data(false); } } else { return ResultBody.failed("用户名不能为空!").data(false); } } }