RepairClassesSettingsController.java 33 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695
  1. package com.repair.controller;
  2. import com.repair.api.RepairClassesSettingsControllerAPI;
  3. import com.repair.common.utils.ExcelExportUtil;
  4. import com.repair.common.utils.ExcelUtils;
  5. import com.repair.common.utils.TimeExchange;
  6. import com.repair.common.utils.paramUtils;
  7. import com.repair.model.enumModel.eFileType;
  8. import com.repair.model.enumModel.eSchool;
  9. import com.repair.model.pojo.RepairClassesSettings;
  10. import com.repair.model.pojo.RepairShiftSettings;
  11. import com.repair.model.pojo.RepairUser;
  12. import com.repair.model.request.insertRepairClassesRequest;
  13. import com.repair.model.request.updateRepairClassesRequest;
  14. import com.repair.model.result.CommonResult;
  15. import com.repair.model.result.PageUtils;
  16. import com.repair.model.vo.*;
  17. import com.repair.services.RepairClassesSettingsService;
  18. import com.repair.services.RepairShiftSettingsService;
  19. import com.repair.services.RepairUserService;
  20. import org.apache.commons.lang3.StringUtils;
  21. import org.apache.poi.hssf.usermodel.HSSFRow;
  22. import org.apache.poi.hssf.usermodel.HSSFSheet;
  23. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  24. import org.apache.poi.ss.usermodel.CellType;
  25. import org.apache.poi.xssf.usermodel.XSSFRow;
  26. import org.apache.poi.xssf.usermodel.XSSFSheet;
  27. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  28. import org.springframework.beans.factory.annotation.Autowired;
  29. import org.springframework.validation.BindingResult;
  30. import org.springframework.web.bind.annotation.RestController;
  31. import org.springframework.web.multipart.MultipartFile;
  32. import javax.servlet.http.HttpServletResponse;
  33. import java.io.IOException;
  34. import java.io.InputStream;
  35. import java.lang.reflect.InvocationTargetException;
  36. import java.text.ParseException;
  37. import java.time.Instant;
  38. import java.time.LocalDate;
  39. import java.time.LocalDateTime;
  40. import java.time.ZoneId;
  41. import java.time.format.DateTimeFormatter;
  42. import java.util.*;
  43. import java.util.stream.Collectors;
  44. /**
  45. * <p>
  46. * 前端控制器
  47. * </p>
  48. *
  49. * @author ceshi
  50. * @since 2023-07-13
  51. */
  52. @RestController
  53. public class RepairClassesSettingsController implements RepairClassesSettingsControllerAPI {
  54. @Autowired
  55. private RepairUserService repairUserService;
  56. @Autowired
  57. private RepairShiftSettingsService repairShiftSettingsService;
  58. @Autowired
  59. private RepairClassesSettingsService repairClassesSettingsService;
  60. /**
  61. * 新增排班数据
  62. * @param ircr 排版数据
  63. * @param bindingResult 是否为空判断
  64. * @return
  65. * @throws ParseException
  66. */
  67. @Override
  68. public CommonResult InsertRepairClassesSettings(insertRepairClassesRequest ircr, BindingResult bindingResult) throws ParseException {
  69. if (bindingResult.hasErrors()) {
  70. String st = paramUtils.getParamError(bindingResult);
  71. return CommonResult.fail(st);
  72. }
  73. if (ircr.getStartDate() == null) {
  74. return CommonResult.fail("开始日期不能为空");
  75. }
  76. //防止选择的班次重叠
  77. List<RepairShiftSettings> datas = repairShiftSettingsService.getRepairsByShiftIds(ircr.getShiftIds());
  78. for (int i = 0; i < datas.size(); i++) {
  79. for (int j = i + 1; j < datas.size(); j++) {
  80. boolean isOver = TimeExchange.overlapping(datas.get(i).getStartTime(), datas.get(i).getEndTime(), datas.get(j).getStartTime(), datas.get(j).getEndTime());
  81. if (isOver) {
  82. return CommonResult.fail(datas.get(i).getStartTime() + "-" + datas.get(i).getEndTime() + "时间段和" + datas.get(j).getStartTime() + "-" + datas.get(j).getEndTime() + "时间段存在重叠");
  83. }
  84. }
  85. }
  86. RepairClassesSettings rcs = new RepairClassesSettings();
  87. rcs.setUserId(ircr.getUserId());
  88. rcs.setShiftId(StringUtils.join(ircr.getShiftIds(), ','));
  89. rcs.setStartDate(ircr.getStartDate());
  90. int result = repairClassesSettingsService.insertRepairClassesSettings(rcs);
  91. return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
  92. }
  93. /**
  94. * 根据ID更新排班数据
  95. * @param urcr 排班数据
  96. * @param bindingResult 是否为空判断
  97. * @return
  98. * @throws ParseException
  99. */
  100. @Override
  101. public CommonResult updateRepairClassesSettingsById(updateRepairClassesRequest urcr, BindingResult bindingResult) throws ParseException {
  102. if (bindingResult.hasErrors()) {
  103. String st = paramUtils.getParamError(bindingResult);
  104. return CommonResult.fail(st);
  105. }
  106. if (urcr.getStartDate() == null) {
  107. return CommonResult.fail("开始日期不能为空");
  108. }
  109. RepairClassesSettings rcs = repairClassesSettingsService.getRepairById(urcr.getId());
  110. if (rcs == null) {
  111. return CommonResult.fail("当前数据不存在,修改失败!");
  112. }
  113. LocalDate dateNow = LocalDate.now();
  114. //小于等于当天时间的数据不能修改
  115. if(rcs.getStartDate().isBefore(dateNow) || rcs.getStartDate().isEqual(dateNow)){
  116. return CommonResult.fail("当天及当天以前的排班数据无法进行修改操作!");
  117. }
  118. //防止选择的班次重叠
  119. List<RepairShiftSettings> datas = repairShiftSettingsService.getRepairsByShiftIds(urcr.getShiftIds());
  120. for (int i = 0; i < datas.size(); i++) {
  121. for (int j = i + 1; j < datas.size(); j++) {
  122. boolean isOver = TimeExchange.overlapping(datas.get(i).getStartTime(), datas.get(i).getEndTime(), datas.get(j).getStartTime(), datas.get(j).getEndTime());
  123. if (isOver) {
  124. return CommonResult.fail(datas.get(i).getStartTime() + "-" + datas.get(i).getEndTime() + "时间段和" + datas.get(j).getStartTime() + "-" + datas.get(j).getEndTime() + "时间段存在重叠");
  125. }
  126. }
  127. }
  128. rcs.setId(urcr.getId());
  129. rcs.setUserId(urcr.getUserId());
  130. rcs.setShiftId(StringUtils.join(urcr.getShiftIds(), ','));
  131. rcs.setStartDate(urcr.getStartDate());
  132. int result = repairClassesSettingsService.updateRepairClassesSettings(rcs);
  133. return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
  134. }
  135. /**
  136. * 查询排班分页数据
  137. * @param currentPage 当前页数
  138. * @param pageCount 一页数据条数
  139. * @param startTime 开始时间
  140. * @param endTime 结束时间
  141. * @return
  142. */
  143. @Override
  144. public CommonResult queryPageRepairClassesSettingss(int currentPage, int pageCount, String startTime, String endTime) {
  145. PageUtils<RepairUser> result = repairUserService.queryPageRepairUser(currentPage, pageCount);
  146. List<Integer> userIds = result.getList().stream().map(RepairUser::getId).collect(Collectors.toList());
  147. if (startTime == null || endTime == null) {
  148. String[] weeks = TimeExchange.getCurrentWeekTimeFrame();
  149. startTime = weeks[0];
  150. endTime = weeks[1];
  151. }
  152. LocalDate StartDate = LocalDate.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  153. LocalDate EndDate = LocalDate.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  154. List<ClassSettingDateVo> dates = TimeExchange.getDatesBetween(StartDate, EndDate);
  155. try {
  156. startTime = startTime == null ? startTime : TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
  157. endTime = endTime == null ? endTime : TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
  158. } catch (Exception e) {
  159. }
  160. List<ClassesSettingVo> datas = repairClassesSettingsService.getRepairByUserIds(userIds, startTime, endTime);
  161. List<ClassesSettingPageDataVo> cspds = new ArrayList<>();
  162. for (RepairUser ru : result.getList()) {
  163. ClassesSettingPageDataVo cspd = new ClassesSettingPageDataVo();
  164. cspd.setSchoolId(ru.getSchoolId());
  165. cspd.setSchoolName(eSchool.stringOf(ru.getSchoolId()));
  166. cspd.setUserId(ru.getId());
  167. cspd.setUserName(ru.getUserName());
  168. List<ClassesSettingVo> classDatas = datas.stream().filter(e -> e.getUserId() == ru.getId()).collect(Collectors.toList());
  169. for (ClassSettingDateVo d : dates) {
  170. Optional<ClassesSettingVo> o = classDatas.stream().filter(e -> e.getStartDate().equals(d.getDateStr())).findFirst();
  171. if (!(o != null && o.isPresent())) {
  172. ClassesSettingVo newData = new ClassesSettingVo();
  173. newData.setStartDate(d.getDateStr());
  174. newData.setUserId(ru.getId());
  175. classDatas.add(newData);
  176. }
  177. }
  178. classDatas.sort(Comparator.comparing(ClassesSettingVo::getStartDate));
  179. cspd.setClassSettings(classDatas);
  180. cspds.add(cspd);
  181. }
  182. ClassesSettingPageVo data = new ClassesSettingPageVo();
  183. data.setDates(dates);
  184. PageUtils ssss = new PageUtils(cspds, result.getTotalCount(), result.getTotalPage(), result.getCurrPage());
  185. data.setPageDatas(ssss);
  186. return CommonResult.ok(data);
  187. }
  188. /**
  189. * 排班数据导出
  190. * @param startTime 开始时间
  191. * @param endTime 结束时间
  192. * @param response 响应流
  193. */
  194. @Override
  195. public void downloadRepairClassesExcel(String startTime, String endTime, HttpServletResponse response){
  196. List<RepairUser> result = repairUserService.queryRepairUsers();
  197. List<Integer> userIds = result.stream().map(RepairUser::getId).collect(Collectors.toList());
  198. if (startTime == null || endTime == null) {
  199. String[] weeks = TimeExchange.getCurrentWeekTimeFrame();
  200. startTime = weeks[0];
  201. endTime = weeks[1];
  202. }
  203. LocalDate StartDate = LocalDate.parse(startTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  204. LocalDate EndDate = LocalDate.parse(endTime, DateTimeFormatter.ofPattern("yyyy-MM-dd"));
  205. List<ClassSettingDateVo> dates = TimeExchange.getDatesBetween(StartDate, EndDate);
  206. try {
  207. startTime = startTime == null ? startTime : TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
  208. endTime = endTime == null ? endTime : TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
  209. } catch (Exception e) {
  210. }
  211. List<ClassesSettingVo> datas = repairClassesSettingsService.getRepairByUserIds(userIds, startTime, endTime);
  212. List<Map<String, Object>> list = new ArrayList<>();
  213. for (RepairUser ru : result) {
  214. Map<String, Object> map = new LinkedHashMap<>();
  215. map.put("名称", ru.getUserName());
  216. List<ClassesSettingVo> classDatas = datas.stream().filter(e -> e.getUserId() == ru.getId()).collect(Collectors.toList());
  217. for (ClassSettingDateVo d : dates) {
  218. Optional<ClassesSettingVo> o = classDatas.stream().filter(e -> e.getStartDate().equals(d.getDateStr())).findFirst();
  219. if (!(o != null && o.isPresent())) {
  220. map.put(d.getDateStr() + "(" + d.getWeekStr() + ")", "");
  221. } else {
  222. map.put(d.getDateStr() + "(" + d.getWeekStr() + ")", o.get().getShiftName());
  223. }
  224. }
  225. list.add(map);
  226. }
  227. ExcelExportUtil.createExcel(list, "testExcel.xlsx", "排班文档", response);
  228. }
  229. /**
  230. * 根据数据ID删除排班数据
  231. * @param id 数据ID
  232. * @return
  233. */
  234. @Override
  235. public CommonResult deleteRepairClassesSettingsById(int id) {
  236. RepairClassesSettings data = repairClassesSettingsService.getRepairById(id);
  237. if (data == null) {
  238. return CommonResult.fail("当前数据不存在,删除失败!");
  239. }
  240. LocalDate dateNow = LocalDate.now();
  241. //小于等于当天时间的数据不能删除
  242. if(data.getStartDate().isBefore(dateNow) || data.getStartDate().isEqual(dateNow)){
  243. return CommonResult.fail("当天及当天以前的排班数据无法进行删除操作!");
  244. }
  245. int result = repairClassesSettingsService.deleteRepairClassesSettingsById(id);
  246. return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
  247. }
  248. /**
  249. * 排班模板导出
  250. * @param response 响应流
  251. */
  252. @Override
  253. public void downloadRepairClassesSettingExcel(HttpServletResponse response) {
  254. ExcelUtils.fileDownload("/自定义排班模板.xlsx", response);
  255. }
  256. /**
  257. * 维修师傅首页当天排班分页数据
  258. * @param currentPage 当前页数
  259. * @param pageCount 一页数据条数
  260. * @param schoolId 校区ID
  261. * @return
  262. */
  263. @Override
  264. public CommonResult queryPageUserClasses(int currentPage, int pageCount, int schoolId) {
  265. PageUtils<AddressBookVo> result = repairUserService.queryUserPageBySchoolId(currentPage, pageCount, schoolId);
  266. List<Integer> userIds = result.getList().stream().map(AddressBookVo::getId).collect(Collectors.toList());
  267. List<ClassesDataVo> users = repairClassesSettingsService.queryClassesDatas(userIds, schoolId);
  268. List<UserScheduleVo> results = new ArrayList<>();
  269. for (AddressBookVo ru : result.getList()) {
  270. UserScheduleVo dataV = new UserScheduleVo();
  271. dataV.setId(ru.getId());
  272. dataV.setUserName(ru.getUserName());
  273. dataV.setUserPhone(ru.getUserPhone());
  274. dataV.setWorkTypeName(ru.getWorkTypeName());
  275. dataV.setState(ru.getState());
  276. dataV.setStateStr(ru.getStateStr());
  277. Optional<ClassesDataVo> data = users.stream().filter(e -> Integer.valueOf(e.getUserId()).equals(ru.getId())).findFirst();
  278. if (data != null && data.isPresent()) {
  279. dataV.setShifts(data.get().getShifts());
  280. dataV.setClassId(data.get().getId());
  281. }
  282. results.add(dataV);
  283. }
  284. PageUtils resultPage = new PageUtils(results, result.getTotalCount(), result.getTotalPage(), result.getCurrPage());
  285. return CommonResult.ok(resultPage);
  286. }
  287. /**
  288. * 后勤首页修改或新增当天排班数据
  289. * @param usv 排班数据
  290. * @param bindingResult 是否为空判断
  291. * @return
  292. * @throws ParseException
  293. */
  294. @Override
  295. public CommonResult updateUserClasses(UserScheduleVo usv, BindingResult bindingResult) throws ParseException {
  296. if (bindingResult.hasErrors()) {
  297. String st = paramUtils.getParamError(bindingResult);
  298. return CommonResult.fail(st);
  299. }
  300. RepairUser user = repairUserService.getRepairById(usv.getId());
  301. if (user == null) {
  302. return CommonResult.fail("用户信息失效,修改失败");
  303. }
  304. if (!user.getState().equals(usv.getState())) {
  305. user.setState(usv.getState());
  306. int updateUser = repairUserService.updateRepairUser(user);
  307. if (updateUser <= 0) {
  308. return CommonResult.fail("用户信息更新失败");
  309. }
  310. }
  311. if (usv.getShifts() != null && usv.getShifts().size() > 0) {
  312. List<String> shifts = usv.getShifts().stream().map(ShiftSettingDataVo::getId).distinct().collect(Collectors.toList()).stream().map(String::valueOf).collect(Collectors.toList());
  313. List<RepairShiftSettings> datas = repairShiftSettingsService.getRepairsByShiftIds(shifts);
  314. for (int i = 0; i < datas.size(); i++) {
  315. for (int j = i + 1; j < datas.size(); j++) {
  316. boolean isOver = TimeExchange.overlapping(datas.get(i).getStartTime(), datas.get(i).getEndTime(), datas.get(j).getStartTime(), datas.get(j).getEndTime());
  317. if (isOver) {
  318. return CommonResult.fail(datas.get(i).getStartTime() + "-" + datas.get(i).getEndTime() + "时间段和" + datas.get(j).getStartTime() + "-" + datas.get(j).getEndTime() + "时间段存在重叠");
  319. }
  320. }
  321. }
  322. //为空则新增排班数据
  323. if (usv.getClassId() == null) {
  324. RepairClassesSettings rcs = new RepairClassesSettings();
  325. rcs.setUserId(usv.getId());
  326. Date date = new Date();
  327. Instant instant = date.toInstant();
  328. ZoneId zoneId = ZoneId.systemDefault();
  329. // atZone()方法返回在指定时区从此Instant生成的ZonedDateTime。
  330. LocalDate localDate = instant.atZone(zoneId).toLocalDate();
  331. rcs.setStartDate(localDate);
  332. rcs.setShiftId(StringUtils.join(shifts, ","));
  333. int insertClasses = repairClassesSettingsService.insertRepairClassesSettings(rcs);
  334. if (insertClasses <= 0) {
  335. return CommonResult.fail("排班信息新增失败");
  336. }
  337. } else {
  338. //判断对应师傅当天排班数据是否存在
  339. RepairClassesSettings csv = repairClassesSettingsService.getRepairById(usv.getClassId());
  340. if(csv == null){
  341. return CommonResult.fail("排班数据不存在更新失败");
  342. }
  343. csv.setShiftId(StringUtils.join(shifts, ","));
  344. int updateClasses = repairClassesSettingsService.updateRepairClassesSettings(csv);
  345. if (updateClasses <= 0) {
  346. return CommonResult.fail("排班信息更新失败");
  347. }
  348. }
  349. }
  350. return CommonResult.ok("操作成功");
  351. }
  352. /**
  353. * 排班数据导入
  354. * @param file 导入文件
  355. * @return
  356. * @throws IOException
  357. * @throws ParseException
  358. */
  359. @Override
  360. public CommonResult importRepairClassesSettingExcel(MultipartFile file) throws IOException, ParseException {
  361. System.out.println("导入排班");
  362. if (file.isEmpty() || file.getSize() == 0) {
  363. return CommonResult.fail("导入文件不能为空");
  364. }
  365. String ContentType = file.getContentType();
  366. InputStream inputStream = file.getInputStream();
  367. List<RepairClassesSettings> result = new ArrayList<>();
  368. //xls格式文件
  369. if (ContentType.equals(eFileType.Xls.getValue())) {
  370. CommonResult<List<RepairClassesSettings>> resultData = readXls(inputStream);
  371. if (!resultData.isSuccess()) {
  372. return resultData;
  373. }
  374. result = resultData.getData();
  375. } else if (ContentType.equals(eFileType.Xlsx.getValue())) {
  376. CommonResult<List<RepairClassesSettings>> resultData = readXlsx(inputStream);
  377. if (!resultData.isSuccess()) {
  378. return resultData;
  379. }
  380. result = resultData.getData();
  381. } else {
  382. return CommonResult.fail("排班数据导入只支持Xls、Xlsx");
  383. }
  384. boolean resultBool = repairClassesSettingsService.saveBatch(result);
  385. System.out.println("导入排班1");
  386. return resultBool ? CommonResult.ok("导入成功") : CommonResult.fail("导入失败");
  387. }
  388. /**
  389. * xls文件读取方法
  390. * @param inputStream
  391. * @return
  392. * @throws IOException
  393. * @throws ParseException
  394. */
  395. private CommonResult<List<RepairClassesSettings>> readXls(InputStream inputStream) throws IOException, ParseException {
  396. int month = 0;
  397. int year = 0;
  398. List<String> datas = new ArrayList<>();
  399. HSSFWorkbook sheets = new HSSFWorkbook(inputStream);
  400. List<RepairClassesSettings> result = new ArrayList<>();
  401. //读取第一张sheet
  402. HSSFSheet sheetAt = sheets.getSheetAt(0);
  403. List<String> UserNames = new ArrayList<>();
  404. List<Integer> userZZs = new ArrayList<>();
  405. userZZs.add(1);
  406. userZZs.add(2);
  407. List<RepairUser> users = repairUserService.getRepairByUserZZ(userZZs, null);
  408. List<RepairShiftSettings> shifts = repairShiftSettingsService.getRepairs();
  409. List<RepairClassesSettings> clssses = new ArrayList<>();
  410. //rowNum = 3 从第三行开始获取值
  411. //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
  412. for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
  413. HSSFRow row = sheetAt.getRow(rowNum);
  414. if (row != null) {
  415. //使用了getStringCellValue()方法来获取值,POI会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
  416. //所以先使用setCellType()方法先将该单元格的类型设置为STRING
  417. //然后poi会根据字符串读取它
  418. //第一行数据获取月份
  419. if (rowNum == 0) {
  420. try {
  421. row.getCell(0).setCellType(CellType.STRING);
  422. month = Integer.valueOf(row.getCell(0).getStringCellValue().substring(4, 6));
  423. year = Integer.valueOf(row.getCell(0).getStringCellValue().substring(0, 4));
  424. } catch (Exception e) {
  425. return CommonResult.fail("请按模板格式导入数据");
  426. }
  427. clssses = repairClassesSettingsService.getRepairByMonths(year + "-" + String.format("%02d", month));
  428. } else if (rowNum == 3) {//日期
  429. for (int d = 3; d <= row.getPhysicalNumberOfCells() - 1; d++) {
  430. row.getCell(d).setCellType(CellType.STRING);
  431. String stringCellValue = year + "-" + String.format("%02d", month) + "-" + String.format("%02d", Integer.valueOf(row.getCell(d).getStringCellValue()));
  432. datas.add(stringCellValue);
  433. }
  434. } else if (rowNum >= 4) {
  435. row.getCell(0).setCellType(CellType.STRING);
  436. String UserName = row.getCell(0).getStringCellValue();
  437. row.getCell(1).setCellType(CellType.STRING);
  438. String CardNumber = row.getCell(1).getStringCellValue();
  439. int userId = 0;
  440. Optional<RepairUser> userData = users.stream().filter(e -> e.getUserName().equals(UserName)).findFirst();
  441. if (userData != null && userData.isPresent()) {
  442. userId = userData.get().getId();
  443. }
  444. if (userId == 0) {
  445. return CommonResult.fail(UserName + "用户数据不存在");
  446. }
  447. UserNames.add(UserName);
  448. if (UserNames.stream().distinct().count() != UserNames.size()) {
  449. return CommonResult.fail("导入的Excel中" + UserName + "存在重复数据");
  450. }
  451. for (int d = 1; d <= datas.size(); d++) {
  452. Integer userid = userId;
  453. String dateStr = datas.get(d - 1);
  454. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  455. //重复数据不让导入
  456. long exist = clssses.stream().filter(e -> e.getUserId().equals(userid) && e.getStartDate().format(formatter).equals(dateStr)).count();
  457. if (exist > 0) {
  458. return CommonResult.fail(UserName + "的" + dateStr + "日数据在系统中已存在,请勿重复导入");
  459. }
  460. //用户ID
  461. RepairClassesSettings classData = new RepairClassesSettings();
  462. classData.setUserId(userId);
  463. //日期
  464. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  465. LocalDate dateParam = LocalDate.parse(datas.get(d - 1), df);
  466. classData.setStartDate(dateParam);
  467. //班次ID
  468. row.getCell(d+2).setCellType(CellType.STRING);
  469. String stringCellValue = row.getCell(d+2).getStringCellValue();
  470. String[] shiftStrs = stringCellValue.split("、");
  471. List<String> shiftIds = new ArrayList<>();
  472. List<RepairShiftSettings> shiftDatas = new ArrayList<>();
  473. for (String shiftStr : shiftStrs) {
  474. if (!shiftStr.equals("")) {
  475. Optional<RepairShiftSettings> shiftData = shifts.stream().filter(e -> e.getName().equals(shiftStr)).findFirst();
  476. if (shiftData != null && shiftData.isPresent()) {
  477. shiftIds.add(shiftData.get().getId().toString());
  478. shiftDatas.add(shiftData.get());
  479. } else {
  480. return CommonResult.fail(UserName + "的" + datas.get(d - 1) + "的" + shiftStr + "数据不存在");
  481. }
  482. }
  483. }
  484. for (int i = 0; i < shiftDatas.size(); i++) {
  485. for (int j = i + 1; j < shiftDatas.size(); j++) {
  486. boolean isOver = TimeExchange.overlapping(shiftDatas.get(i).getStartTime(), shiftDatas.get(i).getEndTime(), shiftDatas.get(j).getStartTime(), shiftDatas.get(j).getEndTime());
  487. if (isOver) {
  488. return CommonResult.fail(UserName + "师傅的" + datas.get(d - 1) + "日" + shiftDatas.get(i).getStartTime() + "-" + shiftDatas.get(i).getEndTime() + "时间段和" + shiftDatas.get(j).getStartTime() + "-" + shiftDatas.get(j).getEndTime() + "时间段存在重叠");
  489. }
  490. }
  491. }
  492. classData.setShiftId(StringUtils.join(shiftIds, ','));
  493. result.add(classData);
  494. }
  495. }
  496. }
  497. }
  498. return CommonResult.ok(result);
  499. }
  500. /**
  501. * Xlsx文件读取方法
  502. * @param inputStream
  503. * @return
  504. * @throws IOException
  505. * @throws ParseException
  506. */
  507. private CommonResult<List<RepairClassesSettings>> readXlsx(InputStream inputStream) throws IOException, ParseException {
  508. int month = 0;
  509. int year = 0;
  510. List<String> datas = new ArrayList<>();
  511. XSSFWorkbook sheets = new XSSFWorkbook(inputStream);
  512. List<RepairClassesSettings> result = new ArrayList<>();
  513. //读取第一张sheet
  514. XSSFSheet sheetAt = sheets.getSheetAt(0);
  515. List<String> UserNames = new ArrayList<>();
  516. List<Integer> userZZs = new ArrayList<>();
  517. userZZs.add(1);
  518. userZZs.add(2);
  519. List<RepairUser> users = repairUserService.getRepairByUserZZ(userZZs, null);
  520. List<RepairShiftSettings> shifts = repairShiftSettingsService.getRepairs();
  521. List<RepairClassesSettings> clssses = new ArrayList<>();
  522. //rowNum = 3 从第三行开始获取值
  523. //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
  524. for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
  525. XSSFRow row = sheetAt.getRow(rowNum);
  526. if (row != null) {
  527. //使用了getStringCellValue()方法来获取值,POI会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
  528. //所以先使用setCellType()方法先将该单元格的类型设置为STRING
  529. //然后poi会根据字符串读取它
  530. //第一行数据获取月份
  531. if (rowNum == 0) {
  532. try {
  533. row.getCell(0).setCellType(CellType.STRING);
  534. month = Integer.valueOf(row.getCell(0).getStringCellValue().substring(4, 6));
  535. year = Integer.valueOf(row.getCell(0).getStringCellValue().substring(0, 4));
  536. } catch (Exception e) {
  537. return CommonResult.fail("请按模板格式导入数据");
  538. }
  539. clssses = repairClassesSettingsService.getRepairByMonths(year + "-" + String.format("%02d", month));
  540. } else if (rowNum == 3) {//日期
  541. for (int d = 3; d <= row.getPhysicalNumberOfCells() - 1; d++) {
  542. row.getCell(d).setCellType(CellType.STRING);
  543. String stringCellValue = year + "-" + String.format("%02d", month) + "-" + String.format("%02d", Integer.valueOf(row.getCell(d).getStringCellValue()));
  544. datas.add(stringCellValue);
  545. }
  546. } else if (rowNum >= 4) {
  547. row.getCell(0).setCellType(CellType.STRING);
  548. String UserName = row.getCell(0).getStringCellValue();
  549. row.getCell(1).setCellType(CellType.STRING);
  550. String CardNumber = row.getCell(1).getStringCellValue();
  551. int userId = 0;
  552. Optional<RepairUser> userData = users.stream().filter(e -> e.getUserName().equals(UserName) && e.getCardNumber().equals(CardNumber)).findFirst();
  553. if (userData != null && userData.isPresent()) {
  554. userId = userData.get().getId();
  555. }
  556. if (userId == 0) {
  557. return CommonResult.fail(UserName + "用户数据不存在");
  558. }
  559. UserNames.add(UserName);
  560. if (UserNames.stream().distinct().count() != UserNames.size()) {
  561. return CommonResult.fail("导入的Excel中" + UserName + "存在重复数据");
  562. }
  563. for (int d = 1; d <= datas.size(); d++) {
  564. Integer userid = userId;
  565. String dateStr = datas.get(d - 1);
  566. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  567. //重复数据不让导入
  568. long exist = clssses.stream().filter(e -> e.getUserId().equals(userid) && e.getStartDate().format(formatter).equals(dateStr)).count();
  569. if (exist > 0) {
  570. return CommonResult.fail(UserName + "的" + dateStr + "日数据在系统中已存在,请勿重复导入");
  571. }
  572. //用户ID
  573. RepairClassesSettings classData = new RepairClassesSettings();
  574. classData.setUserId(userId);
  575. //日期
  576. DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  577. LocalDate dateParam = LocalDate.parse(datas.get(d - 1), df);
  578. classData.setStartDate(dateParam);
  579. //班次ID
  580. row.getCell(d+2).setCellType(CellType.STRING);
  581. String stringCellValue = row.getCell(d+2).getStringCellValue();
  582. String[] shiftStrs = stringCellValue.split("、");
  583. List<String> shiftIds = new ArrayList<>();
  584. List<RepairShiftSettings> shiftDatas = new ArrayList<>();
  585. for (String shiftStr : shiftStrs) {
  586. if (!shiftStr.equals("")) {
  587. Optional<RepairShiftSettings> shiftData = shifts.stream().filter(e -> e.getName().equals(shiftStr)).findFirst();
  588. if (shiftData != null && shiftData.isPresent()) {
  589. shiftIds.add(shiftData.get().getId().toString());
  590. shiftDatas.add(shiftData.get());
  591. } else {
  592. return CommonResult.fail(UserName + "的" + datas.get(d - 1) + "的" + shiftStr + "数据不存在");
  593. }
  594. }
  595. }
  596. for (int i = 0; i < shiftDatas.size(); i++) {
  597. for (int j = i + 1; j < shiftDatas.size(); j++) {
  598. boolean isOver = TimeExchange.overlapping(shiftDatas.get(i).getStartTime(), shiftDatas.get(i).getEndTime(), shiftDatas.get(j).getStartTime(), shiftDatas.get(j).getEndTime());
  599. if (isOver) {
  600. return CommonResult.fail(UserName + "师傅的" + datas.get(d - 1) + "日" + shiftDatas.get(i).getStartTime() + "-" + shiftDatas.get(i).getEndTime() + "时间段和" + shiftDatas.get(j).getStartTime() + "-" + shiftDatas.get(j).getEndTime() + "时间段存在重叠");
  601. }
  602. }
  603. }
  604. classData.setShiftId(StringUtils.join(shiftIds, ','));
  605. result.add(classData);
  606. }
  607. }
  608. }
  609. }
  610. return CommonResult.ok(result);
  611. }
  612. }