中心调研二维码和链接的时间有效性
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
0631af4d9b
commit
97411b7eaf
|
|
@ -4482,4 +4482,36 @@ export function getDoctorUserTrialReadingStat(data) {
|
|||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 设置项目链接过期时间
|
||||
export function setTrialLinkExpirationTime(data) {
|
||||
return request({
|
||||
url: `/TrialConfig/setTrialLinkExpirationTime`,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 获取项目链接过期时间
|
||||
export function getTrialLinkExpirationTime(data) {
|
||||
return request({
|
||||
url: `/TrialConfig/getTrialLinkExpirationTime`,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 获取项目链接时间是否过期
|
||||
export function getLinkLinkExpirationTime(data) {
|
||||
return request({
|
||||
url: `/TrialConfig/getLinkLinkExpirationTime`,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
// 获取项目链接code是否有效
|
||||
export function getLinkVerificationCodeIsEffective(data) {
|
||||
return request({
|
||||
url: `/TrialConfig/getLinkVerificationCodeIsEffective`,
|
||||
method: 'post',
|
||||
data,
|
||||
})
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
<template>
|
||||
<div class="question-login-wrapper">
|
||||
<div class="box-wrapper">
|
||||
<div v-if="verify"></div>
|
||||
<div class="box-wrapper" v-else>
|
||||
<h2 style="text-align:center;">
|
||||
<!-- 中心调研表 -->
|
||||
{{ $t('trials:researchForm:title:question') }}
|
||||
|
|
@ -91,7 +92,10 @@ import { getUserMenuTree, getUserPermissions } from '@/api/user'
|
|||
import store from '@/store'
|
||||
import TopLang from './topLang'
|
||||
import { mapGetters, mapMutations } from 'vuex'
|
||||
|
||||
import {
|
||||
getLinkLinkExpirationTime,
|
||||
getLinkVerificationCodeIsEffective
|
||||
} from '@/api/trials'
|
||||
export default {
|
||||
components: { TopLang },
|
||||
data() {
|
||||
|
|
@ -146,6 +150,7 @@ export default {
|
|||
}
|
||||
return {
|
||||
trialId: '',
|
||||
verify: true,
|
||||
form: {
|
||||
Sponsor: null, // 申办方
|
||||
ResearchProgramNo: null, // 方案号
|
||||
|
|
@ -202,31 +207,112 @@ export default {
|
|||
])
|
||||
},
|
||||
mounted() {
|
||||
this.$i18n.locale = this.$route.query.lang
|
||||
this.setLanguage(this.$route.query.lang)
|
||||
let lang = this.$route.query.lang
|
||||
if (!lang) {
|
||||
const language = navigator.language
|
||||
lang = 'zh'
|
||||
if (language === 'en-US') {
|
||||
lang = 'en'
|
||||
}
|
||||
}
|
||||
this.$i18n.locale = lang
|
||||
this.setLanguage(lang)
|
||||
this.$updateDictionary()
|
||||
if (this.$route.query.trialId) {
|
||||
this.trialId = this.$route.query.trialId
|
||||
this.initPage()
|
||||
}
|
||||
if (this.$route.query.isUpload) {
|
||||
this.isUpload = true
|
||||
this.form.IsUpdate = true
|
||||
let { email, oldEMail, trialSiteId } = this.$route.query
|
||||
if (trialSiteId) this.form.TrialSiteId = trialSiteId
|
||||
if (oldEMail) this.form.ReplaceUserEmailOrPhone = oldEMail
|
||||
if (email && email !== 'null') {
|
||||
this.form.EmailOrPhone = email
|
||||
} else {
|
||||
this.form.EmailOrPhone = oldEMail
|
||||
}
|
||||
if ((email && email !== 'null') || (oldEMail && oldEMail !== 'null')) {
|
||||
this.isNeedUpload = false
|
||||
}
|
||||
}
|
||||
this.getLinkTimeIsExpired()
|
||||
},
|
||||
methods: {
|
||||
...mapMutations({ setLanguage: 'lang/setLanguage' }),
|
||||
async getLinkTimeIsExpired() {
|
||||
try {
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
}
|
||||
let res = await getLinkLinkExpirationTime(data)
|
||||
if (res.IsSuccess) {
|
||||
if (res.Result.IsIsExpired) return this.$confirm(this.$t("trials:researchForm:confirm:linkIsExpired"), '', {
|
||||
type: 'warning'
|
||||
})
|
||||
this.customPrompt()
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async getLinkVerificationCodeIsEffective(value) {
|
||||
try {
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
LinkVerificationCode: value
|
||||
}
|
||||
let res = await getLinkVerificationCodeIsEffective(data)
|
||||
if (res.IsSuccess) {
|
||||
if (!res.Result.IsEffective) {
|
||||
return false
|
||||
}
|
||||
this.verify = false
|
||||
if (this.$route.query.trialId) {
|
||||
this.trialId = this.$route.query.trialId
|
||||
this.initPage()
|
||||
}
|
||||
if (this.$route.query.isUpload) {
|
||||
this.isUpload = true
|
||||
this.form.IsUpdate = true
|
||||
let { email, oldEMail, trialSiteId } = this.$route.query
|
||||
if (trialSiteId) this.form.TrialSiteId = trialSiteId
|
||||
if (oldEMail) this.form.ReplaceUserEmailOrPhone = oldEMail
|
||||
if (email && email !== 'null') {
|
||||
this.form.EmailOrPhone = email
|
||||
} else {
|
||||
this.form.EmailOrPhone = oldEMail
|
||||
}
|
||||
if ((email && email !== 'null') || (oldEMail && oldEMail !== 'null')) {
|
||||
this.isNeedUpload = false
|
||||
}
|
||||
}
|
||||
}
|
||||
return true
|
||||
} catch (err) {
|
||||
return false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async customPrompt(name) {
|
||||
try {
|
||||
const that = this
|
||||
// 请输入标记名称
|
||||
let message = this.$t('trials:researchForm:message:LinkVerificationCode')
|
||||
const { value } = await this.$prompt(message, '', {
|
||||
showClose: false,
|
||||
cancelButtonText: this.$t('common:button:cancel'),
|
||||
confirmButtonText: this.$t('trials:researchForm:button:saveLinkCode'),
|
||||
showCancelButton: false,
|
||||
closeOnClickModal: false,
|
||||
closeOnPressEscape: false,
|
||||
inputValue: name,
|
||||
beforeClose: async (action, instance, done) => {
|
||||
if (action === 'confirm') {
|
||||
const value = instance.inputValue
|
||||
if (!value) {
|
||||
that.$message.error(this.$t('trials:researchForm:error:noValue'))
|
||||
} else {
|
||||
let flag = await this.getLinkVerificationCodeIsEffective(value)
|
||||
if (!flag) {
|
||||
that.$message.error(this.$t('trials:researchForm:confirm:isEffective'))
|
||||
} else {
|
||||
done()
|
||||
}
|
||||
}
|
||||
} else {
|
||||
done()
|
||||
}
|
||||
}
|
||||
})
|
||||
this.getLinkVerificationCodeIsEffective(value)
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
return null
|
||||
}
|
||||
},
|
||||
// 初始化页面
|
||||
async initPage() {
|
||||
this.loading = true
|
||||
|
|
|
|||
|
|
@ -184,44 +184,75 @@
|
|||
</el-dialog>
|
||||
<!-- 调查表链接 -->
|
||||
<base-model :config="share_model">
|
||||
<template slot="dialog-body">
|
||||
<template slot="dialog-body" v-loading="shareLoading">
|
||||
<el-button size="small" type="primary" style="margin-bottom: 10px;" @click.stop="openImageManual">{{
|
||||
$t('trials:researchRecord:label:edit')
|
||||
}}</el-button>
|
||||
<div style="width: 100%; display: flex">
|
||||
<div class="shareLink">
|
||||
<!-- <div>
|
||||
<i style="color: #428bca" class="el-icon-success" />
|
||||
<span>{{
|
||||
$t('trials:researchRecord:message:createLinkSuccessfully')
|
||||
}}</span>
|
||||
</div> -->
|
||||
<div style="margin: 10px 0">
|
||||
<!-- 链接: -->
|
||||
{{ $t('trials:researchRecord:label:link') }}
|
||||
<div class="date">
|
||||
<el-form :model="shareForm" :rules="rules" ref="shareForm" label-width="100px">
|
||||
<el-form-item :label="$t('trials:researchRecord:label:ExpirationDays')" prop="ExpirationDays">
|
||||
<el-radio-group v-model="shareForm.ExpirationDays" @input="shareForm.OtherExpirationDays = null">
|
||||
<el-radio :label="1">{{ $t('trials:researchRecord:label:day1') }}</el-radio>
|
||||
<el-radio :label="7">{{ $t('trials:researchRecord:label:day7') }}</el-radio>
|
||||
<el-radio :label="15">{{ $t('trials:researchRecord:label:day15') }}</el-radio>
|
||||
<el-radio :label="`default`">{{ $t('trials:researchRecord:label:default') }}
|
||||
<el-input placeholder="" type="number" @input="handleInput" v-model="shareForm.OtherExpirationDays"
|
||||
clearable size="mini" style="width: 60px;" class="dayInput" />
|
||||
<span style="margin-left: 10px;">{{ $t('trials:researchRecord:label:day') }}</span>
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('trials:researchRecord:label:LinkVerificationCode')" prop="LinkVerificationCode">
|
||||
<el-radio-group v-model="shareForm.LinkVerificationCode"
|
||||
@input="shareForm.OtherLinkVerificationCode = null">
|
||||
<el-radio label="researchProgramNo">{{ $t('trials:researchRecord:label:researchProgramNo')
|
||||
}}</el-radio>
|
||||
<el-radio label="default">{{ $t('trials:researchRecord:label:default') }}
|
||||
<el-input placeholder="" type="number" v-model="shareForm.OtherLinkVerificationCode" clearable
|
||||
size="mini" style="width: 100px;" />
|
||||
</el-radio>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<el-button type="primary" round @click="setLink" style="float: right;">
|
||||
{{ $t('trials:researchRecord:button:setLink') }}
|
||||
</el-button>
|
||||
</div>
|
||||
<div class="share">
|
||||
<div class="shareLink">
|
||||
<h3>{{ $t('trials:researchRecord:label:link') }}</h3>
|
||||
<el-input ref="shareLink" v-model="shareLink" readonly type="textarea" autosize />
|
||||
</div>
|
||||
<div>
|
||||
<!-- 复制链接 -->
|
||||
<el-button type="primary" round @click="copyLink" class="shareLinkBtn">
|
||||
<div class="dateBox">
|
||||
<span>{{ $t('trials:researchRecord:label:ValidityPeriod') }}</span>
|
||||
<span>{{ validityPeriod }}</span>
|
||||
<span style="color: red;" v-if="isExpired">({{ $t('trials:researchRecord:label:Expired') }})</span>
|
||||
</div>
|
||||
<el-button type="primary" round @click="copyLink" class="shareLinkBtn"
|
||||
:disabled="!validityPeriod || isExpired">
|
||||
{{ $t('trials:researchRecord:button:copyLink') }}
|
||||
</el-button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="shareCode">
|
||||
<div class="qrCode">
|
||||
<div id="qrcode" ref="qrcode"></div>
|
||||
</div>
|
||||
<div class="codeBtnBox">
|
||||
<el-button @click="handleCopyImg" type="primary" round>{{
|
||||
$t('trials:researchRecord:button:copyCode')
|
||||
}}</el-button>
|
||||
<el-button @click="savePic" round>{{
|
||||
$t('trials:researchRecord:button:savePic')
|
||||
}}</el-button>
|
||||
<div class="shareCode">
|
||||
<h3>{{ $t('trials:researchRecord:label:shareCode') }}</h3>
|
||||
<div style="display: flex;align-items: center;justify-content: space-between;">
|
||||
<div class="qrCodeBox">
|
||||
<div id="qrcode" ref="qrcode"></div>
|
||||
</div>
|
||||
<div class="codeBtnBox">
|
||||
<el-button @click="handleCopyImg" type="primary" round :disabled="!validityPeriod || isExpired">{{
|
||||
$t('trials:researchRecord:button:copyCode')
|
||||
}}</el-button>
|
||||
<el-button @click="savePic" round :disabled="!validityPeriod || isExpired">{{
|
||||
$t('trials:researchRecord:button:savePic')
|
||||
}}</el-button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
</base-model>
|
||||
</BaseContainer>
|
||||
|
|
@ -231,6 +262,9 @@ import {
|
|||
getTrialSiteSurveyList,
|
||||
getTrialSiteSelect,
|
||||
abandonSiteSurvey,
|
||||
setTrialLinkExpirationTime,
|
||||
getTrialLinkExpirationTime,
|
||||
getLinkLinkExpirationTime,
|
||||
} from '@/api/trials'
|
||||
import { changeURLStatic } from '@/utils/history.js'
|
||||
import BaseContainer from '@/components/BaseContainer'
|
||||
|
|
@ -272,14 +306,50 @@ export default {
|
|||
share_model: {
|
||||
visible: false,
|
||||
title: this.$t('trials:researchRecord:title:shark'),
|
||||
width: '800px',
|
||||
width: '1000px',
|
||||
},
|
||||
shareLink: '',
|
||||
researchState: this.$d.ResearchRecord,
|
||||
qrcode: null,
|
||||
validityPeriod: null,
|
||||
isExpired: false,
|
||||
shareLoading: false,
|
||||
shareForm: {
|
||||
ExpirationDays: null,
|
||||
OtherExpirationDays: null,
|
||||
LinkVerificationCode: null,
|
||||
OtherLinkVerificationCode: null,
|
||||
},
|
||||
rules: {
|
||||
ExpirationDays: [
|
||||
{ required: true, message: this.$t("common:ruleMessage:select"), trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === 'default' && !this.shareForm.OtherExpirationDays) {
|
||||
callback(new Error(this.$t("common:ruleMessage:specify")));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
|
||||
}, trigger: 'blur'
|
||||
}
|
||||
],
|
||||
LinkVerificationCode: [
|
||||
{ required: true, message: this.$t("common:ruleMessage:select"), trigger: 'blur' },
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value === 'default' && !this.shareForm.OtherLinkVerificationCode) {
|
||||
callback(new Error(this.$t("common:ruleMessage:specify")));
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
|
||||
}, trigger: 'blur'
|
||||
}
|
||||
],
|
||||
},
|
||||
ImageManualVisible: false,
|
||||
trialSiteSurveyId: null
|
||||
trialSiteSurveyId: null,
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
|
|
@ -287,6 +357,77 @@ export default {
|
|||
this.getSite()
|
||||
},
|
||||
methods: {
|
||||
async getLinkTimeIsExpired() {
|
||||
try {
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await getLinkLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.isExpired = res.Result.IsIsExpired
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async getLinkTime() {
|
||||
try {
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await getTrialLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.validityPeriod = res.Result.LinkExpirationTime
|
||||
if (!this.validityPeriod) return false
|
||||
this.getLinkTimeIsExpired()
|
||||
this.shareLink = `${location.protocol}//${location.host}/researchLogin?trialId=${this.$route.query.trialId}`
|
||||
this.$nextTick(() => {
|
||||
this.creatQrCode()
|
||||
})
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
async setLink() {
|
||||
try {
|
||||
let validate = await this.$refs.shareForm.validate()
|
||||
if (!validate) return false
|
||||
let data = {
|
||||
TrialId: this.$route.query.trialId,
|
||||
ExpirationDays: this.shareForm.ExpirationDays,
|
||||
LinkVerificationCode: this.shareForm.LinkVerificationCode
|
||||
}
|
||||
if (this.shareForm.LinkVerificationCode === 'researchProgramNo') {
|
||||
data.LinkVerificationCode = null
|
||||
}
|
||||
if (this.shareForm.LinkVerificationCode === 'default') {
|
||||
data.LinkVerificationCode = this.shareForm.OtherLinkVerificationCode
|
||||
}
|
||||
if (this.shareForm.ExpirationDays === 'default') {
|
||||
data.ExpirationDays = this.shareForm.OtherExpirationDays
|
||||
}
|
||||
this.shareLoading = true
|
||||
let res = await setTrialLinkExpirationTime(data)
|
||||
this.shareLoading = false
|
||||
if (res.IsSuccess) {
|
||||
this.getLinkTime()
|
||||
}
|
||||
} catch (err) {
|
||||
this.shareLoading = false
|
||||
console.log(err)
|
||||
}
|
||||
},
|
||||
handleInput(val) {
|
||||
// 过滤掉非数字字符,并取整为正整数
|
||||
this.shareForm.OtherExpirationDays = val.replace(/[^\d]/g, '').replace(/^0+/, '')
|
||||
},
|
||||
openImageManual() {
|
||||
// if (!this.trialSiteSurveyId) return false
|
||||
this.ImageManualVisible = true
|
||||
|
|
@ -344,7 +485,7 @@ export default {
|
|||
// 中心调研表链接
|
||||
this.$copyText(
|
||||
`${this.$t('trials:researchRecord:message:researchFormLink')}: ${this.shareLink
|
||||
}`
|
||||
}\n${this.$t('trials:researchRecord:label:ValidityPeriod')}:${this.validityPeriod}`
|
||||
)
|
||||
.then((res) => {
|
||||
// 复制成功
|
||||
|
|
@ -415,13 +556,18 @@ export default {
|
|||
},
|
||||
// 展示调查表链接
|
||||
showResearchLink() {
|
||||
const trialId = this.trialId
|
||||
this.shareLink = `${location.protocol}//${location.host}/researchLogin?trialId=${trialId}&lang=${this.$i18n.locale}`
|
||||
this.shareForm = {
|
||||
ExpirationDays: null,
|
||||
OtherExpirationDays: null,
|
||||
LinkVerificationCode: null,
|
||||
OtherLinkVerificationCode: null,
|
||||
}
|
||||
this.validityPeriod = null
|
||||
this.isExpired = false
|
||||
this.share_model.visible = true
|
||||
this.getLinkTime()
|
||||
// &lang=${this.$i18n.locale}
|
||||
// this.trialSiteSurveyId = this.list[0].Id
|
||||
this.$nextTick(() => {
|
||||
this.creatQrCode()
|
||||
})
|
||||
},
|
||||
// 重置
|
||||
handleReset() {
|
||||
|
|
@ -462,41 +608,54 @@ export default {
|
|||
}
|
||||
</script>
|
||||
<style lang="scss" scoped>
|
||||
.shareLink {
|
||||
padding-right: 20px;
|
||||
width: 50%;
|
||||
position: relative;
|
||||
.date,
|
||||
.share {
|
||||
width: 55%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.shareLinkBtn {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
left: 0px;
|
||||
.dayInput {
|
||||
::v-deep .el-input__inner {
|
||||
padding-left: 5px;
|
||||
}
|
||||
}
|
||||
|
||||
.shareCode {
|
||||
width: 50%;
|
||||
border-left: 1px solid #eee;
|
||||
|
||||
.date {
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.share {
|
||||
width: 45%;
|
||||
padding-left: 5%;
|
||||
border-left: 1px solid #000;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.shareLinkBtn {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.qrCodeBox {
|
||||
width: 220px;
|
||||
height: 220px;
|
||||
display: flex;
|
||||
border: 1px solid #c0c4cc;
|
||||
border-radius: 5px;
|
||||
box-shadow: 1px 1px 5px #c0c4cc;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
|
||||
.qrCode {
|
||||
width: 220px;
|
||||
height: 220px;
|
||||
display: flex;
|
||||
border: 1px solid #c0c4cc;
|
||||
border-radius: 5px;
|
||||
box-shadow: 1px 1px 5px #c0c4cc;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.dateBox {
|
||||
margin: 10px;
|
||||
}
|
||||
|
||||
.codeBtnBox {
|
||||
margin-top: 20px;
|
||||
width: 100%;
|
||||
display: flex;
|
||||
justify-content: space-around;
|
||||
.codeBtnBox {
|
||||
|
||||
::v-deep .el-button {
|
||||
display: block;
|
||||
margin: 10px auto;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
|
|
|||
Loading…
Reference in New Issue