PbCseFeeobjupdateServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. package com.xjrsoft.module.student.service.impl;
  2. import com.github.yulichang.base.MPJBaseServiceImpl;
  3. import com.github.yulichang.wrapper.MPJLambdaWrapper;
  4. import com.xjrsoft.module.base.entity.BaseMajorSet;
  5. import com.xjrsoft.module.student.dto.EnrollmentStatisticsCalendarInfoDto;
  6. import com.xjrsoft.module.student.dto.EnrollmentStatisticsGraduationInfoDto;
  7. import com.xjrsoft.module.student.entity.*;
  8. import com.xjrsoft.module.student.mapper.PbCseFeeobjupdateMapper;
  9. import com.xjrsoft.module.student.service.IPbCseFeeobjupdateService;
  10. import com.xjrsoft.module.student.service.IPbCseSpecplanService;
  11. import com.xjrsoft.module.student.vo.*;
  12. import com.xjrsoft.module.student.dto.EnrollmentStatisticsInfoDto;
  13. import lombok.AllArgsConstructor;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import java.math.RoundingMode;
  17. import java.text.DecimalFormat;
  18. import java.time.LocalDate;
  19. import java.time.format.DateTimeFormatter;
  20. import java.util.ArrayList;
  21. import java.util.LinkedHashMap;
  22. import java.util.List;
  23. import java.util.Map;
  24. import java.util.stream.Collectors;
  25. /**
  26. * @title:
  27. * @Author szs
  28. * @Date: 2024-03-29
  29. * @Version 1.0
  30. */
  31. @Service
  32. @AllArgsConstructor
  33. public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobjupdateMapper, PbCseFeeobjupdate> implements IPbCseFeeobjupdateService {
  34. @Autowired
  35. private final IPbCseSpecplanService pbCseSpecplanService;
  36. @Override
  37. public EnrollmentStatisticsInfoVo getEnrollmentStatisticsInfo(EnrollmentStatisticsInfoDto dto) {
  38. EnrollmentStatisticsInfoVo result = new EnrollmentStatisticsInfoVo();
  39. //获取所有学生的信息
  40. MPJLambdaWrapper<PbCseFeeobjupdate> pbCseFeeobjupdateMPJLambdaWrapper = new MPJLambdaWrapper<>();
  41. pbCseFeeobjupdateMPJLambdaWrapper
  42. .disableSubLogicDel()
  43. .distinct()
  44. .select("ifnull(t2.name,t.specname) as specname")
  45. .selectAs(PbCseFeeobjupdate::getPersonalid, PbCseFeeobjupdate::getPersonalid)
  46. .selectAs(PbCseFeeobjupdate::getResourcename, PbCseFeeobjupdate::getResourcename)
  47. .selectAs(PbCseFeeobjupdate::getQuartername, PbCseFeeobjupdate::getQuartername)
  48. .selectAs(PbCseFeeobjupdate::getSex, PbCseFeeobjupdate::getSex)
  49. .leftJoin(BaseMajorSet.class, BaseMajorSet::getName, PbCseFeeobjupdate::getSpecname)
  50. .leftJoin(BaseMajorCategor.class, BaseMajorCategor::getId, BaseMajorSet::getMajorCategorId)
  51. .eq(dto.getYear() != null, PbCseFeeobjupdate::getEnteryear, dto.getYear())
  52. ;
  53. List<PbCseFeeobjupdate> pbCseFeeobjupdateList = this.selectJoinList(PbCseFeeobjupdate.class, pbCseFeeobjupdateMPJLambdaWrapper);
  54. if(pbCseFeeobjupdateList != null && !pbCseFeeobjupdateList.isEmpty()){
  55. //专业排行
  56. Map<String, Long> professionalHeadCount = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getSpecname, Collectors.counting()));
  57. if(!professionalHeadCount.isEmpty()){
  58. professionalHeadCount = professionalHeadCount.entrySet().stream()
  59. .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
  60. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
  61. (e1, e2) -> e1, LinkedHashMap::new));
  62. }
  63. //专业计划人数,余数
  64. MPJLambdaWrapper<PbCseSpecplan> pbCseSpecplanMPJLambdaWrapper = new MPJLambdaWrapper<>();
  65. pbCseSpecplanMPJLambdaWrapper
  66. .disableSubLogicDel()
  67. .distinct()
  68. .select("ifnull(t2.name,t.specname) as kkey")
  69. .selectAs(PbCseSpecplan::getNum, EnrollmentStatisticsInfoKeyValue::getValue)
  70. .leftJoin(BaseMajorSet.class, BaseMajorSet::getName, PbCseSpecplan::getSpecname)
  71. .leftJoin(BaseMajorCategor.class, BaseMajorCategor::getId, BaseMajorSet::getMajorCategorId)
  72. .eq(dto.getYear() != null, PbCseSpecplan::getXyear, dto.getYear())
  73. ;
  74. List<EnrollmentStatisticsInfoKeyValue> pbCseSpecplanList = pbCseSpecplanService.selectJoinList(EnrollmentStatisticsInfoKeyValue.class, pbCseSpecplanMPJLambdaWrapper);
  75. Map<String, Long> pbCseSpecplanSumMap = pbCseSpecplanList.stream().collect(Collectors.groupingBy(EnrollmentStatisticsInfoKeyValue::getKkey, Collectors.summingLong(EnrollmentStatisticsInfoKeyValue::getValue)));
  76. List<ProfessionalHeadCoun> professionalHeadCountRes = new ArrayList<>();
  77. for (Map.Entry<String, Long> entry : professionalHeadCount.entrySet()) {
  78. professionalHeadCountRes.add(new ProfessionalHeadCoun(){{
  79. setKey(entry.getKey());
  80. setValue(entry.getValue());
  81. if(pbCseSpecplanSumMap.get(entry.getKey()) != null){
  82. setPlannedNumber(pbCseSpecplanSumMap.get(entry.getKey()));
  83. setRemainder(pbCseSpecplanSumMap.get(entry.getKey()) - entry.getValue());
  84. }
  85. }});
  86. }
  87. //学生类型
  88. Map<String, Long> studentSource = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getResourcename, Collectors.counting()));
  89. List<EnrollmentStatisticsInfoKeyValue> studentSourceRes = new ArrayList<>();
  90. for (Map.Entry<String, Long> entry : studentSource.entrySet()) {
  91. studentSourceRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
  92. }
  93. //住宿类型
  94. Map<String, Long> accommodationType = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getQuartername, Collectors.counting()));
  95. List<EnrollmentStatisticsInfoKeyValue> accommodationTypeRes = new ArrayList<>();
  96. for (Map.Entry<String, Long> entry : accommodationType.entrySet()) {
  97. accommodationTypeRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
  98. }
  99. //性别
  100. Map<String, Long> gender = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getSex, Collectors.counting()));
  101. List<EnrollmentStatisticsInfoKeyValue> genderRes = new ArrayList<>();
  102. for (Map.Entry<String, Long> entry : gender.entrySet()) {
  103. genderRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
  104. }
  105. result.setRegistrationPopulation(pbCseFeeobjupdateList.size());
  106. result.setProfessionalHeadCount(professionalHeadCountRes);
  107. result.setStudentSource(studentSourceRes);
  108. result.setAccommodationType(accommodationTypeRes);
  109. result.setGender(genderRes);
  110. //获取所有学生的收费明细
  111. MPJLambdaWrapper<PbCseFeeobjupdate> feeobjupdateXssfdetailMPJLambdaWrapper = new MPJLambdaWrapper<>();
  112. feeobjupdateXssfdetailMPJLambdaWrapper
  113. .select("count(distinct t1.personalid) as payers")
  114. .selectSum(PbVXssfdetail::getMny, EnrollmentStatisticsInfoVo::getRecordedAmountOfMoney)
  115. .leftJoin(PbVXssfdetail.class, PbVXssfdetail::getPersonalid, PbCseFeeobjupdate::getPersonalid)
  116. .eq(dto.getYear() != null, PbCseFeeobjupdate::getEnteryear, dto.getYear())
  117. ;
  118. EnrollmentStatisticsInfoVo enrollmentStatisticsInfoVo = this.selectJoinOne(EnrollmentStatisticsInfoVo.class, feeobjupdateXssfdetailMPJLambdaWrapper);
  119. //退费金额
  120. // MPJLambdaWrapper<PbCseFeeobjupdate> feeobjupdateXssfdetailMPJLambdaWrapper = new MPJLambdaWrapper<>();
  121. // feeobjupdateXssfdetailMPJLambdaWrapper
  122. // .selectCount(PbVXssfdetail::getPersonalid, EnrollmentStatisticsInfoVo::getPayers)
  123. // .selectSum(PbVXssfdetail::getMny, EnrollmentStatisticsInfoVo::getRecordedAmountOfMoney)
  124. // .leftJoin(PbVXssfdetail.class, PbVXssfdetail::getPersonalid, PbCseFeeobjupdate::getPersonalid)
  125. // .eq(dto.getYear() != null, PbCseFeeobjupdate::getEnteryear, dto.getYear())
  126. // ;
  127. // EnrollmentStatisticsInfoVo enrollmentStatisticsInfoVo = this.selectJoinOne(EnrollmentStatisticsInfoVo.class, feeobjupdateXssfdetailMPJLambdaWrapper);
  128. //缴费人数,入账金额
  129. if(enrollmentStatisticsInfoVo != null){
  130. result.setPayers(enrollmentStatisticsInfoVo.getPayers());
  131. if(enrollmentStatisticsInfoVo.getRecordedAmountOfMoney() != null){
  132. result.setRecordedAmountOfMoney(enrollmentStatisticsInfoVo.getRecordedAmountOfMoney().setScale(2, RoundingMode.DOWN));
  133. }
  134. }
  135. //获取所有学生的缴费详情
  136. MPJLambdaWrapper<PbCseFeeobjupdate> feeobjupdateMPJLambdaWrapper = new MPJLambdaWrapper<>();
  137. feeobjupdateMPJLambdaWrapper
  138. .selectAs(PbCseFeeitem2::getShortname, PbVXssfdetail::getFeeitemname)
  139. .selectAs(PbCseFeeobjupdate::getPersonalid, PbVXssfdetail::getPersonalid)
  140. .leftJoin(PbVXssfdetail.class, PbVXssfdetail::getPersonalid, PbCseFeeobjupdate::getPersonalid)
  141. .leftJoin(PbCseFeeitem2.class, PbCseFeeitem2::getFeeitemname, PbVXssfdetail::getFeeitemname)
  142. .eq(dto.getYear() != null, PbCseFeeobjupdate::getEnteryear, dto.getYear())
  143. .isNotNull(PbVXssfdetail::getFeeitemname)
  144. ;
  145. List<PbVXssfdetail> pbVXssfdetails = this.selectJoinList(PbVXssfdetail.class, feeobjupdateMPJLambdaWrapper);
  146. //收费项目情况统计
  147. Map<String, Long> pbVXssfdetailMap = pbVXssfdetails.stream().collect(Collectors.groupingBy(PbVXssfdetail::getFeeitemname, Collectors.counting()));
  148. List<ChargingSituationVo> chargingSituationVoRes = new ArrayList<>();
  149. DecimalFormat df = new DecimalFormat("#.##");
  150. for (Map.Entry<String, Long> entry : pbVXssfdetailMap.entrySet()) {
  151. chargingSituationVoRes.add(new ChargingSituationVo(){{
  152. setFeeitemname(entry.getKey());
  153. setPaid(entry.getValue());
  154. if(entry.getKey().equals("普通中专、职业高中、成人中专普通宿舍") && !accommodationType.isEmpty() && accommodationType.get("住宿") != null){
  155. setUnpaid(accommodationType.get("住宿") - entry.getValue());
  156. setRateOfPayment(df.format((double)entry.getValue()/accommodationType.get("住宿")*100) + "%");
  157. } else {
  158. setUnpaid(result.getRegistrationPopulation() - entry.getValue());
  159. setRateOfPayment(df.format((double)entry.getValue()/result.getRegistrationPopulation()*100) + "%");
  160. }
  161. }});
  162. }
  163. result.setChargingSituationVoList(chargingSituationVoRes);
  164. }
  165. return result;
  166. }
  167. @Override
  168. public EnrollmentStatisticsCalendarInfoVo getEnrollmentStatisticsCalendarInfo(EnrollmentStatisticsCalendarInfoDto dto) {
  169. EnrollmentStatisticsCalendarInfoVo result = new EnrollmentStatisticsCalendarInfoVo();
  170. LocalDate endDate = LocalDate.parse(dto.getEndDay());
  171. DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
  172. LocalDate nextDay = endDate.plusDays(1);
  173. dto.setEndDay(nextDay.format(formatter));
  174. String year = String.valueOf(endDate.getYear());
  175. //根据年月获取招生数量
  176. MPJLambdaWrapper<PbCseFeeobjupdate> pbCseFeeobjupdateByYearMonth = new MPJLambdaWrapper<>();
  177. pbCseFeeobjupdateByYearMonth
  178. .distinct()
  179. .selectAs(PbCseFeeobjupdate::getPersonalid, PbCseFeeobjupdate::getPersonalid)
  180. .selectAs(PbCseFeeobjupdate::getCratetime, PbCseFeeobjupdate::getCratetime)
  181. .eq(PbCseFeeobjupdate::getEnteryear, year)
  182. .between(PbCseFeeobjupdate::getCratetime, dto.getStartDay(), dto.getEndDay())
  183. ;
  184. List<PbCseFeeobjupdate> pbCseFeeobjupdateByYearMonthList = this.selectJoinList(PbCseFeeobjupdate.class, pbCseFeeobjupdateByYearMonth);
  185. if(pbCseFeeobjupdateByYearMonthList != null && !pbCseFeeobjupdateByYearMonthList.isEmpty()) {
  186. //每日招生人数
  187. Map<String, Long> cratetime = pbCseFeeobjupdateByYearMonthList.stream().collect(Collectors.groupingBy(pbCseFeeobjupdate -> pbCseFeeobjupdate.getCratetime().substring(0,10), Collectors.counting()));
  188. if(!cratetime.isEmpty()){
  189. cratetime = cratetime.entrySet().stream()
  190. .sorted(Map.Entry.comparingByKey())
  191. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
  192. (e1, e2) -> e1, LinkedHashMap::new));
  193. }
  194. List<EnrollmentStatisticsInfoKeyValue> cratetimeRes = new ArrayList<>();
  195. for (Map.Entry<String, Long> entry : cratetime.entrySet()) {
  196. cratetimeRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
  197. }
  198. result.setCratetimeList(cratetimeRes);
  199. }
  200. return result;
  201. }
  202. @Override
  203. public EnrollmentStatisticsGraduationInfoVo getEnrollmentStatisticsGraduationInfo(EnrollmentStatisticsGraduationInfoDto dto) {
  204. EnrollmentStatisticsGraduationInfoVo result = new EnrollmentStatisticsGraduationInfoVo();
  205. LocalDate day = LocalDate.parse(dto.getDay());
  206. String year = String.valueOf(day.getYear());
  207. //根据天获取毕业院校
  208. MPJLambdaWrapper<PbCseFeeobjupdate> pbCseFeeobjupdateByDay = new MPJLambdaWrapper<>();
  209. pbCseFeeobjupdateByDay
  210. .distinct()
  211. .selectAs(PbCseFeeobjupdate::getPersonalid, PbCseFeeobjupdate::getPersonalid)
  212. .select("ifnull(t.graduations,'未知') as graduations")
  213. .eq(PbCseFeeobjupdate::getEnteryear, year)
  214. .like(PbCseFeeobjupdate::getCratetime, day)
  215. ;
  216. List<PbCseFeeobjupdate> pbCseFeeobjupdateByDayList = this.selectJoinList(PbCseFeeobjupdate.class, pbCseFeeobjupdateByDay);
  217. if(pbCseFeeobjupdateByDayList != null && !pbCseFeeobjupdateByDayList.isEmpty()){
  218. //毕业学校排行
  219. Map<String, Long> graduations = pbCseFeeobjupdateByDayList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getGraduations, Collectors.counting()));
  220. if(!graduations.isEmpty()){
  221. graduations = graduations.entrySet().stream()
  222. .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
  223. .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
  224. (e1, e2) -> e1, LinkedHashMap::new));
  225. }
  226. List<EnrollmentStatisticsInfoKeyValue> graduationRes = new ArrayList<>();
  227. for (Map.Entry<String, Long> entry : graduations.entrySet()) {
  228. graduationRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
  229. }
  230. result.setGraduationList(graduationRes);
  231. }
  232. return result;
  233. }
  234. }