WelcomeBuildController.java 17 KB

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