package com.ruoyi.personnel.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.core.domain.entity.DepartmentLims;
import com.ruoyi.common.core.domain.entity.User;
import com.ruoyi.common.numgen.NumberGenerator;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.exception.ErrorException;
import com.ruoyi.personnel.dto.PersonTrainingDetailedDto;
import com.ruoyi.personnel.enumeration.AttachmentType;
import com.ruoyi.personnel.excel.PersonTrainingDetailedUpload;
import com.ruoyi.personnel.mapper.*;
import com.ruoyi.personnel.pojo.*;
import com.ruoyi.personnel.service.PersonTrainingDetailedService;
import com.ruoyi.system.mapper.DepartmentLimsMapper;
import com.ruoyi.system.mapper.UserMapper;
import com.ruoyi.system.service.DepartmentLimsService;
import lombok.AllArgsConstructor;
import org.apache.commons.math3.analysis.function.Power;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 培训计划详情 服务实现类
*
*
* @author 芯导软件(江苏)有限公司
* @since 2024-10-11 01:46:27
*/
@Service
@Transactional(rollbackFor = Exception.class)
public class PersonTrainingDetailedServiceImpl extends ServiceImpl implements PersonTrainingDetailedService {
@Resource
private DepartmentLimsService departmentLimsService;
@Resource
private UserMapper userMapper;
@Resource
private PersonTrainingRecordMapper personTrainingRecordMapper;
@Resource
private PersonTrainingMapper personTrainingMapper;
// private PowerMapper powerMapper;
@Resource
private PersonTrainingFileMapper personTrainingFileMapper;
@Resource
private NumberGenerator numberGenerator;
@Resource
private DepartmentLimsMapper departmentLimsMapper;
@Value("${file.path}")
private String imgUrl;
@Value("${excelUrl}")
private String excelUrl;
@Value("${wordUrl}")
private String wordUrl;
/**
*
* @param file
* @param id 年度计划明细表id
*/
@Override
public Map fileUpload(MultipartFile file, Integer id) {
HashMap map = new HashMap<>();
String fileName = file.getOriginalFilename();
try {
UUID uuid = UUID.randomUUID();
String uuidString = uuid.toString();
int i = fileName.indexOf(".");
String suffix = fileName.substring(i); //文件后缀
String url = uuidString + suffix;
String OriginalFileName = fileName.substring(0,i); // 文件原名称
// 存放路径
String path = "";
// 根据不同的后缀存放在不同的路径下
if(suffix.toLowerCase().contains("xls")) {
path = excelUrl;
} else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
path = wordUrl;
}else {
path = imgUrl;
}
File uploadDir = new File(path);
if(!uploadDir.exists()){
uploadDir.mkdir();
}
File destFile = new File(uploadDir , url);
file.transferTo(destFile);
// 将文件路径存储到数据库
PersonTrainingFile personTrainingFile = new PersonTrainingFile();
personTrainingFile.setDetailId(id);
personTrainingFile.setFileName(OriginalFileName + suffix);
personTrainingFile.setFileUrl("/"+url);
personTrainingFile.setCreateUser(SecurityUtils.getUserId().intValue());
personTrainingFile.setCreateTime(LocalDateTime.now());
personTrainingFileMapper.insert(personTrainingFile);
map.put("fileName",OriginalFileName + suffix);
map.put("url","/"+url);
} catch (IOException e) {
throw new ErrorException("上传失败");
}
return map;
}
@Override
public List selectDepartLims() {
List departmentLims = departmentLimsMapper.selectList(null);
return departmentLims;
}
@Override
public void importExcel(List list, Integer planId) {
List personTrainingDetailedList = new ArrayList<>();
list.forEach(i -> {
PersonTrainingDetailed personTrainingDetailed = new PersonTrainingDetailed();
BeanUtils.copyProperties(i, personTrainingDetailed);
personTrainingDetailed.setClassHour(Double.parseDouble( i.getClassHour()));
// 匹配举办部门
DepartmentLims departmentLims = departmentLimsService.getOne(Wrappers.lambdaQuery()
.eq(DepartmentLims::getName, i.getHoldingDepartment()));
if (ObjectUtils.isEmpty(departmentLims)) {
throw new ErrorException("未匹配到举办部门:" + i.getHoldingDepartment());
}
personTrainingDetailed.setHoldingDepartment(departmentLims.getId());
// // 匹配讲师
// String[] names = i.getTrainingLecturerName().split("、|,|,|\\s+");
// ArrayList ids = new ArrayList<>();
// for(String name : names) {
// if(StringUtils.isNotEmpty(name)) {
// User user = userMapper.selectOne(Wrappers.lambdaQuery()
// .eq(User::getName, name));
// if(Objects.isNull(user)) {
// throw new ErrorException("未找到该讲师:" + name);
// }
// ids.add(user.getId());
// }
// }
// String collect = ids.stream().map(item -> item.toString()).collect(Collectors.joining(","));
personTrainingDetailed.setTrainingLecturerId(i.getTrainingLecturerName());
personTrainingDetailed.setPlanId(planId);
personTrainingDetailed.setState(3);
String year = new SimpleDateFormat("yy", Locale.CHINESE).format(new Date());
String month = new SimpleDateFormat("MM", Locale.CHINESE).format(new Date());
String processNumber = numberGenerator.generateNumberWithPrefix(4, "KC" + month + "-" + year + month, PersonTrainingDetailed::getCourseCode);
personTrainingDetailed.setCourseCode(processNumber);
personTrainingDetailedList.add(personTrainingDetailed);
});
// 批量新增
if (CollectionUtils.isNotEmpty(personTrainingDetailedList)) {
baseMapper.insertBatchSomeColumn(personTrainingDetailedList);
}
}
@Override
public void deleteAnnualPlanDetailTable(String ids) {
String[] split = ids.split(",");
if (split.length > 0) {
for (String s : split) {
baseMapper.deleteById(s);
}
}
}
@Override
public IPage queryTheAnnualPlanDetailsTable(Page page, String trainingLecturerName, String courseCode, String trainingDate,
Integer id, Integer userId,Integer departId,Integer state) {
// 判断当前人是否有权限查看年度计划主表
Integer userId1 = SecurityUtils.getUserId().intValue();
User user = userMapper.selectById(userId1);
String name1 = user.getName();
Integer currentUserId = user.getId();
//todo 权限待完成
// List powers = powerMapper.selectList(new LambdaQueryWrapper()
// .eq(Power::getRoleId, user.getRoleId())
// .eq(Power::getMenuMethod,"personTrainingSelect"));
// if(CollectionUtils.isEmpty(powers)) {
// if(Objects.isNull(departId) || departId == 1) {
// // 没有权限 就默认查看自己部门最新的年度计划 18 通信产品实验室 19 电力产品实验室
// if(user.getDepartLimsId().contains("18")) {
// List personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper()
// .eq(PersonTraining::getDepartId, 18)
// .orderByDesc(PersonTraining::getId));
// if(CollectionUtils.isNotEmpty(personTrainings)) {
// id = personTrainings.get(0).getId();
// }
// }else if(user.getDepartLimsId().contains("19")) {
// List personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper()
// .eq(PersonTraining::getDepartId, 19)
// .orderByDesc(PersonTraining::getId));
// if(CollectionUtils.isNotEmpty(personTrainings)) {
// id = personTrainings.get(0).getId();
// }
// }
// }else {
// List personTrainings = personTrainingMapper.selectList(new LambdaQueryWrapper()
// .eq(PersonTraining::getDepartId, departId)
// .orderByDesc(PersonTraining::getId));
// if(CollectionUtils.isNotEmpty(personTrainings)) {
// id = personTrainings.get(0).getId();
// }
// }
// }
if(Objects.nonNull(state)) {
if(state == -1) {
state = null;
}
}
IPage list = baseMapper.queryTheAnnualPlanDetailsTable(page, trainingLecturerName, courseCode, trainingDate, id, userId, userId1,state);
// 报名人数
List records = list.getRecords();
for(PersonTrainingDetailedDto a : records) {
// 报名的人数
List personTrainingRecords = personTrainingRecordMapper.selectList(new LambdaQueryWrapper()
.eq(PersonTrainingRecord::getCourseId, a.getId()));
a.setEnrollment(CollectionUtils.isNotEmpty(personTrainingRecords) ? personTrainingRecords.size() : 0);
List collect = personTrainingRecords.stream().map(PersonTrainingRecord::getUserId).collect(Collectors.toList());
if(collect.contains(SecurityUtils.getUserId().intValue())) {
a.setWhetherClaim(true);
}else {
a.setWhetherClaim(false);
}
//前端权限需要 是否可以操作按钮
// if(a.getTrainingLecturerId().contains(name1) || CollectionUtils.isNotEmpty(powers) ||
// (Objects.nonNull(a.getAssessmentUserId()) && a.getAssessmentUserId().equals(currentUserId)) || Arrays.asList(16,36,35).contains(currentUserId)) {
// a.setIsDisabled(1); // 1不禁用
// }else{
// a.setIsDisabled(0);
// }
}
return list;
}
@Override
public List getFileData(Integer detailedId) {
List personTrainingFiles = personTrainingFileMapper.selectList(new LambdaQueryWrapper()
.eq(PersonTrainingFile::getDetailId, detailedId)
.eq(PersonTrainingFile::getEnumAttachmentType, AttachmentType.getTypeValue(2)));
if(CollectionUtils.isNotEmpty(personTrainingFiles)) {
for(PersonTrainingFile a : personTrainingFiles) {
// 设置mime
int i = a.getFileUrl().indexOf(".");
String contentType = getContentType(a.getFileUrl().substring(i + 1));
a.setMime(contentType);
}
}
return personTrainingFiles;
}
@Override
public void deleteFile(Integer id) {
personTrainingFileMapper.deleteById(id);
}
@Override
public void fileDownLoad(Integer id, HttpServletResponse response) {
// 根据id查询下载的文件
PersonTrainingFile personTrainingFile = personTrainingFileMapper.selectById(id);
if(Objects.nonNull(personTrainingFile)) {
// 拿到文件路径
String fileUrl = personTrainingFile.getFileUrl();
int i = fileUrl.indexOf(".");
String suffix = fileUrl.substring(i); // 文件后缀
String url = "";
if(suffix.toLowerCase().contains("xls")) {
url = excelUrl + File.separator + fileUrl;
} else if (suffix.toLowerCase().contains("doc") || suffix.toLowerCase().contains("pdf")) {
url = wordUrl + File.separator + fileUrl;
}else {
url = imgUrl + File.separator + fileUrl;
}
File file = new File(url);
if(!file.exists()) {
throw new ErrorException("文件不存在或损坏");
}
// 获取文件输入流
try(FileInputStream fileInputStream = new FileInputStream(file); ServletOutputStream outputStream = response.getOutputStream()) {
String contentType = getContentType(fileUrl.substring(i + 1));
// 设置响应头
response.setContentType(contentType);
int i1 = personTrainingFile.getFileName().indexOf(".");
String fileName = URLEncoder.encode(personTrainingFile.getFileName().substring(0, i1), "UTF-8");
response.setHeader("Content-disposition", "attachment;filename=" + fileName + suffix);
byte[] bytes = new byte[1024];
int bytesRead;
while ((bytesRead = fileInputStream.read(bytes)) != -1 ){
outputStream.write(bytes,0,bytesRead);
}
outputStream.flush();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
// 根据文件扩展名获取 MIME 类型
private String getContentType(String fileExtension) {
switch (fileExtension) {
case "jpg":
case "jpeg":
return "image/jpeg";
case "png":
return "image/png";
case "gif":
return "image/gif";
case "pdf":
return "application/pdf";
case "doc":
return "application/msword";
case "docx":
return "application/vnd.openxmlformats-officedocument.wordprocessingml.document";
case "xls":
return "application/vnd.ms-excel";
case "xlsx":
return "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
case "ppt":
case "pptx":
return "application/vnd.ms-powerpoint";
default:
return "application/octet-stream"; // 默认二进制流
}
}
}