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 '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 'element-ui/lib/theme-chalk/index.css'
import './assets/css/theme-blue/index.css' // 浅绿色主题
import './assets/css/iconfont/index.css' // 阿里巴巴图标库
// import locale from 'element-ui/lib/locale/lang/en' // lang i18n
import i18n from './lang'
import '@/styles/index.scss' // global css
@ -23,10 +21,7 @@ import '@/permission' // permission control
import md5 from 'js-md5'
import VueClipboard from 'vue-clipboard2'
Vue.use(VueClipboard)
// import htmlToPdf from './utils/htmlToPdf'
// Vue.use(htmlToPdf)
import permission from './utils/permission'
import { OSSclient } from './utils/oss'
Vue.use(permission)
import Viewer from 'v-viewer'

View File

@ -10,10 +10,18 @@ import { OSSclient } from './utils/oss'
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) => {
NProgress.start()
Vue.prototype.$setOpenWindow();
// 设置页面标题
// document.title = getPageTitle(to.meta.title)

View File

@ -14,8 +14,8 @@ service.interceptors.request.use(
config => {
config.headers['Content-Type'] = 'application/json;charset=UTF-8'
var language = zzSessionStorage.getItem('lang')
config.headers['Accept-Language'] = language === 'en'?'en-US,en;q=0.5':'zh-CN,zh;q=0.9'
console.log(config.headers)
config.headers['Accept-Language'] = language === 'en' ? 'en-US,en;q=0.5' : 'zh-CN,zh;q=0.9'
// console.log(config.headers)
if (store.getters.token) {
config.headers.Authorization = `Bearer ${store.getters.token}`
}
@ -30,14 +30,14 @@ service.interceptors.response.use(
response => {
const res = response.data
let fileReader = new FileReader();
fileReader.onload = function() {
fileReader.onload = function () {
try {
let jsonData = JSON.parse(fileReader.result); // 如果是普通对象数据,后台转换失败
if (!jsonData.IsSuccess && jsonData.ErrorMessage) {
MessageBox.confirm(jsonData.ErrorMessage, {
MessageBox.confirm(jsonData.ErrorMessage, {
type: 'warning',
showCancelButton: false,
callback: action => {}
callback: action => { }
})
return Promise.reject(jsonData)
}
@ -66,19 +66,19 @@ service.interceptors.response.use(
if (error && error.response) {
const status = error.response.status
switch (status) {
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 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 403: message = error.response.data.ErrorMessage; 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 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 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 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 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 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 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 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 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 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
default: break
}
if (error.response.status === 401) {
@ -100,7 +100,7 @@ service.interceptors.response.use(
type: 'warning',
showCancelButton: false,
confirmButtonText: '确定',
callback: action => {}
callback: action => { }
})
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -76,13 +76,12 @@
ref="userType"
v-model="user.UserTypeId"
size="small"
placeholder="Please select"
placeholder=""
style="width: 100%"
:disabled="user.CanEditUserType === false"
>
<template v-for="(userType, key) of userTypeOptions">
<el-option
v-if="userType.UserTypeEnum !== 20"
:key="key"
:label="userType.UserType"
:value="userType.Id"
@ -368,7 +367,15 @@ export default {
getUserTypeList() {
getUserTypeListByUserType(0).then((res) => {
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"
:submitMessage="submitMessage"
:status="status"
@close="beforeCloseStudyDig"
/>
<base-model v-if="addSubject_model.visible" :config="addSubject_model">
<template slot="dialog-body">

View File

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

View File

@ -38,22 +38,11 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 80px;
width: 150px;
"
>
{{ $t("trials:trials-list:table:researchNumber") }}
</div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ $t("trials:trials-list:table:experimentName") }}
</div>
<div
style="
display: inline-block;
@ -65,6 +54,17 @@
>
{{ $t("trials:trials-list:table:sponsor") }}
</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>
<el-tooltip
@ -80,11 +80,11 @@
{{ $t("trials:trials-list:table:researchNumber") }}:
{{ item.ResearchProgramNo }}
<br />
{{ $t("trials:trials-list:table:experimentName") }}:
{{ item.ExperimentName }}
<br />
{{ $t("trials:trials-list:table:sponsor") }}:
{{ item.SponsorName }}
<br />
{{ $t("trials:trials-list:table:experimentName") }}:
{{ item.ExperimentName }}
</div>
<div
class="options_item"
@ -100,22 +100,11 @@
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 80px;
width: 150px;
"
>
{{ item.ResearchProgramNo }}
</div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ item.ExperimentName }}
</div>
<div
style="
display: inline-block;
@ -127,6 +116,17 @@
>
{{ item.SponsorName }}
</div>
<div
style="
display: inline-block;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
width: 160px;
"
>
{{ item.ExperimentName }}
</div>
</div>
</el-tooltip>
</div>
@ -233,7 +233,11 @@ export default {
inputChange(v) {
this.resultFilter = this.options.filter((o) => {
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: {
//
beforeCloseStudyDig() {
this.$setOpenWindow();
this.$emit("update:visible", false);
},
//
@ -256,7 +257,8 @@ export default {
const routeData = this.$router.resolve({
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() {},

View File

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

View File

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

View File

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

View File

@ -99,6 +99,7 @@
stripe
height="100"
@sort-change="handleSortChange"
@row-click="handleDetail"
>
<!-- <el-table-column type="selection" align="left" width="45" /> -->
<el-table-column width="40">
@ -166,12 +167,6 @@
show-overflow-tooltip
sortable="custom"
/>
<!--是否授权-->
<!-- <el-table-column
prop="Sponsor"
:label="$t('trials:trials-list:table:isAccredit')"
show-overflow-tooltip
/> -->
<el-table-column
prop="TrialStatusStr"
:label="$t('trials:trials-list:table:status')"
@ -201,27 +196,41 @@
>
</template>
</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
prop="CreateTime"
:label="$t('trials:trials-list:table:createDate')"
show-overflow-tooltip
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
prop="AuthorizationDuration"
@ -238,7 +247,7 @@
icon="el-icon-info"
:disabled="scope.row.IsDeleted"
:title="$t('trials:trials-list:action:panel')"
@click="handleDetail(scope.row)"
@click.stop="handleDetail(scope.row)"
/>
<!-- 编辑项目基本信息 -->
<el-button
@ -247,7 +256,7 @@
icon="el-icon-edit-outline"
:disabled="scope.row.IsDeleted"
:title="$t('trials:trials-list:action:edit')"
@click="handleEdit(scope.row)"
@click.stop="handleEdit(scope.row)"
/>
<!-- 修改项目状态 -->
<el-button
@ -256,7 +265,7 @@
icon="el-icon-edit"
:disabled="scope.row.IsDeleted"
:title="$t('trials:trials-list:action:status')"
@click="handleStatus(scope.row)"
@click.stop="handleStatus(scope.row)"
/>
<!-- 废除项目 -->
<el-button
@ -268,7 +277,7 @@
scope.row.TrialStatusStr !== 'Initializing'
"
:title="$t('trials:trials-list:action:abolition')"
@click="handleAbandon(scope.row)"
@click.stop="handleAbandon(scope.row)"
/>
<!-- 激活 -->
<el-button
@ -277,7 +286,7 @@
circle
icon="el-icon-key"
:title="$t('trials:trials-list:action:activate')"
@click="handleActivate(scope.row)"
@click.stop="handleActivate(scope.row)"
/>
</template>
</el-table-column>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -150,6 +150,14 @@
sortable="custom"
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
prop="TaskState"

View File

@ -317,7 +317,7 @@ export default {
loading: false,
total: 0,
//
reportBtnLoading: false,
reportFlag: {},
};
},
created() {
@ -331,16 +331,21 @@ export default {
},
//
async showReport(item) {
if (this.reportBtnLoading) return;
if (this.reportFlag[item.Id]) return;
let data = {
VisitTaskId: item.Id,
};
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);
this.reportBtnLoading = false;
this.reportFlag[item.Id] = false;
} catch (err) {
this.reportBtnLoading = false;
this.reportFlag[item.Id] = false;
console.log(err);
}
},

View File

@ -20,7 +20,6 @@
:label="item.UserTypeShortName"
:value="item.Id"
>
<span>{{ item.UserType }}</span>
</el-option>
</el-select>
</el-form-item>
@ -74,14 +73,14 @@
{{ $t('trials:staff:button:addExternalStaff') }}
</el-button> -->
<!-- 导出 -->
<el-button
<!-- <el-button
type="primary"
icon="el-icon-download"
:disabled="list.length === 0"
@click="handleExport"
>
{{ $t("common:button:export") }}
</el-button>
</el-button> -->
</el-form-item>
</el-form>
</div>
@ -241,7 +240,11 @@
<!-- 分配参与人员模态框 -->
<base-model v-if="staff_model.visible" :config="staff_model">
<template slot="dialog-body">
<StaffForm v-if="isAdd == 'Add'" @closeDialog="closeDialog" />
<StaffForm
v-if="isAdd == 'Add'"
:userTypeOptions="userTypeOptions"
@closeDialog="closeDialog"
/>
<StaffExternalForm
v-else
@closeDialog="closeDialog"
@ -335,6 +338,7 @@ import {
updateTrialUser,
trialUserListExport,
} from "@/api/trials";
import { getUserTypeListByUserType } from "@/api/admin";
import Pagination from "@/components/Pagination";
import StaffForm from "./staffForm";
import StaffExternalForm from "./staffExternalForm";
@ -517,8 +521,12 @@ export default {
},
//
getUserType() {
getTrialUserTypeList().then((res) => {
this.userTypeOptions = res.Result;
getUserTypeListByUserType(0).then((res) => {
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"
>
<!-- -->
<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-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-form-item>
<!-- 用户类型 -->
<el-form-item :label="$t('trials:externalStaff:table:userType')" prop="UserTypeId">
<el-select
v-model="form.UserTypeId"
style="width:100%"
>
<el-form-item
:label="$t('trials:externalStaff:table:userType')"
prop="UserTypeId"
>
<el-select v-model="form.UserTypeId" style="width: 100%">
<el-option
v-for="item of userTypeOptions"
:key="item.Id"
:label="item.UserTypeShortName"
:value="item.Id"
>
<span>{{ item.UserType }}</span>
<!-- <span>{{ item.UserType }}</span> -->
</el-option>
</el-select>
</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-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-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-form-item>
</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 slot="dialog-footer">
<!-- 取消 -->
<el-button size="small" type="primary" :disabled="btnLoading" @click="handleCancel">
{{ $t('common:button:cancel') }}
<el-button
size="small"
type="primary"
:disabled="btnLoading"
@click="handleCancel"
>
{{ $t("common:button:cancel") }}
</el-button>
<!-- 保存 -->
<el-button size="small" type="primary" :loading="btnLoading" @click="handleSave">
{{ $t('common:button:save') }}
<el-button
size="small"
type="primary"
:loading="btnLoading"
@click="handleSave"
>
{{ $t("common:button:save") }}
</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') }}
</el-button>
</el-button> -->
</template>
</base-model>
</template>
<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 = () => {
return {
Id: null,
TrialId: null,
LastName: null,
FirstName: null,
UserTypeId: '',
UserTypeId: "",
Phone: null,
Email: null,
OrganizationName: null
}
}
IsSendEmail: false,
Sex: "9",
IsZhiZhun: "",
OrganizationName: "",
DepartmentName: "",
PositionName: "",
IsTestUser: false,
verifyCode: "",
checkCode: "",
};
};
export default {
name: 'StaffExternalAdd',
name: "StaffExternalAdd",
components: { BaseModel },
props: {
userTypeOptions: {
type: Array,
default: function() {
return {}
}
}
default: function () {
return {};
},
},
},
data() {
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) {
callback()
callback();
}
setTimeout(() => {
if (!Number.isInteger(+value)) {
callback(new Error(this.$t('trials:externalStaff:formRule:phone')))
callback(new Error(this.$t("trials:externalStaff:formRule:phone")));
} else {
if (phoneReg.test(value)) {
callback()
callback();
} 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) => {
if (value === '') {
callback(new Error(this.$t('common:ruleMessage:specify')))
if (value === "") {
callback(new Error(this.$t("common:ruleMessage:specify")));
} 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)) {
this.sendDisabled = false
callback()
this.sendDisabled = false;
callback();
} else {
callback(new Error(this.$t('trials:externalStaff:formRule:email')))
this.sendDisabled = true
callback(new Error(this.$t("trials:externalStaff:formRule:email")));
this.sendDisabled = true;
}
}
}
};
return {
form: {
Id: null,
// Id: null,
LastName: null,
FirstName: null,
UserTypeId: '',
UserTypeId: "",
Phone: null,
Email: null,
TrialId: null,
IsSendEmail: false
IsSendEmail: false,
Sex: "9",
IsZhiZhun: "",
OrganizationName: "",
DepartmentName: "",
PositionName: "",
IsTestUser: false,
verifyCode: "",
checkCode: "",
},
rules: {
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: [
{ 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'] }],
Phone: [
{ required: false, validator: checkPhone, trigger: ['blur'] }
UserTypeId: [
{
required: true,
message: this.$t("common:ruleMessage:select"),
trigger: ["blur"],
},
],
Phone: [{ required: false, validator: checkPhone, trigger: ["blur"] }],
Email: [
{ required: true, validator: validateEmail, trigger: ['blur'] }
]
{ required: true, validator: validateEmail, trigger: ["blur"] },
],
},
btnLoading: false,
userRoles: [],
userTypeEnumInt: 0,
model_cfg: { visible: false, showClose: true, width: '600px', title: '', appendToBody: true },
trialId: '',
errorMsg: null
}
model_cfg: {
visible: false,
showClose: true,
width: "600px",
title: "",
appendToBody: true,
},
trialId: "",
errorMsg: null,
hospitalName: null,
};
},
watch: {
model_cfg: {
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() {
this.trialId = this.$route.query.trialId
this.trialId = this.$route.query.trialId;
this.getInfo();
},
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) {
this.model_cfg.visible = true
this.model_cfg.title = title
this.model_cfg.visible = true;
this.model_cfg.title = title;
if (Object.keys(data).length) {
this.form = { ...data }
this.form = { ...data };
} else {
this.form = formDataDefault()
this.form = formDataDefault();
}
},
handleSave(v) {
this.$refs.anonymizationFrom.validate(valid => {
this.$refs.anonymizationFrom.validate((valid) => {
if (valid) {
this.btnLoading = true
this.form.TrialId = this.trialId
if (v === 'SendEmail') {
this.form.IsSendEmail = true
this.form.BaseUrl = `${location.protocol}//${location.host}/login`
this.form.RouteUrl = `${location.protocol}//${location.host}/email-recompose`
this.btnLoading = true;
this.form.TrialId = this.trialId;
if (v === "SendEmail") {
this.form.IsSendEmail = true;
this.form.BaseUrl = `${location.protocol}//${location.host}/login`;
this.form.RouteUrl = `${location.protocol}//${location.host}/email-recompose`;
}
addOrUpdateTrialExternalUser(this.form).then(res => {
this.btnLoading = false
this.$message.success(this.$t('common:message:savedSuccessfully'))
this.model_cfg.visible = false
this.$emit('getList')
}).catch((res) => {
if (res.Result) {
this.$set(this.form, 'LastName', res.Result.LastName)
this.$set(this.form, 'FirstName', res.Result.FirstName)
this.$set(this.form, 'Phone', res.Result.Phone)
this.errorMsg = res.ErrorMessage
}
this.btnLoading = false
})
addUser(this.form)
.then((res) => {
this.btnLoading = false;
this.$message.success(
this.$t("common:message:savedSuccessfully")
);
this.model_cfg.visible = false;
this.$emit("getList");
})
.catch((res) => {
if (res.Result) {
// this.$set(this.form, "LastName", res.Result.LastName);
// this.$set(this.form, "FirstName", res.Result.FirstName);
// this.$set(this.form, "Phone", res.Result.Phone);
this.errorMsg = res.ErrorMessage;
}
this.btnLoading = false;
});
}
})
});
},
handleCancel() {
this.model_cfg.visible = false
}
}
}
this.model_cfg.visible = false;
},
},
};
</script>

View File

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

View File

@ -38,34 +38,6 @@
</el-option>
</el-select>
</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-date-picker
@ -77,18 +49,6 @@
>
</el-date-picker>
</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-button type="primary" icon="el-icon-search" @click="handleSearch">
@ -460,6 +420,7 @@ export default {
});
var newWindow = window.open(routeData.href, "_blank");
this.$emit("setOpenWindow", newWindow);
this.$setOpenWindow(newWindow);
},
//
handleSearch() {

View File

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

View File

@ -2,7 +2,6 @@
<el-dialog
:visible.sync="visible"
:close-on-click-modal="false"
:fullscreen="true"
custom-class="upload-dialog"
:before-close="beforeClosePitentDig"
>
@ -10,10 +9,9 @@
<el-table
ref="patientStudyList"
v-loading="loading"
v-adaptive="{ bottomOffset: 60 }"
:data="list"
stripe
height="100"
height="300px"
>
<el-table-column type="index" width="40" />
<!--患者ID-->
@ -49,7 +47,7 @@
sortable="custom"
></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">
<el-button
circle

View File

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

View File

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