|
@@ -0,0 +1,259 @@
|
|
|
+package com.ym.mec.biz.service.impl;
|
|
|
+
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.ym.mec.auth.api.entity.SysUser;
|
|
|
+import com.ym.mec.auth.api.enums.SysUserType;
|
|
|
+import com.ym.mec.auth.api.enums.YesOrNoEnum;
|
|
|
+import com.ym.mec.biz.dal.dao.TeacherDao;
|
|
|
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
|
|
|
+import com.ym.mec.biz.dal.entity.SchoolStaff;
|
|
|
+import com.ym.mec.biz.dal.entity.SysConfig;
|
|
|
+import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
|
|
|
+import com.ym.mec.biz.dal.mapper.SchoolStaffMapper;
|
|
|
+import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
|
|
|
+import com.ym.mec.biz.service.CooperationOrganService;
|
|
|
+import com.ym.mec.biz.service.SchoolStaffService;
|
|
|
+import com.ym.mec.biz.service.SysConfigService;
|
|
|
+import com.ym.mec.common.exception.BizException;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.apache.commons.collections.CollectionUtils;
|
|
|
+import org.apache.commons.lang3.StringUtils;
|
|
|
+import org.joda.time.DateTime;
|
|
|
+import org.redisson.api.RBucket;
|
|
|
+import org.redisson.api.RedissonClient;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.text.MessageFormat;
|
|
|
+import java.util.Arrays;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.Optional;
|
|
|
+import java.util.Set;
|
|
|
+import java.util.concurrent.TimeUnit;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * 学校员工
|
|
|
+ * 2023-05-06 10:53:06
|
|
|
+ */
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class SchoolStaffServiceImpl extends ServiceImpl<SchoolStaffMapper, SchoolStaff> implements SchoolStaffService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CooperationOrganService cooperationOrganService;
|
|
|
+ @Autowired
|
|
|
+ private RedissonClient redissonClient;
|
|
|
+ @Autowired
|
|
|
+ private TeacherDao teacherDao;
|
|
|
+ @Autowired
|
|
|
+ private SysConfigService sysConfigService;
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查询详情
|
|
|
+ * @param id 详情ID
|
|
|
+ * @return SchoolStaff
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public SchoolStaff detail(Long id) {
|
|
|
+
|
|
|
+ return baseMapper.selectById(id);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 分页查询
|
|
|
+ * @param page IPage<SchoolStaff>
|
|
|
+ * @param query SchoolStaffWrapper.SchoolStaffQuery
|
|
|
+ * @return IPage<SchoolStaff>
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public IPage<SchoolStaff> selectPage(IPage<SchoolStaff> page, SchoolStaffWrapper.SchoolStaffQuery query) {
|
|
|
+
|
|
|
+ return page.setRecords(baseMapper.selectPage(page, query));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 添加
|
|
|
+ * @param schoolStaff SchoolStaffWrapper.SchoolStaff
|
|
|
+ * @return Boolean
|
|
|
+ */
|
|
|
+ @Transactional
|
|
|
+ @Override
|
|
|
+ public Boolean add(SchoolStaffWrapper.SchoolStaff schoolStaff) {
|
|
|
+
|
|
|
+ String submitLockKey = MessageFormat.format("school_staff_lock:{0}", schoolStaff.getMobile());
|
|
|
+ // 数据重复提交校验
|
|
|
+ RBucket<Object> bucket = redissonClient.getBucket(submitLockKey);
|
|
|
+ if (!bucket.trySet(schoolStaff.getMobile(), 5L, TimeUnit.SECONDS)) {
|
|
|
+ throw new BizException("请勿重复提交");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 合作单位编号
|
|
|
+ CooperationOrgan cooperation = cooperationOrganService.get(schoolStaff.getSchoolId().intValue());
|
|
|
+ if (Objects.isNull(cooperation)) {
|
|
|
+ // 删除缓存锁
|
|
|
+ redissonClient.getBucket(submitLockKey).delete();
|
|
|
+
|
|
|
+ throw new BizException("合作单位编号无效");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 系统用户信息
|
|
|
+ SysUser user = getSysUser(schoolStaff, cooperation);
|
|
|
+
|
|
|
+ // 设置默认参数
|
|
|
+ schoolStaff.tenantId(cooperation.getTenantId())
|
|
|
+ .organIdList(String.valueOf(cooperation.getOrganId()))
|
|
|
+ .setUserId(Long.valueOf(user.getId()));
|
|
|
+
|
|
|
+ // 校长或乐团领队最多一人
|
|
|
+ if (ESchoolStaffType.SCHOOLMASTER == schoolStaff.getUserType()
|
|
|
+ || ESchoolStaffType.ORCHESTRA_LEADER == schoolStaff.getUserType()) {
|
|
|
+ // 校长或乐团领队,需要校验人数是否葡,默认最多添加一人
|
|
|
+ Integer exists = lambdaQuery()
|
|
|
+ .eq(SchoolStaff::getSchoolId, schoolStaff.getSchoolId())
|
|
|
+ .eq(SchoolStaff::getUserType, schoolStaff.getUserType().getCode()).count();
|
|
|
+ if (exists > 0) {
|
|
|
+ // 删除缓存锁
|
|
|
+ redissonClient.getBucket(submitLockKey).delete();
|
|
|
+
|
|
|
+ throw new BizException("校长或乐团领队最多添加一人");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 学校员工不允许同时存在多个学校ID
|
|
|
+ {
|
|
|
+ Integer exists = lambdaQuery()
|
|
|
+ //.ne(SchoolStaff::getSchoolId, schoolStaff.getSchoolId())
|
|
|
+ .eq(SchoolStaff::getUserId, user.getId())
|
|
|
+ .count();
|
|
|
+ if (exists > 0) {
|
|
|
+ // 删除缓存锁
|
|
|
+ redissonClient.getBucket(submitLockKey).delete();
|
|
|
+
|
|
|
+ throw new BizException("用户员工账号已存在");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 添加学校员工信息
|
|
|
+ this.save(JSON.parseObject(schoolStaff.jsonString(), SchoolStaff.class));
|
|
|
+
|
|
|
+ // 自动创建学校管理IM群
|
|
|
+ // 自动添加员工到学校乐团群
|
|
|
+
|
|
|
+ // 删除缓存锁
|
|
|
+ redissonClient.getBucket(submitLockKey).delete();
|
|
|
+
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 系统用户信息
|
|
|
+ * @param schoolStaff SchoolStaffWrapper.SchoolStaff
|
|
|
+ * @param cooperation CooperationOrgan
|
|
|
+ * @return SysUser
|
|
|
+ */
|
|
|
+ private SysUser getSysUser(SchoolStaffWrapper.SchoolStaff schoolStaff, CooperationOrgan cooperation) {
|
|
|
+
|
|
|
+ // 用户默认密码:gym + 联系人手机后4位
|
|
|
+ int phoneStrLen = schoolStaff.getMobile().length();
|
|
|
+ // 生成默认密码
|
|
|
+ String defaultPassword = new BCryptPasswordEncoder()
|
|
|
+ .encode("gym" + schoolStaff.getMobile().substring(phoneStrLen - 4, phoneStrLen));
|
|
|
+
|
|
|
+ // 用户帐号信息
|
|
|
+ SysUser user = teacherDao.getUserWithPhone(schoolStaff.getMobile());
|
|
|
+ if (Objects.nonNull(user)) {
|
|
|
+
|
|
|
+ // 校验用户是否已存在学校员工帐号
|
|
|
+ List<String> collect = Arrays.stream(user.getUserType().split(",")).collect(Collectors.toList());
|
|
|
+ if (collect.contains(SysUserType.SCHOOL.getCode())) {
|
|
|
+
|
|
|
+ // 匹配合作单位编号是否一致
|
|
|
+ List<SchoolStaff> staffs = lambdaQuery().eq(SchoolStaff::getUserId, user.getId()).list();
|
|
|
+ if (CollectionUtils.isNotEmpty(staffs)) {
|
|
|
+ SchoolStaff staff = staffs.get(0);
|
|
|
+
|
|
|
+ if (staff.getSchoolId().longValue() != schoolStaff.getSchoolId()) {
|
|
|
+ throw new BizException("员工帐号已存在");
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 设置默认密码
|
|
|
+ SysUser updateInfo = new SysUser();
|
|
|
+ updateInfo.setId(user.getId());
|
|
|
+ updateInfo.setTenantId(user.getTenantId());
|
|
|
+
|
|
|
+ if (StringUtils.isEmpty(user.getPassword())) {
|
|
|
+ // 修改 gym + 联系人手机后4位
|
|
|
+ updateInfo.setPassword(defaultPassword);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 用户身份,排除学校身份
|
|
|
+ Set<String> userTypes = Arrays.stream(user.getUserType().split(",")).collect(Collectors.toSet());
|
|
|
+ userTypes.add(SysUserType.SCHOOL.getCode());
|
|
|
+
|
|
|
+ updateInfo.setUserType(String.join(",", userTypes));
|
|
|
+ // 更新用户信息
|
|
|
+ teacherDao.updateUser(updateInfo);
|
|
|
+
|
|
|
+ } else {
|
|
|
+
|
|
|
+ // 查询用户默认头象
|
|
|
+ String defaultAvatar = Optional.ofNullable(sysConfigService.findByParamName(SysConfigService.USER_DEFAULT_AVATAR))
|
|
|
+ .map(SysConfig::getParanValue).orElse("");
|
|
|
+
|
|
|
+ // 创建默认用户信息
|
|
|
+ user = new SysUser();
|
|
|
+ user.setUsername(schoolStaff.getUsername());
|
|
|
+ user.setPassword(defaultPassword);
|
|
|
+ user.setAvatar(defaultAvatar);
|
|
|
+ user.setPhone(schoolStaff.getMobile());
|
|
|
+ user.setTenantId(cooperation.getTenantId());
|
|
|
+ user.setOrganId(cooperation.getOrganId());
|
|
|
+ user.setDelFlag(YesOrNoEnum.NO);
|
|
|
+ user.setLockFlag(YesOrNoEnum.NO.getCode());
|
|
|
+ user.setUserType(SysUserType.SCHOOL.getCode());
|
|
|
+ user.setUpdateTime(DateTime.now().toDate());
|
|
|
+ user.setCreateTime(DateTime.now().toDate());
|
|
|
+
|
|
|
+ // 添加用户信息
|
|
|
+ teacherDao.addSysUser(user);
|
|
|
+ }
|
|
|
+ return user;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 更新
|
|
|
+ * @param schoolStaff SchoolStaffWrapper.SchoolStaff
|
|
|
+ * @return Boolean
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Boolean update(SchoolStaffWrapper.SchoolStaff schoolStaff){
|
|
|
+
|
|
|
+ return this.updateById(JSON.parseObject(schoolStaff.jsonString(), SchoolStaff.class));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 学校员工信息
|
|
|
+ *
|
|
|
+ * @param userId 用户ID
|
|
|
+ * @return SchoolStaff
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public SchoolStaff queryByUserId(Long userId) {
|
|
|
+
|
|
|
+ // 员工信息
|
|
|
+ List<SchoolStaff> staffs = lambdaQuery().eq(SchoolStaff::getUserId, userId).list();
|
|
|
+ if (CollectionUtils.isEmpty(staffs)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ return staffs.get(0);
|
|
|
+ }
|
|
|
+}
|