Explorar o código

Merge branch 'feature/0427-school' of http://git.dayaedu.com/yonge/mec into feature/0427-school

liujc %!s(int64=2) %!d(string=hai) anos
pai
achega
39ac8d5e6c

+ 11 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/CooperationOrgan.java

@@ -84,6 +84,9 @@ public class CooperationOrgan extends BaseEntity {
 
 	@ApiModelProperty(value = "是否全职资源",required = false)
 	private Integer fullJobResource = 1;
+
+	@ApiModelProperty("合作单位logo")
+	private String logo;
 	
 	private List<CooperationOrganLinkman> cooperationOrganLinkmanList = new ArrayList<CooperationOrganLinkman>();
 
@@ -215,6 +218,14 @@ public class CooperationOrgan extends BaseEntity {
 		this.cooperationOrganLinkmanList = cooperationOrganLinkmanList;
 	}
 
+	public String getLogo() {
+		return logo;
+	}
+
+	public void setLogo(String logo) {
+		this.logo = logo;
+	}
+
 	@Override
 	public String toString() {
 		return ToStringBuilder.reflectionToString(this);

+ 74 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/entity/SchoolStaff.java

@@ -0,0 +1,74 @@
+package com.ym.mec.biz.dal.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
+import lombok.Data;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.io.Serializable;
+import java.util.Date;
+
+
+/**
+ * 学校员工
+ * 2023-05-06 10:49:23
+ */
+@Data
+@ApiModel(" SchoolStaff-学校员工")
+@TableName("school_staff")
+public class SchoolStaff implements Serializable {
+
+    @ApiModelProperty("主键") 
+    @TableId(value = "id_", type = IdType.ID_WORKER)
+    private Long id;
+
+    @ApiModelProperty("学校ID") 
+	@TableField(value = "school_id_")
+    private Long schoolId;
+
+    @ApiModelProperty("用户帐号ID") 
+	@TableField(value = "user_id_")
+    private Long userId;
+
+    @ApiModelProperty("头像") 
+	@TableField(value = "avatar_")
+    private String avatar;
+
+    @ApiModelProperty("昵称") 
+	@TableField(value = "nickname_")
+    private String nickname;
+
+    @ApiModelProperty("用户身份(校长,乐团领队,分管领导,负责老师)") 
+	@TableField(value = "user_type_")
+    private ESchoolStaffType userType;
+
+    @ApiModelProperty("帐号状态(注销,冻结,激活)") 
+	@TableField(value = "status_")
+    private String status;
+
+    @ApiModelProperty("恢复状态") 
+	@TableField(value = "recovery_status_")
+    private Boolean recoveryStatus;
+
+    @ApiModelProperty("所在分部编号") 
+	@TableField(value = "organ_id_list_")
+    private String organIdList;
+
+    @ApiModelProperty("机构编号") 
+	@TableField(value = "tenant_id_")
+    private Integer tenantId;
+
+    @ApiModelProperty("更新时间") 
+	@TableField(value = "update_time_")
+    private Date updateTime;
+
+    @ApiModelProperty("创建时间") 
+	@TableField(value = "create_time_")
+    private Date createTime;
+
+}

+ 54 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/enums/school/ESchoolStaffType.java

@@ -0,0 +1,54 @@
+package com.ym.mec.biz.dal.enums.school;
+
+import com.baomidou.mybatisplus.annotation.EnumValue;
+import com.ym.mec.common.enums.BaseEnum;
+import lombok.Getter;
+import org.apache.commons.lang3.StringUtils;
+
+/***
+ * 学校员工类型
+ * 1人:校长、乐团领队
+ * 多人:分管领导、负责老师
+ */
+@Getter
+public enum ESchoolStaffType implements BaseEnum<String, ESchoolStaffType> {
+
+	SCHOOLMASTER("校长"),
+	ORCHESTRA_LEADER("乐团领队"),
+	SCHOOL_LEADER("分管领导"),
+	TEACHER("负责老师"),
+	;
+
+	private final String describe;
+
+	@EnumValue
+	private final String code;
+
+	ESchoolStaffType(String describe) {
+		this.describe = describe;
+
+		this.code = this.name();
+	}
+
+	@Override
+	public String getCode() {
+		return this.name();
+	}
+
+	/**
+	 * 参数合法性校验
+	 * @param code 枚举code
+	 * @return boolean
+	 */
+	public static boolean invalid(String code) {
+
+		if (StringUtils.isNotEmpty(code)) {
+			for (ESchoolStaffType e : ESchoolStaffType.values()) {
+				if (e.getCode().equals(code)) {
+					return false;
+				}
+			}
+		}
+		return true;
+	}
+}

+ 27 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/mapper/SchoolStaffMapper.java

@@ -0,0 +1,27 @@
+package com.ym.mec.biz.dal.mapper;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+import com.ym.mec.biz.dal.entity.SchoolStaff;
+import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
+
+/**
+ * 学校员工
+ * 2023-05-06 10:49:23
+ */
+@Repository
+public interface SchoolStaffMapper extends BaseMapper<SchoolStaff> {
+
+	/**
+	 * 分页查询
+	 * @param page IPage<SchoolStaffWrapper.SchoolStaff>
+	 * @param param SchoolStaffWrapper.SchoolStaffQuery
+	 * @return List<SchoolStaffWrapper.SchoolStaff>
+	 */
+	List<SchoolStaff> selectPage(@Param("page") IPage<SchoolStaff> page, @Param("param") SchoolStaffWrapper.SchoolStaffQuery param);
+	
+}

+ 255 - 0
mec-biz/src/main/java/com/ym/mec/biz/dal/wrapper/SchoolStaffWrapper.java

@@ -0,0 +1,255 @@
+package com.ym.mec.biz.dal.wrapper;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.auth.api.enums.YesOrNoEnum;
+import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.Date;
+import java.util.Optional;
+
+/**
+ * 学校员工
+ * 2023-05-06 10:49:23
+ */
+@ApiModel(value = "SchoolStaffWrapper对象", description = "学校员工查询对象")
+public class SchoolStaffWrapper {
+
+    @Data
+	@Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" SchoolStaffQuery-学校员工")
+    public static class SchoolStaffQuery implements QueryInfo {
+    
+    	@ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        @ApiModelProperty("关键字匹配")
+		private String keyword;
+        
+        public String getKeyword() {
+            return Optional.ofNullable(keyword).filter(StringUtils::isNotBlank).orElse(null);
+        }
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static SchoolStaffQuery from(String json) {
+            return JSON.parseObject(json, SchoolStaffQuery.class);
+        }
+    }  
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+	@ApiModel(" SchoolStaff-学校员工")
+    public static class SchoolStaff {
+
+        @ApiModelProperty("主键")
+        private Long id;
+
+        @ApiModelProperty("学校ID")
+        private Long schoolId;
+
+        @ApiModelProperty("用户帐号ID")
+        private Long userId;
+
+        @ApiModelProperty("用户身份(校长,乐团领队,分管领导,负责老师)")
+        private ESchoolStaffType userType;
+
+        @ApiModelProperty("所在分部编号")
+        private String organIdList;
+
+        @ApiModelProperty("机构编号")
+        private Integer tenantId;
+
+        @ApiModelProperty("用户名称")
+        private String username;
+
+        @ApiModelProperty("联系方式")
+        private String mobile;
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static SchoolStaff from(String json) {
+            return JSON.parseObject(json, SchoolStaff.class);
+        }
+
+
+        public SchoolStaff organIdList(String organIdList) {
+            this.organIdList = organIdList;
+            return this;
+        }
+
+        public SchoolStaff tenantId(Integer tenantId) {
+            this.tenantId = tenantId;
+            return this;
+        }
+    }
+
+    @Data
+    @Builder
+    @NoArgsConstructor
+    @AllArgsConstructor
+    @ApiModel(" StaffSysUser-学校员工")
+    public static class StaffSysUser implements Serializable {
+
+        @ApiModelProperty(value = "用户名")
+        private String username;
+
+        @ApiModelProperty(value = "手机号")
+        private String phone;
+
+        @ApiModelProperty(value = "头像")
+        private String avatar;
+
+        @ApiModelProperty(value = "部门ID")
+        private Integer organId;
+
+        @ApiModelProperty(value = "0-正常,9-锁定")
+        private Integer lockFlag;
+
+        @ApiModelProperty(value = "0-正常,1-删除")
+        private YesOrNoEnum delFlag;
+
+        @ApiModelProperty(value = "微信openid")
+        private String wxOpenid;
+
+        @ApiModelProperty(value = "QQ openid")
+        private String qqOpenid;
+
+        @ApiModelProperty("用户类型")
+        private String userType;
+
+        @ApiModelProperty(value = "性别0女1男")
+        private Integer gender;
+
+        @ApiModelProperty(value = "民族")
+        private String nation;
+
+        @ApiModelProperty(value = "生日")
+        private Date birthdate;
+
+        @ApiModelProperty(value = "邮箱")
+        private String email;
+
+        @ApiModelProperty(value = "融云token")
+        private String imToken;
+
+        @ApiModelProperty(value = "身份证号")
+        private String idCardNo;
+
+        @ApiModelProperty(value = "真实姓名")
+        private String realName;
+
+        @ApiModelProperty(value = "微信号")
+        private String wechatId;
+
+        @ApiModelProperty("服务标签")
+        private Integer serviceTag;
+
+        @ApiModelProperty("运营标签")
+        private Integer operatingTag;
+
+        @ApiModelProperty(value = "联系地址")
+        private String contactAddress;
+
+        @ApiModelProperty(value = "邮编")
+        private String postalCode;
+
+        @ApiModelProperty("证书类型")
+        private String certificateType;
+
+        @ApiModelProperty(value = "银行卡号")
+        private String bankCard;
+
+        @ApiModelProperty(value = "开户行")
+        private String openBankAddress;
+
+        @ApiModelProperty("职位名称")
+        private String positionName;
+
+        @ApiModelProperty(value = "用户职位")
+        private String positions;
+
+        @ApiModelProperty("分部编号列表")
+        private String organIdList;
+
+        @ApiModelProperty("密码重置标识")
+        private Boolean resetFlag;
+
+        @ApiModelProperty("学校ID")
+        private Long schoolId;
+
+        @ApiModelProperty("用户帐号ID")
+        private Long userId;
+
+        @ApiModelProperty("用户身份(校长,乐团领队,分管领导,负责老师)")
+        private ESchoolStaffType schoolUserType;
+
+        @ApiModelProperty("机构编号")
+        private Integer tenantId;
+
+        @ApiModelProperty("合作单位名称")
+        private String schoolName;
+
+        @ApiModelProperty("合作单位Logo")
+        private String logo;
+
+        public static StaffSysUser from(String json) {
+            return JSON.parseObject(json, StaffSysUser.class);
+        }
+
+
+        public StaffSysUser schoolId(Long schoolId) {
+            this.schoolId = schoolId;
+            return this;
+        }
+
+        public StaffSysUser userId(Long userId) {
+            this.userId = userId;
+            return this;
+        }
+
+        public StaffSysUser schoolUserType(ESchoolStaffType schoolUserType) {
+            this.schoolUserType = schoolUserType;
+            return this;
+        }
+
+        public StaffSysUser tenantId(Integer tenantId) {
+            this.tenantId = tenantId;
+            return this;
+        }
+
+        public StaffSysUser organIdList(String organIdList) {
+            this.organIdList = organIdList;
+            return this;
+        }
+
+        public StaffSysUser schoolName(String schoolName) {
+            this.schoolName = schoolName;
+            return this;
+        }
+
+        public StaffSysUser logo(String logo) {
+            this.logo = logo;
+            return this;
+        }
+    }
+}

+ 49 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SchoolStaffService.java

@@ -0,0 +1,49 @@
+package com.ym.mec.biz.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ym.mec.biz.dal.wrapper.SchoolStaffWrapper;
+import com.ym.mec.biz.dal.entity.SchoolStaff;
+
+/**
+ * 学校员工
+ * 2023-05-06 10:53:06
+ */
+public interface SchoolStaffService extends IService<SchoolStaff>  {
+
+	/**
+     * 查询详情
+     * @param id 详情ID
+     * @return SchoolStaff
+     */
+	SchoolStaff detail(Long id);
+
+    /**
+     * 分页查询
+     * @param page IPage<SchoolStaff>
+     * @param query SchoolStaffWrapper.SchoolStaffQuery
+     * @return IPage<SchoolStaff>
+     */
+    IPage<SchoolStaff> selectPage(IPage<SchoolStaff> page, SchoolStaffWrapper.SchoolStaffQuery query);
+	
+    /**
+     * 添加
+     * @param schoolStaff SchoolStaffWrapper.SchoolStaff
+     * @return Boolean
+     */
+     Boolean add(SchoolStaffWrapper.SchoolStaff schoolStaff);   
+
+    /**
+     * 更新
+     * @param schoolStaff SchoolStaffWrapper.SchoolStaff
+     * @return Boolean
+     */
+     Boolean update(SchoolStaffWrapper.SchoolStaff schoolStaff);
+
+    /**
+     * 学校员工信息
+     * @param userId 用户ID
+     * @return SchoolStaff
+     */
+    SchoolStaff queryByUserId(Long userId);
+}

+ 2 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/SysConfigService.java

@@ -397,6 +397,8 @@ public interface SysConfigService extends BaseService<Long, SysConfig> {
     
     //机构云教室账户余额提醒
     String TENANT_CLOUD_ROOM_BALANCE_NOTICE = "tenant_cloud_room_balance_notice_";
+    // 学校端默认用户头象
+    String USER_DEFAULT_AVATAR = "user_default_avatar";
 
     static void checkActivityDate(String startTimeStr, String endTimeStr) {
         if(StringUtils.isEmpty(startTimeStr) || StringUtils.isEmpty(startTimeStr)){

+ 259 - 0
mec-biz/src/main/java/com/ym/mec/biz/service/impl/SchoolStaffServiceImpl.java

@@ -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);
+    }
+}

+ 1 - 0
mec-biz/src/main/resources/config/mybatis/CooperationOrganMapper.xml

@@ -21,6 +21,7 @@
         <result column="update_time_" property="updateTime"/>
         <result column="full_job_resource_" property="fullJobResource"/>
 		<result column="tenant_id_" property="tenantId" />
+        <result column="logo_" property="logo" />
     </resultMap>
 
     <resultMap type="com.ym.mec.biz.dal.entity.CooperationOrgan" id="ExtCooperationOrgan" extends="CooperationOrgan">

+ 11 - 0
mec-biz/src/main/resources/config/mybatis/SchoolStaffMapper.xml

@@ -0,0 +1,11 @@
+<?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.ym.mec.biz.dal.mapper.SchoolStaffMapper">
+    
+    <select id="selectPage" resultType="com.ym.mec.biz.dal.entity.SchoolStaff">
+		SELECT         
+        	t.*
+		FROM school_staff t
+	</select>
+    
+</mapper>

+ 1 - 1
mec-web/src/main/java/com/ym/mec/web/config/ResourceServerConfig.java

@@ -43,7 +43,7 @@ public class ResourceServerConfig extends ResourceServerConfigurerAdapter {
                         "/tenantInfo/info/*", "/tenantInfo/checkInfo/*", "/tenantInfo/pay/*","/tenantInfo/testCheck", "/tenantInfo/getContract/*",
                         "/tenantPreJoin/add","/imLiveBroadcastRoom/queryRoomInfo","/imLiveBroadcastRoom/test",
                         "/eduOrganization/queryAllOrgan","/eduOrganization/queryAll","/eduOrganization/getOrganCooperation","/import/oaUploadFile",
-                        "/tenantInfo/callback","/adapay/callback","/temp/*"
+                        "/tenantInfo/callback","/adapay/callback","/temp/*", "/open/**"
                 )
                 .permitAll().anyRequest().authenticated().and().httpBasic();
     }

+ 74 - 0
mec-web/src/main/java/com/ym/mec/web/controller/open/OpenSchoolController.java

@@ -0,0 +1,74 @@
+package com.ym.mec.web.controller.open;
+
+import com.alibaba.fastjson.JSONObject;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+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.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import com.ym.mec.web.vo.SchoolStaffVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+import java.util.Optional;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/open/school")
+@Api(tags = "学校开放接口")
+public class OpenSchoolController extends BaseController {
+
+    @Autowired
+    private SchoolStaffService schoolStaffService;
+    @Autowired
+    private CooperationOrganService cooperationOrganService;
+
+
+    @ApiOperation(value = "学校员工新增", notes = "学校员工- 传入 SchoolStaffWrapper.SchoolStaff")
+	@PostMapping("/staffSave")
+	public HttpResponseResult<JSONObject> add(@Validated @RequestBody SchoolStaffVo.SchoolStaff info) {
+
+        // 参数有效性校验
+        if (Objects.isNull(info.getUserType())) {
+            throw new BizException("领队类型无效");
+        }
+
+        // 数据对象转换
+        SchoolStaffWrapper.SchoolStaff wrapper = SchoolStaffWrapper.SchoolStaff.from(info.jsonString());
+        // 新增数据
+        schoolStaffService.add(wrapper);
+        
+        return succeed();
+	}
+
+    @ApiOperation(value = "合作单位查询", notes = "合作单位学校查询- 主键Id")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "id", value = "合作单位ID", dataType = "long")
+    })
+    @GetMapping("/cooperation")
+    public HttpResponseResult<CooperationOrgan> queryCooperationById(@RequestParam Long id) {
+
+    	CooperationOrgan cooperationOrgan = cooperationOrganService.get(Optional.ofNullable(id).orElse(-1L).intValue());
+        if (Objects.isNull(cooperationOrgan)) {
+            throw new BizException("合作单位编号无效");
+        }
+
+    	return succeed(cooperationOrgan);
+    }
+
+}

+ 149 - 0
mec-web/src/main/java/com/ym/mec/web/controller/school/SchoolStaffController.java

@@ -0,0 +1,149 @@
+package com.ym.mec.web.controller.school;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.microsvc.toolkit.common.response.paging.PageInfo;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.auth.api.client.SysUserFeignService;
+import com.ym.mec.auth.api.entity.SysUser;
+import com.ym.mec.biz.dal.entity.CooperationOrgan;
+import com.ym.mec.biz.dal.entity.SchoolStaff;
+import com.ym.mec.biz.dal.enums.ParamEnum;
+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.common.controller.BaseController;
+import com.ym.mec.common.entity.HttpResponseResult;
+import com.ym.mec.common.exception.BizException;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Objects;
+
+@Slf4j
+@Validated
+@RestController
+@RequestMapping("/schoolStaff")
+@Api(tags = "学校员工")
+public class SchoolStaffController extends BaseController {
+
+    @Autowired
+    private SchoolStaffService schoolStaffService;
+    @Autowired
+    private SysUserFeignService sysUserFeignService;
+    @Autowired
+    private CooperationOrganService cooperationOrganService;
+
+
+	@ApiOperation(value = "详情", notes = "学校员工-根据详情ID查询单条, 传入id")
+    @PreAuthorize("@pcs.hasPermissions('schoolStaff/detail')")
+    @GetMapping("/detail/{id}")
+    public HttpResponseResult<SchoolStaff> detail(@PathVariable("id") Long id) {
+    
+    	SchoolStaff wrapper = schoolStaffService.detail(id);
+        
+        return succeed(wrapper);
+	}
+    
+    @ApiOperation(value = "查询分页", notes = "学校员工- 传入 SchoolStaffWrapper.SchoolStaffQuery") 
+    @PreAuthorize("@pcs.hasPermissions('schoolStaff/page')")
+    @PostMapping("/page")
+    public HttpResponseResult<PageInfo<SchoolStaff>> page(@RequestBody SchoolStaffWrapper.SchoolStaffQuery query) {
+        
+        IPage<SchoolStaff> pages = schoolStaffService.selectPage(QueryInfo.getPage(query), query);
+        
+        return succeed(QueryInfo.pageInfo(pages));
+	}
+    
+    @ApiOperation(value = "新增", notes = "学校员工- 传入 SchoolStaffWrapper.SchoolStaff")
+    @PreAuthorize("@pcs.hasPermissions('schoolStaff/save')")
+	@PostMapping("/save")
+	public HttpResponseResult<JSONObject> add(@Validated @RequestBody SchoolStaff schoolStaff) {
+        
+        // 新增数据
+        schoolStaffService.save(schoolStaff);
+        
+        return succeed();
+	}
+    
+    @ApiOperation(value = "修改", notes = "学校员工- 传入 SchoolStaffWrapper.SchoolStaff")
+    @PreAuthorize("@pcs.hasPermissions('schoolStaff/update')")
+	@PostMapping("/update")
+	public HttpResponseResult<JSONObject> update(@Validated @RequestBody SchoolStaff schoolStaff) {
+        
+        // 更新数据
+        schoolStaffService.updateById(schoolStaff);
+        
+        return succeed();
+	}
+
+	@ApiOperation(value = "删除", notes = "学校员工- 传入id")
+    @PreAuthorize("@pcs.hasPermissions('schoolStaff/remove')")
+	@PostMapping("/remove")    
+	public HttpResponseResult<Boolean> remove(@RequestParam Long id) {
+    
+		return succeed(schoolStaffService.removeById(id));
+	}
+
+    @ApiOperation(value = "查询学校员工信息")
+    @GetMapping("/queryUserInfo")
+    public HttpResponseResult<SchoolStaffWrapper.StaffSysUser> queryStaffSysUser() {
+
+        // 查询用户信息
+        SysUser sysUser = sysUserFeignService.queryUserInfo();
+        if (Objects.isNull(sysUser)) {
+            throw new BizException("请先登录");
+        }
+
+        SchoolStaffWrapper.StaffSysUser user = SchoolStaffWrapper.StaffSysUser.from(JSON.toJSONString(sysUser));
+        // 查询学校员工信息
+        SchoolStaff schoolStaff = schoolStaffService.queryByUserId(Long.valueOf(sysUser.getId()));
+        if (Objects.isNull(schoolStaff)) {
+            throw new BizException("员工账号不存在");
+        }
+
+        // 设置数据
+        user.schoolId(schoolStaff.getSchoolId())
+                .userId(schoolStaff.getUserId())
+                .schoolUserType(schoolStaff.getUserType())
+                .organIdList(schoolStaff.getOrganIdList())
+                .tenantId(schoolStaff.getTenantId())
+                .setResetFlag(false);
+
+        // 默认初始密钥
+        int phoneStrLen = sysUser.getPhone().length();
+        String defaultPassword = "gym" + sysUser.getPhone().substring(phoneStrLen - 4, phoneStrLen);
+        // 密码重置标识
+        user.setResetFlag(false);
+
+        String password = sysUser.getPassword();
+        if (StringUtils.isNotBlank(password)
+                && (new BCryptPasswordEncoder().matches(ParamEnum.INIT_PASSWORD.getCode().toString(), password)
+                || new BCryptPasswordEncoder().matches(defaultPassword, password))) {
+            user.setResetFlag(true);
+        }
+
+        // 学校信息
+        CooperationOrgan cooperation = cooperationOrganService.get(schoolStaff.getSchoolId().intValue());
+        if (Objects.isNull(cooperation)) {
+            throw new BizException("合作单位无效");
+        }
+        user.schoolName(cooperation.getName()).logo(cooperation.getLogo());
+
+        return succeed(user);
+    }
+}

+ 76 - 0
mec-web/src/main/java/com/ym/mec/web/vo/SchoolStaffVo.java

@@ -0,0 +1,76 @@
+package com.ym.mec.web.vo;
+
+import com.alibaba.fastjson.JSON;
+import com.microsvc.toolkit.common.response.paging.QueryInfo;
+import com.ym.mec.biz.dal.enums.school.ESchoolStaffType;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Pattern;
+
+/**
+ * 学校员工
+ * 2023-05-06 11:08:00
+ */
+@ApiModel(value = "SchoolStaffVo对象", description = "学校员工查询视图对象")
+public class SchoolStaffVo {
+
+    @Data
+    @ApiModel(" SchoolStaffQuery-学校员工")
+    public static class SchoolStaffQuery implements QueryInfo {
+    
+        @ApiModelProperty("当前页")
+        private Integer page;
+        
+        @ApiModelProperty("分页行数")
+        private Integer rows;
+        
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static SchoolStaffQuery from(String json) {
+            return JSON.parseObject(json, SchoolStaffQuery.class);
+        }
+    }
+    
+    @Data
+    @ApiModel(" SchoolStaff-学校员工")
+    public static class SchoolStaff {
+    	
+		@ApiModelProperty("主键")
+        private Long id;
+                
+        @NotNull(message = "合作单位编号不能为空")
+		@ApiModelProperty("合作单位编号")
+        private Long schoolId;
+                
+		@ApiModelProperty("用户身份(校长,乐团领队,分管领导,负责老师)")
+        private ESchoolStaffType userType;
+                
+        @NotBlank(message = "用户名称不能为空")
+        @Length(min = 1, max = 8, message = "用户名称长度必须在1-8个字符之间")
+        @ApiModelProperty("用户名称")
+        private String username;
+
+        @NotBlank(message = "手机号码不能为空")
+        @Pattern(regexp = "1[3456789][0-9]{9}", message = "手机号码格式不正确")
+        @ApiModelProperty("手机号码")
+        private String mobile;
+                
+                
+        public String jsonString() {
+            return JSON.toJSONString(this);
+        }
+
+        public static SchoolStaff from(String json) {
+            return JSON.parseObject(json, SchoolStaff.class);
+        }
+
+    }
+    
+}