This commit is contained in:
Lx 2025-06-19 15:35:33 +08:00
parent f20e476027
commit 79fcb13cc7
8 changed files with 174 additions and 12 deletions

View File

@ -150,4 +150,14 @@ public interface SchoolBaseConstants {
*/ */
public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_PAY_TO_MEMBER = "学员 %s 订单已支付!"; public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_PAY_TO_MEMBER = "学员 %s 订单已支付!";
/**
* 审核不通过
*/
public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_AUDIT_NOT_PASS = "驾校学员 %s ,身份证号:%s科目 %s 的提成审核未通过,原因:%s 。请查看!";
/**
* 待审核
*/
public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_AUDIT_WAIT = "驾校学员 %s ,身份证号:%s科目 %s 的考试已通过,提成待审核,请查看!";
} }

View File

@ -142,15 +142,15 @@ public class ProcessController {
/** /**
* 财务审核 * 财务审核
* *
* @param process {@link Process} * @param processVO {@link Process}
* @return cn.iocoder.yudao.framework.common.pojo.CommonResult<java.lang.Boolean> * @return cn.iocoder.yudao.framework.common.pojo.CommonResult<java.lang.Boolean>
* @author PQZ * @author PQZ
* @date 15:23 2025/2/18 * @date 15:23 2025/2/18
**/ **/
@PostMapping("/check") @PostMapping("/check")
@Operation(summary = "财务审核") @Operation(summary = "财务审核")
public CommonResult<Boolean> saveSchoolCoach(@Valid @RequestBody Process process) { public CommonResult<Boolean> saveSchoolCoach(@Valid @RequestBody ProcessVO processVO) {
processService.checkProcess(process); processService.checkProcess(processVO);
return success(true); return success(true);
} }

View File

@ -48,6 +48,10 @@ public class SchoolCommission extends TenantBaseDO {
* 学生姓名 * 学生姓名
*/ */
private String studentName; private String studentName;
/**
* 学院身份证号
*/
private String studentIdCard;
/** /**
* 提成金额 * 提成金额
*/ */
@ -76,5 +80,9 @@ public class SchoolCommission extends TenantBaseDO {
* 支付时间 * 支付时间
*/ */
private Date payTime; private Date payTime;
/**
* 审核备注
*/
private String checkRemark;
} }

View File

@ -99,11 +99,11 @@ public interface ProcessService extends IService<Process> {
/** /**
* 财务审核 * 财务审核
* *
* @param process {@link Process} * @param processVO {@link Process}
* @author PQZ * @author PQZ
* @date 15:24 2025/2/18 * @date 15:24 2025/2/18
**/ **/
void checkProcess(Process process); void checkProcess(ProcessVO processVO);
/** /**
* 保存学员课程进度 * 保存学员课程进度

View File

@ -6,6 +6,7 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO; import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants; import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants;
import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent; import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent;
import cn.iocoder.yudao.module.base.mapper.DlDriveSchoolCourseMapper; import cn.iocoder.yudao.module.base.mapper.DlDriveSchoolCourseMapper;
@ -33,8 +34,10 @@ import cn.iocoder.yudao.module.exam.mapper.ExamBatchItemMapper;
import cn.iocoder.yudao.module.exam.vo.ExamBatchItemNewVO; import cn.iocoder.yudao.module.exam.vo.ExamBatchItemNewVO;
import cn.iocoder.yudao.module.jx.domain.DriveSchoolDeduct; import cn.iocoder.yudao.module.jx.domain.DriveSchoolDeduct;
import cn.iocoder.yudao.module.jx.service.IDriveSchoolDeductService; import cn.iocoder.yudao.module.jx.service.IDriveSchoolDeductService;
import cn.iocoder.yudao.module.system.api.permission.RoleApi;
import cn.iocoder.yudao.module.system.api.user.AdminUserApi; import cn.iocoder.yudao.module.system.api.user.AdminUserApi;
import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO; import cn.iocoder.yudao.module.system.api.user.dto.AdminUserRespDTO;
import cn.iocoder.yudao.module.system.api.user.dto.UserDTO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -97,6 +100,9 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
@Resource @Resource
private SchoolCourseSchemeService schemeService; private SchoolCourseSchemeService schemeService;
@Resource
private RoleApi roleApi;
/** /**
* 教练查自己带教的课程和科目 * 教练查自己带教的课程和科目
@ -343,7 +349,7 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
}*/ }*/
@Override @Override
@Transactional(rollbackFor = Exception.class) @Transactional(rollbackFor = Exception.class)
public void checkProcess(Process process) { public void checkProcess(ProcessVO process) {
// 查询原始数据和当前用户信息 // 查询原始数据和当前用户信息
Process oldProcess = getById(process.getId()); Process oldProcess = getById(process.getId());
Long userId = SecurityFrameworkUtils.getLoginUserId(); Long userId = SecurityFrameworkUtils.getLoginUserId();
@ -355,6 +361,20 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
return; return;
} }
if(!process.getFinancePass()){
// 审核不通过需要发送站内信通知姓名科目原因时间审核人
Long tenantId = TenantContextHolder.getTenantId();
List<UserDTO> officeStaffList = roleApi.selectUserListByRoleCode(tenantId, "school_staff");
if (officeStaffList != null && !officeStaffList.isEmpty()) {
String officeMessage = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_AUDIT_NOT_PASS, process.getUserName(), process.getStudentIdCard(), process.getSubject(), process.getFinanceRemark());
for (UserDTO staff : officeStaffList) {
schoolNotifyMessageSendService.sendMessage(staff.getId(), officeMessage, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_ADMIN, null);
}
}
}
// 查询提成规则 // 查询提成规则
DriveSchoolCourseDeduct deduct = deductService.getOne( DriveSchoolCourseDeduct deduct = deductService.getOne(
Wrappers.<DriveSchoolCourseDeduct>lambdaQuery() Wrappers.<DriveSchoolCourseDeduct>lambdaQuery()
@ -375,6 +395,7 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
schoolCommission.setSubject(String.valueOf(oldProcess.getSubject())); schoolCommission.setSubject(String.valueOf(oldProcess.getSubject()));
schoolCommission.setCheckId(sysUser.getId()); schoolCommission.setCheckId(sysUser.getId());
schoolCommission.setCheckName(sysUser.getNickname()); schoolCommission.setCheckName(sysUser.getNickname());
schoolCommission.setCheckRemark(process.getFinanceRemark());
// 检查是否已存在记录 // 检查是否已存在记录
SchoolCommission existing = schoolCommissionService.getOne( SchoolCommission existing = schoolCommissionService.getOne(
@ -397,6 +418,7 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
schoolCommission.setId(existing.getId()); schoolCommission.setId(existing.getId());
schoolCommission.setDeleted(!process.getFinancePass()); schoolCommission.setDeleted(!process.getFinancePass());
schoolCommissionService.removeById(existing.getId()); schoolCommissionService.removeById(existing.getId());
} }
} else if (process.getFinancePass()) { } else if (process.getFinancePass()) {
@ -788,15 +810,27 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
List<SchoolCourseOrderVO> courseByInfo = schoolCourseOrderService.getCourseByInfo(userId, courseId); List<SchoolCourseOrderVO> courseByInfo = schoolCourseOrderService.getCourseByInfo(userId, courseId);
BigDecimal studentPay = BigDecimal.ZERO; BigDecimal studentPay = BigDecimal.ZERO;
BigDecimal studentRemainingPay = BigDecimal.ZERO; BigDecimal studentRemainingPay = BigDecimal.ZERO;
String studentIdCard = null;
if (!courseByInfo.isEmpty()) { if (!courseByInfo.isEmpty()) {
studentPay = courseByInfo.get(0).getReserveMoney() != null ? studentPay = courseByInfo.get(0).getReserveMoney() != null ?
courseByInfo.get(0).getReserveMoney() : BigDecimal.ZERO; courseByInfo.get(0).getReserveMoney() : BigDecimal.ZERO;
studentRemainingPay = courseByInfo.get(0).getRestMoney() != null ? studentRemainingPay = courseByInfo.get(0).getRestMoney() != null ?
courseByInfo.get(0).getRestMoney() : BigDecimal.ZERO; courseByInfo.get(0).getRestMoney() : BigDecimal.ZERO;
studentIdCard = courseByInfo.get(0).getUserNo() != null ?
courseByInfo.get(0).getUserNo() : null;
} }
processVO.setCoachCommission(deduct); processVO.setCoachCommission(deduct);
processVO.setStudentPay(studentPay); processVO.setStudentPay(studentPay);
processVO.setStudentRemainingPay(studentRemainingPay); processVO.setStudentRemainingPay(studentRemainingPay);
processVO.setStudentIdCard(studentIdCard);
List<Process> list = this.lambdaQuery()
.eq(Process::getCoachId, processVO.getCoachId())
.eq(Process::getCourseId, processVO.getCourseId())
.eq(Process::getUserId, processVO.getUserId())
.eq(Process::getDeleted, false)
.orderByAsc(Process::getSubject)
.list();
processVO.setProcessList(list);
return processVO; return processVO;
} }

View File

@ -232,13 +232,81 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
throw new RuntimeException("订单不存在"); throw new RuntimeException("订单不存在");
} }
//判断新订单课程与旧订单课程是否一致 // 检查是否需要更新进度记录
if (!oldOrder.getCourseId().equals(createReqVO.getCourseId())) { boolean isCourseChanged = !oldOrder.getCourseId().equals(createReqVO.getCourseId());
// 删除学习记录表中的课程记录 boolean isCoachChanged = !oldOrder.getCoachUserId().equals(createReqVO.getCoachUserId());
processService.remove(Wrappers.lambdaQuery(Process.class) if (isCourseChanged || isCoachChanged) {
// 查询所有进度记录
List<Process> processList = processService.lambdaQuery()
.eq(Process::getUserId, oldOrder.getUserId()) .eq(Process::getUserId, oldOrder.getUserId())
.eq(Process::getCourseId, oldOrder.getCourseId())); .eq(Process::getCourseId, oldOrder.getCourseId())
.list();
if (!processList.isEmpty()) {
for (Process process : processList) {
// 如果课程变化更新课程信息
if (isCourseChanged) {
process.setCourseId(createReqVO.getCourseId());
process.setCourseName(createReqVO.getCourseName());
}
// 如果教练变化更新教练信息
if (isCoachChanged) {
if (createReqVO.getCoachUserId() != null) {
process.setCoachId(Long.valueOf(createReqVO.getCoachUserId()));
}
process.setCoachName(createReqVO.getCoachUserName());
}
processService.updateById(process);
}
}
} }
/*//判断新订单课程与旧订单课程是否一致
if (!oldOrder.getCourseId().equals(createReqVO.getCourseId())) {
// 查询所有进度
List<Process> processList = processService.lambdaQuery()
.eq(Process::getUserId, oldOrder.getUserId())
.eq(Process::getCourseId, oldOrder.getCourseId())
.list();
if (!processList.isEmpty()) {
for (Process process : processList) {
// 更新课程ID
process.setCourseId(createReqVO.getCourseId());
// 更新课程名称
process.setCourseName(createReqVO.getCourseName());
// 更新教练ID
process.setCoachId(Long.valueOf(createReqVO.getCoachUserId()));
// 更新教练名称
process.setCoachName(createReqVO.getCoachUserName());
processService.updateById(process);
}
}
}
// 如果课程一直判断教练是否一致
if (!oldOrder.getCoachUserId().equals(createReqVO.getCoachUserId())) {
// 查询所有进度
List<Process> processList = processService.lambdaQuery()
.eq(Process::getUserId, oldOrder.getUserId())
.eq(Process::getCourseId, oldOrder.getCourseId())
.list();
if (!processList.isEmpty()) {
for (Process process : processList) {
// 更新教练ID
process.setCoachId(Long.valueOf(createReqVO.getCoachUserId()));
// 更新教练名称
process.setCoachName(createReqVO.getCoachUserName());
processService.updateById(process);
}
}
}*/
//判断新订单课程与旧订单课程是否一致
// if (!oldOrder.getCourseId().equals(createReqVO.getCourseId())) {
// // 删除学习记录表中的课程记录
// processService.remove(Wrappers.lambdaQuery(Process.class)
// .eq(Process::getUserId, oldOrder.getUserId())
// .eq(Process::getCourseId, oldOrder.getCourseId()));
// }
SchoolCourseOrder schoolCourseOrder = BeanUtil.copyProperties(oldOrder, SchoolCourseOrder.class); SchoolCourseOrder schoolCourseOrder = BeanUtil.copyProperties(oldOrder, SchoolCourseOrder.class);
schoolCourseOrder.setOldOrderId(oldOrder.getId()); schoolCourseOrder.setOldOrderId(oldOrder.getId());
@ -254,7 +322,7 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
schoolCourseOrder.setCreateTime(null); schoolCourseOrder.setCreateTime(null);
schoolCourseOrder.setUpdateTime(null); schoolCourseOrder.setUpdateTime(null);
schoolCourseOrder.setDeleted(SchoolBaseConstants.COMMON_NO); schoolCourseOrder.setDeleted(SchoolBaseConstants.COMMON_NO);
schoolCourseOrder.setIfAssignmentCoach(SchoolBaseConstants.SCHOOL_COURSE_ORDER_IS_NOT_ASSIGN_COACH); schoolCourseOrder.setIfAssignmentCoach(SchoolBaseConstants.SCHOOL_COURSE_ORDER_IS_ASSIGN_COACH);
schoolCourseOrder.setIfEnd(SchoolBaseConstants.COMMON_NO); schoolCourseOrder.setIfEnd(SchoolBaseConstants.COMMON_NO);
schoolCourseOrder.setEndReason(null); schoolCourseOrder.setEndReason(null);
schoolCourseOrder.setEndTime(null); schoolCourseOrder.setEndTime(null);

View File

@ -5,6 +5,7 @@ import lombok.Data;
import org.apache.poi.hpsf.Decimal; import org.apache.poi.hpsf.Decimal;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List;
/** /**
* 驾校-学员课程进度 DO * 驾校-学员课程进度 DO
@ -33,4 +34,9 @@ public class ProcessVO extends Process {
private String name; private String name;
/** 学员头像 */ /** 学员头像 */
private String avatar; private String avatar;
/**
* 学习进度
*/
private List<Process> processList;
} }

View File

@ -4,7 +4,10 @@ import cn.hutool.core.date.DateUtil;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils; import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils; import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder; import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.module.base.constant.SchoolBaseConstants;
import cn.iocoder.yudao.module.base.entity.DlDriveSchoolStudent;
import cn.iocoder.yudao.module.base.service.DlDriveSchoolStudentService; import cn.iocoder.yudao.module.base.service.DlDriveSchoolStudentService;
import cn.iocoder.yudao.module.base.service.SchoolNotifyMessageSendService;
import cn.iocoder.yudao.module.course.entity.Process; import cn.iocoder.yudao.module.course.entity.Process;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder; import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
import cn.iocoder.yudao.module.course.service.ProcessService; import cn.iocoder.yudao.module.course.service.ProcessService;
@ -19,12 +22,17 @@ import cn.iocoder.yudao.module.exam.vo.ExamBatchItemNewVO;
import cn.iocoder.yudao.module.jx.domain.StudentScoreInput; import cn.iocoder.yudao.module.jx.domain.StudentScoreInput;
import cn.iocoder.yudao.module.jx.mapper.StudentScoreInputMapper; import cn.iocoder.yudao.module.jx.mapper.StudentScoreInputMapper;
import cn.iocoder.yudao.module.jx.service.StudentScoreInputService; import cn.iocoder.yudao.module.jx.service.StudentScoreInputService;
import cn.iocoder.yudao.module.system.api.permission.RoleApi;
import cn.iocoder.yudao.module.system.api.user.dto.UserDTO;
import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List;
@Service @Service
@ -50,6 +58,12 @@ public class StudentScoreInputServiceImpl implements StudentScoreInputService {
@Autowired @Autowired
private SchoolCourseOrderService schoolCourseOrderService; private SchoolCourseOrderService schoolCourseOrderService;
@Resource
private RoleApi roleApi;
@Autowired
private SchoolNotifyMessageSendService schoolNotifyMessageSendService;
/** /**
* 录入学员成绩 * 录入学员成绩
*/ */
@ -69,6 +83,28 @@ public class StudentScoreInputServiceImpl implements StudentScoreInputService {
// 如果是科2和科3 需要创建批次信息 // 如果是科2和科3 需要创建批次信息
if(studentScoreInput.getSubject() == 2 || studentScoreInput.getSubject() == 3){ if(studentScoreInput.getSubject() == 2 || studentScoreInput.getSubject() == 3){
if("1".equals(studentScoreInput.getExamStatus())){
// 向会计和出纳发送信息
Long tenantId = TenantContextHolder.getTenantId();
List<UserDTO> kjStaffList = roleApi.selectUserListByRoleCode(tenantId, "kj");
List<UserDTO> cnStaffList = roleApi.selectUserListByRoleCode(tenantId, "cn");
List<UserDTO> allStaffList = new ArrayList<>();
allStaffList.addAll(kjStaffList);
allStaffList.addAll(cnStaffList);
DlDriveSchoolStudent studentByUserId = dlDriveSchoolStudentService.getStudentByUserId(studentScoreInput.getUserId());
String studentIdCard = null;
if(studentByUserId != null){
studentIdCard = studentByUserId.getIdCard();
}
if (allStaffList != null && !allStaffList.isEmpty()) {
String officeMessage = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_AUDIT_WAIT, studentScoreInput.getUserName(), studentIdCard, studentScoreInput.getSubject());
for (UserDTO staff : allStaffList) {
schoolNotifyMessageSendService.sendMessage(staff.getId(), officeMessage, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_ADMIN, null);
}
}
}
// 生成批次信息 // 生成批次信息
ExamBatch examBatch = new ExamBatch(); ExamBatch examBatch = new ExamBatch();
String timestamp = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss"); String timestamp = DateUtil.format(DateUtil.date(), "yyyyMMddHHmmss");