This commit is contained in:
Lx 2025-06-05 14:30:56 +08:00
parent bb1bfee430
commit 1177ff987a
26 changed files with 535 additions and 74 deletions

View File

@ -96,4 +96,9 @@ public class CompanySmallProgramAPI {
List<Company> list = this.companyService.list(queryWrapper);
return success(list.isEmpty()?null:list.get(0));
}
@GetMapping("/getCompanyByTenantIdAndSystemCode")
public CommonResult<?> getCompanyAndManager(String tenantId, String systemCode){
return success(companyService.getCompanyByTenantIdAndSystemCode(tenantId, systemCode));
}
}

View File

@ -134,4 +134,25 @@ public class Company extends TenantBaseDO {
* 纬度
*/
private BigDecimal lat;
/**
* 小程序app_id
*/
private String appId;
/**
* 微信商户号
*/
private String mchId;
/**
* 微信支付密钥
*/
private String privateKeyStr;
/**
* 回调地址
*/
private String notifyUrl;
}

View File

@ -77,4 +77,7 @@ public interface CompanyService extends IService<Company> {
* @param id 企业ID
**/
CompanyToServerVO getCompanyServerById(String id);
}
Company getCompanyByTenantIdAndSystemCode(String tenantId, String systemCode);
}

View File

@ -5,6 +5,9 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
import cn.iocoder.yudao.framework.common.exception.ErrorCode;
import cn.iocoder.yudao.framework.common.exception.ServiceException;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.framework.tenant.core.db.TenantBaseDO;
import cn.iocoder.yudao.module.app.company.vo.CompanyToServerVO;
import cn.iocoder.yudao.module.company.entity.Company;
import cn.iocoder.yudao.module.company.vo.CompanyRespVO;
@ -18,6 +21,7 @@ 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.UserDTO;
import com.baomidou.dynamic.datasource.annotation.DSTransactional;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.iocoder.yudao.module.company.vo.CompanyReqVO;
import org.springframework.beans.factory.annotation.Autowired;
@ -205,4 +209,16 @@ public class CompanyServiceImpl extends ServiceImpl<CompanyMapper, Company> impl
Optional.ofNullable(servicePackageByIds).ifPresent(result::setServicePackages);
return result;
}
}
@Override
@TenantIgnore
public Company getCompanyByTenantIdAndSystemCode(String tenantId, String systemCode) {
LambdaQueryWrapper<Company> queryWrapper = new LambdaQueryWrapper<Company>()
.eq(TenantBaseDO::getTenantId, tenantId)
.like(Company::getServiceCodes, systemCode)
.orderByDesc(BaseDO::getCreateTime);
List<Company> list = this.list(queryWrapper);
return list.isEmpty() ? null : list.get(0);
}
}

View File

@ -130,4 +130,24 @@ public interface SchoolBaseConstants {
*/
public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_ENROLL_TO_OFFICE= "学员 %s 报名了 %s 课程,请留意!";
/**
* 学员面签成功之后发送消息给教练
*/
public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_SIGN_TO_COACH= "学员 %s 已面签成功!";
/**
* 学员取消面签之后发送消息给教练
*/
public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_CANCEL_SIGN_TO_COACH= "学员 %s 已取消面签!";
/**
* 学员课程终止之后发送消息
*/
public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_COURSE_END_TO_MEMBER= "学员 %s 订单已终止!终止原因:%s";
/**
* 学员支付后
*/
public static final String SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_PAY_TO_MEMBER = "学员 %s 订单已支付!";
}

View File

@ -192,4 +192,6 @@ public interface DlDriveSchoolStudentService extends IService<DlDriveSchoolStude
* 修改学员来源
*/
public boolean updateChannel(DlDriveSchoolStudent student);
DlDriveSchoolStudent getStudentByIdNo(String idNo);
}

View File

@ -684,4 +684,14 @@ public class DlDriveSchoolStudentServiceImpl extends ServiceImpl<DlDriveSchoolSt
return rows > 0;
}
@Override
public DlDriveSchoolStudent getStudentByIdNo(String idNo) {
return lambdaQuery()
.eq(DlDriveSchoolStudent::getIdCard, idNo)
.orderByDesc(DlDriveSchoolStudent::getCreateTime)
.eq(DlDriveSchoolStudent::getDeleted, false)
.last("LIMIT 1")
.one();
}
}

View File

@ -72,6 +72,15 @@ public class ProcessController {
return success(processService.pageProcess(page, pageReqVO));
}
@GetMapping("/newPage")
@Operation(summary = "学员课程进度分页")
public CommonResult<IPage<?>> getDlDriveSchoolCoachPageNew(ProcessVO pageReqVO,
@RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
@RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) {
Page<ProcessVO> page = new Page<>(pageNo, pageSize);
return success(processService.pageProcessNew(page, pageReqVO));
}
/**
* 教练查自己带教的课程和科目
*

View File

@ -2,12 +2,12 @@ package cn.iocoder.yudao.module.course.controller.admin;
import cn.hutool.core.bean.BeanUtil;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
import cn.iocoder.yudao.module.course.service.SchoolCourseOrderService;
import cn.iocoder.yudao.module.course.vo.SchoolCommissionVO;
import cn.iocoder.yudao.module.course.vo.SchoolCourseOrderBusinessVO;
import cn.iocoder.yudao.module.course.vo.SchoolCourseOrderExportVO;
import cn.iocoder.yudao.module.course.vo.SchoolCourseOrderVO;
import com.baomidou.mybatisplus.core.metadata.IPage;
@ -15,7 +15,6 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -24,7 +23,6 @@ import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.io.IOException;
import java.util.Date;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@ -143,4 +141,13 @@ public class SchoolCourseOrderController {
schoolCourseOrderService.updateStudentPassTime(studentId, passTime);
return success(true);
}
/**
* 业务经理代学员报名
*/
@PostMapping("/businessManagerCreate")
public CommonResult<Long> businessManagerCreateSchoolCourseOrder(@Valid @RequestBody SchoolCourseOrderBusinessVO createReqVO) {
// return success("");
return success(schoolCourseOrderService.businessManagerCreateSchoolCourseOrder(createReqVO));
}
}

View File

@ -73,8 +73,8 @@ public class SchoolCommission extends TenantBaseDO {
*/
private Boolean ifPay;
/**
* 是否已付
* 支付时间
*/
private Date payTime;
}
}

View File

@ -122,5 +122,15 @@ public class SchoolCourseOrder extends TenantBaseDO {
*/
private Date gradTime;
/**
* 报名方式1为代报名
*/
private String signType;
}
/**
* 支付渠道微信1线下2
*/
private String payChannel;
}

View File

@ -70,6 +70,7 @@ public interface ProcessMapper extends BaseMapper<Process> {
* @return com.baomidou.mybatisplus.core.metadata.IPage<cn.iocoder.yudao.module.course.vo.ProcessVO>
**/
IPage<ProcessVO> pageProcess(@Param("entity") ProcessVO entity, Page<ProcessVO> page);
IPage<ProcessVO> pageProcessNew(@Param("entity") ProcessVO entity, Page<ProcessVO> page);
Double selectAllTrainTime(@Param("userId") Long userId,@Param("courseId") String courseId);

View File

@ -2,7 +2,9 @@ package cn.iocoder.yudao.module.course.mapper;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
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.system.dal.dataobject.user.AdminUserDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -43,4 +45,8 @@ public interface SchoolCourseOrderMapper extends BaseMapper<SchoolCourseOrder> {
/** 学员订单信息 */
SchoolCourseOrderVO getOrderInfo(@Param("userId") Long userId);
/**创建学员Users表信息*/
Long createStudentUsers(AdminUserDO adminUserDO);
}

View File

@ -93,6 +93,7 @@ public interface ProcessService extends IService<Process> {
* @date 15:34 2025/2/17
**/
IPage<ProcessVO> pageProcess(Page<ProcessVO> page, ProcessVO pageReqVO);
IPage<ProcessVO> pageProcessNew(Page<ProcessVO> page, ProcessVO pageReqVO);
/**
* 财务审核

View File

@ -30,4 +30,9 @@ public interface SchoolCommissionService extends IService<SchoolCommission> {
*/
boolean createSchoolCommission(SchoolCommissionVO entity);
/**
* 判断提成记录是否存在
*/
boolean exists(SchoolCommission entity);
}

View File

@ -1,24 +1,17 @@
package cn.iocoder.yudao.module.course.service;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.course.entity.SchoolCommission;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
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 com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.web.bind.annotation.GetMapping;
import javax.validation.Valid;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
/**
* 驾照报名订单 Service 接口
*
@ -110,4 +103,6 @@ public interface SchoolCourseOrderService extends IService<SchoolCourseOrder> {
*/
void updateStudentPassTime(String studentId, String gradTime);
Long businessManagerCreateSchoolCourseOrder(SchoolCourseOrderBusinessVO createReqVO);
}

View File

@ -253,6 +253,10 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
public IPage<ProcessVO> pageProcess(Page<ProcessVO> page, ProcessVO pageReqVO) {
return processMapper.pageProcess(pageReqVO, page);
}
@Override
public IPage<ProcessVO> pageProcessNew(Page<ProcessVO> page, ProcessVO pageReqVO) {
return processMapper.pageProcessNew(pageReqVO, page);
}
/**
* 财务审核
@ -261,7 +265,7 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
* @author PQZ
* @date 15:24 2025/2/18
**/
@Override
/*@Override
@Transactional(rollbackFor = Exception.class)
public void checkProcess(Process process) {
//查询数据
@ -298,13 +302,99 @@ public class ProcessServiceImpl extends ServiceImpl<ProcessMapper, Process> impl
schoolCommission.setCheckId(sysUser.getId());
//审核人姓名
schoolCommission.setCheckName(sysUser.getNickname());
schoolCommissionService.save(schoolCommission);
// 检查是否已存在记录
SchoolCommission existing = schoolCommissionService.getOne(
Wrappers.<SchoolCommission>lambdaQuery()
.eq(SchoolCommission::getCoachUserId, schoolCommission.getCoachUserId())
.eq(SchoolCommission::getStudentId, schoolCommission.getStudentId())
.eq(SchoolCommission::getCourseId, schoolCommission.getCourseId())
.eq(SchoolCommission::getSubject, schoolCommission.getSubject())
);
if(existing != null){
schoolCommission.setId(existing.getId());
schoolCommission.setDeleted(!process.getFinancePass());
schoolCommissionService.updateById(schoolCommission);
}else{
schoolCommissionService.save(schoolCommission);
}
}
}
}
updateById(process);
}*/
@Override
@Transactional(rollbackFor = Exception.class)
public void checkProcess(Process process) {
// 查询原始数据和当前用户信息
Process oldProcess = getById(process.getId());
Long userId = SecurityFrameworkUtils.getLoginUserId();
AdminUserRespDTO sysUser = userApi.getUser(userId);
// 科目为空时直接更新Process并返回
if (process.getSubject() == null) {
updateById(process);
return;
}
// 查询提成规则
DriveSchoolCourseDeduct deduct = deductService.getOne(
Wrappers.<DriveSchoolCourseDeduct>lambdaQuery()
.eq(DriveSchoolCourseDeduct::getCourseId, process.getCourseId())
.eq(DriveSchoolCourseDeduct::getCourseSubject, process.getSubject())
);
// 如果存在提成规则
if (deduct != null) {
// 构建提成记录对象
SchoolCommission schoolCommission = new SchoolCommission();
schoolCommission.setCoachUserId(oldProcess.getCoachId());
schoolCommission.setCoachName(oldProcess.getCoachName());
schoolCommission.setStudentId(oldProcess.getUserId());
schoolCommission.setStudentName(oldProcess.getUserName());
schoolCommission.setCommissionAmount(deduct.getDeduct());
schoolCommission.setCourseId(oldProcess.getCourseId());
schoolCommission.setSubject(String.valueOf(oldProcess.getSubject()));
schoolCommission.setCheckId(sysUser.getId());
schoolCommission.setCheckName(sysUser.getNickname());
// 检查是否已存在记录
SchoolCommission existing = schoolCommissionService.getOne(
Wrappers.<SchoolCommission>lambdaQuery()
.eq(SchoolCommission::getCoachUserId, schoolCommission.getCoachUserId())
.eq(SchoolCommission::getStudentId, schoolCommission.getStudentId())
.eq(SchoolCommission::getCourseId, schoolCommission.getCourseId())
.eq(SchoolCommission::getSubject, schoolCommission.getSubject())
);
// 根据是否存在记录和审核状态处理
if (existing != null) {
if(process.getFinancePass()){
// 更新记录设置ID和deleted状态
schoolCommission.setId(existing.getId());
schoolCommission.setDeleted(!process.getFinancePass());
schoolCommissionService.updateById(schoolCommission);
}else {
// 删除记录设置ID和deleted状态
schoolCommission.setId(existing.getId());
schoolCommission.setDeleted(!process.getFinancePass());
schoolCommissionService.removeById(existing.getId());
}
} else if (process.getFinancePass()) {
// 仅审核通过时新增记录
schoolCommission.setDeleted(false);
schoolCommissionService.save(schoolCommission);
}
}
// 更新Process记录
updateById(process);
}
/**
* 保存学员课程进度
*

View File

@ -71,4 +71,14 @@ public class SchoolCommissionServiceImpl extends ServiceImpl<SchoolCommissionMap
return true;
}
@Override
public boolean exists(SchoolCommission entity) {
return this.lambdaQuery()
.eq(SchoolCommission::getCoachUserId, entity.getCoachUserId())
.eq(SchoolCommission::getStudentId, entity.getStudentId())
.eq(SchoolCommission::getCourseId, entity.getCourseId())
.eq(SchoolCommission::getSubject, entity.getSubject())
.exists();
}
}

View File

@ -1,24 +1,28 @@
package cn.iocoder.yudao.module.course.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
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.entity.DlDriveSchoolStudent;
import cn.iocoder.yudao.module.base.service.DlDriveSchoolCourseService;
import cn.iocoder.yudao.module.base.service.DlDriveSchoolStudentService;
import cn.iocoder.yudao.module.base.service.SchoolNotifyMessageSendService;
import cn.iocoder.yudao.module.base.vo.DlDriveSchoolStudentVO;
import cn.iocoder.yudao.module.course.entity.Process;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
import cn.iocoder.yudao.module.course.mapper.SchoolCourseOrderMapper;
import cn.iocoder.yudao.module.course.service.ProcessService;
import cn.iocoder.yudao.module.course.service.SchoolCourseOrderService;
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.system.api.permission.RoleApi;
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.UserDTO;
import cn.iocoder.yudao.module.system.service.permission.RoleService;
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@ -62,6 +66,11 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
@Lazy
private RoleApi roleApi;
@Lazy
@Resource
private DlDriveSchoolStudentService schoolStudentService;
@Override
public String createSchoolCourseOrder(SchoolCourseOrderVO createReqVO) {
// 插入
@ -75,9 +84,37 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
public void updateSchoolCourseOrder(SchoolCourseOrderVO updateReqVO) {
// 更新
SchoolCourseOrder updateObj = BeanUtils.toBean(updateReqVO, SchoolCourseOrder.class);
this.sendMessage(updateReqVO);
schoolCourseOrderMapper.updateById(updateObj);
}
// 判断是否面签发送消息
public void sendMessage(SchoolCourseOrderVO updateReqVO) {
SchoolCourseOrder schoolCourseOrder = schoolCourseOrderMapper.selectById(updateReqVO.getId());
DlDriveSchoolStudent studentByUserId = schoolStudentService.getStudentByUserId(Long.valueOf(updateReqVO.getUserId()));
if(studentByUserId != null){
if("04".equals(studentByUserId.getSource()) && studentByUserId.getSourceUserId() != null){
if(schoolCourseOrder != null){
// 面签成功
if(schoolCourseOrder.getIsSign() == 0 && updateReqVO.getIsSign() == 1){
String messageToCoach = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_SIGN_TO_COACH, studentByUserId.getName());
schoolNotifyMessageSendService.sendMessage(studentByUserId.getSourceUserId(), messageToCoach, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_ADMIN,null);
} else if (schoolCourseOrder.getIsSign() == 1 && updateReqVO.getIsSign() == 0) {
// 取消面签
String messageToCoach = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_CANCEL_SIGN_TO_COACH, studentByUserId.getName());
schoolNotifyMessageSendService.sendMessage(studentByUserId.getSourceUserId(), messageToCoach, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_ADMIN,null);
} else if ("0".equals(schoolCourseOrder.getPaymentStatus()) && "2".equals(updateReqVO.getPaymentStatus())) {
// 支付成功
String messageToCoach = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_PAY_TO_MEMBER, studentByUserId.getName());
schoolNotifyMessageSendService.sendMessage(studentByUserId.getSourceUserId(), messageToCoach, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_ADMIN,null);
}
}
}
}
}
@Override
public void deleteSchoolCourseOrder(String id) {
// 删除
@ -104,10 +141,11 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
public IPage<SchoolCourseOrderVO> queryPage(Page<SchoolCommissionVO> page, SchoolCourseOrderVO pageReqVO) {
return schoolCourseOrderMapper.queryPage(pageReqVO, page);
}
@Override
public IPage<SchoolCourseOrderVO> queryPageNew(Page<SchoolCommissionVO> page, SchoolCourseOrderVO pageReqVO) {
return schoolCourseOrderMapper.queryPageNew(pageReqVO,page);
}
public IPage<SchoolCourseOrderVO> queryPageNew(Page<SchoolCommissionVO> page, SchoolCourseOrderVO pageReqVO) {
return schoolCourseOrderMapper.queryPageNew(pageReqVO, page);
}
/**
* 终止订单
@ -139,6 +177,16 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
.eq(Process::getStatus, SchoolBaseConstants.PROCESS_STATUS_IN_PROGRESS))
);
DlDriveSchoolStudent studentByUserId = schoolStudentService.getStudentByUserId(Long.valueOf(schoolCourseOrder.getUserId()));
if (studentByUserId != null) {
// 如果为业务经理招生发送消息给业务经理
if("04".equals(studentByUserId.getSource()) && studentByUserId.getSourceUserId() != null){
String messageToCoach = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_COURSE_END_TO_MEMBER, studentByUserId.getName(), endReason);
schoolNotifyMessageSendService.sendMessage(studentByUserId.getSourceUserId(), messageToCoach, SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TYPE_ADMIN,null);
}
}
// 准备消息内容
String message = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_COURSE_END, schoolCourseOrder.getCourseName());
@ -229,7 +277,7 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
@Override
public Boolean sendOrderMessage(String studentName, String courseName, Long coachId) {
if(coachId != null){
if (coachId != null) {
// 准备消息内容
String message = String.format(SchoolBaseConstants.SCHOOL_NOTIFY_MESSAGE_TEMPLATE_MEMBER_ENROLL, studentName, courseName);
@ -318,4 +366,39 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl<SchoolCourseOrderM
return "ORDER" + UUID.randomUUID().toString().replace("-", "").substring(0, 10);
}
public String generateOrderNum() {
return "DXD" + UUID.randomUUID().toString().replace("-", "").substring(0, 10);
}
@Transactional(rollbackFor = Exception.class)
@Override
public Long businessManagerCreateSchoolCourseOrder(SchoolCourseOrderBusinessVO createReqVO) {
DlDriveSchoolStudent studentByIdNo = schoolStudentService.getStudentByIdNo(createReqVO.getIdCard());
Long userId = null;
if (studentByIdNo == null) {
DlDriveSchoolStudentVO dlDriveSchoolStudentVO = new DlDriveSchoolStudentVO();
dlDriveSchoolStudentVO.setName(createReqVO.getUserName());
dlDriveSchoolStudentVO.setAge(createReqVO.getAge());
dlDriveSchoolStudentVO.setSource("04");
dlDriveSchoolStudentVO.setSourceUserId(SecurityFrameworkUtils.getLoginUserId());
dlDriveSchoolStudentVO.setSex(createReqVO.getUserSex());
dlDriveSchoolStudentVO.setPhone(createReqVO.getUserPhone());
dlDriveSchoolStudentVO.setIdCard(createReqVO.getIdCard());
dlDriveSchoolStudentVO.setIdPhoto(createReqVO.getIdCardImage());
dlDriveSchoolStudentVO.setRegistAddress(createReqVO.getAddress());
String studentId = schoolStudentService.createDlDriveSchoolStudent(dlDriveSchoolStudentVO);
DlDriveSchoolStudent dlDriveSchoolStudent = schoolStudentService.getDlDriveSchoolStudent(studentId);
userId = dlDriveSchoolStudent.getUserId();
} else {
userId = studentByIdNo.getUserId();
}
createReqVO.setUserId(Math.toIntExact(userId));
createReqVO.setOrderNo(generateOrderNum());
schoolCourseOrderMapper.insert(createReqVO);
return userId;
}
}

View File

@ -0,0 +1,30 @@
package cn.iocoder.yudao.module.course.vo;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 驾照报名订单 Response VO")
@Data
@ExcelIgnoreUnannotated
public class SchoolCourseOrderBusinessVO extends SchoolCourseOrder {
/**
* 学员身份证号
*/
private String idCard;
/**
* 学员身份证图片
*/
private String idCardImage;
/**
* 学员年龄
*/
private Integer age;
/**
* 户籍地址
*/
private String address;
}

View File

@ -1,9 +1,12 @@
package cn.iocoder.yudao.module.jx.controller.admin;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.jx.core.controller.BaseController;
import cn.iocoder.yudao.module.jx.domain.DriveContractTest;
import cn.iocoder.yudao.module.jx.domain.DriveSchoolContract;
import cn.iocoder.yudao.module.jx.service.IDriveContractTestService;
import cn.iocoder.yudao.module.jx.service.IDriveSchoolContractService;
import cn.iocoder.yudao.module.jx.utils.ExcelUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -26,6 +29,9 @@ public class DriveContractTestController extends BaseController
@Autowired
private IDriveContractTestService driveContractTestService;
@Autowired
private IDriveSchoolContractService driveSchoolContractService;
/**
* 查询合同模板列表
*/
@ -84,4 +90,18 @@ public class DriveContractTestController extends BaseController
{
return toAjax(driveContractTestService.deleteDriveContractTestByIds(ids));
}
@GetMapping(value = "/tenantId/{tenantId}")
@TenantIgnore
public CommonResult getInfoByTenantId(@PathVariable("tenantId") String tenantId)
{
return CommonResult.success(driveContractTestService.selectDriveContractTestByTenantId(tenantId));
}
@PostMapping("/add")
@TenantIgnore
public CommonResult add(@RequestBody DriveSchoolContract driveSchoolContract)
{
return CommonResult.success(driveSchoolContractService.insertDriveSchoolContractNew(driveSchoolContract));
}
}

View File

@ -4,6 +4,8 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.company.entity.Company;
import cn.iocoder.yudao.module.company.service.CompanyService;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
import cn.iocoder.yudao.module.course.service.SchoolCourseOrderService;
import cn.iocoder.yudao.module.course.vo.SchoolCourseOrderVO;
@ -51,6 +53,8 @@ public class NewSmallProgramJxOrderController {
private AdminUserApi userApi;
@Resource
private SchoolCourseOrderService schoolCourseOrderService;
@Resource
private CompanyService companyService;
@PostMapping("/offLinePay")
@ -121,19 +125,29 @@ public class NewSmallProgramJxOrderController {
@GetMapping("/prepayment")
@TenantIgnore
public Map<String,Object> transactions(String type, String orderId, String orderNo, String payType) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException {
public Map<String,Object> transactions(String type, String orderId, String orderNo, String payType, String tenantId) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException {
Long userId = SecurityFrameworkUtils.getLoginUserId();
AdminUserRespDTO user = userApi.getUser(userId);
String systemCode = "jiaxiao";
// SchoolCourseOrder dbSchoolCourseOrder = schoolCourseOrderService.getSchoolCourseOrder(orderId);
SchoolCourseOrder dbSchoolCourseOrder = schoolCourseOrderService.getSchoolCourseOrder(orderId);
if (dbSchoolCourseOrder == null) {
throw new IllegalStateException("订单不存在");
}
Company companyInfo = companyService.getCompanyByTenantIdAndSystemCode(tenantId, systemCode);
if (companyInfo == null) {
throw new IllegalStateException("商户信息不存在");
}
// 统一参数封装
Map<String, Object> params = new HashMap<>(8);
params.put("appid", wechatPayConfigs.getJxAppId());
params.put("mchid", wechatPayConfigs.getMchId());
params.put("appid", companyInfo.getAppId());
params.put("mchid", companyInfo.getMchId());
params.put("description", dbSchoolCourseOrder.getCourseName());
params.put("out_trade_no", orderNo);
params.put("notify_url", wechatPayConfigs.getNotifyUrl());
params.put("notify_url", companyInfo.getNotifyUrl());
Map<String, Object> amountMap = new HashMap<>(4);
Double amount = 0.0;
@ -169,7 +183,7 @@ public class NewSmallProgramJxOrderController {
log.info("请求参数 ===> {}" + paramsStr);
String resStr = wechatPayRequests.wechatHttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi",paramsStr);
Map<String, Object> resMap = JSONObject.parseObject(resStr, new TypeReference<Map<String, Object>>(){});
Map<String, Object> signMap = paySignMsg(resMap.get("prepay_id").toString(), wechatPayConfigs.getJxAppId(),null);
Map<String, Object> signMap = paySignMsg(resMap.get("prepay_id").toString(), companyInfo.getAppId(), companyInfo.getPrivateKeyStr());
return signMap;
}

View File

@ -4,6 +4,9 @@ import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
import cn.iocoder.yudao.module.company.entity.Company;
import cn.iocoder.yudao.module.company.service.CompanyService;
import cn.iocoder.yudao.module.company.vo.CompanyRespVO;
import cn.iocoder.yudao.module.course.entity.SchoolCourseOrder;
import cn.iocoder.yudao.module.course.service.SchoolCourseOrderService;
import cn.iocoder.yudao.module.course.vo.SchoolCourseOrderVO;
@ -27,10 +30,7 @@ import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import java.io.IOException;
import java.security.*;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.*;
@Slf4j
@RestController
@ -53,6 +53,9 @@ public class SmallProgramJxOrderController {
@Resource
private SchoolCourseOrderService schoolCourseOrderService;
@Resource
private CompanyService companyService;
@PostMapping("/offLinePay")
@TenantIgnore
@ -89,7 +92,7 @@ public class SmallProgramJxOrderController {
@PostMapping("/onLinePay")
@TenantIgnore
public Map<String,String> userPayOnLine(@RequestBody SchoolCourseOrder schoolCourseOrder) {
public Map<String, String> userPayOnLine(@RequestBody SchoolCourseOrder schoolCourseOrder) {
SchoolCourseOrderVO schoolCourseOrderVO = BeanUtils.toBean(schoolCourseOrder, SchoolCourseOrderVO.class);
schoolCourseOrderVO.setPaymentStatus("0");
@ -113,35 +116,46 @@ public class SmallProgramJxOrderController {
String orderId = schoolCourseOrderService.createSchoolCourseOrder(schoolCourseOrderVO);
SchoolCourseOrder dbSchoolCourseOrder = schoolCourseOrderService.getSchoolCourseOrder(orderId);
String orderNo = dbSchoolCourseOrder.getOrderNo();
Map<String,String> resMap = new HashMap<>();
resMap.put("orderNo",orderNo);
resMap.put("orderId",orderId);
Map<String, String> resMap = new HashMap<>();
resMap.put("orderNo", orderNo);
resMap.put("orderId", orderId);
return resMap;
}
@GetMapping("/prepayment")
@TenantIgnore
public Map<String,Object> transactions(String type, String orderId, String orderNo, String payType) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException {
public Map<String, Object> transactions(String type, String orderId, String orderNo, String payType, String tenantId) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException {
Long userId = SecurityFrameworkUtils.getLoginUserId();
AdminUserRespDTO user = userApi.getUser(userId);
String systemCode = "jiaxiao";
// SchoolCourseOrder dbSchoolCourseOrder = schoolCourseOrderService.getSchoolCourseOrder(orderId);
// Company companyInfo = companyService.getCompanyByTenantIdAndSystemCode(tenantId, systemCode);
SchoolCourseOrder dbSchoolCourseOrder = schoolCourseOrderService.getSchoolCourseOrder(orderId);
if (dbSchoolCourseOrder == null) {
throw new IllegalStateException("订单不存在");
}
Company companyInfo = companyService.getCompanyByTenantIdAndSystemCode(tenantId, systemCode);
if (companyInfo == null) {
throw new IllegalStateException("商户信息不存在");
}
// 统一参数封装
Map<String, Object> params = new HashMap<>(8);
params.put("appid", wechatPayConfigs.getJxAppId());
params.put("mchid", wechatPayConfigs.getMchId());
params.put("appid", companyInfo.getAppId());
params.put("mchid", companyInfo.getMchId());
params.put("description", dbSchoolCourseOrder.getCourseName());
params.put("out_trade_no", orderNo);
params.put("notify_url", wechatPayConfigs.getNotifyUrl());
params.put("notify_url", companyInfo.getNotifyUrl());
Map<String, Object> amountMap = new HashMap<>(4);
Double amount = 0.0;
// 金额单位为分
amount = dbSchoolCourseOrder.getReserveMoney().doubleValue()*100;
if (payType.equals("2")){
amount = dbSchoolCourseOrder.getReserveMoney().doubleValue()*100;
amount = dbSchoolCourseOrder.getReserveMoney().doubleValue() * 100;
if (payType.equals("2")) {
amount = dbSchoolCourseOrder.getReserveMoney().doubleValue() * 100;
}
amountMap.put("total", amount.intValue());
//人民币
@ -168,13 +182,14 @@ public class SmallProgramJxOrderController {
params.put("scene_info", sceneInfoMap);
String paramsStr = JSON.toJSONString(params);
log.info("请求参数 ===> {}" + paramsStr);
String resStr = wechatPayRequests.wechatHttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi",paramsStr);
Map<String, Object> resMap = JSONObject.parseObject(resStr, new TypeReference<Map<String, Object>>(){});
Map<String, Object> signMap = paySignMsg(resMap.get("prepay_id").toString(), wechatPayConfigs.getJxAppId(),null);
String resStr = wechatPayRequests.wechatHttpPost("https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi", paramsStr);
Map<String, Object> resMap = JSONObject.parseObject(resStr, new TypeReference<Map<String, Object>>() {
});
Map<String, Object> signMap = paySignMsg(resMap.get("prepay_id").toString(), companyInfo.getAppId(), companyInfo.getPrivateKeyStr());
return signMap;
}
String buildMessage(String appId, String timestamp,String nonceStr,String prepay_id) {
String buildMessage(String appId, String timestamp, String nonceStr, String prepay_id) {
return appId + "\n"
+ timestamp + "\n"
@ -182,15 +197,15 @@ public class SmallProgramJxOrderController {
+ prepay_id + "\n";
}
String sign(byte[] message,String privateKeyStr) throws NoSuchAlgorithmException, SignatureException, IOException, InvalidKeyException {
String sign(byte[] message, String privateKeyStr) throws NoSuchAlgorithmException, SignatureException, IOException, InvalidKeyException {
//签名方式
Signature sign = Signature.getInstance("SHA256withRSA");
//私钥通过MyPrivateKey来获取这是个静态类可以接调用方法 需要的是_key.pem文件的绝对路径配上文件名
PrivateKey privateKey =null;
if (StringUtils.isNotEmpty(privateKeyStr)){
PrivateKey privateKey = null;
if (StringUtils.isNotEmpty(privateKeyStr)) {
privateKey = PemUtil.loadPrivateKey(privateKeyStr);
}else {
privateKey = wechatPayConfigs.getPrivateKey(wechatPayConfigs.getKeyPemPath());
} else {
privateKey = wechatPayConfigs.getPrivateKey(wechatPayConfigs.getKeyPemPath());
}
sign.initSign(privateKey);
@ -198,16 +213,16 @@ public class SmallProgramJxOrderController {
return Base64.getEncoder().encodeToString(sign.sign());
}
private Map<String, Object> paySignMsg(String prepayId,String appId,String privateKeyStr) throws IOException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
private Map<String, Object> paySignMsg(String prepayId, String appId, String privateKeyStr) throws IOException, NoSuchAlgorithmException, InvalidKeyException, SignatureException {
long timeMillis = System.currentTimeMillis();
String timeStamp = timeMillis/1000+"";
String nonceStr = timeMillis+"";
String packageStr = "prepay_id="+prepayId;
String timeStamp = timeMillis / 1000 + "";
String nonceStr = timeMillis + "";
String packageStr = "prepay_id=" + prepayId;
// 公共参数
Map<String, Object> resMap = new HashMap<>();
resMap.put("nonceStr",nonceStr);
resMap.put("timeStamp",timeStamp);
resMap.put("appId",appId);
resMap.put("nonceStr", nonceStr);
resMap.put("timeStamp", timeStamp);
resMap.put("appId", appId);
resMap.put("package", packageStr);
// 使用字段appIdtimeStampnonceStrpackage进行签名
//从下往上依次生成

View File

@ -86,6 +86,60 @@
dsp.create_time DESC; -- 再按创建时间降序
</select>
<select id="pageProcessNew" resultType="cn.iocoder.yudao.module.course.vo.ProcessVO">
SELECT
dsp.*,
dss.id_card AS studentIdCard,
sysu.nickname AS updateName
FROM drive_school_process dsp
LEFT JOIN drive_school_student dss ON dss.user_id = dsp.user_id
LEFT JOIN system_users sysu on sysu.id = dsp.updater
<where>
dsp.deleted = 0 AND dsp.subject in (2,3)
<if test="entity.coachName != null and entity.coachName != '' "> and dsp.coach_name like concat('%', #{entity.coachName}, '%')</if>
<if test="entity.userName != null and entity.userName != '' "> and dsp.user_name like concat('%', #{entity.userName}, '%')</if>
<if test="entity.courseName != null and entity.courseName != '' "> and dsp.name like concat('%', #{entity.courseName}, '%')</if>
<if test="entity.userId != null "> and dsp.user_id = #{entity.userId}</if>
<if test="entity.courseId != null and entity.courseId != '' "> and dsp.course_id = #{entity.courseId}</if>
<if test="entity.examStatus != null ">and dsp.exam_status = #{entity.examStatus}</if>
<choose>
<when test="entity.financePass == true">
AND dsp.finance_pass = 1
</when>
<when test="entity.financePass == false">
AND dsp.finance_pass = 0
</when>
<when test="entity.financePass == null">
AND dsp.finance_pass IS NULL
</when>
</choose>
<if test="entity.studentIdCard != null and entity.studentIdCard != '' ">
<choose>
<!-- 精确匹配当输入18位时 -->
<when test="entity.studentIdCard.length() == 18">
AND dss.id_card = #{entity.studentIdCard}
</when>
<!-- 后4位匹配当输入正好4位时 -->
<when test="entity.studentIdCard.length() == 4">
AND RIGHT(dss.id_card, 4) = #{entity.studentIdCard}
</when>
<!-- 模糊搜索当输入大于4位但不足18位时 -->
<otherwise>
AND dss.id_card LIKE concat('%', #{entity.studentIdCard}, '%')
</otherwise>
</choose>
</if>
</where>
ORDER BY
(CASE
WHEN dsp.exam_status = '1' AND dsp.finance_pass IS NULL THEN 1 -- 优先级最高
WHEN dsp.exam_status = '9' THEN 2
WHEN dsp.status = '1' THEN 2
ELSE 4
END),
dsp.update_time DESC; -- 再按创建时间降序
</select>
<select id="getProcessList" resultType="cn.iocoder.yudao.module.course.entity.Process">
SELECT
*

View File

@ -11,28 +11,36 @@
<select id="queryPage" resultType="cn.iocoder.yudao.module.course.vo.SchoolCommissionVO">
SELECT
main.*,
dsc.name AS courseName,
dsc.type AS courseType
main.*,
dsc.name AS courseName,
dsc.type AS courseType
FROM
drive_school_commission main
LEFT JOIN drive_school_course dsc ON main.course_id = dsc.id AND dsc.deleted = 0
drive_school_commission main
LEFT JOIN drive_school_course dsc ON main.course_id = dsc.id AND dsc.deleted = 0
<where>
main.deleted = 0
<if test="entity.coachName != null and entity.coachName != '' "> and main.coach_name like concat('%', #{entity.coachName}, '%')</if>
<if test="entity.studentName != null and entity.studentName != '' "> and main.student_name like concat('%', #{entity.studentName}, '%')</if>
<if test="entity.checkName != null and entity.checkName != '' "> and main.check_name like concat('%', #{entity.checkName}, '%')</if>
<if test="entity.courseName != null and entity.courseName != '' "> and dsc.name like concat('%', #{entity.courseName}, '%')</if>
<if test="entity.coachName != null and entity.coachName != '' ">and main.coach_name like concat('%',
#{entity.coachName}, '%')
</if>
<if test="entity.studentName != null and entity.studentName != '' ">and main.student_name like concat('%',
#{entity.studentName}, '%')
</if>
<if test="entity.checkName != null and entity.checkName != '' ">and main.check_name like concat('%',
#{entity.checkName}, '%')
</if>
<if test="entity.courseName != null and entity.courseName != '' ">and dsc.name like concat('%',
#{entity.courseName}, '%')
</if>
</where>
order by main.create_time desc
order by main.create_time desc
</select>
<select id="selectByCoachId" resultType="cn.iocoder.yudao.module.course.entity.SchoolCommission">
SELECT
dsc.*
dsc.*
FROM
drive_school_commission dsc
drive_school_commission dsc
WHERE
dsc.deleted = 0
dsc.deleted = 0
<if test="coachId != null and coachId != ''">
AND dsc.coach_user_id = #{coachId}
</if>
@ -44,4 +52,4 @@ order by main.create_time desc
</if>
ORDER BY dsc.create_time DESC
</select>
</mapper>
</mapper>

View File

@ -92,4 +92,30 @@
ORDER BY create_time DESC
LIMIT 1
</select>
<insert id="createStudentUsers" parameterType="cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO" useGeneratedKeys="true" keyProperty="id">
INSERT INTO system_users (username,
password,
status,
nickname,
user_age,
sex,
mobile,
id_card,
id_card_image,
create_time,
deleted)
VALUES (#{username},
#{password},
#{status},
#{nickname},
#{userAge},
#{sex},
#{mobile},
#{idCard},
#{idCardImage},
#{createTime},
#{deleted})
</insert>
</mapper>