feat(teacher): 添加教师工作交接功能

dev_workchange
zhaokai 2026-06-24 14:54:40 +08:00
parent 45898bf03a
commit 61192a9d49
6 changed files with 195 additions and 0 deletions

View File

@ -0,0 +1,32 @@
package com.zcloud.edu.facade;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.SingleResponse;
import com.zcloud.edu.command.query.resource.EduWorkQueryExe;
import com.zcloud.edu.command.resource.EduWorkChangeExe;
import com.zcloud.gbscommon.zcloudedu.facade.ZcloudEduWorkFacade;
import com.zcloud.gbscommon.zcloudedu.request.EduWorkChangeCmd;
import com.zcloud.gbscommon.zcloudedu.request.EduWorkQry;
import com.zcloud.gbscommon.zcloudedu.response.EduListByUserCO;
import org.apache.dubbo.config.annotation.DubboService;
import javax.annotation.Resource;
@DubboService
public class ZcloudEduWorkFacadeImpl implements ZcloudEduWorkFacade {
@Resource
private EduWorkQueryExe eduWorkQueryExe;
@Resource
private EduWorkChangeExe eduWorkChangeExe;
@Override
public MultiResponse<EduListByUserCO> listManagerByUserId(EduWorkQry eduWorkQry) {
return MultiResponse.of(eduWorkQueryExe.execute(eduWorkQry));
}
@Override
public SingleResponse updateWorkChange(EduWorkChangeCmd eduWorkChangeCmd) {
eduWorkChangeExe.execute(eduWorkChangeCmd);
return SingleResponse.buildSuccess();
}
}

View File

@ -0,0 +1,53 @@
package com.zcloud.edu.command.query.resource;
import com.zcloud.edu.persistence.dataobject.TeacherDO;
import com.zcloud.edu.persistence.repository.resource.TeacherRepository;
import com.zcloud.gbscommon.zcloudedu.request.EduWorkQry;
import com.zcloud.gbscommon.zcloudedu.response.EduListByUserCO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* web-app
*/
@Component
@AllArgsConstructor
public class EduWorkQueryExe {
private static final String WORK_PROJECT = "线下培训";
private static final String DEFAULT_WORK_CONTENT = "教师信息";
private final TeacherRepository teacherRepository;
public List<EduListByUserCO> execute(EduWorkQry qry) {
if (qry == null || qry.getUserId() == null || qry.getCorpinfoId() == null) {
return Collections.emptyList();
}
List<TeacherDO> teacherDOList = teacherRepository.listWorkByUserId(qry.getUserId(), qry.getCorpinfoId());
if (CollectionUtils.isEmpty(teacherDOList)) {
return Collections.emptyList();
}
return teacherDOList.stream().map(this::buildWorkInfo).collect(Collectors.toList());
}
private EduListByUserCO buildWorkInfo(TeacherDO teacherDO) {
EduListByUserCO eduListByUserCO = new EduListByUserCO();
eduListByUserCO.setWorkId(teacherDO.getTeacherId());
eduListByUserCO.setWorkProject(WORK_PROJECT);
eduListByUserCO.setWorkContent(buildWorkContent(teacherDO));
return eduListByUserCO;
}
private String buildWorkContent(TeacherDO teacherDO) {
if (teacherDO == null || !StringUtils.hasText(teacherDO.getTeacherName())) {
return DEFAULT_WORK_CONTENT;
}
return "教师:" + teacherDO.getTeacherName();
}
}

View File

@ -0,0 +1,74 @@
package com.zcloud.edu.command.resource;
import com.alibaba.cola.exception.BizException;
import com.zcloud.edu.persistence.dataobject.TeacherDO;
import com.zcloud.edu.persistence.repository.resource.TeacherCertificateRepository;
import com.zcloud.edu.persistence.repository.resource.TeacherRepository;
import com.zcloud.gbscommon.zcloudedu.request.EduWorkChangeCmd;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
/**
* web-app
*/
@Component
@AllArgsConstructor
@Slf4j
public class EduWorkChangeExe {
private final TeacherRepository teacherRepository;
private final TeacherCertificateRepository teacherCertificateRepository;
@Transactional(rollbackFor = Exception.class)
public void execute(EduWorkChangeCmd cmd) {
validate(cmd);
TeacherDO teacherDO = teacherRepository.getByTeacherId(cmd.getWorkId());
if (teacherDO == null) {
log.info("未查询到可交接的教师工作,{}",cmd.getWorkId());
return;
}
if (cmd.getUserId().equals(teacherDO.getUserId())) {
log.info("当前用户已接收该教师工作,{}",cmd.getWorkId());
return;
}
if (!cmd.getOldUserId().equals(teacherDO.getUserId())) {
log.info("当前教师工作责任人已变更,无法重复交接,{}",cmd.getWorkId());
return;
}
Long targetCorpinfoId = cmd.getCorpId() != null ? cmd.getCorpId() : teacherDO.getCorpinfoId();
Long duplicateCount = teacherRepository.countDuplicateWorkUser(teacherDO.getTeacherId(), cmd.getUserId(), targetCorpinfoId);
if (duplicateCount != null && duplicateCount > 0) {
throw new BizException("接收人已存在教师工作,不能重复交接");
}
teacherDO.setUserId(cmd.getUserId());
teacherDO.setCorpinfoId(targetCorpinfoId);
boolean updateResult = teacherRepository.updateById(teacherDO);
if (!updateResult) {
throw new BizException("工作交接失败");
}
teacherCertificateRepository.removeByTeacherId(teacherDO.getTeacherId());
}
private void validate(EduWorkChangeCmd cmd) {
if (cmd == null) {
throw new BizException("交接参数不能为空");
}
if (!StringUtils.hasText(cmd.getWorkId())) {
throw new BizException("工作标识不能为空");
}
if (cmd.getOldUserId() == null) {
throw new BizException("原处理人不能为空");
}
if (cmd.getUserId() == null) {
throw new BizException("接收人不能为空");
}
if (cmd.getOldUserId().equals(cmd.getUserId())) {
throw new BizException("原处理人和接收人不能相同");
}
}
}

View File

@ -14,6 +14,7 @@ import com.jjb.saas.framework.repository.repo.impl.BaseRepositoryImpl;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.List; import java.util.List;
@ -71,5 +72,31 @@ public class TeacherRepositoryImpl extends BaseRepositoryImpl<TeacherMapper, Tea
queryWrapper.in("user_id", userIdList); queryWrapper.in("user_id", userIdList);
return list(queryWrapper); return list(queryWrapper);
} }
@Override
public List<TeacherDO> listWorkByUserId(Long userId, Long corpinfoId) {
Map<String, Object> params = new HashMap<>(4);
params.put("userId", userId);
params.put("corpinfoId", corpinfoId);
return teacherMapper.getTeacherList(params);
}
@Override
public TeacherDO getByTeacherId(String teacherId) {
QueryWrapper<TeacherDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("teacher_id", teacherId);
queryWrapper.eq("delete_enum", "FALSE");
return getOne(queryWrapper);
}
@Override
public Long countDuplicateWorkUser(String teacherId, Long userId, Long corpinfoId) {
QueryWrapper<TeacherDO> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("user_id", userId);
queryWrapper.eq("corpinfo_id", corpinfoId);
queryWrapper.eq("delete_enum", "FALSE");
queryWrapper.ne("teacher_id", teacherId);
return count(queryWrapper);
}
} }

View File

@ -27,5 +27,11 @@ public interface TeacherRepository extends BaseRepository<TeacherDO> {
TeacherDO getTeacherInfoByUserId(Long userId); TeacherDO getTeacherInfoByUserId(Long userId);
List<TeacherDO> getListByUserIdList(List<Long> userIdList); List<TeacherDO> getListByUserIdList(List<Long> userIdList);
List<TeacherDO> listWorkByUserId(Long userId, Long corpinfoId);
TeacherDO getByTeacherId(String teacherId);
Long countDuplicateWorkUser(String teacherId, Long userId, Long corpinfoId);
} }

View File

@ -43,6 +43,9 @@
<if test=" params.corpinfoId != null"> <if test=" params.corpinfoId != null">
AND a.corpinfo_id = #{params.corpinfoId} AND a.corpinfo_id = #{params.corpinfoId}
</if> </if>
<if test=" params.userId != null">
AND a.user_id = #{params.userId}
</if>
<if test=" params.state != null"> <if test=" params.state != null">
AND a.state = #{params.state} AND a.state = #{params.state}
</if> </if>