WelcomeBuildController.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. package com.template.controller;
  2. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
  5. import com.template.api.WelcomeBuildControllerAPI;
  6. import com.template.common.utils.ExcelUtils;
  7. import com.template.model.enumModel.eFileType;
  8. import com.template.model.pojo.*;
  9. import com.template.model.result.CommonResult;
  10. import com.template.model.result.PageUtils;
  11. import com.template.model.vo.StudentPageVo;
  12. import com.template.model.vo.WelcomeBuildVo;
  13. import com.template.services.WelcomeBuildService;
  14. import com.template.services.WelcomeSchoolService;
  15. import org.apache.poi.hssf.usermodel.HSSFRow;
  16. import org.apache.poi.hssf.usermodel.HSSFSheet;
  17. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  18. import org.apache.poi.ss.usermodel.*;
  19. import org.apache.poi.xssf.usermodel.XSSFRow;
  20. import org.apache.poi.xssf.usermodel.XSSFSheet;
  21. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  22. import org.springframework.beans.factory.annotation.Autowired;
  23. import org.springframework.web.bind.annotation.RequestMapping;
  24. import org.springframework.web.bind.annotation.RestController;
  25. import org.springframework.web.multipart.MultipartFile;
  26. import javax.servlet.http.HttpServletResponse;
  27. import java.io.IOException;
  28. import java.io.InputStream;
  29. import java.text.ParseException;
  30. import java.util.ArrayList;
  31. import java.util.List;
  32. import java.util.Optional;
  33. import java.util.stream.Collectors;
  34. /**
  35. * <p>
  36. * 前端控制器
  37. * </p>
  38. *
  39. * @author ceshi
  40. * @since 2025-06-13
  41. */
  42. @RestController
  43. public class WelcomeBuildController implements WelcomeBuildControllerAPI {
  44. @Autowired
  45. private WelcomeBuildService welcomeBuildService;
  46. @Autowired
  47. WelcomeSchoolService welcomeSchoolService;
  48. @Override
  49. public CommonResult saveBuild(WelcomeBuild welcomeBuild) {
  50. String build = welcomeBuild.getBuild();
  51. LambdaQueryWrapper<WelcomeBuild> wrapper = new LambdaQueryWrapper<>();
  52. wrapper.eq(WelcomeBuild::getBuild, build)
  53. .eq(WelcomeBuild::getSchool, welcomeBuild.getSchool());
  54. WelcomeBuild wb = welcomeBuildService.getOne(wrapper);
  55. if (ObjectUtils.isNotEmpty(wb)) {
  56. return CommonResult.fail("已存在该楼栋");
  57. }
  58. welcomeBuildService.save(welcomeBuild);
  59. return CommonResult.ok();
  60. }
  61. @Override
  62. public CommonResult deleteBuild(Integer buildId) {
  63. boolean result = welcomeBuildService.removeById(buildId);
  64. return result ? CommonResult.ok() : CommonResult.fail();
  65. }
  66. @Override
  67. public CommonResult updateBuild(WelcomeBuild welcomeBuild) {
  68. //先查询是否有当前楼栋信息
  69. LambdaQueryWrapper<WelcomeBuild> wrapper = new LambdaQueryWrapper<>();
  70. wrapper.eq(WelcomeBuild::getBuild, welcomeBuild.getBuild())
  71. .eq(WelcomeBuild::getSchool, welcomeBuild.getSchool());
  72. WelcomeBuild one = welcomeBuildService.getOne(wrapper);
  73. if (ObjectUtils.isNotEmpty(one)) {
  74. Integer id = one.getId();
  75. if (!id.equals(welcomeBuild.getId())) {
  76. return CommonResult.fail("修改的楼栋已存在");
  77. }
  78. }
  79. welcomeBuildService.updateById(welcomeBuild);
  80. return CommonResult.ok();
  81. }
  82. @Override
  83. public CommonResult listBuild(int currentPage, int pageCount, Integer schoolId, String buildId, String sex) {
  84. PageUtils<WelcomeBuildVo> pageUtils = welcomeBuildService.listBuild(currentPage, pageCount, schoolId, buildId, sex);
  85. return CommonResult.ok(pageUtils);
  86. }
  87. @Override
  88. public CommonResult schoolGroup() {
  89. List<WelcomeSchool> schoolGroup = welcomeSchoolService.schoolGroup();
  90. return CommonResult.ok(schoolGroup);
  91. }
  92. @Override
  93. public CommonResult buildGroup(Integer schoolId) {
  94. List<WelcomeBuild> schoolGroup = welcomeBuildService.buildGroup(schoolId);
  95. return CommonResult.ok(schoolGroup);
  96. }
  97. @Override
  98. public CommonResult importBuildExcel(MultipartFile file) throws IOException, ParseException {
  99. System.out.println("导入楼栋信息");
  100. if (file.isEmpty() || file.getSize() == 0) {
  101. return CommonResult.fail("导入文件不能为空");
  102. }
  103. String ContentType = file.getContentType();
  104. InputStream inputStream = file.getInputStream();
  105. List<WelcomeBuild> result = new ArrayList<>();
  106. //xls格式文件
  107. if (ContentType.equals(eFileType.Xls.getValue())) {
  108. CommonResult<List<WelcomeBuild>> resultData = readXls(inputStream);
  109. if (!resultData.isSuccess()) {
  110. return resultData;
  111. }
  112. result = resultData.getData();
  113. } else if (ContentType.equals(eFileType.Xlsx.getValue())) {
  114. CommonResult<List<WelcomeBuild>> resultData = readXlsx(inputStream);
  115. if (!resultData.isSuccess()) {
  116. return resultData;
  117. }
  118. result = resultData.getData();
  119. } else {
  120. return CommonResult.fail("楼栋信息数据导入只支持Xls或Xlsx格式文件");
  121. }
  122. boolean resultBool = welcomeBuildService.saveOrUpdateBatch(result);
  123. System.out.println("导入楼栋1");
  124. return resultBool ? CommonResult.ok("导入成功") : CommonResult.fail("导入失败");
  125. }
  126. /**
  127. * xls文件读取方法
  128. *
  129. * @param inputStream
  130. * @return
  131. * @throws IOException
  132. * @throws ParseException
  133. */
  134. private CommonResult<List<WelcomeBuild>> readXls(InputStream inputStream) throws IOException, ParseException {
  135. List<WelcomeBuild> result = new ArrayList<>();
  136. HSSFWorkbook sheets = new HSSFWorkbook(inputStream);
  137. List<WelcomeBuild> wb = welcomeBuildService.list(null);
  138. //读取第一张sheet
  139. HSSFSheet sheetAt = sheets.getSheetAt(0);
  140. DataFormatter dataFormatter = new DataFormatter();
  141. try {
  142. //rowNum = 3 从第三行开始获取值
  143. //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
  144. for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
  145. HSSFRow row = sheetAt.getRow(rowNum);
  146. if (row != null) {
  147. //使用了getStringCellValue()方法来获取值,POI会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
  148. //所以先使用setCellType()方法先将该单元格的类型设置为STRING
  149. //然后poi会根据字符串读取它
  150. //第一行数据获取月份
  151. if (rowNum == 0) {
  152. String number = dataFormatter.formatCellValue(row.getCell(0));//序号
  153. if (!number.equals("序号")) {
  154. return CommonResult.fail("导入数据第一列为序号");
  155. }
  156. String school = dataFormatter.formatCellValue(row.getCell(1));//校区名称
  157. if (!school.equals("校区名称")) {
  158. return CommonResult.fail("导入数据第二列为校区名称");
  159. }
  160. String build = dataFormatter.formatCellValue(row.getCell(2));//楼栋名称
  161. if (!build.equals("楼栋名称")) {
  162. return CommonResult.fail("导入数据第三列为楼栋名称");
  163. }
  164. String sex = dataFormatter.formatCellValue(row.getCell(3));//楼栋性别
  165. if (!sex.equals("楼栋性别")) {
  166. return CommonResult.fail("导入数据第四列为楼栋性别");
  167. }
  168. String floors = dataFormatter.formatCellValue(row.getCell(4));//楼栋层数
  169. if (!floors.equals("楼栋层数")) {
  170. return CommonResult.fail("导入数据第五列为楼栋层数");
  171. }
  172. String startFloor = dataFormatter.formatCellValue(row.getCell(5));//起始层数
  173. if (!startFloor.equals("起始层数")) {
  174. return CommonResult.fail("导入数据第六列为起始层数");
  175. }
  176. String remark = dataFormatter.formatCellValue(row.getCell(6));//备注
  177. if (!remark.equals("备注")) {
  178. return CommonResult.fail("导入数据第七列为备注");
  179. }
  180. } else {
  181. WelcomeBuild buildData = new WelcomeBuild();
  182. String school = dataFormatter.formatCellValue(row.getCell(1));//校区名称
  183. String build = dataFormatter.formatCellValue(row.getCell(2));//楼栋名称
  184. Optional<WelcomeBuild> ob = wb.stream().filter(e -> e.getSchool().equals(school) && e.getBuild().equals(build)).findFirst();
  185. if (ob != null && ob.isPresent()) {
  186. buildData.setId(ob.get().getId());
  187. }
  188. buildData.setSchool(school);
  189. buildData.setBuild(build);
  190. String sex = dataFormatter.formatCellValue(row.getCell(3));//楼栋性别
  191. buildData.setSex(sex);
  192. String floors = dataFormatter.formatCellValue(row.getCell(4));//楼栋层数
  193. buildData.setFloors(floors);
  194. String startFloor = dataFormatter.formatCellValue(row.getCell(5));//起始层数
  195. buildData.setStartFloor(Integer.valueOf(startFloor));
  196. String remark = dataFormatter.formatCellValue(row.getCell(6));//备注
  197. buildData.setRemark(remark);
  198. result.add(buildData);
  199. }
  200. }
  201. }
  202. } catch (Exception e) {
  203. return CommonResult.fail("请按模板格式导入数据");
  204. }
  205. return CommonResult.ok(result);
  206. }
  207. /**
  208. * xls文件读取方法
  209. *
  210. * @param inputStream
  211. * @return
  212. * @throws IOException
  213. * @throws ParseException
  214. */
  215. private CommonResult<List<WelcomeBuild>> readXlsx(InputStream inputStream) throws IOException, ParseException {
  216. List<WelcomeBuild> result = new ArrayList<>();
  217. XSSFWorkbook sheets = new XSSFWorkbook(inputStream);
  218. List<WelcomeBuild> wb = welcomeBuildService.list(null);
  219. //读取第一张sheet
  220. XSSFSheet sheetAt = sheets.getSheetAt(0);
  221. DataFormatter dataFormatter = new DataFormatter();
  222. try {
  223. //rowNum = 3 从第三行开始获取值
  224. //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
  225. for (int rowNum = 0; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
  226. XSSFRow row = sheetAt.getRow(rowNum);
  227. if (row != null) {
  228. //使用了getStringCellValue()方法来获取值,POI会判断单元格的类型,如果非字符串类型就会抛出上面的异常。
  229. //所以先使用setCellType()方法先将该单元格的类型设置为STRING
  230. //然后poi会根据字符串读取它
  231. //第一行数据获取月份
  232. if (rowNum == 0) {
  233. String number = dataFormatter.formatCellValue(row.getCell(0));//序号
  234. if (!number.equals("序号")) {
  235. return CommonResult.fail("导入数据第一列为序号");
  236. }
  237. String school = dataFormatter.formatCellValue(row.getCell(1));//校区名称
  238. if (!school.equals("校区名称")) {
  239. return CommonResult.fail("导入数据第二列为校区名称");
  240. }
  241. String build = dataFormatter.formatCellValue(row.getCell(2));//楼栋名称
  242. if (!build.equals("楼栋名称")) {
  243. return CommonResult.fail("导入数据第三列为楼栋名称");
  244. }
  245. String sex = dataFormatter.formatCellValue(row.getCell(3));//楼栋性别
  246. if (!sex.equals("楼栋性别")) {
  247. return CommonResult.fail("导入数据第四列为楼栋性别");
  248. }
  249. String floors = dataFormatter.formatCellValue(row.getCell(4));//楼栋层数
  250. if (!floors.equals("楼栋层数")) {
  251. return CommonResult.fail("导入数据第五列为楼栋层数");
  252. }
  253. String startFloor = dataFormatter.formatCellValue(row.getCell(5));//起始层数
  254. if (!startFloor.equals("起始层数")) {
  255. return CommonResult.fail("导入数据第六列为起始层数");
  256. }
  257. String remark = dataFormatter.formatCellValue(row.getCell(6));//备注
  258. if (!remark.equals("备注")) {
  259. return CommonResult.fail("导入数据第七列为备注");
  260. }
  261. } else {
  262. WelcomeBuild buildData = new WelcomeBuild();
  263. String school = dataFormatter.formatCellValue(row.getCell(1));//校区名称
  264. String build = dataFormatter.formatCellValue(row.getCell(2));//楼栋名称
  265. Optional<WelcomeBuild> ob = wb.stream().filter(e -> e.getSchool().equals(school) && e.getBuild().equals(build)).findFirst();
  266. if (ob != null && ob.isPresent()) {
  267. buildData.setId(ob.get().getId());
  268. }
  269. buildData.setSchool(school);
  270. buildData.setBuild(build);
  271. String sex = dataFormatter.formatCellValue(row.getCell(3));//楼栋性别
  272. buildData.setSex(sex);
  273. String floors = dataFormatter.formatCellValue(row.getCell(4));//楼栋层数
  274. buildData.setFloors(floors);
  275. String startFloor = dataFormatter.formatCellValue(row.getCell(5));//起始层数
  276. buildData.setStartFloor(Integer.valueOf(startFloor));
  277. String remark = dataFormatter.formatCellValue(row.getCell(6));//备注
  278. buildData.setRemark(remark);
  279. result.add(buildData);
  280. }
  281. }
  282. }
  283. } catch (Exception e) {
  284. return CommonResult.fail("请按模板格式导入数据");
  285. }
  286. return CommonResult.ok(result);
  287. }
  288. @Override
  289. public CommonResult downloadBuildExcel() {
  290. return CommonResult.ok("200", "操作成功", "https://chtech.ncjti.edu.cn/welcome/homeimage/学生信息管理.xlsx");
  291. }
  292. @Override
  293. public void welcomeBuildExport(HttpServletResponse response, String schoolName, String buildName, String sex) {
  294. List<WelcomeBuild> result = welcomeBuildService.listBuild(schoolName, buildName, sex);
  295. //导出
  296. Workbook workbook = new XSSFWorkbook();
  297. Sheet sheet = workbook.createSheet("楼栋信息");
  298. // 创建样式对象
  299. CellStyle style = workbook.createCellStyle();
  300. // 设置边框样式
  301. style.setBorderBottom(BorderStyle.THIN);
  302. style.setBorderTop(BorderStyle.THIN);
  303. style.setBorderRight(BorderStyle.THIN);
  304. style.setBorderLeft(BorderStyle.THIN);
  305. style.setAlignment(HorizontalAlignment.CENTER);
  306. style.setVerticalAlignment(VerticalAlignment.CENTER);
  307. Row headerRow = sheet.createRow(0);
  308. Cell no = headerRow.createCell(0);
  309. no.setCellStyle(style);
  310. no.setCellValue("序号");
  311. Cell school = headerRow.createCell(1);
  312. school.setCellStyle(style);
  313. school.setCellValue("校区名称");
  314. Cell buildStr = headerRow.createCell(2);
  315. buildStr.setCellStyle(style);
  316. buildStr.setCellValue("楼栋名称");
  317. Cell sexStr = headerRow.createCell(3);
  318. sexStr.setCellStyle(style);
  319. sexStr.setCellValue("楼栋性别");
  320. Cell floors = headerRow.createCell(4);
  321. floors.setCellStyle(style);
  322. floors.setCellValue("楼栋层数");
  323. Cell startFloor = headerRow.createCell(5);
  324. startFloor.setCellStyle(style);
  325. startFloor.setCellValue("起始层数");
  326. Cell remark = headerRow.createCell(6);
  327. remark.setCellStyle(style);
  328. remark.setCellValue("备注");
  329. for (int i = 0; i < result.size(); i++) {
  330. WelcomeBuild build = result.get(i);
  331. Row dataRow = sheet.createRow(i + 1);
  332. Cell nod = dataRow.createCell(0);
  333. nod.setCellStyle(style);
  334. nod.setCellValue(i + 1);
  335. Cell schoold = dataRow.createCell(1);
  336. schoold.setCellStyle(style);
  337. schoold.setCellValue(build.getSchool());
  338. Cell buildStrd = dataRow.createCell(2);
  339. buildStrd.setCellStyle(style);
  340. buildStrd.setCellValue(build.getBuild());
  341. Cell sexd = dataRow.createCell(3);
  342. sexd.setCellStyle(style);
  343. sexd.setCellValue(build.getSex());
  344. Cell floord = dataRow.createCell(4);
  345. floord.setCellStyle(style);
  346. floord.setCellValue(build.getFloors());
  347. Cell startFloord = dataRow.createCell(5);
  348. startFloord.setCellStyle(style);
  349. startFloord.setCellValue(build.getStartFloor());
  350. Cell remarkd = dataRow.createCell(6);
  351. remarkd.setCellStyle(style);
  352. remarkd.setCellValue(build.getRemark());
  353. }
  354. // 将工作簿写入文件
  355. ExcelUtils.excelDownload(workbook, "楼栋信息.xlsx", response);
  356. }
  357. }