This commit is contained in:
Lx 2025-07-01 14:27:36 +08:00
parent 8b5413eaa7
commit 63546eb40a
25 changed files with 407 additions and 64 deletions

View File

@ -22,6 +22,7 @@ import cn.iocoder.yudao.module.constant.InspectionConstants;
import cn.iocoder.yudao.module.course.entity.SchoolCommission;
import cn.iocoder.yudao.module.course.mapper.SchoolCommissionMapper;
import cn.iocoder.yudao.module.course.service.ProcessService;
import cn.iocoder.yudao.module.course.service.SchoolCourseSchemeService;
import cn.iocoder.yudao.module.course.vo.ProcessVO;
import cn.iocoder.yudao.module.exam.mapper.ExamBatchItemMapper;
import cn.iocoder.yudao.module.exam.vo.ExamBatchItemVO;
@ -63,6 +64,7 @@ import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.time.format.DateTimeFormatter;
import java.util.*;
@ -117,6 +119,9 @@ public class DlDriveSchoolCoachServiceImpl extends ServiceImpl<DlDriveSchoolCoac
@Resource
private ProcessService processService;
@Resource
private SchoolCourseSchemeService schemeService;
/**
* 驾校教练普通员工列表
@ -1085,6 +1090,18 @@ public class DlDriveSchoolCoachServiceImpl extends ServiceImpl<DlDriveSchoolCoac
@Override
public IPage<BusinessRecordVO> getBusinessManager(BusinessRecordVO businessRecordVO, Page<BusinessRecordVO> page) {
return dlDriveSchoolCoachMapper.getBusinessManager(businessRecordVO, page);
IPage<BusinessRecordVO> businessManager = dlDriveSchoolCoachMapper.getBusinessManager(businessRecordVO, page);
List<BusinessRecordVO> records = businessManager.getRecords();
for (BusinessRecordVO record : records) {
BigDecimal deduct = BigDecimal.ZERO;
if(record.getScheme() != null){
deduct = schemeService.getSchemeById(record.getScheme(), 0);
}else{
deduct = schemeService.getCourseDeduct(record.getCourseId(), 0);
}
record.setSubsidy(deduct);
}
businessManager.setRecords(records);
return businessManager;
}
}

View File

@ -15,6 +15,7 @@ public class BusinessRecordVO extends TenantBaseDO {
private Integer age;
private String sex;
private String channel;
private String courseId;
private String courseName;
private String coachUserName;
private BigDecimal reserveMoney;
@ -25,5 +26,7 @@ public class BusinessRecordVO extends TenantBaseDO {
private String businessName;
private String businessPhone;
private LocalDateTime createTime;
private BigDecimal subsidy;
private String scheme;
}

View File

@ -96,4 +96,6 @@ public class DlDriveSchoolStaffVO {
private Date enrollTime;
/**工作性质 */
private String workName;
/**面签时间 */
private Date signTime;
}

View File

@ -7,6 +7,7 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Schema(description = "管理后台 - 驾校学员 Response VO")
@Data
@ -47,4 +48,6 @@ public class DlDriveSchoolStudentVO extends DlDriveSchoolStudent {
private Integer isSign;
/**查询人员类型*/
private String pType;
/**面签时间*/
private Date signTime;
}

View File

@ -235,6 +235,13 @@ public class ProcessController {
return success(processService.getPassStudent(coachId, subject, courseType, name, sort, page));
}
/**
* 导出界面获取数据
* @param exportVO
* @param pageNo
* @param pageSize
* @return
*/
@GetMapping("/getProcessExportData")
public CommonResult<IPage<ProcessExportVO>> getProcessExportData(ProcessExportVO exportVO,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@ -243,14 +250,20 @@ public class ProcessController {
return success(processService.getProcessExportData(exportVO, page));
}
/**
* 导出
* @param exportVO
* @param response
* @throws IOException
*/
@GetMapping("/export")
public void exportCommission(ProcessExportVO exportVO, HttpServletResponse response) throws IOException {
// 1. 校验导出类型
// 校验导出类型
if (exportVO.getExportType() == null || !Arrays.asList("current", "all", "range").contains(exportVO.getExportType())) {
throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType());
}
// 2. 根据不同类型查询数据
// 根据不同类型查询数据
List<ProcessExportVO> exportData;
String fileName = "学员进度记录";
@ -270,7 +283,7 @@ public class ProcessController {
default:
throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType());
}
// 4. 导出Excel
// 导出Excel
ExcelUtils.write(response, fileName + ".xlsx", "学员进度记录", ProcessExportVO.class, exportData);
}
}

View File

@ -7,6 +7,7 @@ import cn.iocoder.yudao.module.base.vo.DriveSchoolCourseDeductVO;
import cn.iocoder.yudao.module.course.entity.SchoolCommission;
import cn.iocoder.yudao.module.course.service.SchoolCommissionService;
import cn.iocoder.yudao.module.course.vo.CommissionExportVO;
import cn.iocoder.yudao.module.course.vo.CommissionStatisticsVO;
import cn.iocoder.yudao.module.course.vo.SchoolCommissionVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -114,6 +115,11 @@ public class SchoolCommissionController {
return success(schoolCommissionService.getAllCommissionPage(commissionExportVO, page));
}
@GetMapping("/getCommissionStatistics")
public CommonResult<CommissionStatisticsVO> getCommissionStatistics(CommissionExportVO commissionExportVO){
return success(schoolCommissionService.getCommissionStatistics(commissionExportVO));
}
/**
* 导出数据支持三种模式
* @param exportVO 包含导出类型exportType分页参数等
@ -147,21 +153,19 @@ public class SchoolCommissionController {
}*/
@GetMapping("/export")
public void exportCommission(CommissionExportVO exportVO, HttpServletResponse response) throws IOException {
// 1. 校验导出类型
// 校验导出类型
if (exportVO.getExportType() == null || !Arrays.asList("current", "all", "range").contains(exportVO.getExportType())) {
throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType());
}
// 2. 根据不同类型查询数据
// 根据不同类型查询数据
List<CommissionExportVO> exportData;
String fileName = "提成记录";
int offset = 0; // 序号偏移量用于分页连续
switch (exportVO.getExportType()) {
case "current":
exportData = schoolCommissionService.getCommissionList(exportVO);
fileName += "_第" + exportVO.getPageNo() + "";
offset = (exportVO.getPageNo() - 1) * exportVO.getPageSize(); // 计算分页偏移
break;
case "all":
exportData = schoolCommissionService.getAllCommissionList(exportVO);
@ -170,20 +174,12 @@ public class SchoolCommissionController {
case "range":
exportData = schoolCommissionService.getCommissionListByRange(exportVO);
fileName += "_" + exportVO.getStartPage() + "-" + exportVO.getEndPage() + "";
offset = (exportVO.getStartPage() - 1) * exportVO.getPageSize(); // 自定义范围偏移
break;
default:
throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType());
}
// 3. 设置序号考虑分页偏移
if (exportData != null && !exportData.isEmpty()) {
for (int i = 0; i < exportData.size(); i++) {
exportData.get(i).setSerialNumber(offset + i + 1); // 确保序号连续
}
}
// 4. 导出Excel
// 导出Excel
ExcelUtils.write(response, fileName + ".xlsx", "提成记录", CommissionExportVO.class, exportData);
}
}

View File

@ -203,24 +203,27 @@ public class SchoolCourseOrderController {
return success(schoolCourseOrderService.getOrderExportData(exportVO, page));
}
@GetMapping("/getOrderStatistics")
public CommonResult<CourseOrderStatisticsVO> getOrderStatistics(CourseOrderExportVO exportVO) {
return success(schoolCourseOrderService.getOrderStatistics(exportVO));
}
@GetMapping("/export")
public void exportCommission(CourseOrderExportVO exportVO, HttpServletResponse response) throws IOException {
// 1. 校验导出类型
// 校验导出类型
if (exportVO.getExportType() == null || !Arrays.asList("current", "all", "range").contains(exportVO.getExportType())) {
throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType());
}
// 2. 根据不同类型查询数据
// 根据不同类型查询数据
List<CourseOrderExportVO> exportData;
String fileName = "学员记录";
int offset = 0; // 序号偏移量用于分页连续
switch (exportVO.getExportType()) {
case "current":
exportData = schoolCourseOrderService.getOrderList(exportVO);
fileName += "_第" + exportVO.getPageNo() + "";
offset = (exportVO.getPageNo() - 1) * exportVO.getPageSize(); // 计算分页偏移
break;
case "all":
exportData = schoolCourseOrderService.getAllOrderList(exportVO);
@ -229,20 +232,13 @@ public class SchoolCourseOrderController {
case "range":
exportData = schoolCourseOrderService.getOrderListByRange(exportVO);
fileName += "_" + exportVO.getStartPage() + "-" + exportVO.getEndPage() + "";
offset = (exportVO.getStartPage() - 1) * exportVO.getPageSize(); // 自定义范围偏移
break;
default:
throw new IllegalArgumentException("无效的导出类型: " + exportVO.getExportType());
}
// 3. 设置序号考虑分页偏移
if (exportData != null && !exportData.isEmpty()) {
for (int i = 0; i < exportData.size(); i++) {
exportData.get(i).setSerialNumber(offset + i + 1); // 确保序号连续
}
}
// 4. 导出Excel
// 导出Excel
ExcelUtils.write(response, fileName + ".xlsx", "学员记录", CourseOrderExportVO.class, exportData);
}

View File

@ -111,4 +111,14 @@ public class SchoolCommission extends TenantBaseDO {
*/
private Long cashierUserId;
/**
* 考试通过时间
*/
private Date examTime;
/**
* 缴纳学费金额
*/
private BigDecimal studentPay;
}

View File

@ -164,5 +164,10 @@ public class SchoolCourseOrder extends TenantBaseDO {
*/
private Date payFeesTime;
/**
* 收款账号
*/
private String paymentAccount;
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.course.mapper;
import cn.iocoder.yudao.module.course.entity.SchoolCommission;
import cn.iocoder.yudao.module.course.vo.CommissionExportVO;
import cn.iocoder.yudao.module.course.vo.CommissionStatisticsVO;
import cn.iocoder.yudao.module.course.vo.SchoolCommissionVO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -42,4 +43,5 @@ public interface SchoolCommissionMapper extends BaseMapper<SchoolCommission> {
IPage<SchoolCommissionVO> getCommissionListByCoachId(@Param("entity") SchoolCommissionVO entity, Page<SchoolCommissionVO> page);
IPage<CommissionExportVO> getCommissionListExport(@Param("entity") CommissionExportVO entity, Page<CommissionExportVO> page);
CommissionStatisticsVO getCommissionStatistics(@Param("entity") CommissionExportVO entity);
}

View File

@ -1,10 +1,7 @@
package cn.iocoder.yudao.module.course.mapper;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
import cn.iocoder.yudao.module.course.vo.CourseOrderExportVO;
import cn.iocoder.yudao.module.course.vo.SchoolCommissionVO;
import cn.iocoder.yudao.module.course.vo.SchoolCourseOrderBusinessVO;
import cn.iocoder.yudao.module.course.vo.SchoolCourseOrderVO;
import cn.iocoder.yudao.module.course.vo.*;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -73,4 +70,6 @@ public interface SchoolCourseOrderMapper extends BaseMapper<SchoolCourseOrder> {
IPage<SchoolCourseOrderVO> getOrderMoneyByCoachId(@Param("entity")SchoolCourseOrderVO entity, Page<SchoolCourseOrderVO> page);
IPage<CourseOrderExportVO> getOrderExportData(@Param("entity")CourseOrderExportVO entity, Page<CourseOrderExportVO> page);
CourseOrderStatisticsVO getOrderStatistics(@Param("entity")CourseOrderExportVO entity);
}

View File

@ -2,6 +2,7 @@ package cn.iocoder.yudao.module.course.service;
import cn.iocoder.yudao.module.course.entity.SchoolCommission;
import cn.iocoder.yudao.module.course.vo.CommissionExportVO;
import cn.iocoder.yudao.module.course.vo.CommissionStatisticsVO;
import cn.iocoder.yudao.module.course.vo.SchoolCommissionVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -59,6 +60,7 @@ public interface SchoolCommissionService extends IService<SchoolCommission> {
IPage<SchoolCommissionVO> getCommissionListByCoachId(SchoolCommissionVO schoolCommissionVO, Page<SchoolCommissionVO> page);
IPage<CommissionExportVO> getAllCommissionPage(CommissionExportVO exportVO,Page<CommissionExportVO> page);
CommissionStatisticsVO getCommissionStatistics(CommissionExportVO exportVO);
public List<CommissionExportVO> getCommissionList(CommissionExportVO exportVO);
public List<CommissionExportVO> getAllCommissionList(CommissionExportVO exportVO);

View File

@ -143,6 +143,7 @@ public interface SchoolCourseOrderService extends IService<SchoolCourseOrder> {
IPage<CourseOrderExportVO> getOrderExportData(CourseOrderExportVO exportVO, Page<CourseOrderExportVO> page);
CourseOrderStatisticsVO getOrderStatistics(CourseOrderExportVO exportVO);
List<CourseOrderExportVO> getOrderList(CourseOrderExportVO exportVO);
List<CourseOrderExportVO> getAllOrderList(CourseOrderExportVO exportVO);

View File

@ -405,6 +405,8 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
schoolCommission.setCheckName(sysUser.getNickname());
schoolCommission.setCheckRemark(process.getFinanceRemark());
schoolCommission.setStudentIdCard(process.getStudentIdCard());
schoolCommission.setExamTime(process.getExamTime());
schoolCommission.setStudentPay(process.getStudentPay());
// 检查是否已存在记录
SchoolCommission existing = schoolCommissionService.getOne(

View File

@ -6,6 +6,7 @@ import cn.iocoder.yudao.module.course.entity.SchoolCommission;
import cn.iocoder.yudao.module.course.mapper.SchoolCommissionMapper;
import cn.iocoder.yudao.module.course.service.SchoolCommissionService;
import cn.iocoder.yudao.module.course.vo.CommissionExportVO;
import cn.iocoder.yudao.module.course.vo.CommissionStatisticsVO;
import cn.iocoder.yudao.module.course.vo.SchoolCommissionVO;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
@ -169,6 +170,11 @@ public class SchoolCommissionServiceImpl extends ServiceImpl<SchoolCommissionMap
return schoolCommissionMapper.getCommissionListExport(exportVO, page);
}
@Override
public CommissionStatisticsVO getCommissionStatistics(CommissionExportVO exportVO) {
return schoolCommissionMapper.getCommissionStatistics(exportVO);
}
@Override
public List<CommissionExportVO> getCommissionList(CommissionExportVO exportVO) {
@ -203,4 +209,6 @@ public class SchoolCommissionServiceImpl extends ServiceImpl<SchoolCommissionMap
}
return allData;
}
}

View File

@ -638,6 +638,11 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
return schoolCourseOrderMapper.getOrderExportData(exportVO, page);
}
@Override
public CourseOrderStatisticsVO getOrderStatistics(CourseOrderExportVO exportVO) {
return schoolCourseOrderMapper.getOrderStatistics(exportVO);
}
@Override
public List<CourseOrderExportVO> getOrderList(CourseOrderExportVO exportVO) {
// 分页查询当前页

View File

@ -7,60 +7,76 @@ import com.alibaba.excel.annotation.format.DateTimeFormat;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import lombok.Data;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;
@Data
public class CommissionExportVO {
@ExcelProperty(value = " ", index = 0)
/*@ExcelProperty(value = " ", index = 0)
@ColumnWidth(8)
private Integer serialNumber;
private Integer serialNumber;*/
@ExcelIgnore
private Long coachId;
@ExcelProperty(value = "教练", index = 1)
@ExcelProperty(value = "教练", index = 0)
private String coachName;
@ExcelProperty(value = "教练身份证号", index = 2)
@ExcelProperty(value = "教练身份证号", index = 1)
private String coachIdCard;
@ExcelIgnore
private Long studentId;
@ExcelProperty(value = "学员", index = 3)
@ExcelProperty(value = "学员", index = 2)
private String studentName;
@ExcelProperty(value = "学员身份证号", index = 4)
@ExcelProperty(value = "学员身份证号", index = 3)
private String studentIdCard;
@ExcelIgnore
private String courseId;
@ExcelProperty(value = "课程名称", index = 5)
@ExcelProperty(value = "课程名称", index = 4)
private String courseName;
@ExcelProperty(value = "课程类型", index = 6)
@ExcelProperty(value = "课程类型", index = 5)
private String courseType;
@ExcelProperty(value = "科目", index = 7)
@ExcelProperty(value = "科目", index = 6)
private String subject;
@ExcelProperty(value = "提成金额(元)", index = 8)
@ExcelIgnore
private Date examTime;
@ExcelProperty(value = "考试通过时间", index = 7)
private String examTimeStr;
@ExcelProperty(value = "缴纳学费金额", index = 8)
private BigDecimal studentPay;
@ExcelProperty(value = "提成金额(元)", index = 9)
private String commissionAmount;
@ExcelProperty(value = "审核人", index = 9)
@ExcelProperty(value = "审核人", index = 10)
private String checkName;
@ExcelProperty(value = "审核时间", index = 10)
@ExcelProperty(value = "审核时间", index = 11)
// @DateTimeFormat("yyyy-MM-dd HH:mm:ss")
@ColumnWidth(20)
private String createTimeStr;
@ExcelProperty(value = "备注", index = 11)
@ExcelProperty(value = "备注", index = 12)
private String checkRemark;
@ExcelIgnore
private String source;
@ExcelProperty(value = "渠道", index = 13)
private String sourceStr;
@ExcelIgnore
private String startTimeStr;
@ExcelIgnore
@ -89,4 +105,37 @@ public class CommissionExportVO {
this.createTimeStr = sdf.format(createTime);
}
}
public void setExamTime(Date examTime) {
if (examTime != null) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
this.examTimeStr = sdf.format(examTime);
}
}
public void setSource(String source) {
this.source = source;
if (source == null) {
this.sourceStr = "";
return;
}
switch (source) {
case "01":
this.sourceStr = "驾校统招";
break;
case "02":
this.sourceStr = "教练自招";
break;
case "03":
this.sourceStr = "自来客户";
break;
case "04":
this.sourceStr = "业务经理统招";
break;
default:
this.sourceStr = "未知渠道";
break;
}
}
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.course.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class CommissionStatisticsVO {
// 科二合格数
private Integer subject2PassCount;
// 科二提成
private BigDecimal subject2Commission;
// 科三合格数
private Integer subject3PassCount;
// 科三提成
private BigDecimal subject3Commission;
// 总合格数
private Integer totalPassCount;
// 总提成金额
private BigDecimal totalCommission;
}

View File

@ -14,20 +14,20 @@ import java.util.Date;
@Data
public class CourseOrderExportVO {
@ExcelProperty(value = " ", index = 0)
/*@ExcelProperty(value = " ", index = 0)
@ColumnWidth(8)
private Integer serialNumber;
private Integer serialNumber;*/
@ExcelIgnore
private Long studentId;
@ExcelProperty(value = "学员姓名", index = 1)
@ExcelProperty(value = "学员姓名", index = 0)
private String studentName;
@ExcelProperty(value = "学员身份证号", index = 2)
@ExcelProperty(value = "学员身份证号", index = 1)
private String studentIdCard;
@ExcelProperty(value = "学员手机号", index = 3)
@ExcelProperty(value = "学员手机号", index = 2)
private String studentPhone;
/*@ExcelProperty(value = "学员报名时间", index = 4)
@ -35,7 +35,7 @@ public class CourseOrderExportVO {
@ExcelIgnore
private Date signUpTime;
@ExcelProperty(value = "学员报名时间", index = 4)
@ExcelProperty(value = "学员报名时间", index = 3)
private String signUpTimeStr;
public void setSignUpTime(Date signUpTime) {
@ -47,20 +47,20 @@ public class CourseOrderExportVO {
@ExcelIgnore
private Long courseId;
@ExcelProperty(value = "课程名称", index = 5)
@ExcelProperty(value = "课程名称", index = 4)
private String courseName;
@ExcelProperty(value = "课程类型", index = 6)
@ExcelProperty(value = "课程类型", index = 5)
private String courseType;
@ExcelProperty(value = "缴费金额", index = 7)
@ExcelProperty(value = "缴费金额", index = 6)
private BigDecimal reserveMoney;
/*@ExcelProperty(value = "缴费时间", index = 8)
@DateTimeFormat("yyyy-MM-dd")*/
@ExcelIgnore
private Date payFeesTime;
@ExcelProperty(value = "缴费时间", index = 8)
@ExcelProperty(value = "缴费时间", index = 7)
private String payFeesTimeStr;
public void setPayFeesTimeStr(Date payFeesTime) {
@ -69,6 +69,12 @@ public class CourseOrderExportVO {
}
}
@ExcelIgnore
private String source;
@ExcelProperty(value = "渠道", index = 8)
private String sourceStr;
@ExcelProperty(value = "订单备注", index = 9)
private String orderRemark;
@ -100,6 +106,8 @@ public class CourseOrderExportVO {
@ExcelProperty(value = "出纳是否确认收款", index = 16)
private String cashierConfirmDisplay;
@ExcelProperty(value = "收款账号", index = 17)
private String paymentAccount;
@ExcelIgnore
private Integer cashierConfirm;
@ -107,7 +115,7 @@ public class CourseOrderExportVO {
@ExcelIgnore
private Date cashierConfirmTime;
@ExcelProperty(value = "出纳确认时间", index = 17)
@ExcelProperty(value = "出纳确认时间", index = 18)
private String cashierConfirmTimeStr;
public void setCashierConfirmTime(Date cashierConfirmTime) {
@ -116,7 +124,7 @@ public class CourseOrderExportVO {
}
}
@ExcelProperty(value = "出纳备注", index = 18)
@ExcelProperty(value = "出纳备注", index = 19)
private String cashierConfirmRemark;
/**
@ -185,4 +193,31 @@ public class CourseOrderExportVO {
}
}
public void setSource(String source) {
this.source = source;
if (source == null) {
this.sourceStr = "";
return;
}
switch (source) {
case "01":
this.sourceStr = "驾校统招";
break;
case "02":
this.sourceStr = "教练自招";
break;
case "03":
this.sourceStr = "自来客户";
break;
case "04":
this.sourceStr = "业务经理统招";
break;
default:
this.sourceStr = "未知渠道";
break;
}
}
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.yudao.module.course.vo;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class CourseOrderStatisticsVO {
/** 招生人数 */
private Integer studentCount;
/** 招生金额总和 */
private BigDecimal totalAmount;
/** 科目二提成金额总和 */
private BigDecimal subject2DeductTotal;
/** 科目三提成金额总和 */
private BigDecimal subject3DeductTotal;
}

View File

@ -44,4 +44,9 @@ public class ProcessVO extends Process {
* 出纳确认情况
*/
private String cashierConfirm;
/**
* 渠道
*/
private String source;
}

View File

@ -134,6 +134,7 @@
dss.sex,
dss.channel,
dsco.course_name,
dsco.course_id,
dsco.coach_user_name,
dsco.reserve_money,
dsco.rest_money,

View File

@ -69,7 +69,8 @@
dsco.rest_money,
dsco.if_end,
dsco.create_time AS enrollTime,
dsco.user_no AS studentIdCard
dsco.user_no AS studentIdCard,
dsco.sign_time
FROM
drive_school_student main
LEFT JOIN drive_school_course_order dsco ON main.user_id = dsco.user_id
@ -435,11 +436,12 @@
<select id="selectTrainStudent" resultType="cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO">
SELECT
dss.*,dsc.type AS courseType,dst.subject
dss.*,dsc.type AS courseType,dst.subject, dsco.sign_time
FROM
drive_school_student dss
LEFT JOIN drive_school_train dst ON dss.user_id = dst.user_id AND dst.deleted = 0
LEFT JOIN drive_school_course dsc ON dst.course_id = dsc.id
LEFT JOIN drive_school_course_order dsco ON dsco.user_id = dss.user_id AND dsco.deleted = 0 AND dsco.if_end = 0 AND dsco.is_sign = 1
WHERE
dst.id IS NOT NULL
AND dss.deleted = 0

View File

@ -114,7 +114,10 @@
dsc.subject,
dsc.check_name,
dsc.check_remark,
dsc.create_time
dsc.create_time,
dsc.exam_time,
dsc.student_pay,
student.source
FROM drive_school_commission dsc
LEFT JOIN drive_school_coach coach ON coach.user_id = dsc.coach_user_id AND coach.deleted = 0
LEFT JOIN drive_school_course course ON course.id = dsc.course_id AND course.deleted = 0
@ -135,6 +138,9 @@
<if test="entity.subject != null and entity.subject != '' ">
AND dsc.subject = #{entity.subject}
</if>
<if test="entity.source != null and entity.source != '' ">
AND student.source = #{entity.source}
</if>
<if test="entity.checkName != null and entity.checkName != '' ">
AND dsc.check_name LIKE CONCAT('%', #{entity.checkName}, '%')
</if>
@ -162,4 +168,60 @@
</if>
order BY dsc.create_time DESC
</select>
<select id="getCommissionStatistics" resultType="cn.iocoder.yudao.module.course.vo.CommissionStatisticsVO">
SELECT
SUM(CASE WHEN dsc.subject = 2 THEN 1 ELSE 0 END) AS subject2PassCount,
SUM(CASE WHEN dsc.subject = 2 THEN dsc.commission_amount ELSE 0 END) AS subject2Commission,
SUM(CASE WHEN dsc.subject = 3 THEN 1 ELSE 0 END) AS subject3PassCount,
SUM(CASE WHEN dsc.subject = 3 THEN dsc.commission_amount ELSE 0 END) AS subject3Commission,
COUNT(*) AS totalPassCount,
SUM(dsc.commission_amount) AS totalCommission
FROM drive_school_commission dsc
LEFT JOIN drive_school_coach coach ON coach.user_id = dsc.coach_user_id AND coach.deleted = 0
LEFT JOIN drive_school_course course ON course.id = dsc.course_id AND course.deleted = 0
LEFT JOIN drive_school_student student ON student.user_id = dsc.student_id AND student.deleted = 0
WHERE dsc.deleted = 0 AND dsc.subject IN (2,3)
<!-- 这里保持与getCommissionListNoPage相同的条件 -->
<if test="entity.coachId != null ">
AND dsc.coach_user_id = #{entity.coachId}
</if>
<if test="entity.studentName != null and entity.studentName != '' ">
AND dsc.student_name LIKE CONCAT('%', #{entity.studentName}, '%')
</if>
<if test="entity.courseId != null and entity.courseId != '' ">
AND dsc.course_id = #{entity.courseId}
</if>
<if test="entity.courseType != null and entity.courseType != '' ">
AND course.type = #{entity.courseType}
</if>
<if test="entity.subject != null and entity.subject != '' ">
AND dsc.subject = #{entity.subject}
</if>
<if test="entity.source != null and entity.source != '' ">
AND student.source = #{entity.source}
</if>
<if test="entity.checkName != null and entity.checkName != '' ">
AND dsc.check_name LIKE CONCAT('%', #{entity.checkName}, '%')
</if>
<if test="entity.startTimeStr!=null and entity.startTimeStr!='' ">
AND dsc.create_time &gt;= #{entity.startTimeStr}
</if>
<if test="entity.endTimeStr!=null and entity.endTimeStr!='' ">
AND dsc.create_time &lt;= #{entity.endTimeStr}
</if>
<if test="entity.studentIdCard != null and entity.studentIdCard != '' ">
<choose>
<when test="entity.studentIdCard.length() == 18">
AND student.id_card = #{entity.studentIdCard}
</when>
<when test="entity.studentIdCard.length() == 4">
AND RIGHT(student.id_card, 4) = #{entity.studentIdCard}
</when>
<otherwise>
AND student.id_card LIKE concat('%', #{entity.studentIdCard}, '%')
</otherwise>
</choose>
</if>
</select>
</mapper>

View File

@ -302,6 +302,8 @@
dsco.order_remark,
dsco.cashier_confirm,
dsco.cashier_confirm_remark,
dss.source,
dsco.payment_account,
MAX(CASE WHEN dsp.subject = 2 THEN COALESCE(dsp.coach_name, '') END) AS subject2CoachName,
MAX(CASE WHEN dscd.course_subject = 2 THEN COALESCE(dscd.deduct, 0) END) AS subject2Deduct,
MAX(CASE WHEN dsp.subject = 3 THEN COALESCE(dsp.coach_name, '') END) AS subject3CoachName,
@ -310,6 +312,7 @@
drive_school_course_order dsco
LEFT JOIN drive_school_process dsp ON dsp.course_id = dsco.course_id AND dsp.user_id = dsco.user_id AND dsp.subject IN (2, 3) AND dsp.deleted = 0
LEFT JOIN drive_school_course_deduct dscd ON dsco.scheme_id = dscd.scheme_id AND dsco.course_id = dscd.course_id AND dscd.course_subject IN (2, 3) AND dscd.deleted = 0
LEFT JOIN drive_school_student dss ON dsco.user_id = dss.user_id AND dss.deleted = 0
WHERE dsco.deleted = 0
AND dsco.if_end = 0
<if test="entity.courseId != null and entity.courseId != '' ">
@ -348,9 +351,9 @@
<if test="entity.paymentStatus != null and entity.paymentStatus != '' ">
AND dsco.payment_status = #{entity.paymentStatus}
</if>
<if test="entity.cashierConfirm != null and entity.cashierConfirm != '' ">
<!--<if test="entity.cashierConfirm != null and entity.cashierConfirm != '' ">
AND dsco.cashier_Confirm = #{entity.cashierConfirm}
</if>
</if>-->
<if test="entity.isSign != null">
AND dsco.is_sign = #{entity.isSign}
</if>
@ -361,7 +364,9 @@
<if test="entity.cashierConfirm == null">
AND dsco.cashier_Confirm IS NULL
</if>
<if test="entity.source != null and entity.source != '' ">
AND dss.source = #{entity.source}
</if>
<if test="entity.studentIdCard != null and entity.studentIdCard != '' ">
<choose>
<!-- 精确匹配当输入18位时 -->
@ -392,4 +397,84 @@
dsco.cashier_confirm,
dsco.cashier_confirm_remark
</select>
<select id="getOrderStatistics" resultType="cn.iocoder.yudao.module.course.vo.CourseOrderStatisticsVO">
SELECT
COUNT(DISTINCT dsco.user_id) AS studentCount,
SUM(dsco.reserve_money) AS totalAmount,
SUM(CASE WHEN dscd.course_subject = 2 THEN COALESCE(dscd.deduct, 0) ELSE 0 END) AS subject2DeductTotal,
SUM(CASE WHEN dscd.course_subject = 3 THEN COALESCE(dscd.deduct, 0) ELSE 0 END) AS subject3DeductTotal
FROM
drive_school_course_order dsco
LEFT JOIN drive_school_process dsp ON dsp.course_id = dsco.course_id AND dsp.user_id = dsco.user_id AND dsp.subject IN (2, 3) AND dsp.deleted = 0
LEFT JOIN drive_school_course_deduct dscd ON dsco.scheme_id = dscd.scheme_id AND dsco.course_id = dscd.course_id AND dscd.course_subject IN (2, 3) AND dscd.deleted = 0
LEFT JOIN drive_school_student dss ON dsco.user_id = dss.user_id AND dss.deleted = 0
WHERE dsco.deleted = 0
AND dsco.if_end = 0
<if test="entity.courseId != null and entity.courseId != '' ">
AND dsco.course_id = #{entity.courseId}
</if>
<if test="entity.studentPhone != null and entity.studentPhone != '' ">
AND dsco.user_phone like concat('%', #{entity.studentPhone}, '%')
</if>
<if test="entity.coachId != null and entity.coachId != '' ">
AND dsp.coach_id = #{entity.coachId}
</if>
<if test="entity.courseType != null and entity.courseType != '' ">
AND dsco.course_type = #{entity.courseType}
</if>
<if test="entity.signUpStartTimeStr!=null and entity.signUpStartTimeStr!='' ">
AND dsco.create_time &gt;= #{entity.signUpStartTimeStr}
</if>
<if test="entity.signUpEndTimeStr!=null and entity.signUpEndTimeStr!='' ">
AND dsco.create_time &lt;= #{entity.signUpEndTimeStr}
</if>
<if test="entity.payFeesStartTimeStr!=null and entity.payFeesStartTimeStr!='' ">
AND dsco.pay_fees_time &gt;= #{entity.payFeesStartTimeStr}
</if>
<if test="entity.payFeesEndTimeStr!=null and entity.payFeesEndTimeStr!='' ">
AND dsco.pay_fees_time &lt;= #{entity.payFeesEndTimeStr}
</if>
<if test="entity.cashierConfirmStartTimeStr!=null and entity.cashierConfirmStartTimeStr!='' ">
AND dsco.cashier_confirm_time &gt;= #{entity.cashierConfirmStartTimeStr}
</if>
<if test="entity.cashierConfirmEndTimeStr!=null and entity.cashierConfirmEndTimeStr!='' ">
AND dsco.cashier_confirm_time &lt;= #{entity.cashierConfirmEndTimeStr}
</if>
<if test="entity.paymentStatus != null and entity.paymentStatus != '' ">
AND dsco.payment_status = #{entity.paymentStatus}
</if>
<if test="entity.isSign != null">
AND dsco.is_sign = #{entity.isSign}
</if>
<if test="entity.cashierConfirm != null">
AND dsco.cashier_Confirm = #{entity.cashierConfirm}
</if>
<if test="entity.cashierConfirm == null">
AND dsco.cashier_Confirm IS NULL
</if>
<if test="entity.source != null and entity.source != '' ">
AND dss.source = #{entity.source}
</if>
<if test="entity.studentIdCard != null and entity.studentIdCard != '' ">
<choose>
<!-- 精确匹配当输入18位时 -->
<when test="entity.studentIdCard.length() == 18">
AND dsco.id_card = #{entity.studentIdCard}
</when>
<!-- 后4位匹配当输入正好4位时 -->
<when test="entity.studentIdCard.length() == 4">
AND RIGHT(dsco.id_card, 4) = #{entity.studentIdCard}
</when>
<!-- 模糊搜索当输入大于4位但不足18位时 -->
<otherwise>
AND dsco.id_card LIKE concat('%', #{entity.studentIdCard}, '%')
</otherwise>
</choose>
</if>
</select>
</mapper>