RepairClassesSettingsController.java 34 KB

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