85bea01c by zhangmeng

报名校验

1 parent 529802ed
......@@ -815,4 +815,21 @@ export function preCheckForPerson(params) {
})
}
// 人员OCR校验
export function checkOcr(data) {
return request({
url: `/systemj/personInfo/checkOcr`,
method: 'post',
data
})
}
// 修改人员
export function editOcr(data) {
return request({
url: `/systemj/personInfo/editOcr`,
method: 'post',
data
})
}
......
<template>
<el-dialog v-model="show" :title="title" append-to-body width="1000px">
<div class="from-Card">
<el-form :inline="true" :model="query" class="mt20" label-width="60" size="small">
<el-form-item :label="language==0?'姓名':'Name'">
<el-input v-model="query.realName" clearable style="width: 120px;" />
</el-form-item>
<el-form-item v-if="!isNational" :label="language==0?'证件类型':'ID Type'">
<el-select v-model="query.idcType" clearable style="width: 100px;" @change="getList">
<el-option
v-for="item in certificates"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
<el-form-item v-if="!isNational" :label="language==0?'证件号码':'ID NO.'">
<el-input v-model="query.idcCode" clearable style="width: 120px;" />
</el-form-item>
<el-form-item>
<el-button type="primary" @click="getList">{{ language == 0 ? '查询' : 'Search' }}</el-button>
</el-form-item>
</el-form>
</div>
<p v-if="noPhotoCanSign == 0" class="text-danger">
{{
language == 0 ? '*完善信息才可报名' : '*Please complete the information before signing up'
}}
</p>
<el-table
ref="allSportmenTable" v-loading="loading" :data="tableData" height="60vh"
>
<el-table-column
:label="language==0?'序号':'Index'" align="center" type="index"
width="70"
/>
<el-table-column v-if="isNational" :label="language==0?'WDSF 会员号':'WDSF MIN'" prop="wdsfMin" width="100" />
<el-table-column
v-if="!isNational" :label="language==0?'姓名':'Real Name'" align="center" min-width="100"
prop="realName"
/>
<el-table-column
v-if="isNational" :label="language==0?'姓氏':'Surname'" align="center" min-width="100"
prop="xing"
/>
<el-table-column v-if="isNational" :label="language==0?'名':'Name'" align="center" min-width="100" prop="ming" />
<el-table-column
v-if="isNational" :label="language==0?'代表':'Representing'" align="center" min-width="120"
prop="representing"
/>
<el-table-column
v-if="!isNational" :label="language==0?'所属国家/地区':'Nationality'" align="center"
min-width="110" prop="countryName"
/>
<el-table-column :label="language==0?'性别':'Gender'" prop="sexStr" />
<el-table-column
v-if="isNational" :label="language==0?'年龄组':'Age group'" align="center" min-width="100"
prop="ageGroup"
/>
<el-table-column
v-if="isNational" :label="language==0?'舞种':'Division'" align="center" min-width="100"
prop="division"
/>
<el-table-column v-if="!isNational" :label="language==0?'年龄':'Age'" prop="age" />
<el-table-column v-if="!isNational" :label="language==0?'出生日期':'Date of Birth'" prop="birth" width="130" />
<el-table-column v-if="!isNational" :label="language==0?'证件类型':'ID Type'" prop="idcTypeStr" width="120" />
<el-table-column v-if="!isNational" :label="language==0?'证件号码':'ID NO.'" prop="idcCode" width="200" />
<el-table-column :label="language==0?'操作':'Actions'" align="center" fixed="right" width="100">
<template #default="scope">
<el-button v-if="scope.row.ocrFlag=='0'" link type="danger" @click="editPerson(scope.row)">
{{ language == 0 ? '完善信息' : 'Complete' }}
</el-button>
<el-button v-else disabled link type="danger">
{{ language == 0 ? '完善信息' : 'Complete' }}
</el-button>
</template>
</el-table-column>
</el-table>
<paginationPc
v-show="total>0"
v-model:limit="query.pageSize"
v-model:page="query.pageNum"
:total="total"
@pagination="getList"
/>
</el-dialog>
<!-- 国内赛运动员-->
<!-- <add-coach ref="dialogAddCoach" @submitForm="getList" />-->
<!-- 国际赛运动员-->
<checkOcr ref="checkOcrRef" @submitForm="getList" />
<Import ref="dialogImportProps" @submitForm="getList" />
</template>
<script setup>
import { reactive, ref, toRefs } from 'vue'
import { getCurrentInstance } from 'vue'
import * as match from '@/apiPc/match'
import checkOcr from '../components/checkOcr'
import Import from '../components/import'
import { useStorage } from '@vueuse/core/index'
import { getPerPersonList } from '@/apiPc/match'
const language = useStorage('language', 0)
const { proxy } = getCurrentInstance()
const data = reactive({
query: {
label: '0',
pageSize: 10,
pageNum: 1
},
tableData: [],
show: false,
loading: false,
title: '运动员',
noPhotoCanSign: 0,
total: 0,
isNational: false
})
const { query, tableData, show, title, loading, noPhotoCanSign, total, isNational } = toRefs(data)
const certificates = ref([
{
value: '0',
label: language.value == 0 ? '居民身份证' : 'Resident ID card'
},
{
value: '1',
label: language.value == 0 ? '护照' : 'Passport'
},
{
value: '2',
label: language.value == 0 ? '其他' : 'Other'
}
])
let groupId
const type = ref('1')
const open = (id, val) => {
show.value = true
query.value.id = id
type.value = val
getList()
}
const getList = async() => {
loading.value = true
let res
if (type.value == 1) {
res = await match.getPerPersonList(query.value, query.value.id)
} else {
res = await match.getGroupPersonList(query.value, query.value.id)
}
tableData.value = res.rows
total.value = res.total
loading.value = false
}
function editPerson(row) {
console.log(isNational.value)
const params = {
id: row.id,
title: language.value == 0 ? '编辑人员' : 'Edit Person',
groupId: groupId,
label: '0'
}
proxy.$refs['checkOcrRef'].open(params)
}
defineExpose({
open
})
</script>
<style lang="scss" scoped>
.el-form--inline .el-form-item {
width: auto;
}
</style>
<template>
<el-dialog
v-model="show" :close-on-click-modal="false" :title="title" append-to-body center
class="pcloginpop"
close-icon="CircleClose" destroy-on-close width="800px"
@close="cancel"
>
<!-- wdsf 个人/舞伴/国际赛运动员-->
<div class="pd10" />
<el-form ref="dialogRef" :label-width="language==0?120:180" :model="form" inline>
<div class="leftboderTT">
{{ language == 0 ? '完善信息' : 'ADDITIONAL INFORMATION' }}
</div>
<div class="h20" />
<el-form-item :label="language==0?'个人照片':'photo'" prop="picUrl">
<ImageUpload2
v-model="form.picUrl"
:crop-height="280"
:crop-width="200"
:is-show-tip="false"
:limit="1"
class="threeFour"
/>
</el-form-item>
<el-form-item :label="language==0?'有效证件':'Valid Passport'" required>
<image-upload
ref="uploadPassportRef"
v-model="form.passportUrl"
:action="'/common/getPersonInfoFromCert/6'"
:button-text="language==0?'上传':'Upload'"
:is-show-tip="false"
:limit="1"
param-name="pic"
@response="ocrSuccess"
/>
<div class="tip">
<span v-if="language==0">请上传有效身份证件扫描件,用于核实身份信息、申请签证邀请函及购买保险等 </span>
<span v-else>
Please upload a scanned copy of your valid passport for verification of identity information,
application of visa invitation letter and purchasing insurance etc.</span>
</div>
</el-form-item>
<el-form-item :label="language==0?'姓名':'Name'" required>
<el-input v-model="form.certName" />
</el-form-item>
<el-form-item :label="language==0?'性别':'Gender'" required>
<el-radio-group v-model="form.sex">
<el-radio value="0">{{ language == 0 ? '女' : 'female' }}</el-radio>
<el-radio value="1">{{ language == 0 ? '男' : 'male' }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item :label="language==0?'出生日期':'Date of Birth'" required>
<el-date-picker
v-model="form.birth"
:disabled-date="disabledBirth" format="YYYY-MM-DD"
style="width: 100%;" type="date" value-format="YYYY-MM-DD"
/>
</el-form-item>
<el-form-item :label="language==0?'证件号':'Passport number'" required>
<el-input v-model="form.passportNumber" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer text-center">
<el-button class="btn-lineG w200px" round type="primary" @click="submitForm">
{{ language == 0 ? '确定' : 'Save' }}
</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, toRefs, watch } from 'vue'
import { getCurrentInstance, nextTick } from '@vue/runtime-core'
import * as match from '@/apiPc/match'
import { ElMessage } from 'element-plus'
import { useStorage } from '@vueuse/core/index'
import ImageUpload from '@/components/ImageUpload/index.vue'
import ImageUpload2 from '@/components/ImageUpload/index2.vue'
const language = useStorage('language', 0)
const { proxy } = getCurrentInstance()
const emit = defineEmits(['submitForm'])
const data = reactive({
form: {},
card: '',
show: false,
showVcode: false,
labels: [
{ value: '0', label: '运动员', enlabel: 'Sportsman' },
{ value: '1', label: '教练', enlabel: 'Coach' },
{ value: '2', label: '领队', enlabel: 'Head of team' },
{ value: '4', label: '队医', enlabel: 'Team Doctor' },
{ value: '5', label: '翻译', enlabel: 'Interpreter' },
{ value: '6', label: '官员', enlabel: 'Official' },
{ value: '3', label: '其他', enlabel: 'Other' }
],
title: '添加选手信息',
isMe: false,
isCodeTrue: false,
cptId: '',
failVcode: '验证失败,请重试',
successVcode: '验证通过!',
sliderText: '拖动滑块完成拼图'
})
const {
form, show, showVcode, title, isCodeTrue, card, cptId, uploadPassportRef
} = toRefs(data)
const groupId = ref('0')
const open = (params) => {
show.value = true
console.log(params)
title.value = params.title
cptId.value = params.cptId
groupId.value = params.groupId
form.value.id = params.id
// getMyInfo()
getFormById(params.id)
}
function getMyInfo() {
match.getMyPersonInfo().then(res => {
form.value = res.data
})
}
function getFormById(id) {
match.getPersonInfoById(id).then(res => {
form.value = res.data
form.value.certName = res.data.realName
form.value.passportNumber = res.data.idcCode
form.value.passportUrl = ''
})
}
watch(show, (value) => {
if (!value) {
card.value = ''
isCodeTrue.value = false
form.value = {
// sex: '0'
}
}
nextTick(() => {
proxy.$refs['dialogRef'].clearValidate()
})
})
const ocrSuccess = (res) => {
// form.value.passportUrl = res.data.url
console.log(form.value.passportUrl)
if (res.code == 200) {
form.value.passportUrl = res.data.url
form.value.passportNumber = res.data.code
form.value.birth = res.data.birth?.slice(0, 10)
form.value.sex = res.data.sex
form.value.certName = res.data.name
} else if (res.code == 500) {
ElMessage.warning(res.msg)
form.value.passportUrl = ''
}
}
function submitForm() {
// if (!form.value.wdsfMin && !card.value) {
// ElMessage.warning(language.value == 0 ? '请输入你的WDSF会员号' : 'Please fill in your WDSF MIN')
// return
// }
// if (card.value && !isCodeTrue.value) {
// ElMessage.warning(language.value == 0 ? '请验证你的WDSF会员号' : 'Please verify your WDSF MIN')
// return
// }
if (!form.value.passportNumber) {
ElMessage.warning(language.value == 0 ? '请输入你的证件号' : 'Please fill in your passport number')
return
}
if (!form.value.birth) {
ElMessage.warning(language.value == 0 ? '请输入你的出生日期' : 'Please fill in your birthday')
return
}
if (!form.value.sex) {
ElMessage.warning(language.value == 0 ? '请选择性别' : 'Please select your gender')
return
}
if (!form.value.certName) {
ElMessage.warning(language.value == 0 ? '请输入姓名' : 'Please enter your name')
return
}
if (!form.value.passportUrl || form.value.passportUrl == '' || form.value.passportUrl.length == 0) {
ElMessage.warning(language.value == 0 ? '请上传有效证件' : 'Please upload valid identification documents')
return
}
form.value.cptId = cptId.value
if (Array.isArray(form.value.passportUrl)) {
form.value.passportUrl = form.value.passportUrl[0].url
}
match.editOcr(form.value).then(res => {
ElMessage.success(language.value == 0 ? '保存成功' : 'Successfully')
show.value = false
emit('submitForm')
})
// if (editgay) {
// // id不是0
//
// } else {
// if (Array.isArray(form.value.passportUrl)) {
// form.value.passportUrl = form.value.passportUrl[0].url
// }
// if (isMe.value) {
// match.saveMyBaseInfo(form.value).then(res => {
// ElMessage.success('保存成功')
// show.value = false
// emit('submitForm')
// })
// } else {
// delete form.value.status
// delete form.value.id
// form.value.label = '0'
// form.value.cptId = cptId.value
// form.value.wdsfMin = form.value.min
// form.value.idcCode = form.value.passportNumber
// form.value.idcType = '1'
// if (Array.isArray(form.value.passportUrl)) {
// form.value.passportUrl = form.value.passportUrl[0].url
// }
// if (groupId.value == '0' || !groupId.value) {
// addPersonal()
// } else {
// if (groupId.value) {
// addGroupMember()
// }
// }
// }
// }
}
function addPersonal() {
match.savePersonForMyPerson2(form.value).then(res => {
ElMessage.success('保存成功')
show.value = false
emit('submitForm', res.data)
})
}
function addGroupMember() {
form.value.groupId = groupId
match.savePersonForMyGroup(form.value).then(res => {
ElMessage.success(language.value == 0 ? '保存成功' : 'Save successful')
show.value = false
emit('submitForm')
})
}
function cancel() {
show.value = false
showVcode.value = false
}
// function resetCode() {
// isCodeTrue.value = false
// }
//
// function checkCard() {
// if (isCodeTrue.value) {
// return
// }
// if (!card.value) {
// if (language.value == 0) {
// ElMessage.warning('请填写WDSF卡号')
// } else {
// ElMessage.warning('Please fill in your WDSF code')
// }
// return
// }
// showVcode.value = true
// }
//
// function codeSuccess(msg) {
// console.log('验证通过' + msg)
// showVcode.value = false
// isCodeTrue.value = true
// checkWdsfAthletes({ card: card.value, groupId: groupId }).then(res => {
// if (res.data.wdsfFlag == -1) {
// ElMessage.warning(language.value == 0 ? '您添加的运动员代表国家/地区,与团体账号注册的国家/地区不符,无法添加' : 'The athlete \'s representing, does not match the group account‘s country/region and cannot be added.')
// isCodeTrue.value = false
// return
// }
//
// form.value = res.data
// form.value.xing = form.value.surname
// form.value.ming = form.value.name
// form.value.wdsfStatus = res.data.status
// if (form.value.sex) {
// form.value.sex = res.data.sex
// }
// if (form.value.wdsfFlag == '0') {
// isCodeTrue.value = false
// if (language.value == 0) {
// ElMessage.warning('WDSF卡号错误')
// } else {
// ElMessage.warning('WDSF MIN is Error')
// }
// }
// })
// }
function disabledBirth(time) {
return time.getTime() > new Date().getTime()
}
defineExpose({ open })
</script>
<style lang="scss">
.el-input-group__append button.el-button, .el-input-group__append button.el-button:hover {
color: var(--el-color-primary);
background: #efefff;
border: var(--el-color-primary) solid 1px;
border-radius: 0;
}
.leftboderTT {
color: var(--el-color-primary);
font-size: 16px;
font-weight: 600;
span {
color: #929AA0;
font-size: 14px;
}
}
.threeFour {
width: 100%;
.el-upload--picture-card {
width: 120px;
height: 160px;
}
.el-upload-list--picture-card .el-upload-list__item {
width: 120px;
height: 160px;
}
}
.tip {
font-size: 13px;
color: #999;
line-height: 1.6;
margin: 10px 0;
i {
color: red;
margin: 0 4px 0 0;
}
}
.shenfen {
.el-upload--picture-card {
width: 320px;
height: 200px;
}
.el-upload-list--picture-card .el-upload-list__item {
width: 320px;
height: 200px;
}
}
.touxiang {
:deep(.el-upload--picture-card ) {
width: 140px;
height: 200px;
}
}
.touxiang {
:deep(.el-upload-list__item ) {
width: 140px;
height: 200px;
}
}
.el-form--inline .el-form-item {
width: 100%
}
.boxDialog {
.el-dialog__header {
background: linear-gradient(#ed2c22, #fe6d45);
margin-right: 0;
height: 52px;
span {
color: #fff;
}
}
}
</style>
......@@ -392,6 +392,8 @@
@click="openPickup"
>{{ language == 0 ? '接 / 送机服务' : 'Pick-up/drop-off service' }}</a>
<pickup ref="pickupRef" />
<checkAllSportsman ref="checkAllSportsmanRef" />
</div>
</template>
......@@ -407,6 +409,8 @@ import { getCurrentInstance, ref } from 'vue'
import { reactive, onMounted } from '@vue/runtime-core'
import { useRoute, useRouter } from 'vue-router'
import AffixInvitation from '@/viewsPc/match/components/affix-invitation'
import checkAllSportsman from '@/viewsPc/match/components/checkAllSportsman'
const language = useStorage('language', 0)
const route = useRoute()
......@@ -589,18 +593,7 @@ function goTeamSign() {
return
}
handelPreCheckForGroup(
router.push({
path: `${route.params.id}/teamSignCn`,
query: {
matchId: matchId.value,
groupId: groupId.value,
signType: matchData.value.signType,
languageSource: matchData.value.languageSource,
isNational: false
}
})
)
handelPreCheckForGroup(goTeamSignCn)
} else {
// 国际赛
if (group?.type != '4' && matchData.value.countryLimit == '1') {
......@@ -615,7 +608,11 @@ function goTeamSign() {
)
return
}
handelPreCheckForGroup(
handelPreCheckForGroup(goTamSign)
}
}
function goTamSign() {
router.push({
path: `${route.params.id}/teamSign`,
query: {
......@@ -626,8 +623,19 @@ function goTeamSign() {
languageSource: matchData.value.languageSource
}
})
)
}
function goTeamSignCn() {
router.push({
path: `${route.params.id}/teamSignCn`,
query: {
matchId: matchId.value,
groupId: groupId.value,
signType: matchData.value.signType,
languageSource: matchData.value.languageSource,
isNational: false
}
})
}
function goPersonalSign() {
......@@ -833,7 +841,8 @@ async function handelGeRenNext() {
}
// 正常报名
if (res.data == 1) {
goPersonalSign()
const flag = await getCheckOcr({ type: '1' })
if (flag) await goPersonalSign()
}
// 提示
if (res.data == 2) {
......@@ -843,7 +852,8 @@ async function handelGeRenNext() {
: 'The athlete`s WDSF membership number has been changed. Should it be updated?'
)
await match.preCheckForPerson({ type: '2' })
await goPersonalSign()
const flag = await getCheckOcr({ type: '1' })
if (flag) await goPersonalSign()
}
}
......@@ -867,7 +877,8 @@ const openPickup = () => {
async function handelPreCheckForGroup(fn) {
const res = await match.preCheckForGroup(groupId.value, '1')
if (res.data == 1 || res.data == 0) {
await fn()
const flag = await getCheckOcr({ type: '2', groupId: groupId.value })
if (flag) await fn()
}
if (res.data == 2) {
await proxy.$modal.confirm(
......@@ -875,9 +886,23 @@ async function handelPreCheckForGroup(fn) {
? '运动员的WDSF会员号已变更,是否更新?'
: 'The athlete`s WDSF membership number has been changed. Should it be updated?')
await match.preCheckForGroup(groupId.value, '2')
await fn()
const flag = await getCheckOcr({ type: '2', groupId: groupId.value })
if (flag) await fn()
}
}
async function getCheckOcr(obj) {
const { data } = await match.checkOcr(obj)
if (!data) {
// 人员ocr未通过
await proxy.$modal.confirm(language.value == 0 ? '请完善人员信息' : 'Please complete the personnel information')
await proxy.$refs['checkAllSportsmanRef'].open(obj.type == 1 ? user.userId : groupId.value, obj.type)
return false
} else {
return true
}
}
</script>
<style lang="scss" scoped>
......
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!