This commit is contained in:
Lihx 2025-07-20 22:26:33 +08:00
parent c53103141a
commit 08f0b83b6b
4 changed files with 610 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

View File

@ -127,4 +127,35 @@ export function exportSchoolOrderExcel(params) {
});
}
// 根据type获取教练列表
export function getCoachListByType(type) {
return request({
url: '/base/dl-drive-school-coach/coachListByType?type=' + type,
method: 'get'
});
}
// 文件上传接口
export function uploadFile(file) {
const formData = new FormData()
formData.append('file', file)
return request({
url: '/infra/file/upload',
method: 'post',
data: formData,
headers: {
'Content-Type': 'multipart/form-data'
},
})
}
// 身份证OCR识别接口
export function idOcr(data) {
return request({
url: '/drive/school-course-order/idOcr',
method: 'post',
data: data
})
}

View File

@ -0,0 +1,570 @@
<template>
<div class="app-container">
<!-- 对话框(添加 / 修改) -->
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="45%" v-dialogDrag append-to-body>
<el-form ref="formRef" :model="formData" :rules="formRules" v-loading="formLoading" label-width="100px">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="学员姓名" prop="userName">
<el-input v-model="formData.userName" placeholder="请输入学员姓名"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="学员手机号" prop="userPhone">
<el-input v-model="formData.userPhone" placeholder="请输入学员手机号"/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="学员身份证号" prop="userNo">
<el-input v-model="formData.userNo" placeholder="请输入学员身份证号"/>
</el-form-item>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="性别" prop="userSex">
<el-radio-group v-model="formData.userSex">
<el-radio v-for="dict in this.getDictDatas(DICT_TYPE.SYSTEM_USER_SEX)"
:key="dict.value" :label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="年龄" prop="age">
<el-input v-model="formData.age" placeholder="请输入学员年龄"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="报名渠道" prop="source">
<el-select v-model="formData.source" placeholder="请选择报名渠道" @change="handleSourceChange">
<el-option v-for="dict in this.getDictDatas('drive_school_channel')"
:key="dict.value" :label="dict.label" :value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12" v-if="showSourceUser">
<el-form-item label="招生人" prop="sourceUserId">
<el-select
v-model="formData.sourceUserId"
placeholder="请选择招生人"
clearable
>
<el-option
v-for="item in sourceCoachList"
:key="item.userId"
:label="item.name"
:value="item.userId.toString()"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-divider></el-divider>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="课程选择" prop="courseName">
<el-select v-model="formData.courseId" placeholder="请选择课程" @change="handleChange()">
<el-option v-for="dict in courseList"
:key="dict.id" :label="dict.name" :value="dict.id"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="负责教练" prop="coachUserName">
<el-select v-model="formData.coachUserName" placeholder="请选择教练" @change="handleCoachChange">
<el-option v-for="dict in coachList" :key="dict.userId" :label="dict.name" :value="dict"/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="报名时间" prop="createTime">
<el-date-picker clearable v-model="formData.createTime" type="datetime" value-format="timestamp"
placeholder="选择报名时间"
/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="缴费时间" prop="payFeesTime">
<el-date-picker clearable v-model="formData.payFeesTime" type="date" value-format="timestamp"
placeholder="选择缴费时间"
/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="订金金额" prop="reserveMoney">
<el-input-number v-model="formData.reserveMoney" placeholder="请输入订金金额" :precision="2"
:step="100.0"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="尾款" prop="restMoney">
<el-input-number v-model="formData.restMoney" placeholder="请输入尾款" :precision="2"
:step="100.0"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="优惠金额" prop="discount">
<el-input-number v-model="formData.discount" placeholder="请输入优惠金额" :precision="2"
:step="100.0"></el-input-number>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="实付金额" prop="actualPayment">
<el-input-number v-model="formData.actualPayment" placeholder="请输入实付金额" :precision="2"
:step="100.0"></el-input-number>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="订单状态" prop="paymentStatus">
<el-select v-model="formData.paymentStatus" placeholder="请选择订单状态">
<el-option v-for="dict in this.getDictDatas(DICT_TYPE.DRIVE_SCHOOL_ORDER_STATUS)"
:key="dict.value" :label="dict.label" :value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="支付类型" prop="payType">
<el-radio-group v-model="formData.payType">
<el-radio v-for="dict in this.payTypeList"
:key="dict.value" :label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="支付渠道" prop="payChannel">
<el-select v-model="formData.payChannel" placeholder="请选择支付渠道">
<el-option v-for="dict in this.payChannelList"
:key="dict.value" :label="dict.label" :value="dict.value"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-divider></el-divider>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="是否已面签" prop="isSign">
<el-radio-group v-model="formData.isSign">
<el-radio v-for="dict in isSignRadio"
:key="dict.value" :label="dict.value"
>{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="面签时间" prop="signTime">
<el-date-picker clearable v-model="formData.signTime" type="datetime" value-format="timestamp"
placeholder="选择面签时间"
/>
</el-form-item>
</el-col>
</el-row>
<div style="display: flex; flex-direction: row; gap: 10px;">
<div>
<el-form-item label="提成方案" prop="schemeId">
<el-select v-model="formData.schemeId" placeholder="请选择提成方案" style="width: 300px;">
<el-option
v-for="item in schemeList"
:key="item.id"
:label="item.name"
:value="item.id"
>
<div style="display: flex; justify-content: space-between; width: 100%">
<span>{{ item.name }}</span>
<span style="color: #888; margin-left: 20px;">
<span style="color: red;">*科1</span>{{ item.subject1Deduct }},
<span style="color: red;">*科2</span>{{ item.subject2Deduct }},
<span style="color: red;">*科3</span>{{ item.subject3Deduct }},
<span style="color: red;">*科4</span>{{ item.subject4Deduct }},
<span style="color: red;">*业务经理</span>{{ item.subject0Deduct }}
</span>
</div>
</el-option>
</el-select>
</el-form-item>
</div>
<div>
<el-button type="primary" icon="el-icon-plus" size="small" @click="openSchemeDialog">添加方案</el-button>
</div>
<div>
<span style="color: red">(如果没有合适的方案请添加)</span>
</div>
</div>
<el-form-item label="订单备注" prop="orderRemark">
<el-input type="textarea" v-model="formData.orderRemark" placeholder="请输入订单备注"/>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</div>
</el-dialog>
<!-- 身份证上传弹窗 -->
<el-dialog
title="身份证识别"
:visible.sync="popupShow"
width="400px"
center
@close="closePopup">
<div class="popup-box">
<div class="title_s">请上传身份证人像面</div>
<el-upload
class="avatar-uploader"
action="#"
:show-file-list="false"
:auto-upload="false"
:on-change="handleIdCardUpload"
:before-upload="beforeIdCardUpload">
<img v-if="idCardImageUrl" :src="idCardImageUrl" class="avatar">
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
</el-upload>
<div class="upload-tip">支持JPG/PNG格式大小不超过5MB</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="popupShow = false"> </el-button>
<el-button type="primary" @click="submitIdCard" :loading="ocrLoading">开始识别</el-button>
</div>
</el-dialog>
<SchemeForm ref="schemeFormRef" @success="fetchSchemeList"/>
</div>
</template>
<script>
import * as SchoolCourseOrderApi from '@/views/drivingSchool/DriveSchoolPay/api'
import {getCoachListByType, getSchemeListByCourseId, idOcr, uploadFile} from '@/views/drivingSchool/DriveSchoolPay/api'
import SchemeForm from '@/views/drivingSchool/schoolCourse/form/schemeForm.vue'
import {listCoach} from '@/views/drivingSchool/drivingSchoolCar/api/car'
import {getDictDatas} from '@/utils/dict'
import {listDriveSchoolCourse} from "@/views/drivingSchool/schoolCourse/api/driveSchoolCourse";
export default {
name: 'AddSchoolCourseOrderForm',
components: {
SchemeForm
},
data() {
return {
//
dialogTitle: '',
//
dialogVisible: false,
// 12
formLoading: false,
showSourceUser: false, //
sourceTypeMap: { //
'01': 'yg', //
'02': 'jl', //
'04': 'ywjl' //
},
//
formData: {
orderNo: undefined,
userName: undefined,
userPhone: undefined,
userNo: undefined,
userSex: undefined,
courseId: undefined,
courseName: undefined,
coachUserId: undefined,
coachUserName: undefined,
reserveMoney: undefined,
courseType: undefined,
ifEnd: undefined,
endReason: undefined,
endTime: undefined,
paymentStatus: undefined,
isSign: undefined,
restMoney: undefined,
payType: undefined,
passTime: undefined,
gradTime: undefined,
schemeId: undefined,
orderRemark: undefined,
discount: undefined,
actualPayment: undefined,
sourceUserId: undefined,
},
ifEndRadio: [
{
label: '是',
value: true
},
{
label: '否',
value: false
}
],
isSignRadio: [
{
label: '是',
value: 1
},
{
label: '否',
value: 0
}
],
payChannelList: [
{
label: '线下支付',
value: '2'
},
{
label: '微信支付',
value: '1'
}
],
payTypeList: [
{
label: '全款',
value: '2'
},
{
label: '定金',
value: '1'
}
],
ifAgreeList: [
{
label: '未确认',
value: '0'
},
{
label: '已同意',
value: '1'
},
{
label: '未同意',
value: '2'
},
{
label: '非代报名订单',
value: null
}
],
//
formRules: {},
schemeList: [],
coachList: [],
courseList: [],
sourceCoachList: [],
}
},
methods: {
/** 打开弹窗 */
async open() {
this.dialogVisible = true
this.reset()
this.showSourceUser = false;
this.sourceCoachList = [];
//
const courseRes = await listDriveSchoolCourse({pageNo: 1, pageSize: 9999})
this.courseList = courseRes.data.records
await this.loadSchemeList(this.formData.courseId);
const coachRes = await listCoach()
this.coachList = coachRes.data
this.dialogTitle = '新增驾照报名订单'
},
openSchemeDialog() {
this.$refs.schemeFormRef.open(null, this.formData.courseId)
},
async fetchSchemeList() {
//
console.log('courseId', this.formData.courseId)
const res = await getSchemeListByCourseId(this.formData.courseId)
console.log('res', res)
this.schemeList = res.data || []
},
/** 提交按钮 */
async submitForm() {
//
await this.$refs['formRef'].validate()
//
if (!this.formData.schemeId) {
try {
await this.$confirm('该订单尚未选择提成方案,是否继续?', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning'
})
//
} catch (error) {
//
return
}
}
this.formLoading = true
try {
const data = this.formData
//
if (data.id) {
await SchoolCourseOrderApi.updateSchoolCourseOrder(data)
this.$modal.msgSuccess('修改成功')
this.dialogVisible = false
this.$emit('success')
return
}
//
await SchoolCourseOrderApi.createSchoolCourseOrder(data)
this.$modal.msgSuccess('新增成功')
this.dialogVisible = false
this.$emit('success')
} finally {
this.formLoading = false
}
},
async loadSchemeList(courseId) {
console.log('courseId', courseId)
if (!courseId) return;
try {
const res = await getSchemeListByCourseId(courseId);
console.log('res', res)
this.schemeList = res.data || [];
} catch (error) {
this.$message.error('获取提成方案失败');
}
},
async getSchemeListByCourseId(courseId) {
await SchoolCourseOrderApi.getSchemeListByCourseId(courseId)
.then(res => {
this.schemeList = res.data
})
},
/**
* 课程选择处理
*/
async handleChange() {
this.schemeList = [];
this.formData.schemeId = null
const selected = this.courseList.find(item => item.id === this.formData.courseId);
if (selected) {
this.formData.courseName = selected.name;
this.formData.courseType = selected.type;
await this.getSchemeListByCourseId(this.formData.courseId);
} else {
this.formData.courseName = '';
this.schemeList = [];
}
},
/**
* 教练选择处理
*/
handleCoachChange(selectedCoach) {
if (selectedCoach) {
this.formData.coachUserId = selectedCoach.userId;
this.formData.coachUserName = selectedCoach.name;
} else {
this.formData.coachUserId = undefined;
this.formData.coachUserName = undefined;
}
},
//
async handleSourceChange(value) {
// 03
this.showSourceUser = value !== '03';
this.formData.sourceUserId = null; //
if (!this.showSourceUser) return;
// type
const type = this.sourceTypeMap[value];
if (type) {
try {
const res = await SchoolCourseOrderApi.getCoachListByType(type);
this.sourceCoachList = res.data || [];
} catch (error) {
this.$message.error('获取招生人列表失败');
this.sourceCoachList = [];
}
}
},
/** 表单重置 */
reset() {
this.formData = {
orderNo: undefined,
userName: undefined,
userPhone: undefined,
userNo: undefined,
userSex: undefined,
courseId: undefined,
courseName: undefined,
coachUserId: undefined,
coachUserName: undefined,
reserveMoney: undefined,
courseType: undefined,
ifEnd: undefined,
endReason: undefined,
endTime: undefined,
paymentStatus: undefined,
isSign: undefined,
restMoney: undefined,
payType: undefined,
passTime: undefined,
gradTime: undefined,
schemeId: undefined,
orderRemark: undefined,
discount: undefined,
actualPayment: undefined,
sourceUserId: undefined,
}
this.resetForm('formRef')
}
}
}
</script>

View File

@ -67,6 +67,9 @@
<!-- <el-col :span="1.5">
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="openForm(undefined)">新增</el-button>
</el-col>-->
<el-col :span="1.5">
<el-button type="primary" icon="el-icon-document-add" size="mini" @click="handleAddOrder" >手动报名</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" icon="el-icon-download" size="mini" @click="handleExport" >学员及订单信息导出</el-button>
<!-- <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading">导出</el-button>-->
@ -479,12 +482,14 @@
<SchoolCourseOrderFastAddForm ref="formFastAddRef" @success="getList" />
<cashierConfirmForm ref="cashierConfirmRef" @success="getList" />
<ExportDialog ref="exportDialog" />
<AddSchoolCourseOrderForm ref="addFormRef" />
</div>
</template>
<script>
import * as SchoolCourseOrderApi from '@/views/drivingSchool/DriveSchoolPay/api';
import SchoolCourseOrderForm from '@/views/drivingSchool/DriveSchoolPay/form/SchoolCourseOrderForm.vue';
import AddSchoolCourseOrderForm from '@/views/drivingSchool/DriveSchoolPay/form/AddSchoolCourseOrderForm.vue';
import AssignmentCoach from "@/views/drivingSchool/DriveSchoolPay/form/assignmentCoach.vue";
import EndOrder from "@/views/drivingSchool/DriveSchoolPay/form/endOrder.vue";
import SchoolCourseOrderFastAddForm from "@/views/drivingSchool/DriveSchoolPay/form/SchoolCourseOrderFastAddForm.vue";
@ -500,6 +505,7 @@ export default {
EndOrder,
AssignmentCoach,
SchoolCourseOrderForm,
AddSchoolCourseOrderForm,
},
data() {
return {
@ -878,6 +884,9 @@ export default {
} */
await this.$refs.exportDialog.open();
},
async handleAddOrder() {
await this.$refs.addFormRef.open();
},
formatDate(row, column, cellValue) {
return this.formatTimestampToDate(cellValue);
},