Compare commits
19 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 9d8db73c4f | |||
| 7fa26be9d1 | |||
| 389a0b281e | |||
| 94d7f370d3 | |||
| 6151a73104 | |||
| 52e6863df7 | |||
| dd7e39faee | |||
| 88cf1f5752 | |||
| cf36795651 | |||
| b9804432d4 | |||
| a8fcf315c4 | |||
| 3ea8b8b771 | |||
| 017d0198fe | |||
| 4d7971b30b | |||
| fc2ad8f5ba | |||
| a0ec05e665 | |||
| 08181b9aa2 | |||
| ab27f86b68 | |||
| 95987af7cc |
@@ -2,11 +2,7 @@
|
||||
ENV = 'usa'
|
||||
NODE_ENV = 'usa'
|
||||
# base public path
|
||||
# VUE_APP_BASE_PATH = 'https://d3taa4kz0xxv95.cloudfront.net/2025-10-31/'
|
||||
VUE_APP_BASE_PATH = '/'
|
||||
|
||||
# onlyoffice地址
|
||||
VUE_APP_ONLYOFFICE_URL = "https://onlyoffice.uat.elevateimaging.ai"
|
||||
VUE_APP_BASE_PATH = 'https://ei-code-prod.s3.amazonaws.com/2024-07-30/'
|
||||
|
||||
# 是否开启登陆限制 true:是 false:否
|
||||
VUE_APP_LOGIN_FOR_PERMISSION = true
|
||||
|
||||
+1
-4
@@ -2,10 +2,7 @@
|
||||
ENV = 'usa'
|
||||
NODE_ENV = 'usa'
|
||||
# base public path
|
||||
VUE_APP_BASE_PATH = '/'
|
||||
|
||||
# onlyoffice地址
|
||||
VUE_APP_ONLYOFFICE_URL = "https://office.lili.elevateimaging.ai"
|
||||
VUE_APP_BASE_PATH = 'https://ei-med-s3-code.s3.amazonaws.com/2024-07-30/'
|
||||
|
||||
# 是否开启登陆限制 true:是 false:否
|
||||
VUE_APP_LOGIN_FOR_PERMISSION = true
|
||||
|
||||
@@ -1,44 +0,0 @@
|
||||
# just a flag
|
||||
ENV = 'usa'
|
||||
NODE_ENV = 'usa'
|
||||
# base public path
|
||||
VUE_APP_BASE_PATH = 'https://ei-code-prod.s3.amazonaws.com/2024-08-12/'
|
||||
|
||||
# 是否开启登陆限制 true:是 false:否
|
||||
VUE_APP_LOGIN_FOR_PERMISSION = true
|
||||
|
||||
# 是否开启长时间无操作锁定弹框MFA验证 true:是 false:否
|
||||
VUE_APP_LOCK_FOR_PERMISSION_MFA = true
|
||||
|
||||
# 是否开启长时间无操作锁定弹框 true:是 false:否
|
||||
VUE_APP_LOCK_FOR_PERMISSION = true
|
||||
|
||||
# 无操作锁定弹框判断时间 单位:秒
|
||||
VUE_APP_LOCK_FOR_TIME = 900
|
||||
|
||||
# 是否开启长时间无操作登出 true:是 false:否
|
||||
VUE_APP_LOGOUT_FOR_PERMISSION = true
|
||||
|
||||
# 无操作锁定弹框判断时间 单位:秒
|
||||
VUE_APP_LOGOUT_FOR_TIME = 1800
|
||||
|
||||
# 是否开启密码正则验证 true:是 false:否
|
||||
VUE_APP_PASSWORD_FOR_PERMISSION = true
|
||||
|
||||
# 是否开启密码正则验证 true:是 false:否
|
||||
VUE_APP_PASSWORD_FOR_REGULAR = ^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[-_.@^+\$!%#*?&\$~])[A-Za-z0-9-~_.@^+\$~!%#*?&]{8,32}$
|
||||
|
||||
# 是否开启文档签署验证 true:是 false:否
|
||||
VUE_APP_WORD_FOR_PERMISSION = true
|
||||
|
||||
# 公司名称
|
||||
VUE_APP_COMPANY_NAME = "Elevate Imaging"
|
||||
|
||||
# dicom文件地址
|
||||
VUE_APP_DICOM_PATH = 'https://zyypacs-uat.oss-cn-shanghai.aliyuncs.com'
|
||||
|
||||
VUE_APP_OSS_CONFIG_REGION = 'oss-cn-shanghai'
|
||||
|
||||
VUE_APP_OSS_CONFIG_BUCKET = 'zyypacs-uat'
|
||||
|
||||
VUE_APP_OSS_PATH = '/usa/dist'
|
||||
@@ -6,7 +6,6 @@
|
||||
"build": "vue-cli-service build",
|
||||
"build:prod": "vue-cli-service build --mode prod",
|
||||
"build:uat": "vue-cli-service build --mode uat",
|
||||
"build:usa_test": "vue-cli-service build --mode usa_test",
|
||||
"build:usa": "vue-cli-service build --mode usa",
|
||||
"build:usa_prod": "vue-cli-service build --mode usa_prod",
|
||||
"pre": "vue-cli-service build --mode pre",
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 21 KiB After Width: | Height: | Size: 7.7 KiB |
Binary file not shown.
+2
-2
@@ -81,11 +81,11 @@ export function verifyIRStudyAllowUpload(data) {
|
||||
})
|
||||
}
|
||||
// 影像下载成功确认
|
||||
export function downloadImageSuccess(params) {
|
||||
export function downloadImageSuccess(data) {
|
||||
return request({
|
||||
url: '/DownloadAndUpload/downloadImageSuccess',
|
||||
method: 'post',
|
||||
params
|
||||
data
|
||||
})
|
||||
}
|
||||
// 影像下载记录列表
|
||||
|
||||
+16
-1
@@ -213,6 +213,14 @@ export function getIVUSTemplate(param) {
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function getIVUSTemplatesZip(param) {
|
||||
return requestDownload({
|
||||
url: '/IVUSCalculate/getIVUSTemplatesZip',
|
||||
method: 'post',
|
||||
responseType: 'blob',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function uploadIVUSTemplate(param) {
|
||||
return request({
|
||||
url: `/IVUSCalculate/uploadIVUSTemplate`,
|
||||
@@ -229,7 +237,14 @@ export function getOCTFCTTemplate(param) {
|
||||
data: param
|
||||
})
|
||||
}
|
||||
|
||||
export function getOCTFCTTemplatesZip(param) {
|
||||
return requestDownload({
|
||||
url: '/OCTCalculate/getOCTFCTTemplatesZip',
|
||||
method: 'post',
|
||||
responseType: 'blob',
|
||||
data: param
|
||||
})
|
||||
}
|
||||
export function uploadOCTFCTTemplate(param) {
|
||||
return request({
|
||||
url: `/OCTCalculate/uploadOCTFCTTemplate`,
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
</div>
|
||||
<!--上传列表@selection-change="handleSelectionChange" @sort-change="handleSortByColumn"-->
|
||||
<el-table ref="dicomFilesTable" v-adaptive="{ bottomOffset: 85 }" height="100" :data="list" :loading="loading"
|
||||
class="dicomFiles-table" :default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
|
||||
class="dicomFiles-table" :default-sort="{ prop: 'TaskBlindName', order: 'ascending' }">
|
||||
<!-- <el-table-column
|
||||
type="selection"
|
||||
width="55"
|
||||
@@ -32,8 +32,8 @@
|
||||
/> -->
|
||||
<el-table-column type="index" width="40" />
|
||||
<!--受试者-->
|
||||
<el-table-column :label="$t('download:table:subjectCode')" min-width="130" prop="SubjectCode"
|
||||
show-overflow-tooltip v-if="isReadingTaskViewInOrder !== 0" />
|
||||
<el-table-column :label="$t('download:table:subjectCode')" prop="SubjectCode" show-overflow-tooltip
|
||||
v-if="isReadingTaskViewInOrder !== 0 || IsImageSegment" />
|
||||
<!--访视名称-->
|
||||
<el-table-column prop="VisitName" :label="$t('download:table:VisitName')" sortable v-if="IsImageSegment" />
|
||||
<!--任务名称-->
|
||||
@@ -67,8 +67,8 @@
|
||||
</el-table-column>
|
||||
<el-table-column :label="$t('common:action:action')" fixed="right" width="150">
|
||||
<template slot-scope="scope">
|
||||
<!--预览--->
|
||||
<el-button circle icon="el-icon-view" :title="$t('download:button:preview')" :disabled="forbid"
|
||||
<!--预览:disabled="forbid"--->
|
||||
<el-button circle icon="el-icon-view" :title="$t('download:button:preview')"
|
||||
@click.stop="preview(scope.row)" />
|
||||
<!--下载--->
|
||||
<el-button circle icon="el-icon-download" :title="$t('download:button:download')"
|
||||
@@ -297,7 +297,7 @@ export default {
|
||||
if (res.IsSuccess) {
|
||||
this.downloadId = res.OtherInfo.PreDownloadId
|
||||
this.IsReadingTaskViewInOrder = res.OtherInfo.IsReadingTaskViewInOrder
|
||||
this.downloadImage(res.Result)
|
||||
this.downloadImage(res.Result, data.SubjectVisitTaskList)
|
||||
}
|
||||
} catch (err) {
|
||||
this.btnLoading = false
|
||||
@@ -305,12 +305,12 @@ export default {
|
||||
}
|
||||
},
|
||||
// 打包下载
|
||||
async downloadImage(data) {
|
||||
async downloadImage(data, params) {
|
||||
try {
|
||||
let { files, name, fileType } = this.formatDownloadFile(data)
|
||||
let res = await downLoadFile(files, name, 'zip')
|
||||
if (res && this.downloadId) {
|
||||
this.downloadImageSuccess()
|
||||
this.downloadImageSuccess(params)
|
||||
}
|
||||
} catch (err) {
|
||||
console.log(err)
|
||||
@@ -449,13 +449,13 @@ export default {
|
||||
return { files, name }
|
||||
},
|
||||
// 影像下载成功确认
|
||||
async downloadImageSuccess() {
|
||||
async downloadImageSuccess(data) {
|
||||
try {
|
||||
let params = {
|
||||
TrialImageDownloadId: this.downloadId,
|
||||
}
|
||||
if (this.isReading) {
|
||||
params.VisitTaskId = this.TaskId
|
||||
params.VisitTaskIdList = data.map(item => item.TaskId)
|
||||
}
|
||||
await downloadImageSuccess(params)
|
||||
} catch (err) {
|
||||
|
||||
@@ -8,10 +8,11 @@
|
||||
</div>
|
||||
</div>
|
||||
<!--检查列表-->
|
||||
<el-table :data="list" style="width: 100%" height="300" :loading="loading">
|
||||
<el-table :data="list" style="width: 100%" height="300" :loading="loading"
|
||||
:default-sort="{ prop: 'TaskBlindName', order: 'ascending' }">
|
||||
<!--受试者-->
|
||||
<el-table-column prop="SubjectCode" :label="$t('upload:dicom:table:subjectCode')" sortable
|
||||
v-if="isReadingTaskViewInOrder !== 0" />
|
||||
v-if="isReadingTaskViewInOrder !== 0 || IsImageSegment" />
|
||||
<!--访视名称-->
|
||||
<el-table-column prop="VisitName" :label="$t('download:table:VisitName')" v-if="IsImageSegment" sortable />
|
||||
<!--任务名称-->
|
||||
@@ -43,8 +44,10 @@
|
||||
<template slot-scope="scope">
|
||||
<div class="btnBox">
|
||||
<!--上传--->
|
||||
<form id="inputForm" :ref="`uploadForm_${scope.row.Id}`" enctype="multipart/form-data"
|
||||
v-if="!forbid && (!isReading || isDownloaded)">
|
||||
<form id="inputForm" :ref="`uploadForm_${scope.row.Id}`" enctype="multipart/form-data" v-if="hasPermi(['role:ir']) && !forbid && (!isReading || scope.row.IsIRImageDownloaded || (!scope.row.IsIRImageDownloaded && Criterion && Criterion.CriterionType &&
|
||||
Criterion.CriterionType != 19 &&
|
||||
Criterion.CriterionType != 20
|
||||
)) && scope.row.ReadingTaskState < 2">
|
||||
<div class="form-group" style="margin-right: 10px">
|
||||
<div :id="`directoryInputWrapper_${scope.row.Id}`" class="btn btn-link file-input">
|
||||
<el-button circle icon="el-icon-upload2" :disabled="btnLoading" :loading="btnLoading"
|
||||
@@ -64,16 +67,17 @@
|
||||
<el-button circle :disabled="!scope.row.UploadStudyList ||
|
||||
scope.row.UploadStudyList.length <= 0 ||
|
||||
scope.row.ReadingTaskState === 2
|
||||
" icon="el-icon-delete" :title="$t('upload:dicom:button:delete')" @click.stop="remove(scope.row)" />
|
||||
" v-if="hasPermi(['role:ir'])" icon="el-icon-delete" :title="$t('upload:dicom:button:delete')"
|
||||
@click.stop="remove(scope.row)" />
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<div style="margin: 10px 0" class="top">
|
||||
<span>{{ $t('upload:dicom:uploadTitle') }}</span>
|
||||
<div class="btnBox" v-if="!forbid && (!isReading || isDownloaded)">
|
||||
<div class="btnBox" v-if="!forbid">
|
||||
<span style="margin-right: 10px">{{ $store.state.trials.uploadTip }}</span>
|
||||
<form id="inputForm" ref="uploadForm" enctype="multipart/form-data">
|
||||
<form id="inputForm" ref="uploadForm" enctype="multipart/form-data" v-if="!isReading">
|
||||
<div class="form-group">
|
||||
<div id="directoryInputWrapper" class="btn btn-link file-input">
|
||||
<el-button type="primary" :disabled="btnLoading" :loading="btnLoading" size="mini">{{
|
||||
|
||||
@@ -12,10 +12,10 @@
|
||||
</div>
|
||||
<!--检查列表 @sort-change="handleSortByColumn"-->
|
||||
<el-table :data="list" style="width: 100%" v-adaptive="{ bottomOffset: 60 }" :loading="loading"
|
||||
:default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
|
||||
:default-sort="{ prop: 'TaskBlindName', order: 'ascending' }">
|
||||
<!--受试者 sortable="custom"-->
|
||||
<el-table-column prop="SubjectCode" :label="$t('upload:nonedicom:table:subject')"
|
||||
v-if="isReadingTaskViewInOrder !== 0" />
|
||||
v-if="isReadingTaskViewInOrder !== 0 || IsImageSegment" />
|
||||
<!--访视名称-->
|
||||
<el-table-column prop="VisitName" :label="$t('upload:nonedicom:table:VisitName')" sortable
|
||||
v-if="IsImageSegment" />
|
||||
@@ -110,12 +110,16 @@
|
||||
<el-button circle :disabled="scope.row.UploadedFileCount <= 0" icon="el-icon-view"
|
||||
:title="$t('upload:nonedicom:button:preview')" @click.stop="handlePreviewNoneDicomFiles(scope.row)" />
|
||||
<!--上传--->
|
||||
<el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')" v-if="!forbid"
|
||||
@click.native.prevent="handleUpload(scope.row)" :disabled="isReading && !isDownloaded" />
|
||||
<el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')" v-if="hasPermi(['role:ir']) && !forbid && (!isReading || scope.row.IsIRImageDownloaded || (!scope.row.IsIRImageDownloaded && Criterion && Criterion.CriterionType &&
|
||||
Criterion.CriterionType != 19 &&
|
||||
Criterion.CriterionType != 20
|
||||
)) && scope.row.ReadingTaskState < 2" @click.native.prevent="handleUpload(scope.row)" />
|
||||
<!-- <el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')"
|
||||
@click.native.prevent="handleUpload(scope.row)" /> -->
|
||||
<!--删除--->
|
||||
<el-button :disabled="scope.row.UploadedFileCount <= 0 ||
|
||||
scope.row.ReadingTaskState === 2
|
||||
" circle icon="el-icon-delete" :title="$t('upload:nonedicom:button:delete')"
|
||||
" v-if="hasPermi(['role:ir'])" circle icon="el-icon-delete" :title="$t('upload:nonedicom:button:delete')"
|
||||
@click.stop="remove(scope.row)" />
|
||||
</template>
|
||||
</el-table-column>
|
||||
@@ -397,7 +401,7 @@ export default {
|
||||
}
|
||||
},
|
||||
// 扫描待上传文件
|
||||
beginScanFiles(e) {
|
||||
async beginScanFiles(e) {
|
||||
var files = [...e.target.files]
|
||||
var sameFiles = [], zipFiles = [], f = false
|
||||
files.forEach((file) => {
|
||||
@@ -405,7 +409,7 @@ export default {
|
||||
.substring(file.name.lastIndexOf('.'))
|
||||
.toLocaleLowerCase()
|
||||
if (extendName === '.zip' && this.IsImageSegment) {
|
||||
if (file.name.indexOf('筛选期') > -1 || file.name.indexOf('研究结束') > -1) f = true
|
||||
if (file.name.indexOf(this.$t("trials:uploadNonDicoms:checkValue:SelectionPeriod")) > -1 || file.name.indexOf("trials:uploadNonDicoms:checkValue:researchOver") > -1) f = true
|
||||
zipFiles.push(file)
|
||||
}
|
||||
if (
|
||||
@@ -416,11 +420,13 @@ export default {
|
||||
}
|
||||
})
|
||||
if (zipFiles.length > 0) {
|
||||
zipFiles.forEach(async file => {
|
||||
for (let i = 0; i < zipFiles.length; i++) {
|
||||
let file = zipFiles[i]
|
||||
let list = await this.readZipFileListRaw(file)
|
||||
if (!f) f = list.some(i => i.path.indexOf('筛选期') > -1 || i.path.indexOf('研究结束') > -1)
|
||||
if (!f) f = list.some(i => i.path.indexOf(this.$t("trials:uploadNonDicoms:checkValue:SelectionPeriod")) > -1 || i.path.indexOf(this.$t("trials:uploadNonDicoms:checkValue:researchOver")) > -1)
|
||||
list = null
|
||||
})
|
||||
if (f) break
|
||||
}
|
||||
}
|
||||
if (f) return this.$confirm(this.$t("trials:uploadNonDicoms:confirm:zipNameNonCompliant"), '', {
|
||||
type: "warning"
|
||||
@@ -684,8 +690,8 @@ export default {
|
||||
},
|
||||
(percentage, checkpoint, lastPer) => {
|
||||
item.uploadFileSize += checkpoint.size * (percentage - lastPer)
|
||||
if (item.uploadFileSize > file.fileSize) {
|
||||
item.uploadFileSize = file.fileSize > 0 ? file.fileSize : 1
|
||||
if (item.uploadFileSize > file.size) {
|
||||
item.uploadFileSize = file.size > 0 ? file.size : 1
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1787639576282" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5836" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M511.974687 0.000434A511.992298 511.992298 0 1 1 0.00047 511.992732 511.30523 511.30523 0 0 1 511.974687 0.000434z m93.350858 188.979888l-87.366133 153.053459-295.168071 0.090404c-28.567568 0-51.728995 19.147503-51.728995 42.760949s23.161427 42.760949 51.728995 42.760948h246.331994l-93.911361 164.643213h-152.420633c-28.567568 0-51.728995 19.147503-51.728995 42.760949s23.125266 42.79711 51.728995 42.79711h103.584556l-39.416012 69.19499a34.498051 34.498051 0 1 0 59.919571 34.172597l58.852806-103.385668h395.027995c28.567568 0 51.728995-19.147503 51.728995-42.760948s-23.161427-42.760949-51.728995-42.760949H454.58642l93.983684-164.661294h252.190153c28.567568 0 51.728995-19.147503 51.728995-42.760948s-23.161427-42.760949-51.728995-42.760949l-203.372157-0.090404 67.893176-118.862781a34.485394 34.485394 0 1 0-59.901489-34.190678z" fill="#1296db" p-id="5837"></path></svg>
|
||||
|
After Width: | Height: | Size: 1.2 KiB |
@@ -6,7 +6,9 @@
|
||||
<div class="login-body">
|
||||
<div class="login-l">
|
||||
<div class="login-logo">
|
||||
<img src="@/assets/zzlogo-usa.png" alt="" class="usa-logo" />
|
||||
<img v-if="language === 'zh'" src="@/assets/zzlogo2.png" alt="" />
|
||||
<img v-else-if="NODE_ENV === 'usa'" src="@/assets/zzlogo-usa.png" alt="" class="usa-logo" />
|
||||
<img v-else src="@/assets/zzlogo4.png" alt="" />
|
||||
</div>
|
||||
<div :class="{
|
||||
'login-image': true,
|
||||
@@ -19,14 +21,14 @@
|
||||
<div class="login-r">
|
||||
<div class="title-container">
|
||||
<!-- IRC Management System -->
|
||||
<!-- <div v-if="NODE_ENV === 'usa'"> -->
|
||||
<div v-if="NODE_ENV === 'usa'">
|
||||
<svg-icon icon-class="login-logo" style="width: 300px; height: 94px" />
|
||||
<!-- </div> -->
|
||||
<!-- <div class="title" v-else>
|
||||
</div>
|
||||
<div class="title" v-else>
|
||||
<img src="@/assets/system.png" alt=""
|
||||
:style="{ width: isEN ? '180px' : '200px', height: isEN ? '60px' : '65px' }" />
|
||||
<div :style="`font-size:${isEN ? '28px' : '35px'}`">{{ $t('login:title:system') }}</div>
|
||||
</div> -->
|
||||
</div>
|
||||
</div>
|
||||
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form" auto-complete="on"
|
||||
label-position="left">
|
||||
@@ -96,10 +98,10 @@
|
||||
$t('login:message:PrivacyPolicyName') }}</span>
|
||||
</div>
|
||||
<div style="text-align: right">
|
||||
<!-- <TopLang v-if="
|
||||
<TopLang v-if="
|
||||
VUE_APP_OSS_CONFIG_REGION !== 'oss-us-west-1' &&
|
||||
NODE_ENV !== 'usa'
|
||||
" /> -->
|
||||
" />
|
||||
<!-- Forget password? -->
|
||||
<el-button type="text" size="medium" @click.native.prevent="handleResetPwd" style="color: rgb(0, 147, 221)">
|
||||
{{ $t('login:button:forgetPassword') }}
|
||||
|
||||
@@ -155,6 +155,17 @@ export default {
|
||||
},
|
||||
],
|
||||
IdCard: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
let reg = new RegExp(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/, 'ig')
|
||||
if (value && !reg.test(value)) {
|
||||
callback(new Error(this.$t('common:ruleMessage:pattern')))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
max: 400,
|
||||
message: this.$t('form:rules:maxLength:400'),
|
||||
@@ -162,6 +173,17 @@ export default {
|
||||
},
|
||||
],
|
||||
BankPhoneNum: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
let reg = new RegExp(/^\d{11}$/, 'i')
|
||||
if (value && !reg.test(value)) {
|
||||
callback(new Error(this.$t('common:ruleMessage:pattern')))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
max: 400,
|
||||
message: this.$t('form:rules:maxLength:400'),
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
:maxlength="400"
|
||||
/>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind NameCN')"
|
||||
prop="BlindNameCN"
|
||||
>
|
||||
@@ -30,7 +30,7 @@
|
||||
style="width: 300px"
|
||||
:maxlength="400"
|
||||
/>
|
||||
</el-form-item> -->
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind Publications')"
|
||||
prop="BlindPublications"
|
||||
|
||||
@@ -211,6 +211,17 @@ export default {
|
||||
},
|
||||
],
|
||||
IdCard: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
let reg = new RegExp(/(^\d{15}$)|(^\d{17}([0-9]|X)$)/, 'ig')
|
||||
if (value && !reg.test(value)) {
|
||||
callback(new Error(this.$t('common:ruleMessage:pattern')))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
max: 400,
|
||||
message: this.$t('form:rules:maxLength:400'),
|
||||
@@ -218,6 +229,17 @@ export default {
|
||||
},
|
||||
],
|
||||
BankPhoneNum: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
let reg = new RegExp(/^\d{11}$/, 'i')
|
||||
if (value && !reg.test(value)) {
|
||||
callback(new Error(this.$t('common:ruleMessage:pattern')))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
max: 400,
|
||||
message: this.$t('form:rules:maxLength:400'),
|
||||
|
||||
@@ -19,12 +19,12 @@
|
||||
>
|
||||
{{ DATA.BlindName }}
|
||||
</el-form-item>
|
||||
<!-- <el-form-item
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind NameCN')"
|
||||
style="width: 45%"
|
||||
>
|
||||
{{ DATA.BlindNameCN }}
|
||||
</el-form-item> -->
|
||||
</el-form-item>
|
||||
<div style="display: flex; font-size: 14px; margin-bottom: 22px">
|
||||
<span style="display: inline-block; width: 120px; color: #000">{{
|
||||
$t('system:Setting:label:Blind Publications')
|
||||
@@ -109,19 +109,19 @@
|
||||
<div class="form_title">
|
||||
{{ $t('system:Setting:title:Blinded information') }}
|
||||
</div>
|
||||
<!-- <el-row>
|
||||
<el-col :span="12"> -->
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind Name')"
|
||||
prop="BlindName"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.BlindName"
|
||||
clearable
|
||||
:maxlength="400"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
<!-- </el-col>
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind Name')"
|
||||
prop="BlindName"
|
||||
>
|
||||
<el-input
|
||||
v-model="form.BlindName"
|
||||
clearable
|
||||
:maxlength="400"
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind NameCN')"
|
||||
@@ -134,7 +134,7 @@
|
||||
></el-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row> -->
|
||||
</el-row>
|
||||
<el-form-item
|
||||
:label="$t('system:Setting:label:Blind Publications')"
|
||||
prop="BlindPublications"
|
||||
|
||||
@@ -591,9 +591,32 @@
|
||||
</div>
|
||||
</div>
|
||||
<div class="file" v-if="isAll && hasFile">
|
||||
<div class="curriculum" v-if="resumeListEN && resumeListEN.length > 0">
|
||||
<div
|
||||
class="curriculum"
|
||||
v-if="
|
||||
(resumeListCN && resumeListCN.length > 0) ||
|
||||
(resumeListEN && resumeListEN.length > 0)
|
||||
"
|
||||
>
|
||||
<div class="title">{{ $t('curriculumVitae:curriculum:title') }}</div>
|
||||
<div class="fileBox">
|
||||
<div
|
||||
class="file_title"
|
||||
v-if="resumeListCN && resumeListCN.length > 0"
|
||||
>
|
||||
{{ $t('curriculumVitae:curriculum:fileTitle:CN') }}
|
||||
</div>
|
||||
<template v-if="true">
|
||||
<div class="file" v-for="item in resumeListCN" :key="item.Id">
|
||||
<div class="name" :title="item.FileName">{{ item.FileName }}</div>
|
||||
<i
|
||||
class="el-icon-download"
|
||||
:title="$t('common:button:download')"
|
||||
@click.stop="handlePreview(item)"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<div class="noData" v-else>{{ $t('curriculumVitae:noData') }}</div>
|
||||
<div
|
||||
class="file_title"
|
||||
v-if="resumeListEN && resumeListEN.length > 0"
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
<template>
|
||||
<div class="trials-navbar" style="position: relative">
|
||||
<div class="leftMenu">
|
||||
<img src="@/assets/title-logo.png" alt="" class="title-logo" />
|
||||
<!-- <span style="white-space: nowrap" v-if="NODE_ENV !== 'usa'">
|
||||
<img v-if="NODE_ENV === 'usa'" src="@/assets/title-logo.png" alt="" class="title-logo" />
|
||||
<img v-else src="@/assets/system.png" alt="" style="width: 150px;height: 50px;margin-bottom: -7px;" />
|
||||
<span style="white-space: nowrap" v-if="NODE_ENV !== 'usa'">
|
||||
<!-- 中心影像系统(EICS) -->
|
||||
{{ $t('trials:trials:title:eics') }}
|
||||
</span> -->
|
||||
</span>
|
||||
</div>
|
||||
<div class="center-menu">
|
||||
<NoticeMarquee />
|
||||
|
||||
@@ -396,7 +396,12 @@
|
||||
:label="$t('trials:readingTracking:config:questionName')"
|
||||
show-overflow-tooltip
|
||||
width="600"
|
||||
/>
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<svg-icon v-show="scope.row.IsTriggerJudge" icon-class="notEqual" class="svg-icon"/>
|
||||
{{ scope.row.QuestionName }}
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
prop="judgeResult"
|
||||
:label="$t('trials:adReview:title:result')"
|
||||
@@ -435,7 +440,7 @@
|
||||
<el-radio-group
|
||||
v-show="!(scope.row.Type === 'class' || scope.row.DataSource === 1)"
|
||||
v-model="judgeSelectedArmMap[scope.row.ReadingQuestionId]"
|
||||
:disabled="readingTaskState >= 2"
|
||||
:disabled="readingTaskState >= 2 || !scope.row.IsTriggerJudge"
|
||||
@change="(val) => handleJudgeArmChange(scope.row, val)"
|
||||
>
|
||||
<el-radio :label="1">
|
||||
@@ -834,10 +839,22 @@ export default {
|
||||
// this.judgeQs = QuestionList
|
||||
this.$set(this.judgeForm, 'judgeResultRemark', res.Result.JudgeResultRemark || '')
|
||||
QuestionList.map((item) => {
|
||||
let val = null
|
||||
if (!item.Answer && item.Type === 'number' && !item.IsTriggerJudge) {
|
||||
val = this.getJudgeAnswerAverageValue(item)
|
||||
} else if (!item.Answer && !item.IsTriggerJudge) {
|
||||
const row = this.judgeAnswers.find(v => {
|
||||
return v.ReadingQuestionId === item.ReadingQuestionId
|
||||
})
|
||||
if (!row) return null
|
||||
val = row.R1Answer
|
||||
} else {
|
||||
val = item.Answer
|
||||
}
|
||||
this.$set(
|
||||
this.judgeForm,
|
||||
item.ReadingQuestionId,
|
||||
item.Answer
|
||||
val
|
||||
)
|
||||
if (item.Type === 'class') {
|
||||
this.classArr.push({ triggerId: item.ClassifyQuestionId, classId: item.ReadingQuestionId, classifyAlgorithms: item.ClassifyAlgorithms, classifyType: item.ClassifyType })
|
||||
@@ -869,6 +886,13 @@ export default {
|
||||
handleJudgeArmChange(question, armEnum) {
|
||||
this.$set(this.judgeSelectedArmMap, question.ReadingQuestionId, armEnum)
|
||||
let val = this.getJudgeAnswerValue(question, armEnum)
|
||||
|
||||
// if (armEnum === 1 || armEnum === 2) {
|
||||
// val = this.getJudgeAnswerValue(question, armEnum)
|
||||
// } else if (armEnum === 3) {
|
||||
// val = this.getJudgeAnswerAverageValue(question, armEnum)
|
||||
// }
|
||||
|
||||
this.$set(
|
||||
this.judgeForm,
|
||||
question.ReadingQuestionId,
|
||||
@@ -886,7 +910,7 @@ export default {
|
||||
parseFloat(val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
const o = list.find(v => {
|
||||
return v.val.includes(val)
|
||||
@@ -1152,6 +1176,19 @@ export default {
|
||||
if (!row) return null
|
||||
return armEnum === 1 ? row.R1Answer : row.R2Answer
|
||||
},
|
||||
getJudgeAnswerAverageValue(question) {
|
||||
const row = this.judgeAnswers.find((item) => {
|
||||
return item.ReadingQuestionId === question.ReadingQuestionId
|
||||
})
|
||||
if (!row) return null
|
||||
let val = ((Number(row.R1Answer) + Number(row.R2Answer)) / 2)
|
||||
let digitPlaces = parseInt(this.taskInfo.DigitPlaces)
|
||||
if (digitPlaces > -1) {
|
||||
return val.toFixed(digitPlaces)
|
||||
} else {
|
||||
return val
|
||||
}
|
||||
},
|
||||
validateJudgeSelections() {
|
||||
const missingQuestion = this.judgeQs.find((question) => {
|
||||
const answer = this.judgeForm[question.ReadingQuestionId]
|
||||
|
||||
@@ -236,7 +236,7 @@
|
||||
</template>
|
||||
<script>
|
||||
import { saveTaskQuestion, submitTableQuestion, deleteReadingRowAnswer } from '@/api/trials'
|
||||
import { resetReadingTask, getIVUSTemplate } from '@/api/reading'
|
||||
import { resetReadingTask, getIVUSTemplatesZip } from '@/api/reading'
|
||||
import { getToken } from '@/utils/auth'
|
||||
import DicomEvent from './../DicomEvent'
|
||||
import store from '@/store'
|
||||
@@ -867,7 +867,7 @@ export default {
|
||||
const params = {
|
||||
visitTaskId: this.visitTaskId
|
||||
}
|
||||
await getIVUSTemplate(params)
|
||||
await getIVUSTemplatesZip(params)
|
||||
} catch (e) {
|
||||
console.log(e)
|
||||
}
|
||||
|
||||
@@ -235,7 +235,7 @@
|
||||
</template>
|
||||
<script>
|
||||
import { saveTaskQuestion, submitTableQuestion, deleteReadingRowAnswer } from '@/api/trials'
|
||||
import { resetReadingTask, getOCTFCTTemplate, getOCTLipidAngleTemplate } from '@/api/reading'
|
||||
import { resetReadingTask, getOCTFCTTemplatesZip, getOCTLipidAngleTemplate } from '@/api/reading'
|
||||
import DicomEvent from './../DicomEvent'
|
||||
import store from '@/store'
|
||||
import { getToken } from '@/utils/auth'
|
||||
@@ -890,7 +890,7 @@ export default {
|
||||
visitTaskId: this.visitTaskId
|
||||
}
|
||||
if (lesionType === 104) {
|
||||
await getOCTFCTTemplate(params)
|
||||
await getOCTFCTTemplatesZip(params)
|
||||
} else {
|
||||
await getOCTLipidAngleTemplate(params)
|
||||
}
|
||||
|
||||
+1
-1
@@ -434,7 +434,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
+1
-1
@@ -234,7 +234,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
@@ -150,19 +150,13 @@ export default {
|
||||
this.handleClear(e, key)
|
||||
if (key === 'study') {
|
||||
this.seriesList = this.studyList.find(item => item.StudyId === this.form.studyId).SeriesArr
|
||||
this.form.seriesId = null
|
||||
this.form.segmentGroupId = null
|
||||
this.form.segmentId = null
|
||||
}
|
||||
if (key === 'series') {
|
||||
this.segmentGroupList = this.segmentionList.filter(item => item.SeriesId === this.form.seriesId)
|
||||
this.form.segmentGroupId = null
|
||||
this.form.segmentId = null
|
||||
}
|
||||
if (key === 'segmentGroup') {
|
||||
let list = await this.getSegmentList(this.form.segmentGroupId)
|
||||
this.segmentList = list.filter(item => item.SegmentJson)
|
||||
this.form.segmentId = null
|
||||
}
|
||||
},
|
||||
handleClear(e, key) {
|
||||
|
||||
+1
-1
@@ -757,7 +757,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
+2
-2
@@ -453,7 +453,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
const o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
@@ -1268,7 +1268,7 @@ export default {
|
||||
parseFloat(val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
const o = list.find(v => {
|
||||
return v.val.includes(val)
|
||||
|
||||
+62
-109
@@ -35,9 +35,7 @@
|
||||
scope.row.QuestionName }}
|
||||
<svg-icon
|
||||
v-if="scope.row.ShowChartTypeEnum > 0 || (scope.row.LesionType === 0 && scope.row.ReportLayType === 1)"
|
||||
icon-class="readingChart"
|
||||
class="svg-icon svg-readingChart-mini"
|
||||
@click.stop="(e) => handleReadingChart({
|
||||
icon-class="readingChart" class="svg-icon svg-readingChart-mini" @click.stop="(e) => handleReadingChart({
|
||||
e,
|
||||
data: {
|
||||
QuestionId: scope.row.RowIndex ? null : scope.row.QuestionId,
|
||||
@@ -51,13 +49,8 @@
|
||||
<span v-else style="font-weight: bold;font-size: 16px;color: #f44336;">{{ scope.row.GroupName }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
v-for="task in visitTaskList"
|
||||
:key="task.VisitTaskId"
|
||||
prop="date"
|
||||
show-overflow-tooltip
|
||||
width="200px"
|
||||
>
|
||||
<el-table-column v-for="task in visitTaskList" :key="task.VisitTaskId" prop="date" show-overflow-tooltip
|
||||
width="200px">
|
||||
<template slot="header">
|
||||
<div v-if="task.IsCurrentTask">{{ task.BlindName }}</div>
|
||||
<div v-else>
|
||||
@@ -71,18 +64,15 @@
|
||||
</template>
|
||||
<template slot-scope="scope">
|
||||
<template
|
||||
v-if="readingTaskState < 2 && task.VisitTaskId === visitTaskId && (scope.row.Type === 'input' || scope.row.Type === 'number' || scope.row.Type === 'select' || scope.row.Type === 'textarea' || scope.row.Type === 'radio')"
|
||||
>
|
||||
v-if="readingTaskState < 2 && task.VisitTaskId === visitTaskId && (scope.row.Type === 'input' || scope.row.Type === 'number' || scope.row.Type === 'select' || scope.row.Type === 'textarea' || scope.row.Type === 'radio')">
|
||||
<!-- 输入框 -->
|
||||
<div>
|
||||
<template
|
||||
v-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||
/>
|
||||
v-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)" />
|
||||
<el-input
|
||||
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && (scope.row.Type === 'input' || scope.row.Type === 'textarea') && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||
v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
|
||||
size="mini"
|
||||
/>
|
||||
size="mini" />
|
||||
<span
|
||||
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && (scope.row.Type === 'input' || scope.row.Type === 'textarea')">{{
|
||||
questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] }}</span>
|
||||
@@ -94,22 +84,13 @@
|
||||
<el-select
|
||||
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && (scope.row.Type === 'select' || scope.row.Type === 'radio') && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||
v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
|
||||
size="mini"
|
||||
clearable
|
||||
:multiple="scope.row.OptionTypeEnum === 1"
|
||||
>
|
||||
size="mini" clearable :multiple="scope.row.OptionTypeEnum === 1">
|
||||
<template>
|
||||
<el-option
|
||||
v-for="val in scope.row.TypeValue.split('|')"
|
||||
:key="val"
|
||||
:label="val"
|
||||
:value="val"
|
||||
/>
|
||||
<el-option v-for="val in scope.row.TypeValue.split('|')" :key="val" :label="val" :value="val" />
|
||||
</template>
|
||||
</el-select>
|
||||
<span
|
||||
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && questionForm[scope.row.QuestionId][scope.row.xfIndex] && (scope.row.Type === 'select' || scope.row.Type === 'radio')"
|
||||
>
|
||||
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && questionForm[scope.row.QuestionId][scope.row.xfIndex] && (scope.row.Type === 'select' || scope.row.Type === 'radio')">
|
||||
{{
|
||||
Array.isArray(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId])
|
||||
?
|
||||
@@ -119,32 +100,23 @@
|
||||
</span>
|
||||
<el-select
|
||||
v-else-if="(scope.row.Type === 'select' || scope.row.Type === 'radio') && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||
v-model="questionForm[scope.row.QuestionId]"
|
||||
size="mini"
|
||||
clearable
|
||||
:multiple="scope.row.OptionTypeEnum === 1"
|
||||
>
|
||||
v-model="questionForm[scope.row.QuestionId]" size="mini" clearable
|
||||
:multiple="scope.row.OptionTypeEnum === 1">
|
||||
<template>
|
||||
<el-option
|
||||
v-for="val in scope.row.TypeValue.split('|')"
|
||||
:key="val"
|
||||
:label="val"
|
||||
:value="val"
|
||||
/>
|
||||
<el-option v-for="val in scope.row.TypeValue.split('|')" :key="val" :label="val" :value="val" />
|
||||
</template>
|
||||
</el-select>
|
||||
<span v-else-if="scope.row.Type === 'select' || scope.row.Type === 'radio'">
|
||||
{{
|
||||
questionForm[scope.row.QuestionId] && Array.isArray(questionForm[scope.row.QuestionId]) ?
|
||||
questionForm[scope.row.QuestionId].join(',') :
|
||||
questionForm[scope.row.QuestionId]
|
||||
questionForm[scope.row.QuestionId] && Array.isArray(questionForm[scope.row.QuestionId]) ?
|
||||
questionForm[scope.row.QuestionId].join(',') :
|
||||
questionForm[scope.row.QuestionId]
|
||||
}}
|
||||
</span>
|
||||
<el-input
|
||||
v-else-if="scope.row.DataSource !== 1 && questionForm[scope.row.QuestionId] instanceof Array && scope.row.Type === 'number' && (scope.row.xfIndex || scope.row.xfIndex === 0) && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||
v-model="questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]"
|
||||
:disabled="scope.row.DataSource === 1"
|
||||
size="mini"
|
||||
:disabled="scope.row.DataSource === 1" size="mini"
|
||||
@blur="limitBlur(questionForm[scope.row.QuestionId][scope.row.xfIndex], scope.row.TableQuestionId, scope.row.ValueType)"
|
||||
@focus="() => { questionId = scope.row.QuestionId }">
|
||||
<template v-if="scope.row.Unit !== 0" slot="append">
|
||||
@@ -154,40 +126,35 @@
|
||||
<template v-else-if="scope.row.ValueType === 2" slot="append">%</template>
|
||||
</el-input>
|
||||
<span
|
||||
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && scope.row.Type === 'number' && (scope.row.xfIndex || scope.row.xfIndex === 0)"
|
||||
>
|
||||
<template
|
||||
v-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit"
|
||||
>
|
||||
v-else-if="questionForm[scope.row.QuestionId] instanceof Array && scope.row.Type === 'number' && (scope.row.xfIndex || scope.row.xfIndex === 0)">
|
||||
<template v-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit">
|
||||
{{
|
||||
isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]))
|
||||
?
|
||||
questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] :
|
||||
`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}
|
||||
isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]))
|
||||
?
|
||||
questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] :
|
||||
`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}
|
||||
${scope.row.Unit !== 4 ? $fd('ValueUnit', scope.row.Unit) : scope.row.CustomUnit}` }}
|
||||
</template>
|
||||
<template v-else-if="scope.row.ValueType === 2">
|
||||
{{
|
||||
isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]))
|
||||
?
|
||||
questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] :
|
||||
`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}
|
||||
isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]))
|
||||
?
|
||||
questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] :
|
||||
`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}
|
||||
%` }}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{
|
||||
isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]))
|
||||
?
|
||||
questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] :
|
||||
`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}`
|
||||
isNaN(parseInt(questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]))
|
||||
?
|
||||
questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId] :
|
||||
`${questionForm[scope.row.QuestionId][scope.row.xfIndex][scope.row.TableQuestionId]}`
|
||||
}}
|
||||
</template>
|
||||
</span>
|
||||
<el-input
|
||||
v-else-if="scope.row.DataSource !== 1 && scope.row.Type === 'number' && !scope.row.IsShowInDicom && ((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||
v-model="questionForm[scope.row.QuestionId]"
|
||||
:disabled="scope.row.DataSource === 1"
|
||||
size="mini"
|
||||
v-model="questionForm[scope.row.QuestionId]" :disabled="scope.row.DataSource === 1" size="mini"
|
||||
@blur="limitBlur(questionForm, scope.row.QuestionId, scope.row.ValueType)"
|
||||
@focus="() => { questionId = scope.row.QuestionId }">
|
||||
<template v-if="scope.row.Unit !== 0" slot="append">
|
||||
@@ -197,21 +164,19 @@
|
||||
<template v-else-if="scope.row.ValueType === 2" slot="append">%</template>
|
||||
</el-input>
|
||||
<span v-else-if="scope.row.Type === 'number'">
|
||||
<template
|
||||
v-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit"
|
||||
>
|
||||
<template v-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit">
|
||||
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ?
|
||||
questionForm[scope.row.QuestionId] : `${questionForm[scope.row.QuestionId]} ${scope.row.Unit !== 4
|
||||
?
|
||||
$fd('ValueUnit', scope.row.Unit) : scope.row.CustomUnit}` }}
|
||||
questionForm[scope.row.QuestionId] : `${questionForm[scope.row.QuestionId]} ${scope.row.Unit !== 4
|
||||
?
|
||||
$fd('ValueUnit', scope.row.Unit) : scope.row.CustomUnit}` }}
|
||||
</template>
|
||||
<template v-else-if="scope.row.ValueType === 2">
|
||||
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ?
|
||||
questionForm[scope.row.QuestionId] : `${questionForm[scope.row.QuestionId]} %` }}
|
||||
questionForm[scope.row.QuestionId] : `${questionForm[scope.row.QuestionId]} %` }}
|
||||
</template>
|
||||
<template v-else>
|
||||
{{ isNaN(parseInt(questionForm[scope.row.QuestionId])) ? questionForm[scope.row.QuestionId] :
|
||||
questionForm[scope.row.QuestionId] }}
|
||||
questionForm[scope.row.QuestionId] }}
|
||||
</template>
|
||||
</span>
|
||||
</div>
|
||||
@@ -225,25 +190,22 @@
|
||||
</template>
|
||||
<template v-else-if="scope.row.DictionaryCode">
|
||||
{{scope.row.Answers[task.VisitTaskId] instanceof Array
|
||||
? scope.row.Answers[task.VisitTaskId].map(item => $fd(scope.row.DictionaryCode,
|
||||
item)).join(",") : $fd(scope.row.DictionaryCode,
|
||||
scope.row.Answers[task.VisitTaskId])}}
|
||||
? scope.row.Answers[task.VisitTaskId].map(item => $fd(scope.row.DictionaryCode,
|
||||
item)).join(",") : $fd(scope.row.DictionaryCode,
|
||||
scope.row.Answers[task.VisitTaskId])}}
|
||||
</template>
|
||||
<template v-else-if="criterionType === 10">
|
||||
{{
|
||||
isNaN(parseInt(scope.row.Answers[task.VisitTaskId])) ? scope.row.Answers[task.VisitTaskId] :
|
||||
`${scope.row.Answers[task.VisitTaskId]}`
|
||||
isNaN(parseInt(scope.row.Answers[task.VisitTaskId])) ? scope.row.Answers[task.VisitTaskId] :
|
||||
`${scope.row.Answers[task.VisitTaskId]}`
|
||||
}}
|
||||
</template>
|
||||
<template
|
||||
v-else-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)"
|
||||
/>
|
||||
<template
|
||||
v-else-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit"
|
||||
>
|
||||
v-else-if="!((task.IsBaseLine && scope.row.LimitEdit === 1) || (!task.IsBaseLine && scope.row.LimitEdit === 2) || scope.row.LimitEdit === 0)" />
|
||||
<template v-else-if="(scope.row.ValueType === 0 || scope.row.ValueType === 1) && scope.row.Unit">
|
||||
{{
|
||||
isNaN(parseInt(scope.row.Answers[task.VisitTaskId])) ? scope.row.Answers[task.VisitTaskId] :
|
||||
`${scope.row.Answers[task.VisitTaskId]}
|
||||
isNaN(parseInt(scope.row.Answers[task.VisitTaskId])) ? scope.row.Answers[task.VisitTaskId] :
|
||||
`${scope.row.Answers[task.VisitTaskId]}
|
||||
${scope.row.Unit !== 4 ? $fd('ValueUnit', scope.row.Unit) : scope.row.CustomUnit}` }}
|
||||
</template>
|
||||
<template v-else-if="scope.row.ValueType === 2">
|
||||
@@ -259,26 +221,17 @@
|
||||
</el-card>
|
||||
|
||||
<!-- 签名框 -->
|
||||
<el-dialog
|
||||
v-if="signVisible"
|
||||
:visible.sync="signVisible"
|
||||
:close-on-click-modal="false"
|
||||
width="600px"
|
||||
custom-class="base-dialog-wrapper"
|
||||
>
|
||||
<el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px"
|
||||
custom-class="base-dialog-wrapper">
|
||||
<div slot="title">
|
||||
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span>
|
||||
<span
|
||||
style="font-size:12px;margin-left:5px"
|
||||
>{{ `(${$t('common:label:sign')}${currentUser})` }}</span>
|
||||
<span style="font-size:12px;margin-left:5px">{{ `(${$t('common:label:sign')}${currentUser})` }}</span>
|
||||
</div>
|
||||
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
|
||||
</el-dialog>
|
||||
|
||||
<!-- 预览文件 -->
|
||||
<viewer
|
||||
ref="picture_perview_customizeReportPage"
|
||||
style="margin: 0 10px"
|
||||
<viewer ref="picture_perview_customizeReportPage" style="margin: 0 10px"
|
||||
v-if="currentType && ['png', 'jpg', 'jpeg'].includes(currentType.toLowerCase())"
|
||||
:images="[`${OSSclientConfig.basePath}${currentPath}`]" :options="viewerOptions">
|
||||
<img v-show="false" :src="`${OSSclientConfig.basePath}${currentPath}`" alt="Image" />
|
||||
@@ -740,8 +693,8 @@ export default {
|
||||
dataArr.length === 0
|
||||
? 0
|
||||
: dataArr.reduce((acc, curr) => {
|
||||
return acc + (typeof curr === 'number' ? curr : 0)
|
||||
}, 0) / dataArr.length
|
||||
return acc + (typeof curr === 'number' ? curr : 0)
|
||||
}, 0) / dataArr.length
|
||||
break
|
||||
case 11:
|
||||
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
|
||||
@@ -769,8 +722,8 @@ export default {
|
||||
dataArr.length === 0
|
||||
? 0
|
||||
: dataArr.reduce((acc, curr) => acc && curr)
|
||||
? 1
|
||||
: 0
|
||||
? 1
|
||||
: 0
|
||||
break
|
||||
case 14:
|
||||
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
|
||||
@@ -782,8 +735,8 @@ export default {
|
||||
dataArr.length === 0
|
||||
? 0
|
||||
: dataArr.reduce((acc, curr) => acc || curr, 0)
|
||||
? 1
|
||||
: 0
|
||||
? 1
|
||||
: 0
|
||||
break
|
||||
case 15:
|
||||
if (!isNaN(parseFloat(this.questionForm[o.TableQuestionId]))) {
|
||||
@@ -808,8 +761,8 @@ export default {
|
||||
return isNaN(num)
|
||||
? ''
|
||||
: isFinite(num)
|
||||
? num.toFixed(this.digitPlaces)
|
||||
: '∞'
|
||||
? num.toFixed(this.digitPlaces)
|
||||
: '∞'
|
||||
},
|
||||
getReportInfo() {
|
||||
this.loading = true
|
||||
@@ -1019,8 +972,8 @@ export default {
|
||||
)}</span><a style="color:#409EFF"
|
||||
href="/screen.pdf"
|
||||
target="blank">${this.$t(
|
||||
'trials:reading:tip:openFile'
|
||||
)}</a></div>`
|
||||
'trials:reading:tip:openFile'
|
||||
)}</a></div>`
|
||||
let confirm = await this.$confirm(html, '', {
|
||||
dangerouslyUseHTMLString: true,
|
||||
})
|
||||
@@ -1190,13 +1143,13 @@ export default {
|
||||
border-color: #444444;
|
||||
}
|
||||
|
||||
::v-deep .el-table__body tr > td {
|
||||
::v-deep .el-table__body tr>td {
|
||||
background-color: #000 !important;
|
||||
color: #fff;
|
||||
border-color: #444444;
|
||||
}
|
||||
|
||||
::v-deep .el-table__body tr:hover > td {
|
||||
::v-deep .el-table__body tr:hover>td {
|
||||
background-color: #858282 !important;
|
||||
color: #fff;
|
||||
border-color: #444444;
|
||||
|
||||
@@ -221,7 +221,6 @@ export default {
|
||||
Object.keys(this.seriesData).forEach(key => {
|
||||
if (key !== 'default' || this.isNeedDefault) seriesData.push(this.seriesData[key])
|
||||
})
|
||||
console.log(seriesData, 'seriesData')
|
||||
this.chart.clear();
|
||||
const option = {
|
||||
useUTC: true,
|
||||
@@ -297,11 +296,11 @@ export default {
|
||||
res = await this[`get${annotation.metadata.toolName.split('histogram_')[1]}Values`](this.renderingEngineId, `${this.viewportKey}-${this.activeViewportIndex}`, annotation)
|
||||
} else {
|
||||
res = await this.getCurrentSliceValuesFromVoxelManager(this.renderingEngineId, `${this.viewportKey}-${this.activeViewportIndex}`)
|
||||
}
|
||||
let obj = {
|
||||
|
||||
}
|
||||
if (res) {
|
||||
let obj = {
|
||||
|
||||
}
|
||||
res.values.forEach(item => {
|
||||
if (obj[item]) {
|
||||
obj[item]++
|
||||
@@ -324,24 +323,10 @@ export default {
|
||||
})
|
||||
}
|
||||
seriesData.sort((a, b) => a[0] - b[0])
|
||||
let MIN = seriesData[0][0]
|
||||
let MAX = seriesData[seriesData.length - 1][0]
|
||||
seriesData = []
|
||||
for (let i = MIN; i <= MAX; i++) {
|
||||
if (obj[i]) {
|
||||
let arr = [i, obj[i]]
|
||||
seriesData.push(arr)
|
||||
} else {
|
||||
let arr = [i, 0]
|
||||
seriesData.push(arr)
|
||||
}
|
||||
}
|
||||
seriesData.sort((a, b) => a[0] - b[0])
|
||||
return {
|
||||
seriesData: {
|
||||
type: 'line',
|
||||
symbolSize: 0,
|
||||
stack: 'Total',
|
||||
data: seriesData
|
||||
},
|
||||
min: min,
|
||||
|
||||
@@ -378,7 +378,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
@@ -206,7 +206,7 @@
|
||||
<!-- 是否复制阅片表单 -->
|
||||
<el-form-item :label="$t('trials:readTask:title:copyForm')" prop="IsCopyOrigenalForms" :rules="[
|
||||
{ required: true, message: $t('common:ruleMessage:select') },
|
||||
]" v-if="rowData.ReadingTool !== 3">
|
||||
]">
|
||||
<el-radio-group v-model="ApplyforReasonForm.IsCopyOrigenalForms">
|
||||
<el-radio v-for="item of $d.YesOrNo" :key="`IsCopyOrigenalForms${item.raw.Id}`" :label="item.value">{{
|
||||
item.label }}</el-radio>
|
||||
@@ -483,8 +483,7 @@ export default {
|
||||
this.ApplyforReasonVisible = true
|
||||
this.ApplyforReasonForm = {
|
||||
Type: null,
|
||||
Remake: null,
|
||||
IsCopyOrigenalForms: this.rowData.ReadingTool === 3 ? false : null
|
||||
Remake: null
|
||||
}
|
||||
this.loading = false
|
||||
}).catch(() => { this.loading = false })
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
:label="$t('trials:pendingReadingTasks:table:NoneDicomStudyCount')" show-overflow-tooltip
|
||||
sortable="custom" /> -->
|
||||
<!-- 标记访视数量 -->
|
||||
<el-table-column prop="MarkVisitCount"
|
||||
<el-table-column prop="MarkIVUSVisitCount"
|
||||
:label="$t('trials:pendingReadingTasks:table:MarkVisitCount')" show-overflow-tooltip
|
||||
sortable="custom">
|
||||
<template slot-scope="scope">
|
||||
@@ -59,7 +59,7 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<!-- 标记访视数量 -->
|
||||
<el-table-column prop="MarkVisitCount"
|
||||
<el-table-column prop="MarkOCTVisitCount"
|
||||
:label="$t('trials:pendingReadingTasks:table:MarkOCTVisitCount')"
|
||||
show-overflow-tooltip sortable="custom">
|
||||
<template slot-scope="scope">
|
||||
|
||||
@@ -311,7 +311,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
const o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
<el-form v-loading="loading" :label-width="'100px'">
|
||||
<!-- 仲裁对象 -->
|
||||
<el-form-item :label="$t('trials:adRules:title:arbitrationRule')">
|
||||
<el-radio-group v-model="JudgyInfo.ArbitrationRule" :disabled="isSign">
|
||||
<el-radio-group v-model="JudgyInfo.ArbitrationRule" :disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])">
|
||||
<el-radio v-for="item of $d.ArbitrationRule" :key="item.id"
|
||||
:disabled="!JudgyInfo.IsReadingTaskViewInOrder || true" :label="item.value" @change="changeArbitrationRule">
|
||||
{{ item.label }}
|
||||
@@ -15,7 +15,7 @@
|
||||
</el-form-item>
|
||||
<!-- 仲裁模式JudgeModeEnum 整体结果择一判定;指标组合判定-->
|
||||
<el-form-item :label="$t('trials:adRules:title:judgeMode')">
|
||||
<el-radio-group v-model="JudgyInfo.JudgeModeEnum" :disabled="isSign">
|
||||
<el-radio-group v-model="JudgyInfo.JudgeModeEnum" :disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])">
|
||||
<el-radio
|
||||
v-for="item of $d.JudgeMode"
|
||||
:key="item.id"
|
||||
@@ -28,7 +28,7 @@
|
||||
</el-form-item>
|
||||
<!-- 裁判规则JudgeRuleEnum 访视一致规则;访视差异规则-->
|
||||
<el-form-item :label="$t('trials:adRules:title:judgeRule')">
|
||||
<el-radio-group v-model="JudgyInfo.JudgeRuleEnum" :disabled="isSign">
|
||||
<el-radio-group v-model="JudgyInfo.JudgeRuleEnum" :disabled="isSign || !hasPermi(['trials:trials-panel:setting:reading-unit:edit'])">
|
||||
<el-radio
|
||||
v-for="item of $d.JudgeRule"
|
||||
:key="item.id"
|
||||
|
||||
@@ -761,7 +761,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
@@ -197,7 +197,7 @@ export default {
|
||||
parseFloat(obj.val) < parseFloat(v.lt)
|
||||
)
|
||||
})
|
||||
answer = o ? o.label : null
|
||||
answer = o ? o.label : 'NE'
|
||||
} else if (i.classifyType === 1) {
|
||||
let o = list.find(v => {
|
||||
return v.val.includes(obj.val)
|
||||
|
||||
+2
-2
@@ -354,8 +354,8 @@ export default {
|
||||
},
|
||||
(percentage, checkpoint, lastPer) => {
|
||||
item.uploadFileSize += checkpoint.size * (percentage - lastPer)
|
||||
if (item.uploadFileSize > file.fileSize) {
|
||||
item.uploadFileSize = file.fileSize > 0 ? file.fileSize : 1
|
||||
if (item.uploadFileSize > file.size) {
|
||||
item.uploadFileSize = file.size > 0 ? file.size : 1
|
||||
}
|
||||
}
|
||||
)
|
||||
|
||||
@@ -882,8 +882,8 @@ export default {
|
||||
},
|
||||
(percentage, checkpoint, lastPer) => {
|
||||
item.uploadFileSize += checkpoint.size * (percentage - lastPer)
|
||||
if (item.uploadFileSize > file.fileSize) {
|
||||
item.uploadFileSize = file.fileSize > 0 ? file.fileSize : 1
|
||||
if (item.uploadFileSize > file.size) {
|
||||
item.uploadFileSize = file.size > 0 ? file.size : 1
|
||||
}
|
||||
},
|
||||
{
|
||||
|
||||
@@ -141,12 +141,6 @@ module.exports = defineConfig({
|
||||
optimization: {
|
||||
splitChunks: {
|
||||
chunks: 'all',
|
||||
minSize: 30000, //字节 引入的文件大于30kb才进行分割
|
||||
maxSize: 5000000, //50kb,尝试将大于50kb的文件拆分成n个50kb的文件
|
||||
minChunks: 1, //模块至少使用次数
|
||||
maxAsyncRequests: 30, //同时加载的模块数量最多是5个,只分割出同时引入的前5个文件
|
||||
maxInitialRequests: 30, //首页加载的时候引入的文件最多3个
|
||||
automaticNameDelimiter: '_', //缓存组和生成文件名称之间的连接符
|
||||
cacheGroups: {
|
||||
libs: { // 第三方库
|
||||
name: 'chunk-libs',
|
||||
|
||||
Reference in New Issue
Block a user