driverSchool/newPages/examinationAdd/index.vue
2025-04-11 18:06:20 +08:00

443 lines
14 KiB
Vue

<template>
<view class="page flex-col">
<view class="group_1 flex-row">
</view>
<view class="group_2 flex-row">
<image
class="label_1"
referrerpolicy="no-referrer"
src="/static/lanhu_kaoshijieguo/FigmaDDSSlicePNGacf527a62cbe7351c6472edd8f5b2814.png"
@click="handleBack()"
/>
<text class="text_1">考试结果</text>
</view>
<view class="group_4 flex-col">
<view class="block_1 flex-row justify-between" @click="show = true">
<text class="text_19">是否通过</text>
<view>
<u-picker v-model="process.examStatus" :show="show" :columns="ifPassColumns" title="是否通过"
@confirm="ifPassOnConfirm" @cancel="show = false">
</u-picker>
<text class="text_191">{{ selectedValue || '请选择' }}</text>
</view>
</view>
<view class="text-wrapper_7 flex-row justify-between">
<text class="text_4">分数</text>
<view class="text_5_1 ">
<u--input
placeholder="请输入分数"
border="none"
v-model="process.examScore"
maxlength="3"
inputAlign="right"
>分
</u--input>
</view>
</view>
<view class="text-wrapper_8 flex-row justify-between">
<text class="text_20">时间</text>
<view>
<u-datetime-picker
:show="showTimePicker"
v-model="process.examTime"
mode="datetime"
@confirm="onConfirmExamTime"
@cancel="showTimePicker = false"
></u-datetime-picker>
<text class="text_3" @click="showTimePicker = true">
{{ process.examTime ? formatDate(process.examTime) : '选择时间' }}
</text>
</view>
</view>
<!-- <view class="text-wrapper_9 flex-row justify-between">
<text class="text_6">姓名</text>
<view class="text_5_1 ">
<u--input
placeholder="请输入姓名"
border="none"
v-model="process.userName"
maxlength="3"
inputAlign="right"
></u--input>
</view>
</view> -->
<view class="text-wrapper_10 flex-row justify-between">
<text class="text_8">考试类型</text>
<text class="text_9" v-if="process.subject != 2 && process.subject != 3">{{ courseType }}</text>
<text class="text_9" v-else>{{ opCourseType }}</text>
</view>
<view class="text-wrapper_11 flex-row justify-between" @click="subjectShow = true"
v-if="process.subject != 2 && process.subject != 3">
<text class="text_10">考试科目</text>
<view>
<u-picker v-model="process.subject" :show="subjectShow" :columns="subjectColumns" title="科目"
@confirm="subjectOnConfirm" @cancel="subjectShow = false">
</u-picker>
<text class="text_11">{{ subjectValue || '请选择科目' }}</text>
</view>
</view>
<view class="text-wrapper_11 flex-row justify-between"
v-else-if="process.subject == 2 || process.subject == 3">
<text class="text_10">考试科目</text>
<text class="text_11">{{ formatSubject(process.subject) }}</text>
</view>
<!-- <view class="text-wrapper_3 flex-row justify-between" v-if="item.subject == 2 || item.subject == 3">
<text class="text_8">考试地址:</text>
<text class="text_9">{{ item.addr }}</text>
</view> -->
</view>
<view class="group_5 flex-col">
<text class="text_16">备注</text>
<u--textarea class="text_17" v-model="process.remark" placeholder="请输入内容" count></u--textarea>
<text class="text_18">图片</text>
<view class="image-wrapper_4 flex-row justify-between">
<u-upload
:fileList="displayFileList"
@afterRead="afterRead"
@delete="deletePic"
multiple
:maxCount="2"
></u-upload>
</view>
</view>
<view class="block_8 flex-col">
<view class="text-wrapper_8 flex-col" @click="saveData()">
<text class="text_19">确定</text>
</view>
</view>
</view>
</template>
<script>
import upload from '@/utils/upload.js'
import request from '@/utils/request.js'
import {getLocalUserInfo} from '../../utils/auth';
export default {
data() {
return {
show: false,
showTimePicker: false,
subjectShow: false,
ifPassColumns: [['已通过', '未通过']],
subjectColumns: [['科目一']],
selectedValue: '',
subjectValue: '',
fileList: [],
imageUrl: this.$imagesUrl,
userInfo: [],
courseType: null,
courseCompleteStatusList: {},
opTenantId: null,
opCourseType: null,
examId: null,
batchId: null,
batchItemId: null,
process: {
id: null,
userName: null,
userId: null,
subject: null,
fraction: null,
examNum: null,
examStatus: null,
examScore: null,
remark: '',
examTime: null,
images: null,
tenantId: null,
courseId: null,
ifPass: null,
batchId: null,
coachId: null,
},
constants: {}
};
},
onLoad(options) {
this.userInfo = getLocalUserInfo()
this.getUserOrderDetails()
this.process.subject = options.subject
this.opTenantId = options.tenantId
this.opCourseType = options.courseType
this.process.subject = options.subject
this.process.courseId = options.courseId
this.process.batchId = options.batchId
this.examId = options.id
this.batchId = options.batchId
this.batchItemId = options.id
this.process.id = options.id
this.process.coachId = options.coachId
this.process.userId = this.userInfo.id
this.process.coachId = options.coachId
this.process.userName = options.nickname
},
computed: {
displayFileList() {
return this.fileList.map(item => {
if (item.url.startsWith('http')) {
return item;
}
const prefix = this.$imagesUrl.endsWith('/') ? this.$imagesUrl : `${this.$imagesUrl}/`;
const fullUrl = item.url.startsWith('/')
? `${prefix}${item.url.slice(1)}`
: `${prefix}${item.url}`;
return {
...item,
url: fullUrl,
};
});
},
},
methods: {
handleBack() {
uni.navigateBack({
delta: 1
});
},
ifPassOnConfirm(value) {
const statusMap = {
'已通过': 1,
'未通过': 0
};
// 更新数据
this.process.examStatus = statusMap[value.value[0]];
this.selectedValue = value.value[0];
this.show = false;
},
subjectOnConfirm(value) {
const statusMap = {
'科目一': 1,
'科目四': 4
};
// 更新数据
this.process.subject = statusMap[value.value[0]];
this.subjectValue = value.value[0];
this.subjectShow = false;
},
onConfirmExamTime(value) {
this.process.examTime = value;
this.showTimePicker = false;
},
// 格式化时间戳的方法
formatDate(timestamp) {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0');
const day = String(date.getDate()).padStart(2, '0');
const hours = String(date.getHours()).padStart(2, '0');
const minutes = String(date.getMinutes()).padStart(2, '0');
return `${year}-${month}-${day} ${hours}:${minutes}`;
},
formatSubject(subject) {
switch (Number(subject)) {
case 2: return '科目二';
case 3: return '科目三';
default: return '未知科目';
}
},
deletePic(event) {
this.fileList.splice(event.index, 1);
},
// 新增图片
async afterRead(event) {
let lists = [].concat(event.file);
let fileListLen = this.fileList.length;
for (let i = 0; i < lists.length; i++) {
try {
const resultUrl = await this.uploadFilePromise(lists[i].url);
let item = {
status: 'success',
url: resultUrl,
};
this.fileList.splice(fileListLen, 0, item);
fileListLen++;
} catch (error) {
console.error('图片上传失败', error);
}
}
},
uploadFilePromise(filePath) {
return new Promise((resolve, reject) => {
upload({
url: '/app-api/small-upload/common/upload',
filePath: filePath,
}).then((res) => {
if (res.data && res.data.url) {
resolve(res.data.url);
} else {
reject(new Error('上传失败'));
}
}).catch(err => reject(err));
});
},
getUserOrderDetails() {
request({
url: '/app-api/small/drive/school-course-order/page',
method: 'GET',
params: {
userId: this.userInfo.id,
paymentStatus: '2',
ifEnd: 0,
},
tenantIdFlag: false
}).then(res => {
this.orderList = res.data.records;
if (res.data.records.length > 0) {
const tempData = res.data.records[0]
if (this.process.subject != 2 && this.process.subject != 3) {
this.process.courseId = tempData.courseId
}
if (this.process.subject != 2 && this.process.subject != 3) {
this.courseType = tempData.courseType
}
this.process.tenantId = tempData.tenantId
this.getCourseCompleteStatus()
}
});
},
getCourseCompleteStatus() {
request({
url: '/app-api/process/page',
method: 'GET',
params: {
userId: this.userInfo.id,
courseId: this.process.courseId,
}
}).then(res => {
this.courseCompleteStatusList = res.data.records
if (this.courseCompleteStatusList.length > 0) {
const subject2 = this.courseCompleteStatusList.find(item => item.subject === 2)
const subject3 = this.courseCompleteStatusList.find(item => item.subject === 3)
if (subject2?.status === '2' && subject3?.status === '2') {
this.subjectColumns = [['科目一', '科目四']]
}
}
})
},
saveData() {
if (!this.process.userId || !this.process.subject || !this.process.examScore || !this.process.examStatus || !this.process.examTime) {
uni.showToast({title: '信息填写不完整', icon: 'none'});
return;
}
if (this.process.subject == 1 || this.process.subject == 4) {
this.saveDataOne()
}
if (this.process.subject == 2 || this.process.subject == 3) {
this.saveDataTwo()
}
},
saveDataOne() {
if (this.process.subject === 1 && this.courseCompleteStatusList.length <= 0) {
uni.showToast({title: '请联系驾校人员', icon: 'none'});
return;
}
if (this.process.subject === 4 && this.courseCompleteStatusList.length <= 0) {
uni.showToast({title: '请联系驾校人员', icon: 'none'});
return;
}
this.process.images = this.fileList?.map(item => item.url).join(',') || '';
if (!this.process.userId || !this.process.subject || !this.process.examScore || !this.process.examStatus || !this.process.examTime) {
uni.showToast({title: '信息填写不完整', icon: 'none'});
return;
}
request({
url: '/app-api/process/updateProcess',
method: 'PUT',
data: this.process,
}).then(res => {
if (res.code === 0) {
uni.showToast({
title: '保存成功',
icon: 'success',
duration: 1000
});
setTimeout(() => {
uni.navigateBack({
delta: 1
});
}, 1500);
} else {
uni.showToast({title: res.data?.message || '保存失败', icon: 'none'});
}
})
},
saveDataTwo() {
const postData = {
...this.process, // 先拷贝 process 原有数据
tenantId: this.opTenantId,
fraction: this.process.examScore,
ifPass: this.process.examStatus,
id: this.batchItemId,
userName: this.userInfo.nickname,
remark: this.process.remark,
images: this.fileList?.map(item => item.url).join(',') || '',
}
/* this.process.userId = this.userInfo.id
this.process.tenantId = this.opTenantId
this.process.fraction = this.process.examScore
this.process.ifPass = this.process.examStatus
this.process.images = this.fileList?.map(item => item.url).join(',') || ''; */
if (!this.process.userId || !this.process.subject || !this.process.examScore || !this.process.examStatus || !this.process.examTime) {
uni.showToast({title: '信息填写不完整', icon: 'none'});
return;
}
request({
url: '/app-api/examBatch/update',
method: 'PUT',
data: postData,
// data: this.process,
}).then(res => {
if (res.code === 0) {
uni.showToast({
title: '保存成功',
icon: 'success',
duration: 1000
});
setTimeout(() => {
uni.navigateBack({
delta: 1
});
}, 1500);
} else {
uni.showToast({title: res.data?.message || '保存失败', icon: 'none'});
}
})
}
}
};
</script>
<style lang='scss'>
@import '../common/common.scss';
@import './assets/style/index.rpx.scss';
</style>