diff --git a/dl-module-base/src/main/java/cn/iocoder/yudao/module/app/company/controller/CompanySmallProgramAPI.java b/dl-module-base/src/main/java/cn/iocoder/yudao/module/app/company/controller/CompanySmallProgramAPI.java index 22141f46..01ab506a 100644 --- a/dl-module-base/src/main/java/cn/iocoder/yudao/module/app/company/controller/CompanySmallProgramAPI.java +++ b/dl-module-base/src/main/java/cn/iocoder/yudao/module/app/company/controller/CompanySmallProgramAPI.java @@ -96,4 +96,9 @@ public class CompanySmallProgramAPI { List 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)); + } } diff --git a/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/entity/Company.java b/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/entity/Company.java index c8a82db8..b1901431 100644 --- a/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/entity/Company.java +++ b/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/entity/Company.java @@ -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; + } diff --git a/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/service/CompanyService.java b/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/service/CompanyService.java index 5c800903..65f562c6 100644 --- a/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/service/CompanyService.java +++ b/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/service/CompanyService.java @@ -77,4 +77,7 @@ public interface CompanyService extends IService { * @param id 企业ID **/ CompanyToServerVO getCompanyServerById(String id); -} \ No newline at end of file + Company getCompanyByTenantIdAndSystemCode(String tenantId, String systemCode); + + +} diff --git a/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/service/impl/CompanyServiceImpl.java b/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/service/impl/CompanyServiceImpl.java index b5daf525..8cb85495 100644 --- a/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/service/impl/CompanyServiceImpl.java +++ b/dl-module-base/src/main/java/cn/iocoder/yudao/module/company/service/impl/CompanyServiceImpl.java @@ -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 impl Optional.ofNullable(servicePackageByIds).ifPresent(result::setServicePackages); return result; } -} \ No newline at end of file + + @Override + @TenantIgnore + public Company getCompanyByTenantIdAndSystemCode(String tenantId, String systemCode) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() + .eq(TenantBaseDO::getTenantId, tenantId) + .like(Company::getServiceCodes, systemCode) + .orderByDesc(BaseDO::getCreateTime); + + List list = this.list(queryWrapper); + return list.isEmpty() ? null : list.get(0); + } +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/constant/SchoolBaseConstants.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/constant/SchoolBaseConstants.java index a1d96fd4..8d328333 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/constant/SchoolBaseConstants.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/constant/SchoolBaseConstants.java @@ -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 订单已支付!"; + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java index e50f6e6e..ff56fa28 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/base/service/DlDriveSchoolStudentService.java @@ -192,4 +192,6 @@ public interface DlDriveSchoolStudentService extends IService 0; } + @Override + public DlDriveSchoolStudent getStudentByIdNo(String idNo) { + return lambdaQuery() + .eq(DlDriveSchoolStudent::getIdCard, idNo) + .orderByDesc(DlDriveSchoolStudent::getCreateTime) + .eq(DlDriveSchoolStudent::getDeleted, false) + .last("LIMIT 1") + .one(); + } + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/ProcessController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/ProcessController.java index acf93387..16f9c32e 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/ProcessController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/ProcessController.java @@ -72,6 +72,15 @@ public class ProcessController { return success(processService.pageProcess(page, pageReqVO)); } + @GetMapping("/newPage") + @Operation(summary = "学员课程进度分页") + public CommonResult> getDlDriveSchoolCoachPageNew(ProcessVO pageReqVO, + @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { + Page page = new Page<>(pageNo, pageSize); + return success(processService.pageProcessNew(page, pageReqVO)); + } + /** * 教练查自己带教的课程和科目 * diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/SchoolCourseOrderController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/SchoolCourseOrderController.java index 93d304f2..a2b2f68e 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/SchoolCourseOrderController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/controller/admin/SchoolCourseOrderController.java @@ -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 businessManagerCreateSchoolCourseOrder(@Valid @RequestBody SchoolCourseOrderBusinessVO createReqVO) { +// return success(""); + return success(schoolCourseOrderService.businessManagerCreateSchoolCourseOrder(createReqVO)); + } } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCommission.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCommission.java index 8501ef48..7b6f3632 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCommission.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCommission.java @@ -73,8 +73,8 @@ public class SchoolCommission extends TenantBaseDO { */ private Boolean ifPay; /** - * 是否已付 + * 支付时间 */ private Date payTime; -} \ No newline at end of file +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCourseOrder.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCourseOrder.java index 524faff3..5d82b520 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCourseOrder.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/entity/SchoolCourseOrder.java @@ -122,5 +122,15 @@ public class SchoolCourseOrder extends TenantBaseDO { */ private Date gradTime; + /** + * 报名方式(1为代报名) + */ + private String signType; -} \ No newline at end of file + /** + * 支付渠道(微信1、线下2) + */ + private String payChannel; + + +} diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/mapper/ProcessMapper.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/mapper/ProcessMapper.java index b1c320c4..09ae4edd 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/mapper/ProcessMapper.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/mapper/ProcessMapper.java @@ -70,6 +70,7 @@ public interface ProcessMapper extends BaseMapper { * @return com.baomidou.mybatisplus.core.metadata.IPage **/ IPage pageProcess(@Param("entity") ProcessVO entity, Page page); + IPage pageProcessNew(@Param("entity") ProcessVO entity, Page page); Double selectAllTrainTime(@Param("userId") Long userId,@Param("courseId") String courseId); diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/mapper/SchoolCourseOrderMapper.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/mapper/SchoolCourseOrderMapper.java index fb29369c..4b7cfecd 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/mapper/SchoolCourseOrderMapper.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/mapper/SchoolCourseOrderMapper.java @@ -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 { /** 学员订单信息 */ SchoolCourseOrderVO getOrderInfo(@Param("userId") Long userId); + + + /**创建学员Users表信息*/ + Long createStudentUsers(AdminUserDO adminUserDO); } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/ProcessService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/ProcessService.java index 4db3b6b5..f8b309d9 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/ProcessService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/ProcessService.java @@ -93,6 +93,7 @@ public interface ProcessService extends IService { * @date 15:34 2025/2/17 **/ IPage pageProcess(Page page, ProcessVO pageReqVO); + IPage pageProcessNew(Page page, ProcessVO pageReqVO); /** * 财务审核 diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCommissionService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCommissionService.java index bb8cc266..23d33afb 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCommissionService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCommissionService.java @@ -30,4 +30,9 @@ public interface SchoolCommissionService extends IService { */ boolean createSchoolCommission(SchoolCommissionVO entity); + /** + * 判断提成记录是否存在 + */ + boolean exists(SchoolCommission entity); + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCourseOrderService.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCourseOrderService.java index 5a219119..889a191a 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCourseOrderService.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/SchoolCourseOrderService.java @@ -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 { */ void updateStudentPassTime(String studentId, String gradTime); + Long businessManagerCreateSchoolCourseOrder(SchoolCourseOrderBusinessVO createReqVO); + } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java index b2671266..662d2a79 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/ProcessServiceImpl.java @@ -253,6 +253,10 @@ public class ProcessServiceImpl extends ServiceImpl impl public IPage pageProcess(Page page, ProcessVO pageReqVO) { return processMapper.pageProcess(pageReqVO, page); } + @Override + public IPage pageProcessNew(Page page, ProcessVO pageReqVO) { + return processMapper.pageProcessNew(pageReqVO, page); + } /** * 财务审核 @@ -261,7 +265,7 @@ public class ProcessServiceImpl extends ServiceImpl 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 impl schoolCommission.setCheckId(sysUser.getId()); //审核人姓名 schoolCommission.setCheckName(sysUser.getNickname()); - schoolCommissionService.save(schoolCommission); + + // 检查是否已存在记录 + SchoolCommission existing = schoolCommissionService.getOne( + Wrappers.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.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.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); } + /** * 保存学员课程进度 * diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/SchoolCommissionServiceImpl.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/SchoolCommissionServiceImpl.java index dd3b082f..e66092ac 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/SchoolCommissionServiceImpl.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/course/service/impl/SchoolCommissionServiceImpl.java @@ -71,4 +71,14 @@ public class SchoolCommissionServiceImpl extends ServiceImpl queryPage(Page page, SchoolCourseOrderVO pageReqVO) { return schoolCourseOrderMapper.queryPage(pageReqVO, page); } + @Override - public IPage queryPageNew(Page page, SchoolCourseOrderVO pageReqVO) { - return schoolCourseOrderMapper.queryPageNew(pageReqVO,page); - } + public IPage queryPageNew(Page page, SchoolCourseOrderVO pageReqVO) { + return schoolCourseOrderMapper.queryPageNew(pageReqVO, page); + } /** * 终止订单 @@ -139,6 +177,16 @@ public class SchoolCourseOrderServiceImpl extends ServiceImpl transactions(String type, String orderId, String orderNo, String payType) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException { + public Map 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 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 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 resMap = JSONObject.parseObject(resStr, new TypeReference>(){}); - Map signMap = paySignMsg(resMap.get("prepay_id").toString(), wechatPayConfigs.getJxAppId(),null); + Map signMap = paySignMsg(resMap.get("prepay_id").toString(), companyInfo.getAppId(), companyInfo.getPrivateKeyStr()); return signMap; } diff --git a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/payment/app/SmallProgramJxOrderController.java b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/payment/app/SmallProgramJxOrderController.java index 1920e892..f76a1943 100644 --- a/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/payment/app/SmallProgramJxOrderController.java +++ b/dl-module-jx/src/main/java/cn/iocoder/yudao/module/jx/payment/app/SmallProgramJxOrderController.java @@ -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 userPayOnLine(@RequestBody SchoolCourseOrder schoolCourseOrder) { + public Map 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 resMap = new HashMap<>(); - resMap.put("orderNo",orderNo); - resMap.put("orderId",orderId); + Map resMap = new HashMap<>(); + resMap.put("orderNo", orderNo); + resMap.put("orderId", orderId); return resMap; } @GetMapping("/prepayment") @TenantIgnore - public Map transactions(String type, String orderId, String orderNo, String payType) throws SignatureException, NoSuchAlgorithmException, InvalidKeyException, IOException { + public Map 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 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 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 resMap = JSONObject.parseObject(resStr, new TypeReference>(){}); - Map 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 resMap = JSONObject.parseObject(resStr, new TypeReference>() { + }); + Map 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 paySignMsg(String prepayId,String appId,String privateKeyStr) throws IOException, NoSuchAlgorithmException, InvalidKeyException, SignatureException { + private Map 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 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); // 使用字段appId、timeStamp、nonceStr、package进行签名 //从下往上依次生成 diff --git a/dl-module-jx/src/main/resources/mapper/course/ProcessMapper.xml b/dl-module-jx/src/main/resources/mapper/course/ProcessMapper.xml index ff2a942a..1faccd1d 100644 --- a/dl-module-jx/src/main/resources/mapper/course/ProcessMapper.xml +++ b/dl-module-jx/src/main/resources/mapper/course/ProcessMapper.xml @@ -86,6 +86,60 @@ dsp.create_time DESC; -- 再按创建时间降序 + + 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 main.deleted = 0 - and main.coach_name like concat('%', #{entity.coachName}, '%') - and main.student_name like concat('%', #{entity.studentName}, '%') - and main.check_name like concat('%', #{entity.checkName}, '%') - and dsc.name like concat('%', #{entity.courseName}, '%') + and main.coach_name like concat('%', + #{entity.coachName}, '%') + + and main.student_name like concat('%', + #{entity.studentName}, '%') + + and main.check_name like concat('%', + #{entity.checkName}, '%') + + and dsc.name like concat('%', + #{entity.courseName}, '%') + -order by main.create_time desc + order by main.create_time desc - \ No newline at end of file + diff --git a/dl-module-jx/src/main/resources/mapper/course/SchoolCourseOrderMapper.xml b/dl-module-jx/src/main/resources/mapper/course/SchoolCourseOrderMapper.xml index fd368700..185fda61 100644 --- a/dl-module-jx/src/main/resources/mapper/course/SchoolCourseOrderMapper.xml +++ b/dl-module-jx/src/main/resources/mapper/course/SchoolCourseOrderMapper.xml @@ -92,4 +92,30 @@ ORDER BY create_time DESC LIMIT 1 + + + 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}) + +