package com.gkhy.exam.system.service.impl;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.gkhy.exam.common.api.CommonPage;
import com.gkhy.exam.common.constant.UserConstant;
import com.gkhy.exam.common.domain.entity.SysUser;
import com.gkhy.exam.common.enums.UserTypeEnum;
import com.gkhy.exam.common.exception.ApiException;
import com.gkhy.exam.common.utils.PageUtils;
import com.gkhy.exam.common.utils.SecurityUtils;
import com.gkhy.exam.system.domain.*;
import com.gkhy.exam.system.domain.vo.StudentStudyVO;
import com.gkhy.exam.system.mapper.*;
import com.gkhy.exam.system.service.ExCompanyPeriodService;
import com.gkhy.exam.system.service.ExPhaseStudentService;
import com.gkhy.exam.system.service.ExStudentStudyService;
import com.gkhy.exam.system.service.SysCompanyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
/**
*
* 课时批次与学员关系表 服务实现类
*
*
* @author kzy
* @since 2024-06-06 13:53:17
*/
@Service
public class ExPhaseStudentServiceImpl extends ServiceImpl implements ExPhaseStudentService {
@Autowired
private ExStudentStudyMapper studentStudyMapper;
@Autowired
private ExStudentStudyService studentStudyService;
@Autowired
private ExStudentMapper studentMapper;
@Autowired
private ExCoursePhaseMapper coursePhaseMapper;
@Autowired
private SysCompanyService companyService;
@Autowired
private ExCompanyPeriodService companyPeriodService;
@Autowired
private ExCourseChapterPeriodMapper courseChapterPeriodMapper;
@Override
@Transactional(rollbackFor = RuntimeException.class)
public int addPhaseStudent(ExPhaseStudent phaseStudent) {
checkUserAllowed(phaseStudent);
checkStudentUnique(Collections.singletonList(phaseStudent));
//判断企业课时是否充足
phaseStudent.setCreateId(SecurityUtils.getUserId());
int row=baseMapper.insert(phaseStudent);
if(row<1){
throw new ApiException("分配学员失败");
}
//扣减企业学时,
addCompanyPeriod(phaseStudent.getPhaseId(),1);
return row;
}
@Override
@Transactional(rollbackFor = RuntimeException.class)
public int batchAddPhaseStudent(List phaseStudents) {
if(phaseStudents==null|| phaseStudents.isEmpty()){
throw new ApiException("学员数据不能为空");
}
checkUserAllowed(phaseStudents.get(0));
checkStudentUnique(phaseStudents);
for(ExPhaseStudent phaseStudent:phaseStudents){
phaseStudent.setCreateId(SecurityUtils.getUserId());
}
//判断企业课时是否充足
int row =baseMapper.batchInsert(phaseStudents);
if(row<1){
throw new ApiException("批量分配学员失败");
}
//扣减企业学时,
addCompanyPeriod(phaseStudents.get(0).getPhaseId(),phaseStudents.size());
return row;
}
public void checkUserAllowed(ExPhaseStudent phaseStudent) {
SysUser currentUser= SecurityUtils.getLoginUser().getUser();
if(currentUser.getUserType().equals(UserTypeEnum.SYSTEM_USER.getCode())){
return;
}
if(currentUser.getUserType().equals(UserTypeEnum.STUDENT.getCode())){
throw new ApiException("没有权限操作");
}
ExCoursePhase coursePhase=coursePhaseMapper.selectById(phaseStudent.getPhaseId());
if(!coursePhase.getCompanyId().equals(currentUser.getCompanyId())){
throw new ApiException("没有权限操作其他企业批次");
}
}
@Override
public CommonPage selectPhaseStudentList(ExPhaseStudent phaseStudent) {
if(phaseStudent.getPhaseId()==null){
throw new ApiException("批次id不能为空");
}
PageUtils.startPage();
List phaseStudentList=baseMapper.selectPhaseStudentList(phaseStudent);
if(phaseStudentList.size()>0) {
//获取课程所有课时数量
int count = courseChapterPeriodMapper.selectCountByCourseId(phaseStudentList.get(0).getCourse().getId());
if(count>0) {
for (ExPhaseStudent ps : phaseStudentList) {
if (ps.getTotalProgress() != null) {
ps.setTotalProgress(ps.getTotalProgress().divide(BigDecimal.valueOf(count), BigDecimal.ROUND_UP));
}
}
}
}
return CommonPage.restPage(phaseStudentList);
}
@Override
public CommonPage selectPhaseStudentListForStudent(ExPhaseStudent phaseStudent) {
SysUser user= SecurityUtils.getLoginUser().getUser();
if(!Objects.equals(user.getUserType(), UserTypeEnum.STUDENT.getCode())){
throw new ApiException("非学员用户,不能查看");
}
phaseStudent.setStudentId(user.getId());
PageUtils.startPage();
List phaseStudentList=baseMapper.selectPhaseStudentList(phaseStudent);
return CommonPage.restPage(phaseStudentList);
}
@Override
public int deletePhaseStudent(Long phaseStudentId) {
ExPhaseStudent phaseStudent=baseMapper.selectPhaseStudentById(phaseStudentId);
if(ObjectUtil.isNull(phaseStudent)){
throw new ApiException("该批次下不存在该学员id");
}
checkUserAllowed(phaseStudent);
int studentStudyCount=studentStudyMapper.countByPhaseId(phaseStudent.getPhaseId(),phaseStudent.getStudentId());
if(studentStudyCount>0){
throw new ApiException(String.format("学员<%s>已进行该批次学习,不能删除",phaseStudent.getStudentName()));
}
//删除学员与批次关系
return baseMapper.deleteById(phaseStudentId);
}
@Override
@Transactional(rollbackFor = RuntimeException.class)
public void batchDeletePhaseStudent(List phaseStudentIds) {
for(Long phaseStudentId :phaseStudentIds){
deletePhaseStudent(phaseStudentId);
}
}
@Override
public void checkStudentUnique(List phaseStudents){
for(ExPhaseStudent phaseStudent:phaseStudents) {
Integer existCount = baseMapper.selectCountByPhaseStudentId(phaseStudent.getPhaseId(), phaseStudent.getStudentId());
if (existCount > 0) {
ExStudent student = studentMapper.selectById(phaseStudent.getStudentId());
throw new ApiException(String.format("待分配学员<%s>已存在", student.getName()));
}
}
}
@Override
public List getPhaseStudentById(Long phaseStudentId) {
ExPhaseStudent phaseStudent=getById(phaseStudentId);
return studentStudyService.selectStudyByPhaseAndStundentId(phaseStudent.getPhaseId(),phaseStudent.getStudentId(), UserConstant.ENABLE);
}
public void addCompanyPeriod(Long phaseId,Integer studentCount){
//扣减企业学时
ExCoursePhase coursePhase= coursePhaseMapper.selectCoursePhaseById(phaseId);
ExCompanyPeriod companyPeriod=new ExCompanyPeriod();
companyPeriod.setPhaseId(phaseId);
companyPeriod.setModifyPeriod(-1L*studentCount*coursePhase.getCoursePeriod());
companyPeriod.setOrigin("\""+coursePhase.getName()+"\"新增学员消耗");
SysCompany company=companyService.getById(coursePhase.getCompanyId());
Long remainPeriod=company.getRemainPeriod()+companyPeriod.getModifyPeriod();
if(remainPeriod<0){
throw new ApiException("企业剩余课时不足");
}
companyPeriod.setCompanyId(company.getId());
companyPeriod.setRemainPeriod(remainPeriod);
companyPeriodService.save(companyPeriod);
company.setRemainPeriod(companyPeriod.getRemainPeriod());
companyService.updateById(company);
}
}