package com.repair.controller;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.repair.api.RepairClassesSettingsControllerAPI;
import com.repair.common.utils.ExcelExportUtil;
import com.repair.common.utils.ExcelUtils;
import com.repair.common.utils.TimeExchange;
import com.repair.common.utils.paramUtils;
import com.repair.model.enumModel.eFileType;
import com.repair.model.enumModel.eSchool;
import com.repair.model.pojo.RepairClassesSettings;
import com.repair.model.pojo.RepairShiftSettings;
import com.repair.model.pojo.RepairUser;
import com.repair.model.request.insertRepairClassesRequest;
import com.repair.model.request.updateRepairClassesRequest;
import com.repair.model.result.CommonResult;
import com.repair.model.result.PageUtils;
import com.repair.model.vo.*;
import com.repair.services.RepairClassesSettingsService;
import com.repair.services.RepairShiftSettingsService;
import com.repair.services.RepairUserService;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.stream.Collectors;
/**
*
* 前端控制器
*
*
* @author ceshi
* @since 2023-07-13
*/
@RestController
public class RepairClassesSettingsController implements RepairClassesSettingsControllerAPI {
@Autowired
private RepairUserService repairUserService;
@Autowired
private RepairShiftSettingsService repairShiftSettingsService;
@Autowired
private RepairClassesSettingsService repairClassesSettingsService;
/**
* 新增排班数据
*
* @param ircr 排版数据
* @param bindingResult 是否为空判断
* @return
* @throws ParseException
*/
@Override
public CommonResult InsertRepairClassesSettings(insertRepairClassesRequest ircr, BindingResult bindingResult) throws ParseException {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
if (ircr.getStartDate() == null) {
return CommonResult.fail("开始日期不能为空");
}
//查找该用户是否已存储过当天排班
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
String dateString = ircr.getStartDate().format(formatter);
int shiftDate = repairClassesSettingsService.getRepairByUserId(ircr.getUserId(), dateString);
if (shiftDate > 0) {
return CommonResult.fail("该用户" + dateString + "日已排班,请刷新重试!");
}
//防止选择的班次重叠
List datas = repairShiftSettingsService.getRepairsByShiftIds(ircr.getShiftIds());
for (int i = 0; i < datas.size(); i++) {
for (int j = i + 1; j < datas.size(); j++) {
boolean isOver = TimeExchange.overlapping(datas.get(i).getStartTime(), datas.get(i).getEndTime(), datas.get(j).getStartTime(), datas.get(j).getEndTime());
if (isOver) {
return CommonResult.fail(datas.get(i).getStartTime() + "-" + datas.get(i).getEndTime() + "时间段和" + datas.get(j).getStartTime() + "-" + datas.get(j).getEndTime() + "时间段存在重叠");
}
}
}
RepairClassesSettings rcs = new RepairClassesSettings();
rcs.setUserId(ircr.getUserId());
rcs.setShiftId(StringUtils.join(ircr.getShiftIds(), ','));
rcs.setStartDate(ircr.getStartDate());
int result = repairClassesSettingsService.insertRepairClassesSettings(rcs);
return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
}
/**
* 根据ID更新排班数据
*
* @param urcr 排班数据
* @param bindingResult 是否为空判断
* @return
* @throws ParseException
*/
@Override
public CommonResult updateRepairClassesSettingsById(updateRepairClassesRequest urcr, BindingResult bindingResult) throws ParseException {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
if (urcr.getStartDate() == null) {
return CommonResult.fail("开始日期不能为空");
}
RepairClassesSettings rcs = repairClassesSettingsService.getRepairById(urcr.getId());
if (rcs == null) {
return CommonResult.fail("当前数据不存在,修改失败!");
}
LocalDate dateNow = LocalDate.now();
//小于等于当天时间的数据不能修改
if (rcs.getStartDate().isBefore(dateNow) || rcs.getStartDate().isEqual(dateNow)) {
return CommonResult.fail("当天及当天以前的排班数据无法进行修改操作!");
}
//防止选择的班次重叠
List datas = repairShiftSettingsService.getRepairsByShiftIds(urcr.getShiftIds());
for (int i = 0; i < datas.size(); i++) {
for (int j = i + 1; j < datas.size(); j++) {
boolean isOver = TimeExchange.overlapping(datas.get(i).getStartTime(), datas.get(i).getEndTime(), datas.get(j).getStartTime(), datas.get(j).getEndTime());
if (isOver) {
return CommonResult.fail(datas.get(i).getStartTime() + "-" + datas.get(i).getEndTime() + "时间段和" + datas.get(j).getStartTime() + "-" + datas.get(j).getEndTime() + "时间段存在重叠");
}
}
}
rcs.setId(urcr.getId());
rcs.setUserId(urcr.getUserId());
rcs.setShiftId(StringUtils.join(urcr.getShiftIds(), ','));
rcs.setStartDate(urcr.getStartDate());
int result = repairClassesSettingsService.updateRepairClassesSettings(rcs);
return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
}
/**
* 查询排班分页数据
*
* @param currentPage 当前页数
* @param pageCount 一页数据条数
* @param startTime 开始时间
* @param endTime 结束时间
* @return
*/
@Override
public CommonResult queryPageRepairClassesSettingss(int currentPage, int pageCount, String startTime, String endTime) {
PageUtils result = repairUserService.queryPageRepairUser(currentPage, pageCount);
List userIds = result.getList().stream().map(RepairUser::getId).collect(Collectors.toList());
if (startTime == null || endTime == null) {
String[] weeks = TimeExchange.getCurrentWeekTimeFrame();
startTime = weeks[0];
endTime = weeks[1];
}
LocalDate StartDate = LocalDate.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDate EndDate = LocalDate.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List dates = TimeExchange.getDatesBetween(StartDate, EndDate);
try {
startTime = startTime == null ? startTime : TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
endTime = endTime == null ? endTime : TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
} catch (Exception e) {
}
List datas = repairClassesSettingsService.getRepairByUserIds(userIds, startTime, endTime);
List cspds = new ArrayList<>();
for (RepairUser ru : result.getList()) {
ClassesSettingPageDataVo cspd = new ClassesSettingPageDataVo();
cspd.setSchoolId(ru.getSchoolId());
cspd.setSchoolName(eSchool.stringOf(ru.getSchoolId()));
cspd.setUserId(ru.getId());
cspd.setUserName(ru.getUserName());
List classDatas = datas.stream().filter(e -> e.getUserId() == ru.getId()).collect(Collectors.toList());
for (ClassSettingDateVo d : dates) {
Optional o = classDatas.stream().filter(e -> e.getStartDate().equals(d.getDateStr())).findFirst();
if (!(o != null && o.isPresent())) {
ClassesSettingVo newData = new ClassesSettingVo();
newData.setStartDate(d.getDateStr());
newData.setUserId(ru.getId());
classDatas.add(newData);
}
}
classDatas.sort(Comparator.comparing(ClassesSettingVo::getStartDate));
cspd.setClassSettings(classDatas);
cspds.add(cspd);
}
ClassesSettingPageVo data = new ClassesSettingPageVo();
data.setDates(dates);
PageUtils ssss = new PageUtils(cspds, result.getTotalCount(), result.getTotalPage(), result.getCurrPage());
data.setPageDatas(ssss);
return CommonResult.ok(data);
}
/**
* 排班数据导出
*
* @param startTime 开始时间
* @param endTime 结束时间
* @param response 响应流
*/
@Override
public void downloadRepairClassesExcel(String startTime, String endTime, HttpServletResponse response) {
List result = repairUserService.queryRepairUsers();
List userIds = result.stream().map(RepairUser::getId).collect(Collectors.toList());
if (startTime == null || endTime == null) {
String[] weeks = TimeExchange.getCurrentWeekTimeFrame();
startTime = weeks[0];
endTime = weeks[1];
}
LocalDate StartDate = LocalDate.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
LocalDate EndDate = LocalDate.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
List dates = TimeExchange.getDatesBetween(StartDate, EndDate);
try {
startTime = startTime == null ? startTime : TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
endTime = endTime == null ? endTime : TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
} catch (Exception e) {
}
List datas = repairClassesSettingsService.getRepairByUserIds(userIds, startTime, endTime);
List