123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644 |
- <template>
- <div class="appDetail">
- <!-- <m-header v-if="headerStatus" /> -->
- <van-cell-group>
- <!-- <van-field v-model="form.paymentOrderNo" disabled label="订单编号" /> -->
- <van-field v-model="form.examBaseName" disabled label="考级名称" />
- <van-cell disabled title="缴费状态">
- <div v-if="form.status">
- <p class="noPass" v-if="form.status === 'PAY_WAIT'">未缴费</p>
- <p class="pass" v-else>已缴费</p>
- </div>
- </van-cell>
- <van-field v-model="form.examTime" disabled label="预计考试日期" />
- <van-cell title="专业等级" >
- {{ form.subjectName ? form.subjectName : '通用' }}<span v-if="form.level">({{ form.level | formatLevel }})</span>
- </van-cell>
- <van-cell v-for="(item, index) in practiceInfo" :key="index" :title="`练习曲${numberToCN(index)}`" @click="onOpen('practice', index)" :is-link="form.practiceSongIdList ? false : true" >
- {{ item.songName }} {{ item.songAuthor ? '-' + item.songAuthor : item.songAuthor }}
- </van-cell>
- <van-cell v-for="(item, index) in performInfo" :key="index" :title="`演奏曲${numberToCN(index)}`" @click="onOpen('perform', index)" :is-link="form.performSongIdList ? false : true" >
- {{ item.songName }} {{ item.songAuthor ? '-' + item.songAuthor : item.songAuthor }}
- </van-cell>
- <van-field v-model="form.name" disabled label="考级证书" >
- <template #input>
- <van-uploader
- name="certificate"
- :before-read="beforeRead"
- :before-delete="beforeDelete"
- :after-read="afterRead"
- accept="image/*"
- :disabled="!form.editStatus"
- :deletable="form.editStatus"
- v-model="uploadCertificate"
- :max-count="1" />
- </template>
- </van-field>
- <van-cell disabled title="乐理等级" >
- {{ form.examMusicTheoryLevel | formatLevel }}
- </van-cell>
- <van-field v-model="form.name" disabled label="乐理证书" >
- <template #input>
- <van-uploader
- name="certificate2"
- :before-read="beforeRead"
- :before-delete="beforeDelete"
- :after-read="afterRead"
- v-model="uploadCertificate2"
- accept="image/*"
- :disabled="!form.editStatus"
- :deletable="form.editStatus"
- :max-count="1" />
- </template>
- </van-field>
- </van-cell-group>
- <van-cell-group class="memos" v-if="form.status != 'AUDIT_REJECT' && !form.memo">
- <van-cell disabled title="报名审核" v-if="form.status == 'AUDIT_REJECT'">
- <div v-if="form.status">
- <p class="pass" v-if="form.status === 'AUDIT_PASS'">已通过</p>
- <p v-else-if="form.status === 'AUDIT_WAIT'">等待审核</p>
- <p class="noPass" v-else>未通过</p>
- </div>
- </van-cell>
- <van-cell title="备注" v-if="form.memo">
- {{ form.memo }}
- </van-cell>
- </van-cell-group>
- <van-button type="primary" v-if="form.editStatus" @click="onSubmit" round block>重新提交</van-button>
- <van-popup class="van-popup-song" v-model="songUpload.songStatus" :close-on-click-overlay="false">
- <div class="song-popup">
- <div class="title">自定义曲目</div>
- <van-field name="songName" v-model="songUpload.songName" :disabled="!form.editStatus" label="曲名" placeholder="请输入曲名" >
- <template #label><i style="color: #ee0a24">*</i>曲名</template>
- </van-field>
- <van-field name="songAuthor" :disabled="!form.editStatus" v-model="songUpload.songAuthor" label="作者" placeholder="请输入作者" >
- <template #label><i style="color: #ffffff">*</i>作者</template>
- </van-field>
- <van-field readonly clearable >
- <template #input>
- <van-uploader
- v-if="songUpload.indexName == 'practice'"
- :name="songUpload.indexName + '-' + songUpload.index"
- :before-read="beforeRead"
- :before-delete="beforeDelete"
- :after-read="afterRead"
- v-model.trim="practiceUpload[songUpload.index]"
- multiple
- :disabled="!form.editStatus"
- :deletable="form.editStatus"
- accept="image/*"
- :max-count="5" >
- </van-uploader>
- <van-uploader
- v-if="songUpload.indexName == 'perform'"
- :name="songUpload.indexName + '-' + songUpload.index"
- :before-read="beforeRead"
- :before-delete="beforeDelete"
- :after-read="afterRead"
- v-model.trim="performUpload[songUpload.index]"
- multiple
- :disabled="!form.editStatus"
- :deletable="form.editStatus"
- accept="image/*"
- :max-count="5" >
- </van-uploader>
- </template>
- </van-field>
- <p class="song-popup-tips"><i style="color: #ee0a24">*</i>支持格式:png,jpg,bmp</p>
- <div class="popup-group">
- <span @click="onSaveCancel">取消</span>
- <span @click="onSaveUpload" class="popup-sure">确定</span>
- </div>
- </div>
- </van-popup>
- </div>
- </template>
- <script>
- import { browser } from '@/utils/common'
- import dayjs from 'dayjs'
- import setLoading from '@/utils/loading'
- // import fileUtil from '@/utils/fileUtil'
- import { uploadFile, examRegistrationUpdate } from '../signup/SignUpApi'
- import { applyList } from './appApi'
- export default {
- name: 'appDetail',
- data () {
- const query = this.$route.query
- return {
- headerStatus: false,
- examRegistrationId: query.examRegistrationId,
- form: {
- id: null,
- paymentOrderNo: null,
- examBaseName: null,
- subjectName: null,
- level: null,
- status: null,
- examStartTime: null,
- lastExamCertificateUrl: null,
- examMusicTheoryLevel: null,
- lastMusicTheoryCertificateUrl: null,
- memo: null,
- practiceSongIdList: null,
- performSongIdList: null,
- editStatus: false
- },
- uploadCertificate: [],
- uploadCertificate2: [],
- songUpload: {
- songStatus: false, // 曲目状态
- indexName: null,
- index: null, // 索引
- songName: null, // 曲名
- songAuthor: null // 作者
- },
- practiceNum: null,
- performUpload: [], // 演奏曲
- performUploadTemp: [], // 演奏曲
- performInfo: [], // 演奏曲基本信息
- performNum: null,
- practiceUpload: [], // 练习曲
- practiceUploadTemp: [], // 练习曲
- practiceInfo: [], // 练习曲基本信息
- }
- },
- mounted() {
- // 插入token
- let params = this.$route.query
- if(params.Authorization) {
- localStorage.setItem('Authorization', decodeURI(params.Authorization))
- }
- // 判断是否在app里面
- if(!browser().android && !browser().iPhone) {
- this.headerStatus = true
- } else {
- document.title = '报考详情'
- }
- this.__init()
- },
- methods: {
- async __init() {
- setLoading(true)
- try {
- const res = await applyList({
- page: 1,
- rows: 20,
- examRegistrationId: this.examRegistrationId
- })
- setLoading(false)
- const result = res.data
- if(result.code == 200) {
- const detail = result.data.rows ? result.data.rows[0] : {}
- this.form = {
- id: detail.id,
- paymentOrderNo: detail.paymentOrderNo,
- examBaseName: detail.examBaseName,
- subjectName: detail.subjectName,
- level: detail.level,
- status: detail.status,
- examStartTime: detail.examStartTime,
- examTime: dayjs(detail.examStartTime).format("YYYY-MM-DD") + '~' + dayjs(detail.examEndTime).format("YYYY-MM-DD"),
- lastExamCertificateUrl: detail.lastExamCertificateUrl,
- examMusicTheoryLevel: detail.examMusicTheoryLevel,
- lastMusicTheoryCertificateUrl: detail.lastMusicTheoryCertificateUrl,
- memo: detail.memo,
- practiceSongIdList: detail.practiceSongIdList,
- performSongIdList: detail.performSongIdList,
- editStatus: detail.status === "AUDIT_PASS" || detail.status === "AUDIT_WAIT" ? false : true
- }
- if(detail.lastExamCertificateUrl) {
- this.uploadCertificate = [{ url: detail.lastExamCertificateUrl }]
- }
- if(detail.lastMusicTheoryCertificateUrl) {
- this.uploadCertificate2 = [{ url: detail.lastMusicTheoryCertificateUrl }]
- }
- const songJson = detail.songJson ? JSON.parse(detail.songJson) : []
- songJson.forEach(item => {
- // 曲谱
- const uploadUrl = item.uploadUrl ? item.uploadUrl.split(',') : []
- let tempUrl = []
- uploadUrl.forEach(url => {
- tempUrl.push({
- url: url
- })
- })
- if(item.type === "PRACTICE") {
- this.practiceUpload.push(tempUrl)
- this.practiceUploadTemp.push(tempUrl)
- this.practiceInfo.push(item)
- } else if(item.type === "PERFORM") {
- this.performUpload.push(tempUrl)
- this.performUploadTemp.push(tempUrl)
- this.performInfo.push(item)
- }
- })
- this.practiceInfo.forEach((item, index) => {
- item.index = index
- })
- this.performInfo.forEach((item, index) => {
- item.index = index
- })
- this.practiceNum = this.practiceUpload.length
- this.performNum = this.performUpload.length
- }
- } catch(err) {
- //
- setLoading(false)
- }
- },
- onOpen(type, index) {
- let songUpload = this.songUpload
- let practiceSUL = this.practiceInfo[index]
- let performSUL = this.performInfo[index]
- const practiceSongIdList = this.form.practiceSongIdList
- const performSongIdList = this.form.performSongIdList
- if(type == "perform") {
- if(performSongIdList) {
- return
- }
- songUpload.songName = performSUL ? performSUL.songName : null
- songUpload.songAuthor = performSUL ? performSUL.songAuthor : null
- } else if(type == "practice") {
- if(practiceSongIdList) { // 判断是否是自定义
- return
- }
- songUpload.songName = practiceSUL ? practiceSUL.songName : null
- songUpload.songAuthor = practiceSUL ? practiceSUL.songAuthor : null
- }
- songUpload.indexName = type
- songUpload.index = index
- songUpload.songStatus = true
- },
- beforeRead(file) {
- const isLt2M = file.size / 1024 / 1024 < 5
- if (!isLt2M) {
- this.$toast('上传图片大小不能超过 5MB')
- return false
- }
- return true
- // return new Promise((resolve) => {
- // fileUtil.getOrientation(file).then((orient) => {
- // if (orient && orient != "" && orient != 1) {
- // let reader = new FileReader()
- // let img = new Image()
- // reader.onload = (e) => {
- // img.src = e.target.result
- // img.onload = function () {
- // const data = fileUtil.rotateImage(img, img.width, img.height, orient)
- // const newFile = fileUtil.dataURLtoFile(data, file.name)
- // resolve(newFile)
- // }
- // }
- // reader.readAsDataURL(file)
- // } else {
- // resolve(file)
- // }
- // })
- // })
- },
- beforeDelete(file, detail) {
- const obj = detail.name.split('-')
- let form = this.form
- if(obj[0] == "certificate2") {
- form.lastMusicTheoryCertificateUrl = "" // 上传图片地址为空
- } else if(obj[0] == "certificate") {
- form.lastExamCertificateUrl = ""
- }
- return true
- },
- async afterRead(file, detail) { // 上传头像
- const obj = detail.name.split('-')
- try {
- file.status = 'uploading'
- file.message = '上传中...'
- let formData = new FormData()
- formData.append('file', file.file)
- let res = await uploadFile(formData)
- let result = res.data
- if(result.code == 200) {
- file.status = 'done'
- let form = this.form
- if(obj[0] == "certificate2") {
- form.lastMusicTheoryCertificateUrl = result.data.url // 上传图片地址为空
- } else if(obj[0] == "certificate") {
- form.lastExamCertificateUrl = result.data.url
- } else if(obj[0] == 'practice') {
- file.url = result.data.url
- } else if(obj[0] == 'perform') {
- file.url = result.data.url
- }
- } else {
- file.status = 'failed'
- file.message = '上传失败'
- this.$toast(result.msg)
- return false
- }
- } catch (err) {
- return false
- }
- },
- async onSubmit() {
- if(!this.onCheckFields()) {
- return
- }
- let songJson = [] // json 数组
- // 练习课 "PRACTICE"
- const practiceUpload = this.practiceUpload
- this.practiceInfo.forEach(item => {
- let tempUrl = []
- practiceUpload[item.index].forEach(item => {
- tempUrl.push(item.url)
- })
- songJson.push({
- songName: item.songName,
- songAuthor: item.songAuthor,
- index: item.index,
- type: "PRACTICE",
- uploadUrl: tempUrl.join(',')
- })
- })
- // 演奏课 "PERFORM"
- const performUpload = this.performUpload
- this.performInfo.forEach(item => {
- let tempUrl = []
- performUpload[item.index].forEach(item => {
- tempUrl.push(item.url)
- })
- songJson.push({
- songName: item.songName,
- songAuthor: item.songAuthor,
- index: item.index,
- type: "PERFORM",
- uploadUrl: tempUrl.join(',')
- })
- })
- let form = this.form
- let params = {
- id: form.id,
- lastExamCertificateUrl: form.lastExamCertificateUrl,
- lastMusicTheoryCertificateUrl: form.lastMusicTheoryCertificateUrl,
- songJson: JSON.stringify(songJson),
- status: "AUDIT_WAIT"
- }
- setLoading(true)
- try {
- const res = await examRegistrationUpdate(params)
- setLoading(false)
- const result = res.data
- if(result.code == 200) {
- this.practiceUpload = []
- this.practiceUploadTemp = []
- this.practiceInfo = []
- this.performUpload = []
- this.performUploadTemp = []
- this.performInfo = []
- this.__init()
- } else {
- this.$toast(result.msg)
- }
- } catch(err) {
- //
- setLoading(false)
- }
- },
- onCheckFields() {
- // 校验数据
- let form = this.form
- // 有值说明是列表
- if(this.practiceUpload.length != this.practiceNum) {
- this.$toast('请上传练习曲')
- return false
- }
- if(this.performUpload.length != this.performNum) {
- this.$toast('请上传演奏曲')
- return false
- }
- if(form.level > 2 && form.examMusicTheoryLevel == 0 && !form.lastMusicTheoryCertificateUrl) {
- this.$toast("请上传乐理证书")
- return false
- }
- return true
- },
- onSaveCancel() {
- this.songUpload.songStatus = false
- this.performUpload = JSON.parse(JSON.stringify(this.performUploadTemp)) // 回填数据
- this.practiceUpload = JSON.parse(JSON.stringify(this.practiceUploadTemp)) // 回填数据
- },
- onSaveUpload() {
- let songUpload = this.songUpload
- if(!songUpload.songName) {
- this.$toast("请输入曲名")
- return
- }
- if(songUpload.indexName == "practice") {
- const practiceObj = this.practiceUpload[songUpload.index]
- const practiceLength = practiceObj ? practiceObj.length : 0
- if(practiceObj && practiceLength > 0 && practiceObj[0].url) {
- if(practiceObj[practiceLength - 1].url) {
- this.practiceInfo[songUpload.index] = JSON.parse(JSON.stringify(songUpload))
- this.practiceUploadTemp = JSON.parse(JSON.stringify(this.practiceUpload))
- } else {
- this.$toast("上传曲谱中,请稍等")
- return
- }
- } else {
- this.$toast("请上传文件")
- return
- }
- } else if(songUpload.indexName == "perform") {
- const performObj = this.performUpload[songUpload.index]
- const performLength = performObj ? performObj.length : 0
- if(performObj && performLength > 0) {
- if(performObj[performLength - 1].url) {
- this.performInfo[songUpload.index] = JSON.parse(JSON.stringify(songUpload))
- this.performUploadTemp = JSON.parse(JSON.stringify(this.performUpload))
- } else {
- this.$toast("上传曲谱中,请稍等")
- return
- }
- } else {
- this.$toast("请上传文件")
- return
- }
- }
- songUpload.songName = null
- songUpload.songAuthor = null
- songUpload.songStatus = false
- },
- numberToCN (value) {
- const tempNumber = {
- 0: '一',
- 1: '二',
- 2: '三',
- 3: '四',
- 4: '五',
- 5: '六',
- 6: '七',
- 7: '八',
- 8: '九',
- 9: '十'
- }
- return tempNumber[value]
- }
- },
- filters: {
- filterStatus(value) {
- const template = {
- PAY_WAIT: '未缴费',
- AUDIT_WAIT: '等待审核',
- AUDIT_PASS: '通过',
- AUDIT_REJECT: '拒绝',
- REFUNDED: '已退款'
- }
- return template[value]
- }
- }
- }
- </script>
- <style lang="less" scoped>
- @import url("../../assets/commonLess/variable");
- .appDetail {
- min-height: 100vh;
- overflow: hidden;
- }
- /deep/.van-cell {
- padding: 14px 16px;
- font-size: 16px;
- // color: @--font-main-color;
- .van-cell__title {
- margin-right: 12px;
- }
- .van-cell__value {
- width: calc(40% - .2rem);
- padding-right: .2rem;
- text-align: left;
- flex: auto;
- color: @--font-second-color;
- }
- .van-cell__right-icon {
- position: absolute;
- right: 16px;
- }
- .payTime {
- color: @--red-color;
- }
- &.van-field--disabled .van-field__label {
- color: @--font-main-color;
- }
- .van-field__control:disabled {
- color: @--font-second-color;
- }
- .noPass {
- color: @--red-color;
- .van-field__control:disabled {
- color: @--red-color;
- }
- }
- .pass {
- color: @--main-color;
- .van-field__control:disabled {
- color: @--main-color;
- }
- }
- }
- .van-popup-song {
- width: 80%;
- border-radius: .08rem;
- }
- .song-popup {
- text-align: center;
- .title {
- font-size: 18px;
- font-weight: 500;
- color: @--font-main-color;
- padding: .2rem 0 .15rem;
- }
- .song-upload {
- border-radius: .05rem;
- border: 1px solid #c5c7cb;
- background-position: 0 0, 100% 0, 0 0, 0 100%;
- font-size: .16rem;
- color: #777;
- width: 80px;
- height: 80px;
- display: flex;
- justify-content: center;
- align-items: center;
- text-align: center;
- .van-uploader__preview {
- margin: 0;
- }
- p {
- font-size: 13px;
- }
- }
- /deep/.van-uploader {
- margin: 0 auto;
- }
- /deep/.van-uploader__upload,
- /deep/.van-uploader__preview-image {
- width: 65px;
- height: 65px;
- }
- .song-popup-tips {
- font-size: .14rem;
- color: #808080;
- padding-bottom: .15rem
- // padding-top: .1rem;
- // padding-bottom: .25rem;
- }
- /deep/.van-cell {
- padding: 13px 35px;
- }
- /deep/.van-field__label {
- width: .8rem;
- text-align: left;
- }
- .popup-group {
- width: 100%;
- display: flex;
- color: @--main-color;
- background-color: #F0F0F0;
- font-size: .18rem;
- span {
- padding: .12rem 0;
- flex: 1;
- }
- .popup-sure {
- color: #ffffff;
- background-color: @--main-color;
- }
- }
- }
- .section {
- margin-top: 10px;
- }
- .memos {
- margin-top: 20px;
- margin-bottom: 20px;
- & + .van-button {
- margin-top: 0;
- }
- }
- .van-button--primary {
- margin: .15rem 0 .2rem;
- background-color: @--main-color;
- border: 1px solid @--main-color;
- color: #FFFFFF;
- font-size: .18rem;
- height: .5rem;
- line-height: .52rem;
- width: 90%;
- margin-left: 5%;
- }
- </style>
|