caiyiling 2024-04-25 14:47:13 +08:00
commit 7a0a8bfa5c
33 changed files with 1823 additions and 959 deletions

View File

@ -2,12 +2,10 @@
import Vue from 'vue' import Vue from 'vue'
import 'normalize.css/normalize.css' // A modern alternative to CSS resets import 'normalize.css/normalize.css' // A modern alternative to CSS resets
import ElementUI, { MessageBox } from 'element-ui' import ElementUI from 'element-ui'
import { getBasicDataAllSelect, getFrontInternationalizationList } from '@/api/dictionary/dictionary' import { getBasicDataAllSelect, getFrontInternationalizationList } from '@/api/dictionary/dictionary'
// import 'element-ui/lib/theme-chalk/index.css'
import './assets/css/theme-blue/index.css' // 浅绿色主题 import './assets/css/theme-blue/index.css' // 浅绿色主题
import './assets/css/iconfont/index.css' // 阿里巴巴图标库 import './assets/css/iconfont/index.css' // 阿里巴巴图标库
// import locale from 'element-ui/lib/locale/lang/en' // lang i18n
import i18n from './lang' import i18n from './lang'
import '@/styles/index.scss' // global css import '@/styles/index.scss' // global css
@ -23,10 +21,7 @@ import '@/permission' // permission control
import md5 from 'js-md5' import md5 from 'js-md5'
import VueClipboard from 'vue-clipboard2' import VueClipboard from 'vue-clipboard2'
Vue.use(VueClipboard) Vue.use(VueClipboard)
// import htmlToPdf from './utils/htmlToPdf'
// Vue.use(htmlToPdf)
import permission from './utils/permission' import permission from './utils/permission'
import { OSSclient } from './utils/oss'
Vue.use(permission) Vue.use(permission)
import Viewer from 'v-viewer' import Viewer from 'v-viewer'

View File

@ -10,10 +10,18 @@ import { OSSclient } from './utils/oss'
NProgress.configure({ showSpinner: false }) NProgress.configure({ showSpinner: false })
const whiteList = ['/activate','/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms'] const whiteList = ['/activate', '/ReviewersResearch', '/login', '/error', '/resetpassword', '/recompose', '/email-recompose', '/trialStats', '/showdicom', '/imagesShare', '/audit', '/preview', '/researchLogin', '/blindResumeInfo', '/trialsResume', '/joinVerify', '/showNoneDicoms', '/noneDicomReading', '/clinicalData', '/readingDicoms', '/readingPage', '/visitDicomReview', '/visitNondicomReview', '/globalReview', '/adReview', '/oncologyReview', '/nonedicoms']
// 影像页关闭
Vue.prototype.$openWindow = null
Vue.prototype.$setOpenWindow = (openWindow) => {
if (Vue.prototype.$openWindow) {
Vue.prototype.$openWindow.close();
}
Vue.prototype.$openWindow = openWindow;
}
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
NProgress.start() NProgress.start()
Vue.prototype.$setOpenWindow();
// 设置页面标题 // 设置页面标题
// document.title = getPageTitle(to.meta.title) // document.title = getPageTitle(to.meta.title)

View File

@ -14,8 +14,8 @@ service.interceptors.request.use(
config => { config => {
config.headers['Content-Type'] = 'application/json;charset=UTF-8' config.headers['Content-Type'] = 'application/json;charset=UTF-8'
var language = zzSessionStorage.getItem('lang') var language = zzSessionStorage.getItem('lang')
config.headers['Accept-Language'] = language === 'en'?'en-US,en;q=0.5':'zh-CN,zh;q=0.9' config.headers['Accept-Language'] = language === 'en' ? 'en-US,en;q=0.5' : 'zh-CN,zh;q=0.9'
console.log(config.headers) // console.log(config.headers)
if (store.getters.token) { if (store.getters.token) {
config.headers.Authorization = `Bearer ${store.getters.token}` config.headers.Authorization = `Bearer ${store.getters.token}`
} }
@ -30,14 +30,14 @@ service.interceptors.response.use(
response => { response => {
const res = response.data const res = response.data
let fileReader = new FileReader(); let fileReader = new FileReader();
fileReader.onload = function() { fileReader.onload = function () {
try { try {
let jsonData = JSON.parse(fileReader.result); // 如果是普通对象数据,后台转换失败 let jsonData = JSON.parse(fileReader.result); // 如果是普通对象数据,后台转换失败
if (!jsonData.IsSuccess && jsonData.ErrorMessage) { if (!jsonData.IsSuccess && jsonData.ErrorMessage) {
MessageBox.confirm(jsonData.ErrorMessage, { MessageBox.confirm(jsonData.ErrorMessage, {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
callback: action => {} callback: action => { }
}) })
return Promise.reject(jsonData) return Promise.reject(jsonData)
} }
@ -66,19 +66,19 @@ service.interceptors.response.use(
if (error && error.response) { if (error && error.response) {
const status = error.response.status const status = error.response.status
switch (status) { switch (status) {
case 400: message = store.state.lang.language === 'en'? 'Request error' : '请求错误'; break case 400: message = store.state.lang.language === 'en' ? 'Request error' : '请求错误'; break
case 401: message = store.state.lang.language === 'en'? 'Not authorized or login timed out. Please log in again.' : '未授权或登陆超时,请重新登录'; break case 401: message = store.state.lang.language === 'en' ? 'Not authorized or login timed out. Please log in again.' : '未授权或登陆超时,请重新登录'; break
case 403: message = error.response.data.ErrorMessage; break case 403: message = error.response.data.ErrorMessage; break
case 404: message = store.state.lang.language === 'en'? 'Request address error' : `请求地址出错`; break case 404: message = store.state.lang.language === 'en' ? 'Request address error' : `请求地址出错`; break
case 405: message = store.state.lang.language === 'en'? 'Interface parameter error or request method inconsistency' : `接口参数传递错误,或者请求方法不一致`; break case 405: message = store.state.lang.language === 'en' ? 'Interface parameter error or request method inconsistency' : `接口参数传递错误,或者请求方法不一致`; break
case 408: message = store.state.lang.language === 'en'? 'Request timed out' : '请求超时'; break case 408: message = store.state.lang.language === 'en' ? 'Request timed out' : '请求超时'; break
case 429: message = store.state.lang.language === 'en'? 'The application service limits the traffic. Your requests are too frequent. Please try again later.' : '应用服务限流,您的请求过于频繁,请稍后再试'; break case 429: message = store.state.lang.language === 'en' ? 'The application service limits the traffic. Your requests are too frequent. Please try again later.' : '应用服务限流,您的请求过于频繁,请稍后再试'; break
case 500: message = store.state.lang.language === 'en'? 'Internal server error, and unable to complete the request. Software release might be in process. Please contact the administrator.' : '服务器内部错误,无法完成请求;可能正在发布中,请联系管理员处理'; break case 500: message = store.state.lang.language === 'en' ? 'Internal server error, and unable to complete the request. Software release might be in process. Please contact the administrator.' : '服务器内部错误,无法完成请求;可能正在发布中,请联系管理员处理'; break
case 501: message = store.state.lang.language === 'en'? 'Service has not been implemented.' : '服务未实现'; break case 501: message = store.state.lang.language === 'en' ? 'Service has not been implemented.' : '服务未实现'; break
case 502: message = store.state.lang.language === 'en'? 'System is being upgraded. Please wait patiently.' : '系统正在升级,请耐心等待。'; break case 502: message = store.state.lang.language === 'en' ? 'System is being upgraded. Please wait patiently.' : '系统正在升级,请耐心等待。'; break
case 503: message = store.state.lang.language === 'en'? 'Service is not available' : '服务不可用'; break case 503: message = store.state.lang.language === 'en' ? 'Service is not available' : '服务不可用'; break
case 504: message = store.state.lang.language === 'en'? 'Gateway timed out' : '网关超时'; break case 504: message = store.state.lang.language === 'en' ? 'Gateway timed out' : '网关超时'; break
case 505: message = store.state.lang.language === 'en'? 'HTTP version is not supported' : 'HTTP版本不受支持'; break case 505: message = store.state.lang.language === 'en' ? 'HTTP version is not supported' : 'HTTP版本不受支持'; break
default: break default: break
} }
if (error.response.status === 401) { if (error.response.status === 401) {
@ -100,7 +100,7 @@ service.interceptors.response.use(
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
confirmButtonText: '确定', confirmButtonText: '确定',
callback: action => {} callback: action => { }
}) })
} }
} }

View File

@ -68,7 +68,7 @@
<el-form-item <el-form-item
:label="$t('trials:researchForm:form:checkCode')" :label="$t('trials:researchForm:form:checkCode')"
prop="CheckCode" prop="CheckCode"
:maxlength="10" :maxlength="6"
> >
<el-input v-model="password.CheckCode" type="number" /> <el-input v-model="password.CheckCode" type="number" />
</el-form-item> </el-form-item>

View File

@ -6,6 +6,7 @@
width="500px" width="500px"
custom-class="base-dialog-wrapper" custom-class="base-dialog-wrapper"
append-to-body append-to-body
:before-close="handleCancel"
> >
<el-form <el-form
ref="editVisitForm" ref="editVisitForm"

View File

@ -3,7 +3,10 @@
<div ref="leftContainer" class="left"> <div ref="leftContainer" class="left">
<el-form :inline="true"> <el-form :inline="true">
<!--AE Title--> <!--AE Title-->
<el-form-item label="AE Title" prop="CalledAE"> <el-form-item
:label="$t('system:dicom:search:AETitle')"
prop="CalledAE"
>
<el-input <el-input
v-model="searchData.CalledAE" v-model="searchData.CalledAE"
style="width: 140px" style="width: 140px"
@ -11,11 +14,11 @@
/> />
</el-form-item> </el-form-item>
<!--IP--> <!--IP-->
<el-form-item label="IP" prop="IP"> <el-form-item :label="$t('system:dicom:search:IP')" prop="IP">
<el-input v-model="searchData.IP" style="width: 140px" clearable /> <el-input v-model="searchData.IP" style="width: 140px" clearable />
</el-form-item> </el-form-item>
<!--Port--> <!--Port-->
<el-form-item label="Port" prop="Port"> <el-form-item :label="$t('system:dicom:search:Port')" prop="Port">
<el-input v-model="searchData.Port" style="width: 140px" clearable /> <el-input v-model="searchData.Port" style="width: 140px" clearable />
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
@ -41,44 +44,43 @@
> >
<!--AE Title--> <!--AE Title-->
<el-table-column <el-table-column
label="AE Title" :label="$t('system:dicom:table:AETitle')"
prop="CalledAE" prop="CalledAE"
min-width="120" min-width="120"
show-overflow-tooltip show-overflow-tooltip
/> />
<!--IP--> <!--IP-->
<el-table-column <el-table-column
label="IP" :label="$t('system:dicom:table:IP')"
prop="IP" prop="IP"
min-width="120" min-width="120"
show-overflow-tooltip show-overflow-tooltip
/> />
<!--Port--> <!--Port-->
<el-table-column <el-table-column
label="Port" :label="$t('system:dicom:table:Port')"
prop="Port" prop="Port"
min-width="120" min-width="120"
show-overflow-tooltip show-overflow-tooltip
/> />
<!--Modality--> <!--Modality-->
<el-table-column <el-table-column
label="Modality" :label="$t('system:dicom:table:Modality')"
prop="Modality" prop="Modality"
min-width="120" min-width="120"
show-overflow-tooltip show-overflow-tooltip
/> />
<!--Description--> <!--Description-->
<el-table-column <el-table-column
label="Description" :label="$t('system:dicom:table:Description')"
prop="Description" prop="Description"
min-width="120" min-width="120"
show-overflow-tooltip show-overflow-tooltip
/> />
<el-table-column <el-table-column
label="actions" :label="$t('system:dicom:table:action')"
fixed="right" fixed="right"
prop="UserTypeShortName" prop="UserTypeShortName"
min-width="200"
show-overflow-tooltip show-overflow-tooltip
> >
<template slot-scope="scope"> <template slot-scope="scope">
@ -87,7 +89,7 @@
type="text" type="text"
v-hasPermi="['system:dicom:edit']" v-hasPermi="['system:dicom:edit']"
@click="openDialog('edit', scope.row)" @click="openDialog('edit', scope.row)"
>编辑</el-button >{{ $t("system:dicom:table:edit") }}</el-button
> >
<el-button <el-button
size="mini" size="mini"
@ -212,7 +214,9 @@ export default {
}, },
// //
async test(item) { async test(item) {
this.loading = true;
let res = await testConnect(item.Id); let res = await testConnect(item.Id);
this.loading = false;
if (res.IsSuccess && res.Result) { if (res.IsSuccess && res.Result) {
this.$message.success(this.$t("system:dicomAE:connect:success")); this.$message.success(this.$t("system:dicomAE:connect:success"));
} else { } else {

View File

@ -14,7 +14,7 @@
> >
<el-select v-model="form.NoticeLevelEnum" clearable size="small"> <el-select v-model="form.NoticeLevelEnum" clearable size="small">
<el-option <el-option
v-for="item of dict.type.NoteLevel" v-for="item of $d.NoteLevel"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.raw.Code * 1" :value="item.raw.Code * 1"
@ -27,10 +27,10 @@
> >
<el-select v-model="form.NoticeTypeEnum" clearable size="small"> <el-select v-model="form.NoticeTypeEnum" clearable size="small">
<el-option <el-option
v-for="item of dict.type.NoteType" v-for="item of $d.NoteType"
:key="item.value" :key="item.id"
:label="item.label" :label="item.label"
:value="item.raw.Code * 1" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -44,10 +44,10 @@
size="small" size="small"
> >
<el-option <el-option
v-for="item of dict.type.NoticeApplicableTrial" v-for="item of $d.TrialType"
:key="item.value" :key="item.id"
:label="item.label" :label="item.label"
:value="item.raw.Code * 1" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -75,10 +75,10 @@
> >
<el-select v-model="form.NoticeModeEnum" clearable size="small"> <el-select v-model="form.NoticeModeEnum" clearable size="small">
<el-option <el-option
v-for="item of dict.type.NoticeMode" v-for="item of $d.NoticeMode"
:key="item.value" :key="item.value"
:label="item.label" :label="item.label"
:value="item.raw.Code * 1" :value="item.value"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>

View File

@ -25,7 +25,7 @@
> >
<el-select v-model="searchData.NoticeTypeEnum" clearable size="small"> <el-select v-model="searchData.NoticeTypeEnum" clearable size="small">
<el-option <el-option
v-for="item of $d.TrialType" v-for="item of $d.NoteType"
:key="item.id" :key="item.id"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
@ -42,8 +42,8 @@
size="small" size="small"
> >
<el-option <el-option
v-for="item of $d.NoticeApplicableTrial" v-for="item of $d.TrialType"
:key="item.value" :key="item.id"
:label="item.label" :label="item.label"
:value="item.value" :value="item.value"
/> />
@ -60,10 +60,10 @@
size="small" size="small"
> >
<el-option <el-option
v-for="item of $d.UserType" v-for="item of roleList"
:key="item.Id" :key="item.Id"
:label="item.label" :label="item.UserTypeShortName"
:value="item.value" :value="item.Id"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -188,10 +188,10 @@
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{ {{
$d.NoticeApplicableTrial.find((v) => { $d.TrialType.find((v) => {
return v.raw.Code * 1 === scope.row.ApplicableProjectEnum; return v.raw.Code * 1 === scope.row.ApplicableProjectEnum;
}) })
? $d.NoticeApplicableTrial.find((v) => { ? $d.TrialType.find((v) => {
return v.raw.Code * 1 === scope.row.ApplicableProjectEnum; return v.raw.Code * 1 === scope.row.ApplicableProjectEnum;
}).label }).label
: "" : ""
@ -237,7 +237,7 @@
show-overflow-tooltip show-overflow-tooltip
> >
<template slot-scope="scope"> <template slot-scope="scope">
{{ scope.row.StartDate }}-{{ scope.row.EndDate }} {{ scope.row.StartDate }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
@ -287,9 +287,11 @@
min-width="200" min-width="200"
show-overflow-tooltip show-overflow-tooltip
v-if=" v-if="
hasPermi(['system:notice:edit']) || hasPermi([
hasPermi(['system:notice:publish']) || 'system:notice:edit',
hasPermi(['system:notice:back']) 'system:notice:publish',
'system:notice:back',
])
" "
> >
<template slot-scope="scope"> <template slot-scope="scope">
@ -436,7 +438,11 @@ export default {
getUserTypeRoleList() { getUserTypeRoleList() {
getUserTypeRoleList({}) getUserTypeRoleList({})
.then((res) => { .then((res) => {
this.roleList = res.Result; this.roleList = res.Result.map((item) => {
if ([4, 5, 8, 9, 12, 14].includes(item.UserTypeEnum)) {
return item;
}
}).filter((item) => item);
}) })
.catch(() => {}); .catch(() => {});
}, },

View File

@ -76,13 +76,12 @@
ref="userType" ref="userType"
v-model="user.UserTypeId" v-model="user.UserTypeId"
size="small" size="small"
placeholder="Please select" placeholder=""
style="width: 100%" style="width: 100%"
:disabled="user.CanEditUserType === false" :disabled="user.CanEditUserType === false"
> >
<template v-for="(userType, key) of userTypeOptions"> <template v-for="(userType, key) of userTypeOptions">
<el-option <el-option
v-if="userType.UserTypeEnum !== 20"
:key="key" :key="key"
:label="userType.UserType" :label="userType.UserType"
:value="userType.Id" :value="userType.Id"
@ -368,7 +367,15 @@ export default {
getUserTypeList() { getUserTypeList() {
getUserTypeListByUserType(0).then((res) => { getUserTypeListByUserType(0).then((res) => {
if (res.IsSuccess) { if (res.IsSuccess) {
this.userTypeOptions = res.Result; let arr = [2, 4, 5, 8, 9, 12, 14];
if (this.hasPermi(["role:oa"])) {
arr = [4, 5, 8, 9, 12, 14];
}
this.userTypeOptions = res.Result.map((item) => {
if (arr.includes(item.UserTypeEnum)) {
return item;
}
}).filter((item) => item);
} }
}); });
}, },

View File

@ -108,6 +108,7 @@
:Patient="PatientData" :Patient="PatientData"
:submitMessage="submitMessage" :submitMessage="submitMessage"
:status="status" :status="status"
@close="beforeCloseStudyDig"
/> />
<base-model v-if="addSubject_model.visible" :config="addSubject_model"> <base-model v-if="addSubject_model.visible" :config="addSubject_model">
<template slot="dialog-body"> <template slot="dialog-body">

View File

@ -456,6 +456,7 @@ export default {
}); });
var newWindow = window.open(routeData.href, "_blank"); var newWindow = window.open(routeData.href, "_blank");
this.$emit("setOpenWindow", newWindow); this.$emit("setOpenWindow", newWindow);
this.$setOpenWindow(newWindow);
}, },
// //
async confirmSubmit() { async confirmSubmit() {
@ -487,6 +488,7 @@ export default {
this.$message.success( this.$message.success(
this.$t("trials:crcUpload:message:submittedSuccessfully") this.$t("trials:crcUpload:message:submittedSuccessfully")
); );
this.$emit("close");
} }
} catch (err) { } catch (err) {
this.btnLoading2 = false; this.btnLoading2 = false;

View File

@ -38,22 +38,11 @@
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
width: 80px; width: 150px;
" "
> >
{{ $t("trials:trials-list:table:researchNumber") }} {{ $t("trials:trials-list:table:researchNumber") }}
</div> </div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ $t("trials:trials-list:table:experimentName") }}
</div>
<div <div
style=" style="
display: inline-block; display: inline-block;
@ -65,6 +54,17 @@
> >
{{ $t("trials:trials-list:table:sponsor") }} {{ $t("trials:trials-list:table:sponsor") }}
</div> </div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ $t("trials:trials-list:table:experimentName") }}
</div>
</div> </div>
</div> </div>
<el-tooltip <el-tooltip
@ -80,11 +80,11 @@
{{ $t("trials:trials-list:table:researchNumber") }}: {{ $t("trials:trials-list:table:researchNumber") }}:
{{ item.ResearchProgramNo }} {{ item.ResearchProgramNo }}
<br /> <br />
{{ $t("trials:trials-list:table:experimentName") }}:
{{ item.ExperimentName }}
<br />
{{ $t("trials:trials-list:table:sponsor") }}: {{ $t("trials:trials-list:table:sponsor") }}:
{{ item.SponsorName }} {{ item.SponsorName }}
<br />
{{ $t("trials:trials-list:table:experimentName") }}:
{{ item.ExperimentName }}
</div> </div>
<div <div
class="options_item" class="options_item"
@ -100,22 +100,11 @@
overflow: hidden; overflow: hidden;
text-overflow: ellipsis; text-overflow: ellipsis;
white-space: nowrap; white-space: nowrap;
width: 80px; width: 150px;
" "
> >
{{ item.ResearchProgramNo }} {{ item.ResearchProgramNo }}
</div> </div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ item.ExperimentName }}
</div>
<div <div
style=" style="
display: inline-block; display: inline-block;
@ -127,6 +116,17 @@
> >
{{ item.SponsorName }} {{ item.SponsorName }}
</div> </div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ item.ExperimentName }}
</div>
</div> </div>
</el-tooltip> </el-tooltip>
</div> </div>
@ -233,7 +233,11 @@ export default {
inputChange(v) { inputChange(v) {
this.resultFilter = this.options.filter((o) => { this.resultFilter = this.options.filter((o) => {
var reg = new RegExp(v, "ig"); var reg = new RegExp(v, "ig");
return reg.test(o.ResearchProgramNo) || reg.test(o.ExperimentName)|| reg.test(o.SponsorName); return (
reg.test(o.ResearchProgramNo) ||
reg.test(o.ExperimentName) ||
reg.test(o.SponsorName)
);
}); });
}, },
}, },

View File

@ -207,6 +207,7 @@ export default {
methods: { methods: {
// //
beforeCloseStudyDig() { beforeCloseStudyDig() {
this.$setOpenWindow();
this.$emit("update:visible", false); this.$emit("update:visible", false);
}, },
// //
@ -256,7 +257,8 @@ export default {
const routeData = this.$router.resolve({ const routeData = this.$router.resolve({
path: `/showdicom?studyId=${item.SCPStudyId}&TokenKey=${token}&type=Patient`, path: `/showdicom?studyId=${item.SCPStudyId}&TokenKey=${token}&type=Patient`,
}); });
window.open(routeData.href, "_blank"); let newWindow = window.open(routeData.href, "_blank");
this.$setOpenWindow(newWindow);
}, },
// //
report() {}, report() {},

View File

@ -110,7 +110,7 @@
v-model="trialForm.CriterionTypeList" v-model="trialForm.CriterionTypeList"
multiple multiple
clearable clearable
:disabled="trialForm.Id !== ''" :disabled="TrialStatusStr === 'Ongoing'"
> >
<el-option <el-option
v-for="item of CriterionTypeList" v-for="item of CriterionTypeList"
@ -330,6 +330,7 @@ export default {
phaseNum: null, phaseNum: null,
dictionaryList: {}, dictionaryList: {},
CriterionTypeList: [], // CriterionTypeList: [], //
TrialStatusStr: null, //
}; };
}, },
computed: { computed: {
@ -367,6 +368,7 @@ export default {
)[0].raw.ChildGroup; )[0].raw.ChildGroup;
} }
} }
this.TrialStatusStr = res.Result.TrialStatusStr;
} }
}) })
.catch(() => { .catch(() => {

View File

@ -75,7 +75,7 @@
</el-form-item> </el-form-item>
<!-- 激活码 --> <!-- 激活码 -->
<el-form-item label="激活码"> <el-form-item label="激活码">
<span>{{ form.code }}</span> <el-input v-model="form.code" />
</el-form-item> </el-form-item>
</div> </div>
<div class="base-dialog-footer" style="text-align: right; margin-top: 10px"> <div class="base-dialog-footer" style="text-align: right; margin-top: 10px">
@ -122,6 +122,7 @@ export default {
PurchaseDuration: null, PurchaseDuration: null,
TrialCode: null, TrialCode: null,
TrialId: null, TrialId: null,
HospitalCode: null,
}, },
}; };
}, },
@ -159,6 +160,7 @@ export default {
CriterionTypeList: this.data.CriterionTypeList, CriterionTypeList: this.data.CriterionTypeList,
CreateUserId: this.data.CreateUserId, CreateUserId: this.data.CreateUserId,
AuthorizationDeadLineDate: null, AuthorizationDeadLineDate: null,
HospitalCode: this.data.HospitalCode,
}; };
let res = await getTrialActivationCode(params); let res = await getTrialActivationCode(params);
if (res.IsSuccess) { if (res.IsSuccess) {

View File

@ -15,7 +15,7 @@
label-width="120px" label-width="120px"
> >
<div class="base-dialog-body"> <div class="base-dialog-body">
<p>授权申请信息</p> <p>{{ $t("trials:activate:ApplyMessage") }}</p>
<!-- 单位名称 --> <!-- 单位名称 -->
<el-form-item <el-form-item
:label="$t('trials:trials-list:activate:organizationName')" :label="$t('trials:trials-list:activate:organizationName')"
@ -71,13 +71,6 @@
prop="Activate" prop="Activate"
> >
<el-input v-model="form.Activate" :disabled="isActivate" /> <el-input v-model="form.Activate" :disabled="isActivate" />
<span
v-if="form.Activate"
class="copy"
@click.stop="getActivationCodeInfo"
style="margin-left: 10px"
>{{ $t("trials:reviewTrack:impactList:save") }}</span
>
<input <input
type="file" type="file"
id="uploadFileInp" id="uploadFileInp"
@ -91,9 +84,16 @@
v-if="!isActivate" v-if="!isActivate"
>{{ $t("trials:activate:button:upload") }}</label >{{ $t("trials:activate:button:upload") }}</label
> >
<span
v-if="form.Activate"
class="copy"
@click.stop="getActivationCodeInfo"
style="margin-left: 10px"
>{{ $t("trials:reviewTrack:impactList:save") }}</span
>
</el-form-item> </el-form-item>
<div v-if="isActivate"> <div v-if="isActivate">
<p>授权信息</p> <p>{{ $t("trials:activate:Message") }}</p>
<!-- 单位名称 --> <!-- 单位名称 -->
<el-form-item <el-form-item
:label="$t('trials:trials-list:activate:organizationName')" :label="$t('trials:trials-list:activate:organizationName')"
@ -184,6 +184,7 @@ export default {
HospitalName: null, HospitalName: null,
CriterionTypeList: [], CriterionTypeList: [],
CreateUserId: null, CreateUserId: null,
HospitalCode: null,
AuthorizationDeadLineDate: null, AuthorizationDeadLineDate: null,
}, },
ActivateData: { ActivateData: {
@ -193,6 +194,7 @@ export default {
HospitalName: null, HospitalName: null,
CriterionTypeList: [], CriterionTypeList: [],
CreateUserId: null, CreateUserId: null,
HospitalCode: null,
AuthorizationDeadLineDate: null, AuthorizationDeadLineDate: null,
}, },
btnLoading: false, btnLoading: false,
@ -260,6 +262,7 @@ export default {
HospitalName: this.form.HospitalName, HospitalName: this.form.HospitalName,
CriterionTypeList: this.form.CriterionTypeList, CriterionTypeList: this.form.CriterionTypeList,
CreateUserId: this.form.CreateUserId, CreateUserId: this.form.CreateUserId,
HospitalCode: this.form.HospitalCode,
}; };
try { try {
let res = await getTrialAuthorizationCode(params); let res = await getTrialAuthorizationCode(params);

View File

@ -99,6 +99,7 @@
stripe stripe
height="100" height="100"
@sort-change="handleSortChange" @sort-change="handleSortChange"
@row-click="handleDetail"
> >
<!-- <el-table-column type="selection" align="left" width="45" /> --> <!-- <el-table-column type="selection" align="left" width="45" /> -->
<el-table-column width="40"> <el-table-column width="40">
@ -166,12 +167,6 @@
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
/> />
<!--是否授权-->
<!-- <el-table-column
prop="Sponsor"
:label="$t('trials:trials-list:table:isAccredit')"
show-overflow-tooltip
/> -->
<el-table-column <el-table-column
prop="TrialStatusStr" prop="TrialStatusStr"
:label="$t('trials:trials-list:table:status')" :label="$t('trials:trials-list:table:status')"
@ -201,27 +196,41 @@
> >
</template> </template>
</el-table-column> </el-table-column>
<!--阅片标准-->
<el-table-column
prop="CriterionTypeList"
:label="$t('trials:trials-list:table:CriterionTypeList')"
show-overflow-tooltip
v-if="hasPermi(['role:pm', 'role:pi', 'role:sr'])"
>
<template slot-scope="scope">
<span>{{
scope.row.CriterionTypeList.map((item) =>
$fd("CriterionType", Number(item))
).join(",")
}}</span>
</template>
</el-table-column>
<!--待提交访视数量-->
<el-table-column
prop="UnSubmitCount"
:label="$t('trials:trials-list:table:UnSubmitCount')"
show-overflow-tooltip
v-if="hasPermi(['role:pm'])"
/>
<!--待阅片数量-->
<el-table-column
prop="UnReadCount"
:label="$t('trials:trials-list:table:UnReadCount')"
show-overflow-tooltip
v-if="hasPermi(['role:pm', 'role:pi', 'role:sr'])"
/>
<el-table-column <el-table-column
prop="CreateTime" prop="CreateTime"
:label="$t('trials:trials-list:table:createDate')" :label="$t('trials:trials-list:table:createDate')"
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
/> />
<!--授权日期-->
<!-- <el-table-column
prop="AuthorizationDate"
:label="$t('trials:trials-list:table:dateAuthorized')"
show-overflow-tooltip
sortable="custom"
>
<template slot-scope="scope">
<span>{{
scope.row.AuthorizationDate
? moment(scope.row.AuthorizationDate)
: ""
}}</span>
</template>
</el-table-column> -->
<!--授权时长--> <!--授权时长-->
<el-table-column <el-table-column
prop="AuthorizationDuration" prop="AuthorizationDuration"
@ -238,7 +247,7 @@
icon="el-icon-info" icon="el-icon-info"
:disabled="scope.row.IsDeleted" :disabled="scope.row.IsDeleted"
:title="$t('trials:trials-list:action:panel')" :title="$t('trials:trials-list:action:panel')"
@click="handleDetail(scope.row)" @click.stop="handleDetail(scope.row)"
/> />
<!-- 编辑项目基本信息 --> <!-- 编辑项目基本信息 -->
<el-button <el-button
@ -247,7 +256,7 @@
icon="el-icon-edit-outline" icon="el-icon-edit-outline"
:disabled="scope.row.IsDeleted" :disabled="scope.row.IsDeleted"
:title="$t('trials:trials-list:action:edit')" :title="$t('trials:trials-list:action:edit')"
@click="handleEdit(scope.row)" @click.stop="handleEdit(scope.row)"
/> />
<!-- 修改项目状态 --> <!-- 修改项目状态 -->
<el-button <el-button
@ -256,7 +265,7 @@
icon="el-icon-edit" icon="el-icon-edit"
:disabled="scope.row.IsDeleted" :disabled="scope.row.IsDeleted"
:title="$t('trials:trials-list:action:status')" :title="$t('trials:trials-list:action:status')"
@click="handleStatus(scope.row)" @click.stop="handleStatus(scope.row)"
/> />
<!-- 废除项目 --> <!-- 废除项目 -->
<el-button <el-button
@ -268,7 +277,7 @@
scope.row.TrialStatusStr !== 'Initializing' scope.row.TrialStatusStr !== 'Initializing'
" "
:title="$t('trials:trials-list:action:abolition')" :title="$t('trials:trials-list:action:abolition')"
@click="handleAbandon(scope.row)" @click.stop="handleAbandon(scope.row)"
/> />
<!-- 激活 --> <!-- 激活 -->
<el-button <el-button
@ -277,7 +286,7 @@
circle circle
icon="el-icon-key" icon="el-icon-key"
:title="$t('trials:trials-list:action:activate')" :title="$t('trials:trials-list:action:activate')"
@click="handleActivate(scope.row)" @click.stop="handleActivate(scope.row)"
/> />
</template> </template>
</el-table-column> </el-table-column>

View File

@ -42,7 +42,7 @@
<el-input <el-input
v-model="userForm.CheckCode" v-model="userForm.CheckCode"
:placeholder="$t('trials:researchForm:form:checkCode')" :placeholder="$t('trials:researchForm:form:checkCode')"
:maxlength="10" :maxlength="6"
type="number" type="number"
/> />
<!-- 修改 --> <!-- 修改 -->

View File

@ -150,6 +150,7 @@ export default {
}); });
var newWindow = window.open(routeData.href, "_blank"); var newWindow = window.open(routeData.href, "_blank");
this.$emit("setOpenWindow", newWindow); this.$emit("setOpenWindow", newWindow);
this.$setOpenWindow(newWindow);
}, },
// //
handleViewStudy(row) { handleViewStudy(row) {
@ -159,6 +160,7 @@ export default {
}); });
var newWindow = window.open(routeData.href, "_blank"); var newWindow = window.open(routeData.href, "_blank");
this.$emit("setOpenWindow", newWindow); this.$emit("setOpenWindow", newWindow);
this.$setOpenWindow(newWindow);
}, },
}, },
}; };

View File

@ -376,6 +376,7 @@ export default {
}, },
// //
beforeCloseStudyDig() { beforeCloseStudyDig() {
this.$setOpenWindow();
this.$emit("update:visible", false); this.$emit("update:visible", false);
}, },
// //
@ -390,6 +391,7 @@ export default {
}); });
var newWindow = window.open(routeData.href, "_blank"); var newWindow = window.open(routeData.href, "_blank");
this.$emit("setOpenWindow", newWindow); this.$emit("setOpenWindow", newWindow);
this.$setOpenWindow(newWindow);
}, },
// //
remove(item) { remove(item) {

View File

@ -184,6 +184,7 @@ export default {
}); });
var newWindow = window.open(routeData.href, "_blank"); var newWindow = window.open(routeData.href, "_blank");
this.$emit("setOpenWindow", newWindow); this.$emit("setOpenWindow", newWindow);
this.$setOpenWindow(newWindow);
}, },
// //
handleViewStudy(row) { handleViewStudy(row) {
@ -193,6 +194,7 @@ export default {
}); });
var newWindow = window.open(routeData.href, "_blank"); var newWindow = window.open(routeData.href, "_blank");
this.$emit("setOpenWindow", newWindow); this.$emit("setOpenWindow", newWindow);
this.$setOpenWindow(newWindow);
}, },
getBodyPart(bodyPart) { getBodyPart(bodyPart) {
if (!bodyPart) return ""; if (!bodyPart) return "";

View File

@ -343,6 +343,10 @@ export default {
}; };
}, },
created() { created() {
if (zzSessionStorage.getItem("SubjectCode")) {
this.searchData.SubjectCode = zzSessionStorage.getItem("SubjectCode");
zzSessionStorage.removeItem("SubjectCode");
}
this.getList(); this.getList();
}, },
methods: { methods: {

View File

@ -150,6 +150,14 @@
sortable="custom" sortable="custom"
show-overflow-tooltip show-overflow-tooltip
/> />
<!-- 阅片标准 -->
<el-table-column
prop="TrialReadingCriterionName"
:label="$t('trials:adReview:table:TrialReadingCriterionName')"
min-width="100"
sortable="custom"
show-overflow-tooltip
/>
<!-- 任务状态 --> <!-- 任务状态 -->
<el-table-column <el-table-column
prop="TaskState" prop="TaskState"

View File

@ -317,7 +317,7 @@ export default {
loading: false, loading: false,
total: 0, total: 0,
// //
reportBtnLoading: false, reportFlag: {},
}; };
}, },
created() { created() {
@ -331,16 +331,21 @@ export default {
}, },
// //
async showReport(item) { async showReport(item) {
if (this.reportBtnLoading) return; if (this.reportFlag[item.Id]) return;
let data = { let data = {
VisitTaskId: item.Id, VisitTaskId: item.Id,
}; };
try { try {
this.reportBtnLoading = true; if (!this.reportFlag.hasOwnProperty(item.Id)) {
this.$set(this.reportFlag, item.Id, true);
}
if (!this.reportFlag[item.Id]) {
this.reportFlag[item.Id] = true;
}
let res = await downLoadReadReport(data); let res = await downLoadReadReport(data);
this.reportBtnLoading = false; this.reportFlag[item.Id] = false;
} catch (err) { } catch (err) {
this.reportBtnLoading = false; this.reportFlag[item.Id] = false;
console.log(err); console.log(err);
} }
}, },

View File

@ -20,7 +20,6 @@
:label="item.UserTypeShortName" :label="item.UserTypeShortName"
:value="item.Id" :value="item.Id"
> >
<span>{{ item.UserType }}</span>
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -74,14 +73,14 @@
{{ $t('trials:staff:button:addExternalStaff') }} {{ $t('trials:staff:button:addExternalStaff') }}
</el-button> --> </el-button> -->
<!-- 导出 --> <!-- 导出 -->
<el-button <!-- <el-button
type="primary" type="primary"
icon="el-icon-download" icon="el-icon-download"
:disabled="list.length === 0" :disabled="list.length === 0"
@click="handleExport" @click="handleExport"
> >
{{ $t("common:button:export") }} {{ $t("common:button:export") }}
</el-button> </el-button> -->
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
@ -241,7 +240,11 @@
<!-- 分配参与人员模态框 --> <!-- 分配参与人员模态框 -->
<base-model v-if="staff_model.visible" :config="staff_model"> <base-model v-if="staff_model.visible" :config="staff_model">
<template slot="dialog-body"> <template slot="dialog-body">
<StaffForm v-if="isAdd == 'Add'" @closeDialog="closeDialog" /> <StaffForm
v-if="isAdd == 'Add'"
:userTypeOptions="userTypeOptions"
@closeDialog="closeDialog"
/>
<StaffExternalForm <StaffExternalForm
v-else v-else
@closeDialog="closeDialog" @closeDialog="closeDialog"
@ -335,6 +338,7 @@ import {
updateTrialUser, updateTrialUser,
trialUserListExport, trialUserListExport,
} from "@/api/trials"; } from "@/api/trials";
import { getUserTypeListByUserType } from "@/api/admin";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
import StaffForm from "./staffForm"; import StaffForm from "./staffForm";
import StaffExternalForm from "./staffExternalForm"; import StaffExternalForm from "./staffExternalForm";
@ -517,8 +521,12 @@ export default {
}, },
// //
getUserType() { getUserType() {
getTrialUserTypeList().then((res) => { getUserTypeListByUserType(0).then((res) => {
this.userTypeOptions = res.Result; this.userTypeOptions = res.Result.map((item) => {
if ([4, 5, 8, 9, 12].includes(item.UserTypeEnum)) {
return item;
}
}).filter((item) => item);
}); });
}, },
}, },

View File

@ -9,206 +9,313 @@
size="small" size="small"
> >
<!-- --> <!-- -->
<el-form-item :label="$t('trials:externalStaff:table:lastName')" prop="LastName"> <el-form-item
:label="$t('trials:externalStaff:table:lastName')"
prop="LastName"
>
<el-input v-model="form.LastName" /> <el-input v-model="form.LastName" />
</el-form-item> </el-form-item>
<!-- --> <!-- -->
<el-form-item :label="$t('trials:externalStaff:table:firstName')" prop="FirstName"> <el-form-item
:label="$t('trials:externalStaff:table:firstName')"
prop="FirstName"
>
<el-input v-model="form.FirstName" /> <el-input v-model="form.FirstName" />
</el-form-item> </el-form-item>
<!-- 用户类型 --> <!-- 用户类型 -->
<el-form-item :label="$t('trials:externalStaff:table:userType')" prop="UserTypeId"> <el-form-item
<el-select :label="$t('trials:externalStaff:table:userType')"
v-model="form.UserTypeId" prop="UserTypeId"
style="width:100%" >
> <el-select v-model="form.UserTypeId" style="width: 100%">
<el-option <el-option
v-for="item of userTypeOptions" v-for="item of userTypeOptions"
:key="item.Id" :key="item.Id"
:label="item.UserTypeShortName" :label="item.UserTypeShortName"
:value="item.Id" :value="item.Id"
> >
<span>{{ item.UserType }}</span> <!-- <span>{{ item.UserType }}</span> -->
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 电话号码 --> <!-- 电话号码 -->
<el-form-item :label="$t('trials:externalStaff:table:phone')" prop="Phone"> <el-form-item
:label="$t('trials:externalStaff:table:phone')"
prop="Phone"
>
<el-input v-model="form.Phone" /> <el-input v-model="form.Phone" />
</el-form-item> </el-form-item>
<!-- 邮箱 --> <!-- 邮箱 -->
<el-form-item :label="$t('trials:externalStaff:table:email')" prop="Email"> <el-form-item
:label="$t('trials:externalStaff:table:email')"
prop="Email"
>
<el-input v-model="form.Email" /> <el-input v-model="form.Email" />
</el-form-item> </el-form-item>
<!-- 单位 --> <!-- 单位 -->
<el-form-item :label="$t('trials:externalStaff:table:organization')" prop="OrganizationName"> <el-form-item
:label="$t('trials:externalStaff:table:organization')"
prop="OrganizationName"
>
<el-input v-model="form.OrganizationName" /> <el-input v-model="form.OrganizationName" />
</el-form-item> </el-form-item>
</el-form> </el-form>
<div v-if="errorMsg" style="font-size: 12px;color: #f66;">{{ errorMsg }}</div> <div v-if="errorMsg" style="font-size: 12px; color: #f66">
{{ errorMsg }}
</div>
</template> </template>
<template slot="dialog-footer"> <template slot="dialog-footer">
<!-- 取消 --> <!-- 取消 -->
<el-button size="small" type="primary" :disabled="btnLoading" @click="handleCancel"> <el-button
{{ $t('common:button:cancel') }} size="small"
type="primary"
:disabled="btnLoading"
@click="handleCancel"
>
{{ $t("common:button:cancel") }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave"> <el-button
{{ $t('common:button:save') }} size="small"
type="primary"
:loading="btnLoading"
@click="handleSave"
>
{{ $t("common:button:save") }}
</el-button> </el-button>
<!-- 保存且发邮件 --> <!-- 保存且发邮件 -->
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave('SendEmail')"> <!-- <el-button size="small" type="primary" :loading="btnLoading" @click="handleSave('SendEmail')">
{{ $t('trials:externalStaff:button:saveAndSendEmail') }} {{ $t('trials:externalStaff:button:saveAndSendEmail') }}
</el-button> </el-button> -->
</template> </template>
</base-model> </base-model>
</template> </template>
<script> <script>
import { addOrUpdateTrialExternalUser } from '@/api/trials' import BaseModel from "@/components/BaseModel";
import BaseModel from '@/components/BaseModel' import { getHospital } from "@/api/hospital.js";
import { addUser } from "@/api/admin.js";
const formDataDefault = () => { const formDataDefault = () => {
return { return {
Id: null,
TrialId: null,
LastName: null, LastName: null,
FirstName: null, FirstName: null,
UserTypeId: '', UserTypeId: "",
Phone: null, Phone: null,
Email: null, Email: null,
OrganizationName: null IsSendEmail: false,
} Sex: "9",
} IsZhiZhun: "",
OrganizationName: "",
DepartmentName: "",
PositionName: "",
IsTestUser: false,
verifyCode: "",
checkCode: "",
};
};
export default { export default {
name: 'StaffExternalAdd', name: "StaffExternalAdd",
components: { BaseModel }, components: { BaseModel },
props: { props: {
userTypeOptions: { userTypeOptions: {
type: Array, type: Array,
default: function() { default: function () {
return {} return {};
} },
} },
}, },
data() { data() {
var checkPhone = (rule, value, callback) => { var checkPhone = (rule, value, callback) => {
const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/ const phoneReg = /^1[3|4|5|7|8][0-9]{9}$/;
if (!value) { if (!value) {
callback() callback();
} }
setTimeout(() => { setTimeout(() => {
if (!Number.isInteger(+value)) { if (!Number.isInteger(+value)) {
callback(new Error(this.$t('trials:externalStaff:formRule:phone'))) callback(new Error(this.$t("trials:externalStaff:formRule:phone")));
} else { } else {
if (phoneReg.test(value)) { if (phoneReg.test(value)) {
callback() callback();
} else { } else {
callback(new Error(this.$t('trials:externalStaff:formRule:phone'))) callback(new Error(this.$t("trials:externalStaff:formRule:phone")));
} }
} }
}, 100) }, 100);
} };
var validateEmail = (rule, value, callback) => { var validateEmail = (rule, value, callback) => {
if (value === '') { if (value === "") {
callback(new Error(this.$t('common:ruleMessage:specify'))) callback(new Error(this.$t("common:ruleMessage:specify")));
} else { } else {
var reg = /^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$/ var reg =
/^[A-Za-z0-9]+([_\.][A-Za-z0-9]+)*@([A-Za-z0-9\-]+\.)+[A-Za-z]{2,6}$/;
if (this.form.Email && reg.test(this.form.Email)) { if (this.form.Email && reg.test(this.form.Email)) {
this.sendDisabled = false this.sendDisabled = false;
callback() callback();
} else { } else {
callback(new Error(this.$t('trials:externalStaff:formRule:email'))) callback(new Error(this.$t("trials:externalStaff:formRule:email")));
this.sendDisabled = true this.sendDisabled = true;
} }
} }
} };
return { return {
form: { form: {
Id: null, // Id: null,
LastName: null, LastName: null,
FirstName: null, FirstName: null,
UserTypeId: '', UserTypeId: "",
Phone: null, Phone: null,
Email: null, Email: null,
TrialId: null, IsSendEmail: false,
IsSendEmail: false Sex: "9",
IsZhiZhun: "",
OrganizationName: "",
DepartmentName: "",
PositionName: "",
IsTestUser: false,
verifyCode: "",
checkCode: "",
}, },
rules: { rules: {
LastName: [ LastName: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }, {
{ min: 0, max: 50, message: `${this.$t('common:ruleMessage:maxLength')} 50`, trigger: 'blur' } required: true,
message: this.$t("common:ruleMessage:specify"),
trigger: "blur",
},
{
min: 0,
max: 50,
message: `${this.$t("common:ruleMessage:maxLength")} 50`,
trigger: "blur",
},
], ],
FirstName: [ FirstName: [
{ required: true, message: this.$t('common:ruleMessage:specify'), trigger: 'blur' }, {
{ min: 0, max: 50, message: `${this.$t('common:ruleMessage:maxLength')} 50`, trigger: 'blur' } required: true,
message: this.$t("common:ruleMessage:specify"),
trigger: "blur",
},
{
min: 0,
max: 50,
message: `${this.$t("common:ruleMessage:maxLength")} 50`,
trigger: "blur",
},
], ],
UserTypeId: [{ required: true, message: this.$t('common:ruleMessage:select'), trigger: ['blur'] }], UserTypeId: [
Phone: [ {
{ required: false, validator: checkPhone, trigger: ['blur'] } required: true,
message: this.$t("common:ruleMessage:select"),
trigger: ["blur"],
},
], ],
Phone: [{ required: false, validator: checkPhone, trigger: ["blur"] }],
Email: [ Email: [
{ required: true, validator: validateEmail, trigger: ['blur'] } { required: true, validator: validateEmail, trigger: ["blur"] },
] ],
}, },
btnLoading: false, btnLoading: false,
userRoles: [], userRoles: [],
userTypeEnumInt: 0, userTypeEnumInt: 0,
model_cfg: { visible: false, showClose: true, width: '600px', title: '', appendToBody: true }, model_cfg: {
trialId: '', visible: false,
errorMsg: null showClose: true,
} width: "600px",
title: "",
appendToBody: true,
},
trialId: "",
errorMsg: null,
hospitalName: null,
};
}, },
watch: { watch: {
model_cfg: { model_cfg: {
handler(newName, oldName) { handler(newName, oldName) {
this.errorMsg = null this.errorMsg = null;
}, },
deep: true deep: true,
} },
"form.UserTypeId": {
handler() {
if (this.form.UserTypeId) {
let name = this.getUserType(this.form.UserTypeId);
if (["PM", "PI", "SR", "OA"].includes(name)) {
this.form.IsZhiZhun = true;
this.form.OrganizationName = this.hospitalName;
return (this.IsZhiZhunDisabled = true);
}
}
this.form.IsZhiZhun = false;
this.form.OrganizationName = null;
this.IsZhiZhunDisabled = false;
},
deep: true,
immediate: true,
},
}, },
mounted() { mounted() {
this.trialId = this.$route.query.trialId this.trialId = this.$route.query.trialId;
this.getInfo();
}, },
methods: { methods: {
//
async getInfo() {
try {
let res = await getHospital();
if (res.IsSuccess) {
this.hospitalName = res.Result.HospitalName;
}
} catch (err) {
console.log(err);
}
},
getUserType(id) {
let obj = this.userTypeOptions.find((item) => item.Id === id);
return obj.UserTypeShortName;
},
openDialog(title, data) { openDialog(title, data) {
this.model_cfg.visible = true this.model_cfg.visible = true;
this.model_cfg.title = title this.model_cfg.title = title;
if (Object.keys(data).length) { if (Object.keys(data).length) {
this.form = { ...data } this.form = { ...data };
} else { } else {
this.form = formDataDefault() this.form = formDataDefault();
} }
}, },
handleSave(v) { handleSave(v) {
this.$refs.anonymizationFrom.validate(valid => { this.$refs.anonymizationFrom.validate((valid) => {
if (valid) { if (valid) {
this.btnLoading = true this.btnLoading = true;
this.form.TrialId = this.trialId this.form.TrialId = this.trialId;
if (v === 'SendEmail') { if (v === "SendEmail") {
this.form.IsSendEmail = true this.form.IsSendEmail = true;
this.form.BaseUrl = `${location.protocol}//${location.host}/login` this.form.BaseUrl = `${location.protocol}//${location.host}/login`;
this.form.RouteUrl = `${location.protocol}//${location.host}/email-recompose` this.form.RouteUrl = `${location.protocol}//${location.host}/email-recompose`;
} }
addOrUpdateTrialExternalUser(this.form).then(res => { addUser(this.form)
this.btnLoading = false .then((res) => {
this.$message.success(this.$t('common:message:savedSuccessfully')) this.btnLoading = false;
this.model_cfg.visible = false this.$message.success(
this.$emit('getList') this.$t("common:message:savedSuccessfully")
}).catch((res) => { );
if (res.Result) { this.model_cfg.visible = false;
this.$set(this.form, 'LastName', res.Result.LastName) this.$emit("getList");
this.$set(this.form, 'FirstName', res.Result.FirstName) })
this.$set(this.form, 'Phone', res.Result.Phone) .catch((res) => {
this.errorMsg = res.ErrorMessage if (res.Result) {
} // this.$set(this.form, "LastName", res.Result.LastName);
this.btnLoading = false // this.$set(this.form, "FirstName", res.Result.FirstName);
}) // this.$set(this.form, "Phone", res.Result.Phone);
this.errorMsg = res.ErrorMessage;
}
this.btnLoading = false;
});
} }
}) });
}, },
handleCancel() { handleCancel() {
this.model_cfg.visible = false this.model_cfg.visible = false;
} },
} },
} };
</script> </script>

View File

@ -11,13 +11,13 @@
clearable clearable
/> />
<!-- 用户名 --> <!-- 用户名 -->
<span>{{ $t("trials:staff:table:uid") }}:</span> <!-- <span>{{ $t("trials:staff:table:uid") }}:</span>
<el-input <el-input
v-model="listQuery.UserName" v-model="listQuery.UserName"
size="mini" size="mini"
class="mr" class="mr"
clearable clearable
/> /> -->
<!-- 单位 --> <!-- 单位 -->
<span>{{ $t("trials:staff:table:organization") }}:</span> <span>{{ $t("trials:staff:table:organization") }}:</span>
<el-input <el-input
@ -26,6 +26,9 @@
class="mr" class="mr"
clearable clearable
/> />
<!-- 邮箱 -->
<span>{{ $t("trials:externalStaff:table:email") }}:</span>
<el-input v-model="listQuery.EMail" size="mini" class="mr" clearable />
<!-- 用户类型 --> <!-- 用户类型 -->
<span>{{ $t("trials:staff:table:userType") }}:</span> <span>{{ $t("trials:staff:table:userType") }}:</span>
<el-select <el-select
@ -35,10 +38,10 @@
class="mr" class="mr"
> >
<el-option <el-option
v-for="item in userTypeOptions" v-for="item of $d.UserType"
:key="item.Id" :key="item.id"
:label="item.UserTypeShortName" :label="item.label"
:value="item.UserTypeEnum" :value="item.value"
> >
</el-option> </el-option>
</el-select> </el-select>
@ -60,17 +63,26 @@
> >
{{ $t("common:button:reset") }} {{ $t("common:button:reset") }}
</el-button> </el-button>
<!--添加新用户-->
<el-button
type="primary"
size="mini"
icon="el-icon-plus"
@click="handleAdd"
v-hasPermi="['role:pm']"
>
{{ $t("common:button:add") }}
</el-button>
<!--确认用户选择-->
<el-button <el-button
type="primary" type="primary"
size="mini" size="mini"
style="margin-left: auto" style="margin-left: auto"
:disabled="selectArr.length === 0" :disabled="selectArr.length === 0"
:loading="assignLoadStatus" :loading="assignLoadStatus"
icon="el-icon-plus"
@click="handleAssign" @click="handleAssign"
> >
{{ $t("common:button:add") }} {{ $t("common:button:confirm") }}
</el-button> </el-button>
</div> </div>
</el-header> </el-header>
@ -99,13 +111,13 @@
min-width="100" min-width="100"
/> />
<!-- 用户名 --> <!-- 用户名 -->
<el-table-column <!-- <el-table-column
prop="UserName" prop="UserName"
:label="$t('trials:staff:table:uid')" :label="$t('trials:staff:table:uid')"
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
min-width="100" min-width="100"
/> /> -->
<!-- 电话 --> <!-- 电话 -->
<el-table-column <el-table-column
prop="Phone" prop="Phone"
@ -149,27 +161,38 @@
@pagination="getList" @pagination="getList"
/> />
</div> </div>
<staffExternalAdd
ref="StaffExternalAdd"
:userTypeOptions="userTypeOptions"
@getList="getList"
/>
</el-container> </el-container>
</template> </template>
<script> <script>
import { import { getTrialUserScreeningList, addTrialUsers } from "@/api/trials";
getTrialUserScreeningList,
addTrialUsers,
getUserTypeList,
} from "@/api/trials";
import Pagination from "@/components/Pagination"; import Pagination from "@/components/Pagination";
import staffExternalAdd from "./staffExternalAdd.vue";
const getListQueryDefault = () => { const getListQueryDefault = () => {
return { return {
UserRealName: "", UserRealName: "",
UserName: "", UserName: "",
OrganizationName: "", OrganizationName: "",
EMail: null,
UserTypeEnum: "", UserTypeEnum: "",
PageIndex: 1, PageIndex: 1,
PageSize: 20, PageSize: 20,
}; };
}; };
export default { export default {
components: { Pagination }, components: { Pagination, staffExternalAdd },
props: {
userTypeOptions: {
required: true,
default: () => {
return [];
},
},
},
data() { data() {
return { return {
list: [], list: [],
@ -178,17 +201,24 @@ export default {
selectArr: [], selectArr: [],
assignLoadStatus: false, assignLoadStatus: false,
isAdmin: JSON.parse(zzSessionStorage.getItem("IsAdmin")), isAdmin: JSON.parse(zzSessionStorage.getItem("IsAdmin")),
userTypeOptions: [],
trialId: "", trialId: "",
qCProcessEnum: null, qCProcessEnum: null,
}; };
}, },
mounted() { mounted() {
this.trialId = this.$route.query.trialId; this.trialId = this.$route.query.trialId;
this.getUserType(); // this.getUserType();
this.getList(); this.getList();
}, },
methods: { methods: {
handleAdd() {
this.$nextTick(() => {
this.$refs["StaffExternalAdd"].openDialog(
this.$t("trials:externalStaff:dialogTitle:add"),
{}
);
});
},
getList() { getList() {
const loading = this.$loading({ const loading = this.$loading({
target: document.querySelector(".participant-container"), target: document.querySelector(".participant-container"),
@ -263,11 +293,11 @@ export default {
return false; return false;
} }
}, },
getUserType() { // getUserType() {
getUserTypeList(2).then((res) => { // getUserTypeList(2).then((res) => {
this.userTypeOptions = res.Result; // this.userTypeOptions = res.Result;
}); // });
}, // },
}, },
}; };
</script> </script>

View File

@ -38,34 +38,6 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 申请号 -->
<!-- <el-form-item :label="$t('trials:study:form:accessionNumber')">
<el-input v-model="searchData.SubjectInfo" style="width: 140px" />
</el-form-item> -->
<!-- 检查设备 -->
<!-- <el-form-item :label="$t('trials:studyList:table:modality')">
<el-select v-model="searchData.VisitPlanArray" clearable>
<el-option
v-for="item of $d.sex"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item> -->
<!-- 检查类型 -->
<!-- <el-form-item :label="$t('trials:seletctedReviews:form:modality')">
<el-select v-model="searchData.Modalities" clearable>
<el-option
v-for="item of $d.modalType"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item> -->
<!-- 检查日期 --> <!-- 检查日期 -->
<el-form-item :label="$t('trials:audit:table:studyDate')"> <el-form-item :label="$t('trials:audit:table:studyDate')">
<el-date-picker <el-date-picker
@ -77,18 +49,6 @@
> >
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<!-- 状态 -->
<!-- <el-form-item :label="$t('trials:seletctedReviews:table:status')">
<el-select v-model="searchData.VisitPlanArray" clearable>
<el-option
v-for="item of $d.sex"
:key="item.id"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item> -->
<el-form-item> <el-form-item>
<!-- 查询 --> <!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
@ -460,6 +420,7 @@ export default {
}); });
var newWindow = window.open(routeData.href, "_blank"); var newWindow = window.open(routeData.href, "_blank");
this.$emit("setOpenWindow", newWindow); this.$emit("setOpenWindow", newWindow);
this.$setOpenWindow(newWindow);
}, },
// //
handleSearch() { handleSearch() {

View File

@ -107,6 +107,7 @@
:Patient="Patient" :Patient="Patient"
:submitMessage="submitMessage" :submitMessage="submitMessage"
:status="status" :status="status"
@close="beforeCloseStudyDig"
/> />
<base-model v-if="patient_model.visible" :config="patient_model"> <base-model v-if="patient_model.visible" :config="patient_model">
<template slot="dialog-body"> <template slot="dialog-body">

View File

@ -2,7 +2,6 @@
<el-dialog <el-dialog
:visible.sync="visible" :visible.sync="visible"
:close-on-click-modal="false" :close-on-click-modal="false"
:fullscreen="true"
custom-class="upload-dialog" custom-class="upload-dialog"
:before-close="beforeClosePitentDig" :before-close="beforeClosePitentDig"
> >
@ -10,10 +9,9 @@
<el-table <el-table
ref="patientStudyList" ref="patientStudyList"
v-loading="loading" v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
:data="list" :data="list"
stripe stripe
height="100" height="300px"
> >
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<!--患者ID--> <!--患者ID-->
@ -49,7 +47,7 @@
sortable="custom" sortable="custom"
></el-table-column> ></el-table-column>
<!--操作--> <!--操作-->
<el-table-column :label="$t('common:action:action')" width="250"> <el-table-column :label="$t('common:action:action')" width="80">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
circle circle

View File

@ -8,9 +8,9 @@
<el-input v-model="searchData.Code" style="width: 130px" clearable /> <el-input v-model="searchData.Code" style="width: 130px" clearable />
</el-form-item> </el-form-item>
<!-- 患者编号 --> <!-- 患者编号 -->
<!-- <el-form-item :label="$t('trials:uploadDicomList:table:pId')"> <el-form-item :label="$t('trials:uploadDicomList:table:pId')">
<el-input v-model="searchData.Code" style="width: 130px" /> <el-input v-model="searchData.PatientIdStr" style="width: 130px" />
</el-form-item> --> </el-form-item>
<!-- 姓名 --> <!-- 姓名 -->
<el-form-item :label="$t('trials:researchStaff:table:Name')"> <el-form-item :label="$t('trials:researchStaff:table:Name')">
<el-input <el-input
@ -36,7 +36,7 @@
</el-select> </el-select>
</el-form-item> </el-form-item>
<!-- 状态 --> <!-- 状态 -->
<el-form-item :label="$t('trials:subject:table:status')"> <!-- <el-form-item :label="$t('trials:subject:table:status')">
<el-select v-model="searchData.Status" clearable style="width: 130px"> <el-select v-model="searchData.Status" clearable style="width: 130px">
<el-option <el-option
v-for="item of $d.Subject_Visit_Status" v-for="item of $d.Subject_Visit_Status"
@ -45,7 +45,7 @@
:label="item.label" :label="item.label"
/> />
</el-select> </el-select>
</el-form-item> </el-form-item> -->
<el-form-item> <el-form-item>
<!-- 查询 --> <!-- 查询 -->
<el-button type="primary" icon="el-icon-search" @click="handleSearch"> <el-button type="primary" icon="el-icon-search" @click="handleSearch">
@ -162,7 +162,18 @@
:label="$t('trials:subject:table:totalVisitCount')" :label="$t('trials:subject:table:totalVisitCount')"
show-overflow-tooltip show-overflow-tooltip
sortable="custom" sortable="custom"
/> >
<template slot-scope="scope">
<el-button
v-if="scope.row.VisitCount >= 1"
type="text"
@click="gotoVisit(scope.row)"
>
<span>{{ scope.row.VisitCount }}</span>
</el-button>
<span v-else>{{ scope.row.VisitCount }}</span>
</template>
</el-table-column>
<!-- 最新检查访视 --> <!-- 最新检查访视 -->
<el-table-column <el-table-column
prop="LatestVisitName" prop="LatestVisitName"
@ -307,6 +318,7 @@ import patientStudyList from "./components/patient-study-list.vue";
// import confirmVisitList from "../../../trials-inspection/components/confirm-visit-list.vue"; // import confirmVisitList from "../../../trials-inspection/components/confirm-visit-list.vue";
const searchDataDefault = () => { const searchDataDefault = () => {
return { return {
PatientIdStr: null,
Code: "", Code: "",
Status: "", Status: "",
Sex: "", Sex: "",
@ -360,6 +372,15 @@ export default {
this.getList(); this.getList();
}, },
methods: { methods: {
// 访
gotoVisit(item) {
let query = this.$route.query;
this.$router.push({
path: "/trials/trials-panel/hir-visit",
query,
});
zzSessionStorage.setItem("SubjectCode", item.Code);
},
handleExport() { handleExport() {
getSubjectList_Export(this.searchData) getSubjectList_Export(this.searchData)
.then((res) => {}) .then((res) => {})

View File

@ -116,13 +116,13 @@
<el-descriptions-item <el-descriptions-item
:label="$t('trials:trial-information:title:activationDate')" :label="$t('trials:trial-information:title:activationDate')"
> >
{{ trialInfo.AuthorizationDate }} {{ otherInfo.ActiveTime }}
</el-descriptions-item> </el-descriptions-item>
<!--授权日期--> <!--授权日期-->
<el-descriptions-item <el-descriptions-item
:label="$t('trials:trials-list:table:dateAuthorized')" :label="$t('trials:trials-list:table:dateAuthorized')"
> >
{{ trialInfo.AuthorizationDate }} {{ otherInfo.AuthorizationDeadLineDate }}
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
<el-button <el-button