PbCseFeeobjupdateServiceImpl.java 17 KB

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