BaseNewStudentController.java 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. package com.xjrsoft.module.student.controller;
  2. import cn.dev33.satoken.annotation.SaCheckPermission;
  3. import cn.dev33.satoken.secure.BCrypt;
  4. import cn.dev33.satoken.stp.StpUtil;
  5. import cn.hutool.core.bean.BeanUtil;
  6. import cn.hutool.core.util.StrUtil;
  7. import com.alibaba.excel.EasyExcel;
  8. import com.alibaba.excel.support.ExcelTypeEnum;
  9. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  10. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  11. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  12. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  13. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  14. import com.xjrsoft.common.constant.GlobalConstant;
  15. import com.xjrsoft.common.enums.EnabledMark;
  16. import com.xjrsoft.common.model.result.RT;
  17. import com.xjrsoft.common.page.ConventPage;
  18. import com.xjrsoft.common.page.PageOutput;
  19. import com.xjrsoft.common.utils.RedisUtil;
  20. import com.xjrsoft.common.utils.VoToColumnUtil;
  21. import com.xjrsoft.config.CommonPropertiesConfig;
  22. import com.xjrsoft.module.base.entity.BaseSemester;
  23. import com.xjrsoft.module.base.entity.BaseUserStudent;
  24. import com.xjrsoft.module.base.entity.WhitelistManagement;
  25. import com.xjrsoft.module.base.service.IBaseSemesterService;
  26. import com.xjrsoft.module.base.service.IBaseUserStudentService;
  27. import com.xjrsoft.module.base.service.IWhitelistManagementService;
  28. import com.xjrsoft.module.organization.entity.User;
  29. import com.xjrsoft.module.organization.entity.UserRoleRelation;
  30. import com.xjrsoft.module.organization.service.IUserRoleRelationService;
  31. import com.xjrsoft.module.organization.service.IUserService;
  32. import com.xjrsoft.module.room.entity.RoomBed;
  33. import com.xjrsoft.module.student.dto.ActiveAccountDto;
  34. import com.xjrsoft.module.student.dto.AddBaseNewStudentDto;
  35. import com.xjrsoft.module.student.dto.BaseNewStudentPageDto;
  36. import com.xjrsoft.module.student.dto.ChangeBandingStatusDto;
  37. import com.xjrsoft.module.student.dto.DeleteNewStudentDto;
  38. import com.xjrsoft.module.student.dto.UpdateBaseNewStudentDto;
  39. import com.xjrsoft.module.student.entity.BaseNewStudent;
  40. import com.xjrsoft.module.student.entity.BaseStudentFamilyMember;
  41. import com.xjrsoft.module.student.service.IBaseNewStudentService;
  42. import com.xjrsoft.module.student.service.IBaseStudentFamilyMemberService;
  43. import com.xjrsoft.module.student.vo.BaseNewStudentExportVo;
  44. import com.xjrsoft.module.student.vo.BaseNewStudentPageVo;
  45. import com.xjrsoft.module.student.vo.BaseNewStudentScoreExcelVo;
  46. import com.xjrsoft.module.student.vo.BaseNewStudentTreeVo;
  47. import com.xjrsoft.module.student.vo.BaseNewStudentVo;
  48. import com.xjrsoft.module.student.vo.EnrollmentPlanGradeVo;
  49. import com.xjrsoft.module.student.vo.EnrollmentPlanTreeVo;
  50. import io.swagger.annotations.Api;
  51. import io.swagger.annotations.ApiOperation;
  52. import lombok.AllArgsConstructor;
  53. import org.springframework.http.ResponseEntity;
  54. import org.springframework.web.bind.annotation.DeleteMapping;
  55. import org.springframework.web.bind.annotation.GetMapping;
  56. import org.springframework.web.bind.annotation.PostMapping;
  57. import org.springframework.web.bind.annotation.PutMapping;
  58. import org.springframework.web.bind.annotation.RequestBody;
  59. import org.springframework.web.bind.annotation.RequestMapping;
  60. import org.springframework.web.bind.annotation.RequestParam;
  61. import org.springframework.web.bind.annotation.RestController;
  62. import org.springframework.web.multipart.MultipartFile;
  63. import javax.validation.Valid;
  64. import java.io.ByteArrayOutputStream;
  65. import java.io.IOException;
  66. import java.time.LocalDateTime;
  67. import java.time.format.DateTimeFormatter;
  68. import java.util.ArrayList;
  69. import java.util.Date;
  70. import java.util.LinkedHashMap;
  71. import java.util.List;
  72. import java.util.Map;
  73. import java.util.concurrent.CompletableFuture;
  74. /**
  75. * @title: 新生维护信息
  76. * @Author dzx
  77. * @Date: 2024-06-27
  78. * @Version 1.0
  79. */
  80. @RestController
  81. @RequestMapping("/student" + "/baseNewStudent")
  82. @Api(value = "/student" + "/baseNewStudent",tags = "新生维护信息代码")
  83. @AllArgsConstructor
  84. public class BaseNewStudentController {
  85. private final IUserService userService;
  86. private final IBaseNewStudentService baseNewStudentService;
  87. private final IBaseStudentFamilyMemberService familyMemberService;
  88. private final IWhitelistManagementService whitelistManagementService;
  89. private final IUserRoleRelationService userRoleRelationService;
  90. private final RedisUtil redisUtil;
  91. private final IBaseUserStudentService userStudentService;
  92. private final CommonPropertiesConfig propertiesConfig;
  93. private final IBaseSemesterService semesterService;
  94. @GetMapping(value = "/page")
  95. @ApiOperation(value="新生维护信息列表(分页)")
  96. @SaCheckPermission("basenewstudent:detail")
  97. public RT<PageOutput<BaseNewStudentPageVo>> page(@Valid BaseNewStudentPageDto dto){
  98. Page<BaseNewStudentPageVo> page = baseNewStudentService.getPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
  99. PageOutput<BaseNewStudentPageVo> pageOutput = ConventPage.getPageOutput(page, BaseNewStudentPageVo.class);
  100. return RT.ok(pageOutput);
  101. }
  102. @GetMapping(value = "/report-page")
  103. @ApiOperation(value="新生报到(分页)")
  104. @SaCheckPermission("basenewstudent:detail")
  105. public RT<PageOutput<BaseNewStudentPageVo>> reportPage(@Valid BaseNewStudentPageDto dto){
  106. List<String> roleList = StpUtil.getRoleList();
  107. if(roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getTeacherId() == null){
  108. dto.setTeacherId(StpUtil.getLoginIdAsLong());
  109. }
  110. if(dto.getBaseSemesterId() == null){
  111. LambdaQueryWrapper<BaseSemester> queryWrapper = new LambdaQueryWrapper<>();
  112. queryWrapper
  113. .orderByDesc(BaseSemester::getStartDate)
  114. .select(BaseSemester.class,x -> VoToColumnUtil.fieldsToColumns(BaseSemester.class).contains(x.getProperty()));
  115. List<BaseSemester> semesterList = semesterService.list(queryWrapper);
  116. if(!semesterList.isEmpty()){
  117. dto.setBaseSemesterId(semesterList.get(0).getId());
  118. }
  119. }
  120. Page<BaseNewStudentPageVo> page = baseNewStudentService.getReportPage(new Page<>(dto.getLimit(), dto.getSize()), dto);
  121. PageOutput<BaseNewStudentPageVo> pageOutput = ConventPage.getPageOutput(page, BaseNewStudentPageVo.class);
  122. return RT.ok(pageOutput);
  123. }
  124. @GetMapping(value = "/tree")
  125. @ApiOperation(value="新生维护信息树")
  126. @SaCheckPermission("basenewstudent:detail")
  127. public RT<List<BaseNewStudentTreeVo>> tree(){
  128. List<EnrollmentPlanGradeVo> gradeList = baseNewStudentService.getGradeList();
  129. List<EnrollmentPlanTreeVo> list = baseNewStudentService.getEnrollmentPlanList();
  130. List<BaseNewStudentTreeVo> result = new ArrayList<>();
  131. for (EnrollmentPlanGradeVo gradeVo : gradeList) {
  132. BaseNewStudentTreeVo treeVo = new BaseNewStudentTreeVo() {{
  133. setId(gradeVo.getId());
  134. setName(gradeVo.getName());
  135. setTreeType(1);
  136. }};
  137. List<BaseNewStudentTreeVo> children = new ArrayList<>();
  138. for (EnrollmentPlanTreeVo planTreeVo : list) {
  139. if(planTreeVo.getGradeId().equals(gradeVo.getId())){
  140. children.add(new BaseNewStudentTreeVo() {{
  141. setId(planTreeVo.getId());
  142. setName(planTreeVo.getEnrollTypeCn());
  143. setTreeType(2);
  144. }});
  145. }
  146. }
  147. treeVo.setChildren(children);
  148. result.add(treeVo);
  149. }
  150. return RT.ok(result);
  151. }
  152. @GetMapping(value = "/info")
  153. @ApiOperation(value="根据id查询新生维护信息信息")
  154. @SaCheckPermission("basenewstudent:detail")
  155. public RT<BaseNewStudentVo> info(@RequestParam Long id){
  156. BaseNewStudent baseNewStudent = baseNewStudentService.getById(id);
  157. if (baseNewStudent == null) {
  158. return RT.error("找不到此数据!");
  159. }
  160. return RT.ok(BeanUtil.toBean(baseNewStudent, BaseNewStudentVo.class));
  161. }
  162. @PostMapping
  163. @ApiOperation(value = "新增新生维护信息")
  164. @SaCheckPermission("basenewstudent:add")
  165. public RT<Boolean> add(@Valid @RequestBody AddBaseNewStudentDto dto){
  166. BaseNewStudent baseNewStudent = BeanUtil.toBean(dto, BaseNewStudent.class);
  167. baseNewStudent.setFirstAmbitionId(Long.parseLong(dto.getFirstAmbition()));
  168. baseNewStudent.setSecondAmbitionId(Long.parseLong(dto.getSecondAmbition()));
  169. baseNewStudent.setCreateDate(new Date());
  170. boolean isSuccess = baseNewStudentService.save(baseNewStudent);
  171. return RT.ok(isSuccess);
  172. }
  173. @PutMapping
  174. @ApiOperation(value = "修改新生维护信息")
  175. @SaCheckPermission("basenewstudent:edit")
  176. public RT<Boolean> update(@Valid @RequestBody UpdateBaseNewStudentDto dto){
  177. BaseNewStudent baseNewStudent = BeanUtil.toBean(dto, BaseNewStudent.class);
  178. return RT.ok(baseNewStudentService.updateById(baseNewStudent));
  179. }
  180. @DeleteMapping
  181. @ApiOperation(value = "删除新生维护信息")
  182. @SaCheckPermission("basenewstudent:delete")
  183. public RT<Boolean> delete(@Valid @RequestBody List<Long> ids){
  184. return RT.ok(baseNewStudentService.removeBatchByIds(ids));
  185. }
  186. @DeleteMapping("deleteByUserIds")
  187. @ApiOperation(value = "删除新生(保留新生信息,删除基础信息)")
  188. @SaCheckPermission("basenewstudent:delete")
  189. public RT<Boolean> deleteByUserIds(@Valid @RequestBody DeleteNewStudentDto dto){
  190. return RT.ok(baseNewStudentService.deleteByUserIds(dto));
  191. }
  192. @PostMapping("/import")
  193. @ApiOperation(value = "导入")
  194. public RT<List<Map<String, String>>> importData(@RequestParam Long treeId, @RequestParam MultipartFile file) throws IOException {
  195. List<Map<Integer, Object>> errorList = baseNewStudentService.importData(treeId, file);
  196. List<Map<String, String>> result = new ArrayList<>();
  197. for (Map<Integer, Object> objectMap : errorList) {
  198. Map<String, String> object = new LinkedHashMap<>();
  199. object.put("毕业学校", objectMap.get(0)==null?"":objectMap.get(0).toString());
  200. object.put("学生姓名", objectMap.get(1)==null?"":objectMap.get(1).toString());
  201. object.put("性别", objectMap.get(2)==null?"":objectMap.get(2).toString());
  202. object.put("身份证号", objectMap.get(3)==null?"":objectMap.get(3).toString());
  203. object.put("身高(cm)", objectMap.get(4)==null?"":objectMap.get(4).toString());
  204. object.put("体重(kg)", objectMap.get(5)==null?"":objectMap.get(5).toString());
  205. object.put("毕业班级", objectMap.get(6)==null?"":objectMap.get(6).toString());
  206. object.put("学生来源", objectMap.get(7)==null?"":objectMap.get(7).toString());
  207. object.put("住宿类型", objectMap.get(8)==null?"":objectMap.get(8).toString());
  208. object.put("手机号", objectMap.get(9)==null?"":objectMap.get(9).toString());
  209. object.put("第一志愿", objectMap.get(10)==null?"":objectMap.get(10).toString());
  210. object.put("第二志愿", objectMap.get(11)==null?"":objectMap.get(11).toString());
  211. object.put("是否可调配", objectMap.get(12)==null?"":objectMap.get(12).toString());
  212. object.put("家庭电话", objectMap.get(13)==null?"":objectMap.get(13).toString());
  213. object.put("家庭地址", objectMap.get(14)==null?"":objectMap.get(14).toString());
  214. object.put("错误信息", objectMap.get(15)==null?"":objectMap.get(15).toString());
  215. result.add(object);
  216. }
  217. return RT.ok(result);
  218. }
  219. @PostMapping("/score-import")
  220. @ApiOperation(value = "成绩导入")
  221. public RT<List<Map<String, String>>> scoreImport(@RequestParam MultipartFile file) throws IOException {
  222. List<BaseNewStudentScoreExcelVo> errorList = baseNewStudentService.scoreImport(file);
  223. List<Map<String, String>> result = new ArrayList<>();
  224. for (BaseNewStudentScoreExcelVo objectMap : errorList) {
  225. Map<String, String> object = new LinkedHashMap<>();
  226. object.put("毕业学校", objectMap.getGraduateSchool());
  227. object.put("姓名", objectMap.getName());
  228. object.put("性别", objectMap.getGender());
  229. object.put("班级", objectMap.getGraduateClass());
  230. object.put("总成绩", objectMap.getScore().intValue() + "");
  231. object.put("错误信息", "未能查询到该学生或该学生存在多个");
  232. result.add(object);
  233. }
  234. return RT.ok(result);
  235. }
  236. @PostMapping("/active-account")
  237. @ApiOperation(value = "激活账号")
  238. public RT<Boolean> activeAccount(@Valid @RequestBody ActiveAccountDto dto) {
  239. User user = userService.getById(dto.getId());
  240. user.setMobile(dto.getMobile());
  241. user.setEnabledMark(EnabledMark.ENABLED.getCode());
  242. user.setModifyDate(LocalDateTime.now());
  243. userService.updateById(user);
  244. // 新增家庭成员信息
  245. if(StrUtil.isNotEmpty(dto.getParentName()) && StrUtil.isNotEmpty(dto.getParentMobile())){
  246. List<BaseStudentFamilyMember> list = familyMemberService.list(
  247. new QueryWrapper<BaseStudentFamilyMember>().lambda()
  248. .eq(BaseStudentFamilyMember::getName, dto.getParentName())
  249. .eq(BaseStudentFamilyMember::getUserId, dto.getId())
  250. .eq(BaseStudentFamilyMember::getMobile, dto.getParentMobile())
  251. );
  252. BaseStudentFamilyMember member;
  253. if(list.isEmpty()){
  254. member = new BaseStudentFamilyMember();
  255. member.setUserId(user.getId());
  256. member.setName(dto.getParentName());
  257. member.setMobile(dto.getParentMobile());
  258. member.setCreateDate(LocalDateTime.now());
  259. member.setCreateUserId(StpUtil.getLoginIdAsLong());
  260. familyMemberService.save(member);
  261. }else{
  262. member = list.get(0);
  263. }
  264. List<User> parents = userService.list(
  265. new QueryWrapper<User>().lambda()
  266. .eq(User::getUserName, dto.getParentMobile())
  267. .or()
  268. .eq(User::getMobile, dto.getParentMobile())
  269. );
  270. if(parents.isEmpty()){
  271. User parentUser = new User() {{
  272. setUserName(dto.getParentMobile());
  273. setName(dto.getParentName());
  274. setIsChangePassword(1);
  275. setDeleteMark(0);
  276. setEnabledMark(1);
  277. setPassword(BCrypt.hashpw(propertiesConfig.getDefaultPassword(), BCrypt.gensalt()));
  278. setMobile(dto.getParentMobile());
  279. }};
  280. userService.save(parentUser);
  281. userRoleRelationService.save(new UserRoleRelation(){{
  282. setUserId(parentUser.getId());
  283. setRoleId(4L);
  284. }});
  285. BaseUserStudent userStudent = new BaseUserStudent();
  286. userStudent.setStudentId(user.getId());
  287. userStudent.setStudentNane(user.getName());
  288. userStudent.setStudentIdentity(user.getCredentialNumber());
  289. userStudent.setCreateDate(new Date());
  290. userStudent.setUserId(parentUser.getId());
  291. userStudent.setStatus(1);
  292. userStudentService.save(userStudent);
  293. }else{
  294. User parentUser = parents.get(0);
  295. BaseUserStudent userStudent = new BaseUserStudent();
  296. userStudent.setStudentId(user.getId());
  297. userStudent.setStudentNane(user.getName());
  298. userStudent.setStudentIdentity(user.getCredentialNumber());
  299. userStudent.setCreateDate(new Date());
  300. userStudent.setUserId(parentUser.getId());
  301. userStudent.setStatus(1);
  302. userStudentService.save(userStudent);
  303. }
  304. }
  305. //新增白名单信息
  306. List<WhitelistManagement> managementList = whitelistManagementService.list(
  307. new QueryWrapper<WhitelistManagement>().lambda()
  308. .eq(WhitelistManagement::getUserId, dto.getId())
  309. );
  310. if(managementList.isEmpty()){
  311. WhitelistManagement whitelistManagement = new WhitelistManagement() {{
  312. setName(user.getName());
  313. setUserId(user.getId());
  314. setCreateDate(new Date());
  315. setCredentialNumber(user.getCredentialNumber());
  316. setPhone(user.getMobile());
  317. }};
  318. whitelistManagementService.save(whitelistManagement);
  319. }else{
  320. WhitelistManagement whitelistManagement = managementList.get(0);
  321. whitelistManagement.setName(user.getName());
  322. whitelistManagement.setUserId(user.getId());
  323. whitelistManagement.setModifyDate(new Date());
  324. whitelistManagement.setCredentialNumber(user.getCredentialNumber());
  325. whitelistManagement.setPhone(user.getMobile());
  326. whitelistManagementService.updateById(whitelistManagement);
  327. }
  328. CompletableFuture.runAsync(() -> {
  329. List<User> userList = userService.list();
  330. redisUtil.set(GlobalConstant.USER_CACHE_KEY, userList);
  331. List<UserRoleRelation> userRoleRelationList = userRoleRelationService.list(Wrappers.lambdaQuery(UserRoleRelation.class));
  332. redisUtil.set(GlobalConstant.USER_ROLE_RELATION_CACHE_KEY, userRoleRelationList);
  333. whitelistManagementService.loadCaches();
  334. });
  335. return RT.ok(true);
  336. }
  337. @PostMapping("/report-export-query")
  338. @ApiOperation(value = "导出")
  339. public ResponseEntity<byte[]> exportData(@Valid @RequestBody BaseNewStudentPageDto dto) {
  340. if(dto.getBaseSemesterId() == null){
  341. LambdaQueryWrapper<BaseSemester> queryWrapper = new LambdaQueryWrapper<>();
  342. queryWrapper
  343. .orderByDesc(BaseSemester::getStartDate)
  344. .select(BaseSemester.class,x -> VoToColumnUtil.fieldsToColumns(BaseSemester.class).contains(x.getProperty()));
  345. List<BaseSemester> semesterList = semesterService.list(queryWrapper);
  346. if(!semesterList.isEmpty()){
  347. dto.setBaseSemesterId(semesterList.get(0).getId());
  348. }
  349. }
  350. List<String> roleList = StpUtil.getRoleList();
  351. if(roleList.contains("CLASSTE") && roleList.contains("TEACHER") && dto.getTeacherId() == null){
  352. dto.setTeacherId(StpUtil.getLoginIdAsLong());
  353. }
  354. List<BaseNewStudentPageVo> reportList = baseNewStudentService.getReportList(dto);
  355. List<BaseNewStudentExportVo> exportVos = new ArrayList<>();
  356. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss");
  357. for (BaseNewStudentPageVo el : reportList) {
  358. BaseNewStudentExportVo vo = BeanUtil.toBean(el, BaseNewStudentExportVo.class);
  359. if(el.getIsReport() == 1){
  360. vo.setReportStatus("是");
  361. }else if(el.getIsReport() == 0){
  362. vo.setReportStatus("否");
  363. }
  364. if(el.getReportTime() != null){
  365. vo.setReportTime(el.getReportTime().format(formatter));
  366. }
  367. exportVos.add(vo);
  368. }
  369. ByteArrayOutputStream bot = new ByteArrayOutputStream();
  370. EasyExcel.write(bot, BaseNewStudentExportVo.class).automaticMergeHead(false).excelType(ExcelTypeEnum.XLSX).sheet().doWrite(exportVos);
  371. return RT.fileStream(bot.toByteArray(), "RoomBed" + ExcelTypeEnum.XLSX.getValue());
  372. }
  373. @PostMapping("/change-banding-status")
  374. @ApiOperation(value = "修改分班状态")
  375. @SaCheckPermission("basenewstudent:add")
  376. public RT<Boolean> changeBandingStatus(@Valid @RequestBody List<ChangeBandingStatusDto> dto){
  377. for (ChangeBandingStatusDto el : dto) {
  378. BaseNewStudent newStudent = baseNewStudentService.getById(el.getId());
  379. UpdateWrapper<BaseNewStudent> updateWrapper = new UpdateWrapper<>();
  380. updateWrapper.eq("id", newStudent.getId());
  381. updateWrapper.setSql("is_can_banding = " + el.getIsCanBanding());
  382. if(StrUtil.isNotEmpty(el.getRemarks())){
  383. updateWrapper.setSql("remarks = '" + el.getRemarks() + "'");
  384. }else{
  385. updateWrapper.setSql("remarks = null");
  386. }
  387. baseNewStudentService.update(newStudent, updateWrapper);
  388. }
  389. return RT.ok(true);
  390. }
  391. }