|
|
@@ -3,16 +3,24 @@ package com.xjrsoft.module.student.service.impl;
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
import com.github.yulichang.base.MPJBaseServiceImpl;
|
|
|
import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
-import com.xjrsoft.module.student.entity.PbCseFeeobjupdate;
|
|
|
-import com.xjrsoft.module.student.entity.PbVXssfdetail;
|
|
|
+import com.xjrsoft.common.utils.VoToColumnUtil;
|
|
|
+import com.xjrsoft.module.base.entity.BaseMajorSet;
|
|
|
+import com.xjrsoft.module.oa.vo.NewsAppendixVo;
|
|
|
+import com.xjrsoft.module.student.entity.*;
|
|
|
import com.xjrsoft.module.student.mapper.PbCseFeeobjupdateMapper;
|
|
|
import com.xjrsoft.module.student.service.IPbCseFeeobjupdateService;
|
|
|
+import com.xjrsoft.module.student.vo.ChargingSituationVo;
|
|
|
import com.xjrsoft.module.student.vo.EnrollmentStatisticsInfoKeyValue;
|
|
|
import com.xjrsoft.module.student.vo.EnrollmentStatisticsInfoVo;
|
|
|
+import com.xjrsoft.module.student.vo.PbCseFeeobjupdatePageVo;
|
|
|
+import com.xjrsoft.module.system.entity.File;
|
|
|
+import com.xjrsoft.module.textbook.dto.EnrollmentStatisticsInfoDto;
|
|
|
import lombok.AllArgsConstructor;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.math.RoundingMode;
|
|
|
+import java.time.LocalDate;
|
|
|
+import java.time.format.DateTimeFormatter;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.LinkedHashMap;
|
|
|
import java.util.List;
|
|
|
@@ -29,17 +37,88 @@ import java.util.stream.Collectors;
|
|
|
@AllArgsConstructor
|
|
|
public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobjupdateMapper, PbCseFeeobjupdate> implements IPbCseFeeobjupdateService {
|
|
|
@Override
|
|
|
- public EnrollmentStatisticsInfoVo getEnrollmentStatisticsInfo() {
|
|
|
+ public EnrollmentStatisticsInfoVo getEnrollmentStatisticsInfo(EnrollmentStatisticsInfoDto dto) {
|
|
|
EnrollmentStatisticsInfoVo result = new EnrollmentStatisticsInfoVo();
|
|
|
+ String firstDayOfMonthStr;
|
|
|
+ String lastDayOfMonthStr;
|
|
|
+ if(dto.getYearMonth() != null && !dto.getYearMonth().equals("")){
|
|
|
+ LocalDate date = LocalDate.parse(dto.getYearMonth() + "-01"); // 假设给定日期为2022年9月15日
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ // 获取月份的第一天
|
|
|
+ LocalDate firstDayOfMonth = date.withDayOfMonth(1);
|
|
|
+ firstDayOfMonthStr = firstDayOfMonth.format(formatter);
|
|
|
+ // 获取月份的最后一天
|
|
|
+ LocalDate lastDayOfMonth = date.withDayOfMonth(date.lengthOfMonth());
|
|
|
+ lastDayOfMonthStr = lastDayOfMonth.format(formatter);
|
|
|
+ }else {
|
|
|
+ LocalDate today = LocalDate.now();
|
|
|
+ DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ // 获取月份的第一天
|
|
|
+ LocalDate firstDayOfMonth = today.withDayOfMonth(1);
|
|
|
+ firstDayOfMonthStr = firstDayOfMonth.format(formatter);
|
|
|
+ // 获取月份的最后一天
|
|
|
+ LocalDate lastDayOfMonth = today.withDayOfMonth(today.lengthOfMonth());
|
|
|
+ lastDayOfMonthStr = lastDayOfMonth.format(formatter);
|
|
|
+ }
|
|
|
+
|
|
|
+ //根据年月获取招生数量,毕业院校
|
|
|
+ MPJLambdaWrapper<PbCseFeeobjupdate> pbCseFeeobjupdateByYearMonth = new MPJLambdaWrapper<>();
|
|
|
+ pbCseFeeobjupdateByYearMonth
|
|
|
+ .distinct()
|
|
|
+ .selectAs(PbCseFeeobjupdate::getPersonalid, PbCseFeeobjupdate::getPersonalid)
|
|
|
+ .select("ifnull(t.graduations,'未知') as graduations")
|
|
|
+ .selectAs(PbCseFeeobjupdate::getCratetime, PbCseFeeobjupdate::getCratetime)
|
|
|
+ .eq(dto.getYear() != null, PbCseFeeobjupdate::getEnteryear, dto.getYear())
|
|
|
+ .between(PbCseFeeobjupdate::getCratetime, firstDayOfMonthStr, lastDayOfMonthStr)
|
|
|
+ ;
|
|
|
+
|
|
|
+ List<PbCseFeeobjupdate> pbCseFeeobjupdateByYearMonthList = this.selectJoinList(PbCseFeeobjupdate.class, pbCseFeeobjupdateByYearMonth);
|
|
|
+
|
|
|
+ if(pbCseFeeobjupdateByYearMonthList != null && !pbCseFeeobjupdateByYearMonthList.isEmpty()) {
|
|
|
+ //每日招生人数
|
|
|
+ Map<String, Long> cratetime = pbCseFeeobjupdateByYearMonthList.stream().collect(Collectors.groupingBy(pbCseFeeobjupdate -> pbCseFeeobjupdate.getCratetime().substring(0,10), Collectors.counting()));
|
|
|
+ List<EnrollmentStatisticsInfoKeyValue> cratetimeRes = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, Long> entry : cratetime.entrySet()) {
|
|
|
+ cratetimeRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
|
|
|
+ }
|
|
|
+
|
|
|
+ //毕业学校排行
|
|
|
+ Map<String, Long> graduations = pbCseFeeobjupdateByYearMonthList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getGraduations, Collectors.counting()));
|
|
|
+ if(!graduations.isEmpty()){
|
|
|
+ graduations = graduations.entrySet().stream()
|
|
|
+ .sorted(Map.Entry.<String, Long>comparingByValue().reversed())
|
|
|
+ .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue,
|
|
|
+ (e1, e2) -> e1, LinkedHashMap::new));
|
|
|
+ }
|
|
|
+ List<EnrollmentStatisticsInfoKeyValue> graduationRes = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, Long> entry : graduations.entrySet()) {
|
|
|
+ graduationRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
|
|
|
+ }
|
|
|
+
|
|
|
+ result.setGraduationList(graduationRes);
|
|
|
+ result.setCratetimeList(cratetimeRes);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
//获取所有学生的信息
|
|
|
- LambdaQueryWrapper<PbCseFeeobjupdate> pbCseFeeobjupdateLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
- pbCseFeeobjupdateLambdaQueryWrapper
|
|
|
- .eq(PbCseFeeobjupdate::getEnteryear, "2024");
|
|
|
+ MPJLambdaWrapper<PbCseFeeobjupdate> pbCseFeeobjupdateMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
+ pbCseFeeobjupdateMPJLambdaWrapper
|
|
|
+ .distinct()
|
|
|
+ .select("ifnull(t2.name,t.specname) as specname")
|
|
|
+ .selectAs(PbCseFeeobjupdate::getPersonalid, PbCseFeeobjupdate::getPersonalid)
|
|
|
+ .selectAs(PbCseFeeobjupdate::getSpecname, PbCseFeeobjupdate::getSpecname)
|
|
|
+ .selectAs(PbCseFeeobjupdate::getResourcename, PbCseFeeobjupdate::getResourcename)
|
|
|
+ .selectAs(PbCseFeeobjupdate::getQuartername, PbCseFeeobjupdate::getQuartername)
|
|
|
+ .selectAs(PbCseFeeobjupdate::getSex, PbCseFeeobjupdate::getSex)
|
|
|
+ .leftJoin(BaseMajorSet.class, BaseMajorSet::getName, PbCseFeeobjupdate::getSpecname)
|
|
|
+ .leftJoin(BaseMajorCategor.class, BaseMajorCategor::getId, BaseMajorSet::getMajorCategorId)
|
|
|
+ .eq(dto.getYear() != null, PbCseFeeobjupdate::getEnteryear, dto.getYear())
|
|
|
+ ;
|
|
|
|
|
|
- List<PbCseFeeobjupdate> pbCseFeeobjupdateList = this.list(pbCseFeeobjupdateLambdaQueryWrapper);
|
|
|
+ List<PbCseFeeobjupdate> pbCseFeeobjupdateList = this.selectJoinList(PbCseFeeobjupdate.class, pbCseFeeobjupdateMPJLambdaWrapper);
|
|
|
|
|
|
if(pbCseFeeobjupdateList != null && !pbCseFeeobjupdateList.isEmpty()){
|
|
|
+ //专业排行
|
|
|
Map<String, Long> professionalHeadCount = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getSpecname, Collectors.counting()));
|
|
|
if(!professionalHeadCount.isEmpty()){
|
|
|
professionalHeadCount = professionalHeadCount.entrySet().stream()
|
|
|
@@ -52,18 +131,21 @@ public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobj
|
|
|
professionalHeadCountRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
|
|
|
}
|
|
|
|
|
|
+ //学生类型
|
|
|
Map<String, Long> studentSource = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getResourcename, Collectors.counting()));
|
|
|
List<EnrollmentStatisticsInfoKeyValue> studentSourceRes = new ArrayList<>();
|
|
|
for (Map.Entry<String, Long> entry : studentSource.entrySet()) {
|
|
|
studentSourceRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
|
|
|
}
|
|
|
|
|
|
+ //住宿类型
|
|
|
Map<String, Long> accommodationType = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getQuartername, Collectors.counting()));
|
|
|
List<EnrollmentStatisticsInfoKeyValue> accommodationTypeRes = new ArrayList<>();
|
|
|
for (Map.Entry<String, Long> entry : accommodationType.entrySet()) {
|
|
|
accommodationTypeRes.add(new EnrollmentStatisticsInfoKeyValue(entry.getKey(), entry.getValue()));
|
|
|
}
|
|
|
|
|
|
+ //性别
|
|
|
Map<String, Long> gender = pbCseFeeobjupdateList.stream().collect(Collectors.groupingBy(PbCseFeeobjupdate::getSex, Collectors.counting()));
|
|
|
List<EnrollmentStatisticsInfoKeyValue> genderRes = new ArrayList<>();
|
|
|
for (Map.Entry<String, Long> entry : gender.entrySet()) {
|
|
|
@@ -75,23 +157,52 @@ public class PbCseFeeobjupdateServiceImpl extends MPJBaseServiceImpl<PbCseFeeobj
|
|
|
result.setStudentSource(studentSourceRes);
|
|
|
result.setAccommodationType(accommodationTypeRes);
|
|
|
result.setGender(genderRes);
|
|
|
- }
|
|
|
|
|
|
- //获取所有学生的收费明细
|
|
|
- MPJLambdaWrapper<PbCseFeeobjupdate> feeobjupdateXssfdetailMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
- feeobjupdateXssfdetailMPJLambdaWrapper
|
|
|
- .selectCount(PbVXssfdetail::getPersonalid, EnrollmentStatisticsInfoVo::getPayers)
|
|
|
- .selectSum(PbVXssfdetail::getMny, EnrollmentStatisticsInfoVo::getRecordedAmountOfMoney)
|
|
|
- .leftJoin(PbVXssfdetail.class, PbVXssfdetail::getPersonalid, PbCseFeeobjupdate::getPersonalid)
|
|
|
- .eq(PbCseFeeobjupdate::getEnteryear, "2024")
|
|
|
- ;
|
|
|
- EnrollmentStatisticsInfoVo enrollmentStatisticsInfoVo = this.selectJoinOne(EnrollmentStatisticsInfoVo.class, feeobjupdateXssfdetailMPJLambdaWrapper);
|
|
|
+ //获取所有学生的收费明细
|
|
|
+ MPJLambdaWrapper<PbCseFeeobjupdate> feeobjupdateXssfdetailMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
+ feeobjupdateXssfdetailMPJLambdaWrapper
|
|
|
+ .selectCount(PbVXssfdetail::getPersonalid, EnrollmentStatisticsInfoVo::getPayers)
|
|
|
+ .selectSum(PbVXssfdetail::getMny, EnrollmentStatisticsInfoVo::getRecordedAmountOfMoney)
|
|
|
+ .leftJoin(PbVXssfdetail.class, PbVXssfdetail::getPersonalid, PbCseFeeobjupdate::getPersonalid)
|
|
|
+ .eq(dto.getYear() != null, PbCseFeeobjupdate::getEnteryear, dto.getYear())
|
|
|
+ ;
|
|
|
+ EnrollmentStatisticsInfoVo enrollmentStatisticsInfoVo = this.selectJoinOne(EnrollmentStatisticsInfoVo.class, feeobjupdateXssfdetailMPJLambdaWrapper);
|
|
|
+
|
|
|
+ //缴费人数,入账金额
|
|
|
+ if(enrollmentStatisticsInfoVo != null){
|
|
|
+ result.setPayers(enrollmentStatisticsInfoVo.getPayers());
|
|
|
+ if(enrollmentStatisticsInfoVo.getRecordedAmountOfMoney() != null){
|
|
|
+ result.setRecordedAmountOfMoney(enrollmentStatisticsInfoVo.getRecordedAmountOfMoney().setScale(2, RoundingMode.DOWN));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //获取所有学生的缴费详情
|
|
|
+ MPJLambdaWrapper<PbCseFeeobjupdate> feeobjupdateMPJLambdaWrapper = new MPJLambdaWrapper<>();
|
|
|
+ feeobjupdateMPJLambdaWrapper
|
|
|
+ .selectAs(PbVXssfdetail::getFeeitemname, PbVXssfdetail::getFeeitemname)
|
|
|
+ .leftJoin(PbVXssfdetail.class, PbVXssfdetail::getPersonalid, PbCseFeeobjupdate::getPersonalid)
|
|
|
+ .eq(dto.getYear() != null, PbCseFeeobjupdate::getEnteryear, dto.getYear())
|
|
|
+ .isNotNull(PbVXssfdetail::getFeeitemname)
|
|
|
+ ;
|
|
|
+ List<PbVXssfdetail> pbVXssfdetails = this.selectJoinList(PbVXssfdetail.class, feeobjupdateMPJLambdaWrapper);
|
|
|
|
|
|
- if(enrollmentStatisticsInfoVo != null){
|
|
|
- result.setPayers(enrollmentStatisticsInfoVo.getPayers());
|
|
|
- if(enrollmentStatisticsInfoVo.getRecordedAmountOfMoney() != null){
|
|
|
- result.setRecordedAmountOfMoney(enrollmentStatisticsInfoVo.getRecordedAmountOfMoney().setScale(2, RoundingMode.DOWN));
|
|
|
+ //收费项目情况统计
|
|
|
+ Map<String, Long> pbVXssfdetailMap = pbVXssfdetails.stream().collect(Collectors.groupingBy(PbVXssfdetail::getFeeitemname, Collectors.counting()));
|
|
|
+ List<ChargingSituationVo> chargingSituationVoRes = new ArrayList<>();
|
|
|
+ for (Map.Entry<String, Long> entry : pbVXssfdetailMap.entrySet()) {
|
|
|
+ chargingSituationVoRes.add(new ChargingSituationVo(){{
|
|
|
+ setFeeitemname(entry.getKey());
|
|
|
+ setPaid(entry.getValue());
|
|
|
+ if(entry.getKey().equals("普通中专、职业高中、成人中专普通宿舍") && !accommodationType.isEmpty() && accommodationType.get("住宿") != null){
|
|
|
+ setUnpaid(accommodationType.get("住宿") - entry.getValue());
|
|
|
+ setRateOfPayment(entry.getValue()/accommodationType.get("住宿")*100 + "%");
|
|
|
+ } else {
|
|
|
+ setUnpaid(result.getRegistrationPopulation() - entry.getValue());
|
|
|
+ setRateOfPayment(entry.getValue()/result.getRegistrationPopulation()*100 + "%");
|
|
|
+ }
|
|
|
+ }});
|
|
|
}
|
|
|
+ result.setChargingSituationVoList(chargingSituationVoRes);
|
|
|
}
|
|
|
|
|
|
return result;
|