TextbookStudentClaimServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. package com.xjrsoft.module.textbook.service.impl;
  2. import cn.dev33.satoken.stp.StpUtil;
  3. import cn.hutool.core.util.ObjectUtil;
  4. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  5. import com.baomidou.mybatisplus.core.metadata.IPage;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.github.yulichang.base.MPJBaseServiceImpl;
  8. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  9. import com.xjrsoft.common.enums.ClaimTypeEnum;
  10. import com.xjrsoft.common.exception.MyException;
  11. import com.xjrsoft.common.page.ConventPage;
  12. import com.xjrsoft.common.utils.VoToColumnUtil;
  13. import com.xjrsoft.module.base.entity.BaseClass;
  14. import com.xjrsoft.module.base.entity.BaseClassAdminCourse;
  15. import com.xjrsoft.module.base.entity.BaseClassCourse;
  16. import com.xjrsoft.module.base.entity.BaseSemester;
  17. import com.xjrsoft.module.base.mapper.BaseClassAdminCourseMapper;
  18. import com.xjrsoft.module.base.mapper.BaseClassCourseMapper;
  19. import com.xjrsoft.module.base.service.IBaseClassService;
  20. import com.xjrsoft.module.base.service.IBaseSemesterService;
  21. import com.xjrsoft.module.student.entity.BaseStudent;
  22. import com.xjrsoft.module.student.entity.BaseStudentSchoolRoll;
  23. import com.xjrsoft.module.system.entity.DictionaryDetail;
  24. import com.xjrsoft.module.teacher.entity.AttendanceRecord;
  25. import com.xjrsoft.module.teacher.entity.XjrUser;
  26. import com.xjrsoft.module.teacher.mapper.XjrUserMapper;
  27. import com.xjrsoft.module.textbook.dto.*;
  28. import com.xjrsoft.module.textbook.entity.*;
  29. import com.xjrsoft.module.textbook.mapper.TextbookStudentClaimMapper;
  30. import com.xjrsoft.module.textbook.mapper.WfTextbookClaimItemMapper;
  31. import com.xjrsoft.module.textbook.service.ITextbookStudentClaimService;
  32. import com.xjrsoft.module.textbook.vo.*;
  33. import lombok.AllArgsConstructor;
  34. import org.apache.commons.lang3.ObjectUtils;
  35. import org.apache.commons.lang3.StringUtils;
  36. import org.springframework.stereotype.Service;
  37. import org.springframework.transaction.annotation.Transactional;
  38. import java.math.BigDecimal;
  39. import java.util.ArrayList;
  40. import java.util.Date;
  41. import java.util.List;
  42. import java.util.Map;
  43. import java.util.stream.Collectors;
  44. /**
  45. * @title: 学生教材认领记录
  46. * @Author szs
  47. * @Date: 2023-12-26
  48. * @Version 1.0
  49. */
  50. @Service
  51. @AllArgsConstructor
  52. public class TextbookStudentClaimServiceImpl extends MPJBaseServiceImpl<TextbookStudentClaimMapper, TextbookStudentClaim> implements ITextbookStudentClaimService {
  53. private final XjrUserMapper xjrUserMapper;
  54. private final TextbookStudentClaimMapper textbookStudentClaimMapper;
  55. private final IBaseSemesterService baseSemesterService;
  56. private final IBaseClassService baseClassService;
  57. private final BaseClassAdminCourseMapper baseClassAdminCourseMapper;
  58. private final BaseClassCourseMapper baseClassCourseMapper;
  59. private final WfTextbookClaimItemMapper wfTextbookClaimItemMapper;
  60. @Override
  61. public HeadTeaLookClassBookVo headTeaLookClassBook(HeadTeaLookClassBookDto dto) {
  62. HeadTeaLookClassBookVo result = new HeadTeaLookClassBookVo();
  63. // 先去申领中找,如果申领中没有数据,那么就到班级课程中找
  64. MPJLambdaWrapper<WfTextbookClaimItem> wfTextbookClaimItemMPJLambdaWrapper = new MPJLambdaWrapper<>();
  65. wfTextbookClaimItemMPJLambdaWrapper
  66. .disableSubLogicDel()
  67. .selectAs(Textbook::getBookName, HeadTeaLookClassBookCategoryDetailVo::getBookName)
  68. .selectAs(Textbook::getPrice, HeadTeaLookClassBookCategoryDetailVo::getPrice)
  69. .selectAs(Textbook::getTextbookType, HeadTeaLookClassBookCategoryDetailVo::getTextbookType)
  70. .selectAs(WfTextbookClaimItem::getCreateDate, HeadTeaLookClassBookCategoryDetailVo::getClaimTime)
  71. .select("1 as claim_num")
  72. .innerJoin(WfTextbookClaim.class, WfTextbookClaim::getId, WfTextbookClaimItem::getWfTextbookClaimId)
  73. .innerJoin(Textbook.class, Textbook::getId, WfTextbookClaimItem::getTextbookId)
  74. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  75. wrapper -> wrapper
  76. .selectAs(DictionaryDetail::getName, HeadTeaLookClassBookCategoryDetailVo::getTextbookTypeCn)
  77. )
  78. .eq(WfTextbookClaim::getBaseSemesterId, dto.getBaseSemesterId())
  79. .eq(WfTextbookClaim::getClassId, dto.getBaseClassId())
  80. .eq(WfTextbookClaim::getClaimType, ClaimTypeEnum.ClaimClass.getCode())
  81. ;
  82. List<HeadTeaLookClassBookCategoryDetailVo> claimResultList = wfTextbookClaimItemMapper.selectJoinList(HeadTeaLookClassBookCategoryDetailVo.class, wfTextbookClaimItemMPJLambdaWrapper);
  83. if(ObjectUtils.isEmpty(claimResultList)){
  84. MPJLambdaWrapper<BaseClassCourse> baseClassCourseMPJLambdaWrapper = new MPJLambdaWrapper<>();
  85. baseClassCourseMPJLambdaWrapper
  86. .disableSubLogicDel()
  87. .selectAs(Textbook::getBookName, HeadTeaLookClassBookCategoryDetailVo::getBookName)
  88. .selectAs(Textbook::getPrice, HeadTeaLookClassBookCategoryDetailVo::getPrice)
  89. .selectAs(Textbook::getTextbookType, HeadTeaLookClassBookCategoryDetailVo::getTextbookType)
  90. .select("1 as claim_num")
  91. .innerJoin(BaseClassAdminCourse.class, BaseClassAdminCourse::getId, BaseClassCourse::getClassId)
  92. .innerJoin(Textbook.class, Textbook::getId, BaseClassCourse::getTextbookId)
  93. .leftJoin(DictionaryDetail.class, DictionaryDetail::getCode, Textbook::getTextbookType,
  94. wrapper -> wrapper
  95. .selectAs(DictionaryDetail::getName, HeadTeaLookClassBookCategoryDetailVo::getTextbookTypeCn)
  96. )
  97. .eq(BaseClassAdminCourse::getBaseSemesterId, dto.getBaseSemesterId())
  98. .eq(BaseClassAdminCourse::getClassId, dto.getBaseClassId())
  99. ;
  100. claimResultList = baseClassCourseMapper.selectJoinList(HeadTeaLookClassBookCategoryDetailVo.class, baseClassCourseMPJLambdaWrapper);
  101. }
  102. if(ObjectUtils.isNotEmpty(claimResultList)){
  103. // 处理数据
  104. // 根据类型分组
  105. Map<String, List<HeadTeaLookClassBookCategoryDetailVo>> detailByCategoryMap = claimResultList.stream()
  106. .filter(detail -> StringUtils.isNotEmpty(detail.getTextbookType())) // Exclude entries where textbookType is null
  107. .collect(Collectors.groupingBy(HeadTeaLookClassBookCategoryDetailVo::getTextbookType));
  108. BigDecimal totalPrice = BigDecimal.ZERO;
  109. List<HeadTeaLookClassBookCategoryVo> categoryVos = new ArrayList<>();
  110. BigDecimal categoryTotalPrice;
  111. HeadTeaLookClassBookCategoryVo headTeaLookClassBookCategoryVo;
  112. for (Map.Entry<String, List<HeadTeaLookClassBookCategoryDetailVo>> entry : detailByCategoryMap.entrySet()){
  113. String key = entry.getKey();
  114. List<HeadTeaLookClassBookCategoryDetailVo> value = entry.getValue();
  115. if(ObjectUtils.isNotEmpty(value)){
  116. headTeaLookClassBookCategoryVo = new HeadTeaLookClassBookCategoryVo();
  117. headTeaLookClassBookCategoryVo.setTextbookType(key);
  118. headTeaLookClassBookCategoryVo.setTextbookTypeCn(value.get(0).getTextbookTypeCn());
  119. headTeaLookClassBookCategoryVo.setCategoryDetailVos(value);
  120. categoryTotalPrice = BigDecimal.ZERO;
  121. for (HeadTeaLookClassBookCategoryDetailVo vo : value){
  122. if(ObjectUtils.isEmpty(vo.getPrice())){
  123. vo.setPrice(BigDecimal.ZERO);
  124. }
  125. categoryTotalPrice = categoryTotalPrice.add(vo.getPrice().multiply(BigDecimal.valueOf(vo.getClaimNum())));
  126. totalPrice = totalPrice.add(vo.getPrice().multiply(BigDecimal.valueOf(vo.getClaimNum())));
  127. }
  128. headTeaLookClassBookCategoryVo.setCategoryTotalPrice(categoryTotalPrice);
  129. categoryVos.add(headTeaLookClassBookCategoryVo);
  130. }
  131. result.setTotalPrice(totalPrice);
  132. result.setCategoryVos(categoryVos);
  133. }
  134. }
  135. return result;
  136. }
  137. @Override
  138. public List<HeadTeaLookClassBookSemesterVo> headTeaLookClassBookSemester() {
  139. Long loginId = StpUtil.getLoginIdAsLong();
  140. MPJLambdaWrapper<BaseClassAdminCourse> baseClassAdminCourseMPJLambdaWrapper = new MPJLambdaWrapper<>();
  141. baseClassAdminCourseMPJLambdaWrapper
  142. .disableSubLogicDel()
  143. .selectAs(BaseClassAdminCourse::getBaseSemesterId, HeadTeaLookClassBookSemesterVo::getBaseSemesterId)
  144. .selectAs(BaseSemester::getName, HeadTeaLookClassBookSemesterVo::getBaseSemesterIdCn)
  145. .selectAs(BaseClassAdminCourse::getClassId, HeadTeaLookClassBookSemesterVo::getBaseClassId)
  146. .selectAs(BaseClass::getName, HeadTeaLookClassBookSemesterVo::getBaseClassIdCn)
  147. .innerJoin(BaseClass.class, BaseClass::getId, BaseClassAdminCourse::getClassId)
  148. .leftJoin(BaseSemester.class, BaseSemester::getId, BaseClassAdminCourse::getBaseSemesterId)
  149. .eq(BaseClass::getTeacherId, loginId)
  150. .orderByDesc(BaseSemester::getName)
  151. ;
  152. return baseClassAdminCourseMapper.selectJoinList(HeadTeaLookClassBookSemesterVo.class, baseClassAdminCourseMPJLambdaWrapper);
  153. }
  154. @Override
  155. public TextbookClaimStudentConfirmVo getStudentConfirmList(TextbookClaimStudentConfirmDto dto) {
  156. //获取当前登录学生的信息
  157. MPJLambdaWrapper<XjrUser> queryUser = new MPJLambdaWrapper<>();
  158. queryUser.selectAs(XjrUser::getName, TextbookClaimStudentConfirmVo::getStudentName).selectAs(BaseStudent::getStudentId, TextbookClaimStudentConfirmVo::getStudentId).selectAs(BaseClass::getName, TextbookClaimStudentConfirmVo::getClassCN).leftJoin(BaseStudent.class, BaseStudent::getUserId, XjrUser::getId).leftJoin(BaseStudentSchoolRoll.class, BaseStudentSchoolRoll::getUserId, XjrUser::getId).leftJoin(BaseClass.class, BaseClass::getId, BaseStudentSchoolRoll::getClassId).eq(XjrUser::getId, StpUtil.getLoginIdAsLong()).disableSubLogicDel().orderByDesc(AttendanceRecord::getId);
  159. TextbookClaimStudentConfirmVo textbookClaimStudentConfirmVo = xjrUserMapper.selectJoinOne(TextbookClaimStudentConfirmVo.class, queryUser);
  160. if (ObjectUtil.isNull(textbookClaimStudentConfirmVo)) {
  161. throw new MyException("登录信息出错,请重新登录");
  162. }
  163. //根据学期id查出学期名称
  164. BaseSemester baseSemester = baseSemesterService.getById(dto.getBaseSemesterId());
  165. textbookClaimStudentConfirmVo.setBaseSemesterCN(baseSemester.getName());
  166. dto.setStudentUserId(StpUtil.getLoginIdAsLong());
  167. List<TextbookClaimVO> textbookClaimVOList = textbookStudentClaimMapper.getTextbookClaimList(dto);
  168. textbookClaimStudentConfirmVo.setTextbookClaimVoList(textbookClaimVOList);
  169. return textbookClaimStudentConfirmVo;
  170. }
  171. @Override
  172. public List<TextbookStudentSemesterVo> getStudentSemesterList() {
  173. //获取当前学生领取记录的所有学期
  174. MPJLambdaWrapper<TextbookStudentClaim> qwerySemester = new MPJLambdaWrapper<>();
  175. qwerySemester
  176. .distinct()
  177. .disableSubLogicDel()
  178. .selectAs(BaseSemester::getName, TextbookStudentSemesterVo::getBaseSemesterIdCN)
  179. .select(TextbookStudentClaim.class, x -> VoToColumnUtil.fieldsToColumns(TextbookStudentSemesterVo.class).contains(x.getProperty()))
  180. .innerJoin(BaseSemester.class, BaseSemester::getId, TextbookStudentClaim::getBaseSemesterId)
  181. .eq(TextbookStudentClaim::getStudentUserId, StpUtil.getLoginIdAsLong());
  182. List<TextbookStudentSemesterVo> textbookStudentSemesterVoList = this.selectJoinList(TextbookStudentSemesterVo.class, qwerySemester);
  183. if (ObjectUtil.isNull(textbookStudentSemesterVoList) && textbookStudentSemesterVoList.isEmpty()) {
  184. return null;
  185. }
  186. //为每个学期添加未领取人数
  187. for (TextbookStudentSemesterVo textbookStudentSemesterVo : textbookStudentSemesterVoList) {
  188. LambdaQueryWrapper<TextbookStudentClaim> queryWrapperNotClaimNum = new LambdaQueryWrapper<>();
  189. queryWrapperNotClaimNum
  190. .eq(TextbookStudentClaim::getStudentUserId, StpUtil.getLoginIdAsLong())
  191. .eq(TextbookStudentClaim::getBaseSemesterId, textbookStudentSemesterVo.getBaseSemesterId())
  192. .eq(TextbookStudentClaim::getIsClaim, 0);
  193. Long notClaimNum = this.count(queryWrapperNotClaimNum);
  194. textbookStudentSemesterVo.setNotClaimNum(notClaimNum);
  195. }
  196. return textbookStudentSemesterVoList;
  197. }
  198. @Override
  199. public IPage<TeacherCheckByclassVo> getTeacherCheckByclassList(TeacherCheckByclassDto dto) {
  200. //根据当前班主任用户查出所管理的班级Id
  201. LambdaQueryWrapper<BaseClass> queryWrapperClassId = new LambdaQueryWrapper<>();
  202. queryWrapperClassId.eq(BaseClass::getTeacherId, StpUtil.getLoginIdAsLong());
  203. List<BaseClass> baseClassList = baseClassService.list(queryWrapperClassId);
  204. if (ObjectUtil.isNull(baseClassList) && baseClassList.size() == 0) {
  205. return null;
  206. }
  207. List<Long> classIdList = new ArrayList<>();
  208. for (BaseClass baseClass : baseClassList) {
  209. classIdList.add(baseClass.getId());
  210. }
  211. dto.setClassIdList(classIdList);
  212. IPage<TeacherCheckByclassVo> teacherCheckByclassVoList = textbookStudentClaimMapper.getTeacherCheckByclassList(ConventPage.getPage(dto), dto);
  213. //为每本书添加数据
  214. // for (TeacherCheckByclassVo t : teacherCheckByclassVoList.getRecords()) {
  215. // MPJLambdaWrapper<WfTextbookClaim> qweryActualReceivedNum = new MPJLambdaWrapper<>();
  216. // qweryActualReceivedNum
  217. // .disableSubLogicDel()
  218. // .selectSum(WfTextbookClaimItem::getIssueNumber, TeacherCheckByclassVo::getActualReceivedNum)
  219. // .leftJoin(WfTextbookClaimItem.class, WfTextbookClaimItem::getWfTextbookClaimId, WfTextbookClaim::getId)
  220. // .eq(WfTextbookClaim::getClassId, t.getClassId())
  221. // .eq(WfTextbookClaimItem::getTextbookId, t.getTextbookId());
  222. // TeacherCheckByclassVo teacherCheckByclassVo = wfTextbookClaimMapper.selectJoinOne(TeacherCheckByclassVo.class, qweryActualReceivedNum);
  223. //
  224. // t.setActualReceivedNum(teacherCheckByclassVo.getActualReceivedNum());
  225. //
  226. // LambdaQueryWrapper<TextbookStudentClaim> queryActualClaimNum = new LambdaQueryWrapper<>();
  227. // queryActualClaimNum
  228. // .eq(TextbookStudentClaim::getClassId, t.getClassId())
  229. // .eq(TextbookStudentClaim::getTextbookId, t.getTextbookId())
  230. // .eq(TextbookStudentClaim::getIsClaim, 1);
  231. // Long actualClaimNum = this.count(queryActualClaimNum);
  232. // t.setActualClaimNum(actualClaimNum);
  233. // }
  234. return teacherCheckByclassVoList;
  235. }
  236. @Override
  237. public IPage<TeacherCheckByStuVo> getTeacherCheckByStuList(TeacherCheckByStuDto dto) {
  238. //根据当前班主任用户查出所管理的班级Id
  239. LambdaQueryWrapper<BaseClass> queryWrapperClassId = new LambdaQueryWrapper<>();
  240. queryWrapperClassId.eq(BaseClass::getTeacherId, StpUtil.getLoginIdAsLong());
  241. List<BaseClass> baseClassList = baseClassService.list(queryWrapperClassId);
  242. if (ObjectUtil.isNull(baseClassList) && baseClassList.size() == 0) {
  243. return null;
  244. }
  245. List<Long> classIdList = new ArrayList<>();
  246. for (BaseClass baseClass : baseClassList) {
  247. classIdList.add(baseClass.getId());
  248. }
  249. dto.setClassIdList(classIdList);
  250. //将班上所有学生进行分组,查询出list集合
  251. IPage<TeacherCheckByStuVo> teacherCheckByStuVoList = textbookStudentClaimMapper.getTeacherCheckByStuList(ConventPage.getPage(dto), dto);
  252. //为每个学生添加教材领取记录集合
  253. //学生id集合
  254. // List<Long> stuIdList = new ArrayList<>();
  255. // for (TeacherCheckByStuVo teacherCheckByStuVo : teacherCheckByStuVoList.getRecords()) {
  256. // stuIdList.add(teacherCheckByStuVo.getStudentUserId());
  257. // }
  258. // //一次查出所有学生的所有书籍
  259. // if(stuIdList.size() > 0){
  260. // List<TextbookClaimVO> textbookClaimVOList = textbookStudentClaimMapper.getTextbookClaimVOList(stuIdList);
  261. // }
  262. for (TeacherCheckByStuVo t : teacherCheckByStuVoList.getRecords()) {
  263. List<TextbookClaimVO> textbookClaimVOList = textbookStudentClaimMapper.getTextbookClaimVOList(t.getStudentUserId());
  264. t.setTextbookClaimVOList(textbookClaimVOList);
  265. }
  266. return teacherCheckByStuVoList;
  267. }
  268. @Override
  269. @Transactional
  270. public Boolean updateByIds(List<Long> textbookStudentClaimIds) {
  271. this.update(new TextbookStudentClaim() {{
  272. setModifyUserId(StpUtil.getLoginIdAsLong());
  273. setModifyDate(new Date());
  274. setIsClaim(1);
  275. }},Wrappers.<TextbookStudentClaim>query().lambda()
  276. .in(TextbookStudentClaim::getId, textbookStudentClaimIds));
  277. // for (Long textbookStudentClaimId : textbookStudentClaimIds) {
  278. // this.updateById(new TextbookStudentClaim() {{
  279. // setModifyUserId(StpUtil.getLoginIdAsLong());
  280. // setModifyDate(new Date());
  281. // setId(textbookStudentClaimId);
  282. // setIsClaim(1);
  283. // }});
  284. // }
  285. return true;
  286. }
  287. @Override
  288. public List<TeacherCheckStuClaimVo> getTeacherCheckStuClaimList(TeacherCheckStuClaimDto dto) {
  289. List<TeacherCheckStuClaimVo> teacherCheckStuClaimVos = textbookStudentClaimMapper.getTeacherCheckStuClaimList(dto);
  290. return teacherCheckStuClaimVos;
  291. }
  292. @Override
  293. public List<TextbookClaimVO> getTeacherGetStuNoClaimList(Long studentUserId) {
  294. MPJLambdaWrapper<TextbookStudentClaim> queryTextbookClaimVOList = new MPJLambdaWrapper<>();
  295. queryTextbookClaimVOList.selectAs(TextbookStudentClaim::getId, TextbookClaimVO::getTextbookStudentClaimId).selectAs(Textbook::getBookName, TextbookClaimVO::getBookName).select(TextbookStudentClaim.class, x -> VoToColumnUtil.fieldsToColumns(TextbookClaimVO.class).contains(x.getProperty())).leftJoin(Textbook.class, Textbook::getId, TextbookStudentClaim::getTextbookId).eq(TextbookStudentClaim::getStudentUserId, studentUserId).disableSubLogicDel();
  296. List<TextbookClaimVO> textbookClaimVOList = this.selectJoinList(TextbookClaimVO.class, queryTextbookClaimVOList);
  297. return textbookClaimVOList;
  298. }
  299. }