38 Commits

Author SHA1 Message Date
DESKTOP-6C3NK6N\WXS f58eb07323 历史文件大小为空时不显示
continuous-integration/drone/push Build is passing
2024-10-09 16:51:50 +08:00
DESKTOP-6C3NK6N\WXS 83a14956e3 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is failing
2024-10-08 13:15:54 +08:00
DESKTOP-6C3NK6N\WXS ef2e7d4cf8 上传记录列表查询字段变更 2024-10-08 13:15:49 +08:00
caiyiling 9e7ec09719 测量值与单位间添加空格
continuous-integration/drone/push Build is running
2024-10-08 13:12:50 +08:00
DESKTOP-6C3NK6N\WXS 19f9c8012c Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing
2024-09-30 13:43:09 +08:00
DESKTOP-6C3NK6N\WXS 506307690d 新增部位去掉前后空格 2024-09-30 13:42:54 +08:00
caiyiling b945db8a47 oct和ivus标准更改
continuous-integration/drone/push Build is passing
2024-09-30 12:08:33 +08:00
DESKTOP-6C3NK6N\WXS 7bb0213a8c Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing
2024-09-30 10:22:00 +08:00
DESKTOP-6C3NK6N\WXS a75367480d 后处理上传添加限制 2024-09-30 10:21:47 +08:00
caiyiling 64fd549d12 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing
2024-09-29 17:20:03 +08:00
caiyiling f0ec643205 dicom阅片更改 2024-09-29 17:17:47 +08:00
DESKTOP-6C3NK6N\WXS 34c05a9728 版本信息修改
continuous-integration/drone/push Build is passing
2024-09-29 14:04:12 +08:00
DESKTOP-6C3NK6N\WXS 49241bacfa 反馈图片名称问题
continuous-integration/drone/push Build is passing
2024-09-29 10:56:51 +08:00
DESKTOP-6C3NK6N\WXS 3bb0250699 apm意见反馈详情权限
continuous-integration/drone/push Build is passing
2024-09-29 10:38:50 +08:00
DESKTOP-6C3NK6N\WXS 47dd21ea7e 权限配置
continuous-integration/drone/push Build is passing
2024-09-29 10:25:19 +08:00
DESKTOP-6C3NK6N\WXS 64d268b6e8 后处理影像可以编辑检查类型
continuous-integration/drone/push Build is passing
2024-09-29 09:17:07 +08:00
caiyiling 463ecee3d8 下载影像预览后处理影像更改
continuous-integration/drone/push Build is passing
2024-09-27 17:00:42 +08:00
DESKTOP-6C3NK6N\WXS 9936d8c942 1
continuous-integration/drone/push Build is passing
2024-09-27 16:55:11 +08:00
caiyiling 1e132e0046 1
continuous-integration/drone/push Build is passing
2024-09-27 16:39:29 +08:00
caiyiling 95097caac2 1
continuous-integration/drone/push Build is passing
2024-09-27 16:27:43 +08:00
DESKTOP-6C3NK6N\WXS dcde93b4f8 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is running
2024-09-27 16:23:55 +08:00
DESKTOP-6C3NK6N\WXS e690aadd8a 1 2024-09-27 16:23:42 +08:00
caiyiling 7874f69bfe 预览影像更改
continuous-integration/drone/push Build is running
2024-09-27 16:23:19 +08:00
caiyiling bdb45c7b4e 1
continuous-integration/drone/push Build is passing
2024-09-27 16:16:18 +08:00
DESKTOP-6C3NK6N\WXS 0a4683386c 1
continuous-integration/drone/push Build is passing
2024-09-27 16:08:25 +08:00
DESKTOP-6C3NK6N\WXS c73297003f 1
continuous-integration/drone/push Build is passing
2024-09-27 14:48:07 +08:00
caiyiling 4faff7e85c 1
continuous-integration/drone/push Build is running
2024-09-27 14:43:03 +08:00
caiyiling 595e10a77a 系统标准配置更改及查看后处理影像修改
continuous-integration/drone/push Build is passing
2024-09-27 10:01:17 +08:00
caiyiling 360826ef28 1
continuous-integration/drone/push Build is passing
2024-09-26 17:21:56 +08:00
caiyiling cd7d261adf 阅片样式调整
continuous-integration/drone/push Build is passing
2024-09-26 16:54:55 +08:00
caiyiling 3ed09d16f6 自定义阅片样式更改
continuous-integration/drone/push Build is passing
2024-09-26 15:21:43 +08:00
caiyiling 2a016cf5f6 自定义标准阅片更改
continuous-integration/drone/push Build is passing
2024-09-26 15:12:28 +08:00
caiyiling 2d996941a2 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing
2024-09-26 14:49:41 +08:00
caiyiling 2ac92aa8b3 裁判阅片更改 2024-09-26 14:49:25 +08:00
DESKTOP-6C3NK6N\WXS e8a21fa5a3 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing
2024-09-26 14:33:14 +08:00
DESKTOP-6C3NK6N\WXS 771554c9b2 标准配置列表新增标准类型字段 2024-09-26 14:33:08 +08:00
caiyiling 3b7271d3a8 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing
2024-09-26 14:02:34 +08:00
caiyiling d2ab510a3c 裁判阅片更改 2024-09-26 14:02:20 +08:00
34 changed files with 1379 additions and 982 deletions
+8
View File
@@ -96,3 +96,11 @@ export function getTrialDownloadList(data) {
data data
}) })
} }
// 修改后处理检查类型
export function updateTaskStudyModality(params) {
return request({
url: '/DownloadAndUpload/updateTaskStudyModality',
method: 'put',
params
})
}
+4 -2
View File
@@ -133,9 +133,11 @@ export function AddAdjudicationReport(param) {
}) })
} }
export function getVisitStudyList(trialId, subjectVisitId, isReading) { export function getVisitStudyList(trialId, subjectVisitId, isReading, visitTaskId) {
let url = `/SubjectVisit/getVisitStudyList/${trialId}/${subjectVisitId}/${isReading}`
url = visitTaskId ? `${url}?visitTaskId=${visitTaskId}` : url
return request({ return request({
url: `/SubjectVisit/getVisitStudyList/${trialId}/${subjectVisitId}/${isReading}`, url: url,
method: 'get' method: 'get'
}) })
} }
@@ -142,6 +142,7 @@
:modelList="modelList" :modelList="modelList"
:bodyPart="bodyPart" :bodyPart="bodyPart"
:IsDicom="IsDicom" :IsDicom="IsDicom"
:visitTaskId="modelTaskId"
/> />
</el-dialog> </el-dialog>
</template> </template>
@@ -217,6 +218,7 @@ export default {
downloadId: null, downloadId: null,
IsReadingTaskViewInOrder: 0, // 阅片规则 IsReadingTaskViewInOrder: 0, // 阅片规则
bodyPart: [], bodyPart: [],
modelTaskId: null,
} }
}, },
async mounted() { async mounted() {
@@ -442,6 +444,7 @@ export default {
data.SourceSubjectVisitId = item.SourceSubjectVisitId data.SourceSubjectVisitId = item.SourceSubjectVisitId
}) })
} }
this.modelTaskId = item.VisitTaskId
this.IsDicom = item.IsDicom this.IsDicom = item.IsDicom
this.model_cfg.visible = true this.model_cfg.visible = true
}, },
@@ -483,7 +486,7 @@ export default {
var token = getToken() var token = getToken()
let trialId = this.$route.query.trialId let trialId = this.$route.query.trialId
const routeData = this.$router.resolve({ const routeData = this.$router.resolve({
path: `/showvisitdicoms?trialId=${trialId}&subjectVisitId=${row.SourceSubjectVisitId}&isReading=1&TokenKey=${token}`, path: `/showvisitdicoms?page=download&trialId=${trialId}&visitTaskId=${row.VisitTaskId}&subjectVisitId=${row.SourceSubjectVisitId}&isReading=1&TokenKey=${token}`,
}) })
this.open = window.open(routeData.href, '_blank') this.open = window.open(routeData.href, '_blank')
}, },
+89 -89
View File
@@ -52,7 +52,7 @@
class="el-icon-warning-outline" class="el-icon-warning-outline"
style="color: #f56c6c; font-size: 24px" style="color: #f56c6c; font-size: 24px"
></i> ></i>
<span>{{ $t("feedBack:imgfail:tip") }}</span> <span>{{ $t('feedBack:imgfail:tip') }}</span>
</p> </p>
<!-- 问题反馈 --> <!-- 问题反馈 -->
<el-form-item <el-form-item
@@ -140,7 +140,7 @@
<div slot="footer" v-if="type !== 'detail' || isImgfail"> <div slot="footer" v-if="type !== 'detail' || isImgfail">
<!-- 取消 --> <!-- 取消 -->
<el-button size="small" @click.stop="cancel"> <el-button size="small" @click.stop="cancel">
{{ $t("feedBack:button:cancel") }} {{ $t('feedBack:button:cancel') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
<el-button <el-button
@@ -149,21 +149,21 @@
@click.stop="save" @click.stop="save"
:loading="loading" :loading="loading"
> >
{{ $t("feedBack:button:save") }} {{ $t('feedBack:button:save') }}
</el-button> </el-button>
</div> </div>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
<script> <script>
import uploadImage from "./uploadImage.vue"; import uploadImage from './uploadImage.vue'
import { import {
addOrUpdateUserFeedBack, addOrUpdateUserFeedBack,
getUserFeedBackInfo, getUserFeedBackInfo,
batchUpdateFeedBackState, batchUpdateFeedBackState,
} from "@/api/trials.js"; } from '@/api/trials.js'
export default { export default {
name: "FB", name: 'FB',
components: { uploadImage }, components: { uploadImage },
data() { data() {
return { return {
@@ -195,131 +195,131 @@ export default {
QuestionType: [ QuestionType: [
{ {
required: true, required: true,
message: this.$t("common:ruleMessage:specify"), message: this.$t('common:ruleMessage:specify'),
trigger: "blur", trigger: 'blur',
}, },
], ],
QuestionDescription: [ QuestionDescription: [
{ {
required: true, required: true,
message: this.$t("common:ruleMessage:specify"), message: this.$t('common:ruleMessage:specify'),
trigger: "blur", trigger: 'blur',
}, },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
if (value.length < 5) { if (value.length < 5) {
callback( callback(
new Error(this.$t("feedBack:ruleMessage:lengthLimitMin5")) new Error(this.$t('feedBack:ruleMessage:lengthLimitMin5'))
); )
} }
callback(); callback()
}, },
trigger: "blur", trigger: 'blur',
}, },
], ],
}, },
isUpload: false, isUpload: false,
}; }
}, },
computed: { computed: {
level() { level() {
if (this.hasPermi(["role:dev", "role:admin"])) { if (this.hasPermi(['role:dev', 'role:admin'])) {
return 9; return 9
} }
if (this.hasPermi(["role:pm"])) { if (this.hasPermi(['role:pm', 'role:apm'])) {
return 8; return 8
} }
if (this.hasPermi(["role:ir", "role:crc"])) { if (this.hasPermi(['role:ir', 'role:crc'])) {
return 7; return 7
} }
return 0; return 0
}, },
QuestionTypeOptions() { QuestionTypeOptions() {
if (this.level > 7) { if (this.level > 7) {
return [ return [
...this.$d.FeedBackTypeToCRC.filter((item) => item.value > 0), ...this.$d.FeedBackTypeToCRC.filter((item) => item.value > 0),
...this.$d.FeedBackTypeToIR, ...this.$d.FeedBackTypeToIR,
]; ]
} }
if (this.hasPermi(["role:ir"])) { if (this.hasPermi(['role:ir'])) {
return this.$d.FeedBackTypeToIR; return this.$d.FeedBackTypeToIR
} }
if (this.hasPermi(["role:crc"])) { if (this.hasPermi(['role:crc'])) {
return this.$d.FeedBackTypeToCRC; return this.$d.FeedBackTypeToCRC
} }
return []; return []
}, },
}, },
methods: { methods: {
open(data) { open(data) {
let { type, trialId, Id, visitTaskId, SubjectVisitId } = data; let { type, trialId, Id, visitTaskId, SubjectVisitId } = data
this.type = type; this.type = type
this.trialId = trialId; this.trialId = trialId
this.Id = Id; this.Id = Id
this.visitTaskId = visitTaskId; this.visitTaskId = visitTaskId
this.SubjectVisitId = SubjectVisitId; this.SubjectVisitId = SubjectVisitId
if (visitTaskId) { if (visitTaskId) {
this.isImgfail = true; this.isImgfail = true
} }
this.setTypeOption(); this.setTypeOption()
if (!Id) { if (!Id) {
this.title = this.setTitle(); this.title = this.setTitle()
} }
if (Id || visitTaskId) { if (Id || visitTaskId) {
this.getInfo(Id, visitTaskId); this.getInfo(Id, visitTaskId)
} }
this.visible = true; this.visible = true
}, },
cancel() { cancel() {
this.visible = false; this.visible = false
this.$emit("closed"); this.$emit('closed')
}, },
async save() { async save() {
try { try {
let validate = await this.$refs.feedBackForm.validate(); let validate = await this.$refs.feedBackForm.validate()
if (!validate) return; if (!validate) return
if (this.trialId) { if (this.trialId) {
this.form.TrialId = this.trialId; this.form.TrialId = this.trialId
} }
if (this.visitTaskId) { if (this.visitTaskId) {
this.form.VisitTaskId = this.visitTaskId; this.form.VisitTaskId = this.visitTaskId
} }
if (this.SubjectVisitId) { if (this.SubjectVisitId) {
this.form.SubjectVisitId = this.SubjectVisitId; this.form.SubjectVisitId = this.SubjectVisitId
} }
if (this.Id) { if (this.Id) {
this.form.Id = this.Id; this.form.Id = this.Id
} }
this.loading = true; this.loading = true
let res = await addOrUpdateUserFeedBack(this.form); let res = await addOrUpdateUserFeedBack(this.form)
this.loading = false; this.loading = false
if (res.IsSuccess) { if (res.IsSuccess) {
this.$emit("success"); this.$emit('success')
this.$message.success(this.$t("feedBack:save:success")); this.$message.success(this.$t('feedBack:save:success'))
this.cancel(); this.cancel()
} }
} catch (err) { } catch (err) {
this.loading = false; this.loading = false
console.log(err); console.log(err)
} }
}, },
// 修改状态 // 修改状态
async changeState() { async changeState() {
if (this.isImgfail) return; if (this.isImgfail) return
try { try {
let data = { let data = {
IdList: [this.Id], IdList: [this.Id],
State: this.form.State, State: this.form.State,
}; }
let res = await batchUpdateFeedBackState(data); let res = await batchUpdateFeedBackState(data)
if (res.IsSuccess) { if (res.IsSuccess) {
this.$message.success(this.$t("feedBack:changeState:success")); this.$message.success(this.$t('feedBack:changeState:success'))
this.$emit("success"); this.$emit('success')
// this.cancel(); // this.cancel();
this.getInfo(this.Id, this.visitTaskId); this.getInfo(this.Id, this.visitTaskId)
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err)
} }
}, },
// 获取反馈详情 // 获取反馈详情
@@ -328,56 +328,56 @@ export default {
let data = { let data = {
Id, Id,
visitTaskId, visitTaskId,
}; }
let res = await getUserFeedBackInfo(data); let res = await getUserFeedBackInfo(data)
if (res.IsSuccess && res.Result) { if (res.IsSuccess && res.Result) {
this.form = res.Result; this.form = res.Result
this.form.ScreenshotList = this.form.ScreenshotList || [] this.form.ScreenshotList = this.form.ScreenshotList || []
this.Id = res.Result.Id; this.Id = res.Result.Id
if (res.Result.State > 0) { if (res.Result.State > 0) {
this.isStateChange = false; this.isStateChange = false
} }
if (res.Result.VisitTaskId) { if (res.Result.VisitTaskId) {
this.visitTaskId = res.Result.VisitTaskId; this.visitTaskId = res.Result.VisitTaskId
} }
if (res.Result.SubjectVisitId) { if (res.Result.SubjectVisitId) {
this.SubjectVisitId = res.Result.SubjectVisitId; this.SubjectVisitId = res.Result.SubjectVisitId
} }
let code = this.$fd("UserType", res.Result.UserTypeEnum); let code = this.$fd('UserType', res.Result.UserTypeEnum)
this.title = this.setTitle(code, res.Result.FeedBackFullName); this.title = this.setTitle(code, res.Result.FeedBackFullName)
if (visitTaskId) { if (visitTaskId) {
code = `${res.Result.SubjectCode}-${res.Result.SubjectVisitName}`; code = `${res.Result.SubjectCode}-${res.Result.SubjectVisitName}`
this.title = this.setTitle(code, res.Result.FeedBackFullName); this.title = this.setTitle(code, res.Result.FeedBackFullName)
} }
this.$refs.uploadImage.initFileList(res.Result.ScreenshotList); this.$refs.uploadImage.initFileList(res.Result.ScreenshotList)
} }
} catch (err) { } catch (err) {
console.log(err); console.log(err)
} }
}, },
setTypeOption() { setTypeOption() {
if (!this.trialId) return (this.options = []); if (!this.trialId) return (this.options = [])
if (this.hasPermi(["role:ir"])) if (this.hasPermi(['role:ir']))
return (this.option = this.$d.FeedBackTypeToIR); return (this.option = this.$d.FeedBackTypeToIR)
if (this.hasPermi(["role:crc"])) if (this.hasPermi(['role:crc']))
return (this.option = this.$d.FeedBackTypeToCRC); return (this.option = this.$d.FeedBackTypeToCRC)
}, },
setTitle(code, name) { setTitle(code, name) {
if (this.hasPermi(["role:pm"]) && this.visitTaskId) { if (this.hasPermi(['role:pm']) && this.visitTaskId) {
return `${this.$t("feedBack:form:title:pm2")}(${code}/${name})`; return `${this.$t('feedBack:form:title:pm2')}(${code}/${name})`
} }
if (this.hasPermi(["role:pm", "role:dev", "role:admin"])) { if (this.hasPermi(['role:pm', 'role:dev', 'role:admin'])) {
return `${this.$t("feedBack:form:title:pm")}(${code},${name})`; return `${this.$t('feedBack:form:title:pm')}(${code},${name})`
} }
if (this.hasPermi(["role:ir", "role:crc"]) && this.type === "detail") { if (this.hasPermi(['role:ir', 'role:crc']) && this.type === 'detail') {
return `${this.$t("feedBack:form:detail:title")}`; return `${this.$t('feedBack:form:detail:title')}`
} }
if (this.hasPermi(["role:ir", "role:crc"])) { if (this.hasPermi(['role:ir', 'role:crc'])) {
return `${this.$t("feedBack:form:title")}`; return `${this.$t('feedBack:form:title')}`
} }
}, },
}, },
}; }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.tip { .tip {
+56 -58
View File
@@ -58,14 +58,14 @@
</div> </div>
</template> </template>
<script> <script>
const type = "Statement of Work"; const type = 'Statement of Work'
export default { export default {
name: "UploadImage", name: 'UploadImage',
props: { props: {
path: { path: {
required: true, required: true,
default: () => { default: () => {
return []; return []
}, },
}, },
disabled: { disabled: {
@@ -78,14 +78,14 @@ export default {
}, },
trialId: { trialId: {
type: String, type: String,
default: "", default: '',
}, },
}, },
data() { data() {
return { return {
fileList: [], fileList: [],
btnDisabled: false, btnDisabled: false,
}; }
}, },
methods: { methods: {
remove(file, fileList) { remove(file, fileList) {
@@ -93,115 +93,113 @@ export default {
}, },
fileToBlob(file) { fileToBlob(file) {
// 创建 FileReader 对象 // 创建 FileReader 对象
const reader = new FileReader(); const reader = new FileReader()
return new Promise((resolve) => { return new Promise((resolve) => {
// FileReader 添加 load 事件 // FileReader 添加 load 事件
reader.addEventListener("load", (e) => { reader.addEventListener('load', (e) => {
let blob; let blob
if (typeof e.target.result === "object") { if (typeof e.target.result === 'object') {
blob = new Blob([e.target.result]); blob = new Blob([e.target.result])
} else { } else {
blob = e.target.result; blob = e.target.result
} }
resolve(blob); resolve(blob)
}); })
// FileReader 以 ArrayBuffer 格式 读取 File 对象中数据 // FileReader 以 ArrayBuffer 格式 读取 File 对象中数据
reader.readAsArrayBuffer(file); reader.readAsArrayBuffer(file)
}); })
}, },
// 上传oss // 上传oss
async uploadToOSS(name, file) { async uploadToOSS(name, file) {
try { try {
let defaultPath = "/System/FeedBack/"; let defaultPath = '/System/FeedBack/'
if (this.trialId) { if (this.trialId) {
defaultPath = `/${this.trialId}/FeedBack/`; defaultPath = `/${this.trialId}/FeedBack/`
} }
let res = await this.OSSclient.put(`${defaultPath}${name}`, file); let res = await this.OSSclient.put(`${defaultPath}${name}`, file)
return res; return res
} catch (err) { } catch (err) {
console.log(err); console.log(err)
return false; return false
} }
}, },
initFileList(list) { initFileList(list) {
if (list && list.length > 0) { if (list && list.length > 0) {
this.fileList = []; this.fileList = []
list.forEach((item, index) => { list.forEach((item, index) => {
let name = item.split("/"); let name = item.split('/')
this.fileList.push({ this.fileList.push({
name: name[name.length - 1], name: name[name.length - 1],
path: item, path: item,
fullPath: this.OSSclientConfig.basePath + item, fullPath: this.OSSclientConfig.basePath + item,
url: this.OSSclientConfig.basePath + item, url: this.OSSclientConfig.basePath + item,
uid: `${name[name.length - 1]}${index}`, uid: `${name[name.length - 1]}${index}`,
}); })
}); })
console.log(this.fileList);
} }
}, },
async uploadFile(param) { async uploadFile(param) {
var fileName = param.file.name; var fileName = param.file.name
this.$emit("update:isUpload", true); this.$emit('update:isUpload', true)
this.btnDisabled = true; this.btnDisabled = true
this.fileList.push({ this.fileList.push({
url: param.file.url, url: param.file.url,
path: fileName, path: fileName,
uid: param.file.uid, uid: param.file.uid,
}); })
let file = await this.fileToBlob(param.file); let file = await this.fileToBlob(param.file)
let res = await this.uploadToOSS(fileName, file); let res = await this.uploadToOSS(fileName, file)
this.btnDisabled = false; this.btnDisabled = false
let index = this.fileList.findIndex( let index = this.fileList.findIndex((item) => item.uid === param.file.uid)
(item) => item.uid === param.file.uid
);
if (!res) { if (!res) {
if (index >= 0) { if (index >= 0) {
this.fileList.splice(index, 1); this.fileList.splice(index, 1)
} }
return this.$emit("update:isUpload", false); return this.$emit('update:isUpload', false)
} }
this.fileList[index].url = this.OSSclientConfig.basePath + res.name; let name = this.$getObjectName(res.url)
this.fileList[index].path = res.name; this.fileList[index].url = this.OSSclientConfig.basePath + name
this.$emit("update:path", [...this.path, res.name]); this.fileList[index].path = name
this.$emit("update:isUpload", false); this.$emit('update:path', [...this.path, res.name])
return false; this.$emit('update:isUpload', false)
return false
}, },
beforeUpload(file, fileList) { beforeUpload(file, fileList) {
const isValidFile = this.fileValid(file.name, ["png", "jpg", "jpeg"]); const isValidFile = this.fileValid(file.name, ['png', 'jpg', 'jpeg'])
if (isValidFile) { if (isValidFile) {
// this.fileList = []; // this.fileList = [];
} else { } else {
this.$alert(this.$t("feedBack:uploadImg:format")); this.$alert(this.$t('feedBack:uploadImg:format'))
return false; return false
} }
}, },
handlePreview(file) { handlePreview(file) {
file.fullPath ? window.open(file.fullPath, "_blank") : ""; file.fullPath ? window.open(file.fullPath, '_blank') : ''
}, },
handleExceed(files, fileList) { handleExceed(files, fileList) {
this.$message.warning(`Upload is currently limited to 1 file`); this.$message.warning(`Upload is currently limited to 1 file`)
}, },
fileValid(fileName, typeArr) { fileValid(fileName, typeArr) {
var extendName = fileName var extendName = fileName
.substring(fileName.lastIndexOf(".") + 1) .substring(fileName.lastIndexOf('.') + 1)
.toLocaleLowerCase(); .toLocaleLowerCase()
if (typeArr.indexOf(extendName) > -1) { if (typeArr.indexOf(extendName) > -1) {
return true; return true
} else { } else {
return false; return false
} }
}, },
handlePictureCardPreview(file) { handlePictureCardPreview(file) {
this.$refs[file.url].$viewer.show(); this.$refs[file.url].$viewer.show()
}, },
handleRemove(file) { handleRemove(file) {
let index = this.fileList.findIndex((item) => item.uid === file.uid); let index = this.fileList.findIndex((item) => item.uid === file.uid)
this.fileList.splice(index, 1); this.fileList.splice(index, 1)
let arr = this.fileList.map((item) => item.path); let arr = this.fileList.map((item) => item.path)
this.$emit("update:path", arr); this.$emit('update:path', arr)
}, },
}, },
}; }
</script> </script>
<style> <style>
.upload-container .el-upload--text { .upload-container .el-upload--text {
@@ -45,11 +45,18 @@
prop="UploadStudyList" prop="UploadStudyList"
:label="$t('upload:dicom:table:uploadStudyListNum')" :label="$t('upload:dicom:table:uploadStudyListNum')"
> >
<template slot-scope="scope">{{ <template slot-scope="scope">
scope.row.UploadStudyList && Array.isArray(scope.row.UploadStudyList) <el-button
? scope.row.UploadStudyList.length v-if="
: 0 scope.row.UploadStudyList && scope.row.UploadStudyList.length >= 1
}}</template> "
type="text"
@click="handleOpenDialog(scope.row, 'UploadStudyList', true)"
>
<span>{{ scope.row.UploadStudyList.length }}</span>
</el-button>
<span v-else>0</span>
</template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
:label="$t('common:action:action')" :label="$t('common:action:action')"
@@ -107,7 +114,8 @@
circle circle
:disabled=" :disabled="
!scope.row.UploadStudyList || !scope.row.UploadStudyList ||
scope.row.UploadStudyList.length <= 0 scope.row.UploadStudyList.length <= 0 ||
scope.row.ReadingTaskState === 2
" "
icon="el-icon-delete" icon="el-icon-delete"
:title="$t('upload:dicom:button:delete')" :title="$t('upload:dicom:button:delete')"
@@ -436,6 +444,9 @@
:IsDicom="true" :IsDicom="true"
:bodyPart="bodyPart" :bodyPart="bodyPart"
:modelList="modelList" :modelList="modelList"
:isUpload="openIsUpload"
:TrialModality="TrialModality"
@getList="getList"
/> />
</div> </div>
</template> </template>
@@ -544,6 +555,8 @@ export default {
errStudyUidList: [], errStudyUidList: [],
open: null, open: null,
bodyPart: [], bodyPart: [],
openIsUpload: false,
TrialModality: [],
} }
}, },
created() { created() {
@@ -580,6 +593,7 @@ export default {
let res = await getSubjectImageUploadList(params) let res = await getSubjectImageUploadList(params)
this.loading = false this.loading = false
if (res.IsSuccess) { if (res.IsSuccess) {
this.TrialModality = res.OtherInfo.TrialModality.split('|')
this.StudyInstanceUidList = [] this.StudyInstanceUidList = []
this.SopInstanceUidList = [] this.SopInstanceUidList = []
this.UploadStudyList = [] this.UploadStudyList = []
@@ -654,7 +668,8 @@ export default {
} }
}, },
// 打开弹窗 // 打开弹窗
handleOpenDialog(item, list) { handleOpenDialog(item, list, isUpload = false) {
this.openIsUpload = isUpload
this.model_cfg.title = `${item.SubjectCode || ''} > ${item.TaskBlindName}` this.model_cfg.title = `${item.SubjectCode || ''} > ${item.TaskBlindName}`
this.modelList = item[list] this.modelList = item[list]
this.model_cfg.visible = true this.model_cfg.visible = true
@@ -1518,7 +1533,7 @@ export default {
var token = getToken() var token = getToken()
let trialId = this.$route.query.trialId let trialId = this.$route.query.trialId
const routeData = this.$router.resolve({ const routeData = this.$router.resolve({
path: `/showvisitdicoms?trialId=${trialId}&visitTaskId=${row.VisitTaskId}&subjectVisitId=${row.SourceSubjectVisitId}&isReading=1&TokenKey=${token}`, path: `/showvisitdicoms?page=upload&trialId=${trialId}&visitTaskId=${row.VisitTaskId}&subjectVisitId=${row.SourceSubjectVisitId}&isReading=1&TokenKey=${token}`,
}) })
this.open = window.open(routeData.href, '_blank') this.open = window.open(routeData.href, '_blank')
}, },
@@ -42,6 +42,7 @@
<script> <script>
import dicomFile from './dicomFile.vue' import dicomFile from './dicomFile.vue'
import nonedicomFile from './nonedicomFile.vue' import nonedicomFile from './nonedicomFile.vue'
import store from '@/store'
export default { export default {
name: 'uploadDicomAndNonedicom', name: 'uploadDicomAndNonedicom',
components: { dicomFile, nonedicomFile }, components: { dicomFile, nonedicomFile },
@@ -83,6 +84,7 @@ export default {
}, },
mounted() { mounted() {
this.title = `Upload Images${this.SubjectCode}${this.Criterion.TrialReadingCriterionName}` this.title = `Upload Images${this.SubjectCode}${this.Criterion.TrialReadingCriterionName}`
store.dispatch('trials/setUnLock', true)
}, },
methods: { methods: {
beforeClose() { beforeClose() {
@@ -67,7 +67,7 @@
<span>{{ <span>{{
scope.row.FileSize && scope.row.FileSize > 0 scope.row.FileSize && scope.row.FileSize > 0
? `${(scope.row.FileSize / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.FileSize / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -139,7 +139,7 @@
<span>{{ <span>{{
scope.row.FileSize && scope.row.FileSize > 0 scope.row.FileSize && scope.row.FileSize > 0
? `${(scope.row.FileSize / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.FileSize / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -203,7 +203,10 @@
/> />
<!--删除---> <!--删除--->
<el-button <el-button
:disabled="scope.row.UploadedFileCount <= 0" :disabled="
scope.row.UploadedFileCount <= 0 ||
scope.row.ReadingTaskState === 2
"
circle circle
icon="el-icon-delete" icon="el-icon-delete"
:title="$t('upload:nonedicom:button:delete')" :title="$t('upload:nonedicom:button:delete')"
@@ -318,7 +321,7 @@
<span>{{ <span>{{
scope.row.size && scope.row.size > 0 scope.row.size && scope.row.size > 0
? `${(scope.row.size / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.size / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -1,4 +1,5 @@
<template> <template>
<div v-if="model_cfg.visible">
<base-model :config="model_cfg"> <base-model :config="model_cfg">
<div slot="dialog-body"> <div slot="dialog-body">
<el-table :data="modelList" style="width: 100%" height="300"> <el-table :data="modelList" style="width: 100%" height="300">
@@ -104,17 +105,71 @@
circle circle
icon="el-icon-view" icon="el-icon-view"
:title="$t('trials:uploadImage:button:preview')" :title="$t('trials:uploadImage:button:preview')"
v-if="!isUpload"
@click.stop="preview(scope.row)" @click.stop="preview(scope.row)"
/> />
<!--编辑--->
<el-button
circle
icon="el-icon-edit-outline"
:title="$t('trials:uploadImage:button:edit')"
v-else
@click.stop="openEdit(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</div> </div>
</base-model> </base-model>
<!--新增检查部位-->
<base-model v-if="editModality_model.visible" :config="editModality_model">
<template slot="dialog-body">
<el-form
ref="editModalityform"
:inline="true"
:model="form"
class="demo-form-inline"
:rules="rules"
>
<el-form-item
:label="$t('trials:uploadImage:form:ModalityForEdit')"
prop="Modality"
label-width="150px"
>
<el-select v-model="form.Modality" placeholder="">
<el-option
v-for="item in TrialModality"
:key="item"
:label="item"
:value="item"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
</template>
<template slot="dialog-footer">
<el-button
type="primary"
@click="updateTaskStudyModality"
:loading="loading"
>
{{ $t('common:button:confirm') }}
</el-button>
<el-button
@click="editModality_model.visible = false"
:loading="loading"
>
{{ $t('common:button:cancel') }}
</el-button>
</template>
</base-model>
</div>
</template> </template>
<script> <script>
import baseModel from '@/components/BaseModel' import baseModel from '@/components/BaseModel'
import { getToken } from '@/utils/auth' import { getToken } from '@/utils/auth'
import { updateTaskStudyModality } from '@/api/load.js'
export default { export default {
name: 'studyView', name: 'studyView',
props: { props: {
@@ -136,15 +191,53 @@ export default {
return [] return []
}, },
}, },
TrialModality: {
type: Array,
default: () => {
return []
},
},
visitTaskId: {
type: String,
},
IsDicom: { IsDicom: {
required: true, required: true,
type: Boolean, type: Boolean,
default: true, default: true,
}, },
isUpload: {
required: true,
type: Boolean,
default: false,
},
}, },
components: { components: {
'base-model': baseModel, 'base-model': baseModel,
}, },
data() {
return {
form: {
Modality: null,
TaskStudyId: null,
},
editModality_model: {
visible: false,
title: this.$t('trials:uploadImage:button:edit'),
width: '500px',
appendToBody: true,
},
rules: {
Modality: [
{
required: true,
message: this.$t('trials:uploadImage:format:notModality'),
trigger: ['blur', 'change'],
},
],
},
loading: false,
}
},
methods: { methods: {
// 预览 // 预览
preview(row) { preview(row) {
@@ -152,7 +245,7 @@ export default {
if (this.IsDicom) { if (this.IsDicom) {
var token = getToken() var token = getToken()
routeData = this.$router.resolve({ routeData = this.$router.resolve({
path: `/showdicom?studyId=${row.Id}&TokenKey=${token}&type=Study`, path: `/showdicom?studyId=${row.Id}&TokenKey=${token}&type=Study&visitTaskId=${this.visitTaskId}`,
}) })
} else { } else {
let trialId = this.$route.query.trialId let trialId = this.$route.query.trialId
@@ -163,6 +256,34 @@ export default {
} }
window.open(routeData.href, '_blank') window.open(routeData.href, '_blank')
}, },
// 打开编辑
openEdit(row) {
this.form.TaskStudyId = row.Id
this.form.Modality = row.ModalityForEdit
this.editModality_model.visible = true
},
// 修改检查类型
async updateTaskStudyModality() {
try {
let validate = await this.$refs.editModalityform.validate()
if (!validate) return false
this.loading = true
let res = await updateTaskStudyModality(this.form)
this.loading = false
if (res.IsSuccess) {
this.modelList.some((item) => {
if (this.form.TaskStudyId === item.Id) {
item.ModalityForEdit = this.form.Modality
}
return this.form.TaskStudyId === item.Id
})
this.editModality_model.visible = false
this.$emit('getList')
}
} catch (err) {
console.log(err)
}
},
}, },
} }
</script> </script>
+4
View File
@@ -113,10 +113,14 @@ export const parseDicom = (file, name = false) => {
} }
}) })
uintKey.forEach(key => { uintKey.forEach(key => {
if (res.hasOwnProperty(key)) {
res[key] = data.uint16(dicom[key]) res[key] = data.uint16(dicom[key])
}
}) })
intStringKey.forEach(key => { intStringKey.forEach(key => {
if (res.hasOwnProperty(key)) {
res[key] = data.intString(dicom[key]) res[key] = data.intString(dicom[key])
}
}) })
defaultKey.forEach(key => { defaultKey.forEach(key => {
if (!res[key] && res.hasOwnProperty(key)) { if (!res[key] && res.hasOwnProperty(key)) {
+1 -1
View File
@@ -251,7 +251,7 @@ export default {
}, },
async loadPatientStudy() { async loadPatientStudy() {
try { try {
let data = await getPatientSeriesList(this.studyId); const data = await getPatientSeriesList(this.studyId)
if (data.IsSuccess) { if (data.IsSuccess) {
const { Result } = data const { Result } = data
var seriesList = [] var seriesList = []
+7 -3
View File
@@ -143,7 +143,7 @@
</div> </div>
</div> </div>
</el-tab-pane> </el-tab-pane>
<el-tab-pane :label="$t('trials:dicom-show:relatedVisit')" name="relation-study" class="pane-relation-wrapper"> <el-tab-pane :label="$t('trials:dicom-show:relatedVisit')" name="relation-study" class="pane-relation-wrapper" v-if="!visitTaskId">
<div class="viewerSidethumbinner"> <div class="viewerSidethumbinner">
<el-collapse v-model="relationActiveName" @change="handelRelationActiveChange"> <el-collapse v-model="relationActiveName" @change="handelRelationActiveChange">
<el-collapse-item v-for="(study,studyIndex) in relationStudyList" :key="`${study.StudyId}`" :name="`${study.StudyId}`"> <el-collapse-item v-for="(study,studyIndex) in relationStudyList" :key="`${study.StudyId}`" :name="`${study.StudyId}`">
@@ -303,7 +303,8 @@ export default {
showSeriesList: [], showSeriesList: [],
currentLoadIns: [], currentLoadIns: [],
isFromCRCUpload: false, isFromCRCUpload: false,
visitTaskId: null visitTaskId: null,
page: ''
} }
}, },
mounted() { mounted() {
@@ -321,6 +322,7 @@ export default {
this.showDelete = parseInt(this.$router.currentRoute.query.showDelete) this.showDelete = parseInt(this.$router.currentRoute.query.showDelete)
this.isFromCRCUpload = !!this.$router.currentRoute.query.isFromCRCUpload this.isFromCRCUpload = !!this.$router.currentRoute.query.isFromCRCUpload
this.visitTaskId = this.$router.currentRoute.query.visitTaskId this.visitTaskId = this.$router.currentRoute.query.visitTaskId
this.page = this.$route.query.page
// cornerstone.events.addEventListener('cornerstoneimageloaded', this.cornerstoneImageLoaded) // cornerstone.events.addEventListener('cornerstoneimageloaded', this.cornerstoneImageLoaded)
this.getStudiesInfo() this.getStudiesInfo()
cornerstone.events.addEventListener('cornerstoneimageloadprogress', this.cornerstoneimageloadprogress) cornerstone.events.addEventListener('cornerstoneimageloadprogress', this.cornerstoneimageloadprogress)
@@ -342,8 +344,10 @@ export default {
this.studyList = [] this.studyList = []
try { try {
let res = null let res = null
if (this.visitTaskId) { if (this.page === 'upload') {
res = await getTaskUploadedDicomStudyList({ visitTaskId: this.visitTaskId }) res = await getTaskUploadedDicomStudyList({ visitTaskId: this.visitTaskId })
} else if (this.page === 'download'){
res = await getVisitStudyList(this.trialId, this.subjectVisitId, this.isReading, this.visitTaskId)
} else { } else {
res = await getVisitStudyList(this.trialId, this.subjectVisitId, this.isReading) res = await getVisitStudyList(this.trialId, this.subjectVisitId, this.isReading)
} }
@@ -355,11 +355,11 @@
<el-radio v-for="item of $d.LimitEdit" :key="item.value" :label="item.value">{{ item.label }}</el-radio> <el-radio v-for="item of $d.LimitEdit" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item label="全局阅片是否显示"> <!-- <el-form-item label="全局阅片是否显示">
<el-radio-group v-model="form.GlobalReadingShowType"> <el-radio-group v-model="form.GlobalReadingShowType">
<el-radio v-for="item of $d.GlobalReadingShowType" :key="item.id" :label="item.value">{{ item.label }}</el-radio> <el-radio v-for="item of $d.GlobalReadingShowType" :key="item.id" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item> -->
</div> </div>
<div class="base-dialog-footer" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" style="text-align:right;margin-top:10px;">
<el-form-item> <el-form-item>
@@ -445,7 +445,7 @@ export default {
DependParentId: '', DependParentId: '',
QuestionMark: null, QuestionMark: null,
LimitEdit: 0, LimitEdit: 0,
GlobalReadingShowType: null, // GlobalReadingShowType: null,
QuestionClassify: null, QuestionClassify: null,
HighlightAnswerList: [] HighlightAnswerList: []
+1 -1
View File
@@ -350,7 +350,7 @@ export default {
if (this.hasPermi(['role:dev', 'role:admin'])) { if (this.hasPermi(['role:dev', 'role:admin'])) {
return 9 return 9
} }
if (this.hasPermi(['role:pm', 'role:spm'])) { if (this.hasPermi(['role:pm', 'role:apm'])) {
return 8 return 8
} }
if (this.hasPermi(['role:ir', 'role:crc'])) { if (this.hasPermi(['role:ir', 'role:crc'])) {
+1 -1
View File
@@ -185,7 +185,7 @@
</p> </p>
<p style="margin-bottom: 20px" v-else>{{ $t('login:title:system') }}</p> <p style="margin-bottom: 20px" v-else>{{ $t('login:title:system') }}</p>
<p style="margin-bottom: 20px"> <p style="margin-bottom: 20px">
V{{ $Version.IsEnv_US ? $version.Version_US : $version.Version }} V{{ $version.IsEnv_US ? $version.Version_US : $version.Version }}
</p> </p>
<p style="margin-bottom: 20px" v-if="language === 'zh'"> <p style="margin-bottom: 20px" v-if="language === 'zh'">
Copyright © {{ new Date().getFullYear() }} 上海展影医疗科技有限公司 Copyright © {{ new Date().getFullYear() }} 上海展影医疗科技有限公司
@@ -70,53 +70,21 @@
width="150" width="150"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<div <div v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].QuestionType === 1">
v-if=" <span v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].DictionaryCode">
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i] {{ $fd(scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].DictionaryCode,parseInt(scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer))
.QuestionType === 1 }}
" </span>
> <span v-else>
<span {{ scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer }}
v-if=" </span>
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i] <span v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Unit && !isNaN(parseFloat(scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer))">{{ $fd('ValueUnit', parseInt(scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Unit)) }}</span>
.DictionaryCode
"
>{{
$fd(
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[
i
].DictionaryCode,
parseInt(
scope.row.VisitTaskInfoList[j.index]
.JudgeQuestionList[i].Answer
)
)
}}</span>
<span v-else>{{
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i]
.Answer
}}</span>
</div> </div>
<div <div v-else-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].QuestionType === 2">
v-else-if=" <div v-if="scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer">
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i] <span>
.QuestionType === 2 {{ $fd("YesOrNo",scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer) }}
" </span>
>
<div
v-if="
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i]
.Answer
"
>
<span>{{
$fd(
"YesOrNo",
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[
i
].Answer
)
}}</span>
<!-- 查看详情 --> <!-- 查看详情 -->
<el-button <el-button
type="text" type="text"
@@ -143,10 +111,7 @@
</div> </div>
</div> </div>
<div v-else> <div v-else>
{{ {{ scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i].Answer }}
scope.row.VisitTaskInfoList[j.index].JudgeQuestionList[i]
.Answer
}}
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@@ -1039,7 +1039,7 @@ export default {
loadImageStack(dicomSeries) { loadImageStack(dicomSeries) {
return new Promise(resolve => { return new Promise(resolve => {
this.isCurrentTask = dicomSeries.isCurrentTask this.isCurrentTask = dicomSeries.isCurrentTask
this.isBaseline = dicomSeries.isBaseline this.isBaseline = dicomSeries.isBaseLineTask
this.readingTaskState = dicomSeries.readingTaskState this.readingTaskState = dicomSeries.readingTaskState
if (this.isCurrentTask && this.readingTaskState < 2) { if (this.isCurrentTask && this.readingTaskState < 2) {
this.activeTool = 1 this.activeTool = 1
@@ -1088,16 +1088,16 @@ export default {
var frame = imageInfo.frame var frame = imageInfo.frame
this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null
this.stack.instanceId = instanceId this.stack.instanceId = instanceId
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
ToolStateManager.clearImageIdToolState(dicomSeries.imageIds)
this.toggleClipPlay(false)
this.toolState.viewportInvert = false
this.toolState.dicomInfoVisible = false
const element = this.$refs.canvas const element = this.$refs.canvas
cornerstone.enable(element) cornerstone.enable(element)
element.tabIndex = 0 element.tabIndex = 0
element.focus() element.focus()
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
ToolStateManager.clearImageIdToolState(dicomSeries.imageIds)
this.toggleClipPlay(false)
this.toolState.viewportInvert = false
this.toolState.dicomInfoVisible = false
var scope = this var scope = this
// var p = parseInt(new Date().getTime()) // var p = parseInt(new Date().getTime())
// requestPoolManager.loadAndCacheImagePlus(this.stack.imageIds[this.stack.currentImageIdIndex], this.stack.seriesId, p*100).then(image=>{ // requestPoolManager.loadAndCacheImagePlus(this.stack.imageIds[this.stack.currentImageIdIndex], this.stack.seriesId, p*100).then(image=>{
@@ -758,7 +758,7 @@
> >
<div slot="title"> <div slot="title">
<span style="font-size:18px;">{{ $t('common:dialogTitle:sign') }}</span> <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;user-select: text !important;">{{ `(${$t('common:label:sign')}${ currentUser })` }}</span>
</div> </div>
<SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" /> <SignForm ref="signForm" :sign-code-enum="signCode" @closeDialog="closeSignDialog" />
</el-dialog> </el-dialog>
@@ -1221,8 +1221,8 @@ export default {
if (idx > -1) { if (idx > -1) {
this.taskId = this.visitTaskList[idx].VisitTaskId this.taskId = this.visitTaskList[idx].VisitTaskId
} }
this.uploadSubjectCode = this.$route.query.subjectCode this.uploadSubjectCode = this.$route.query.subjectCode||localStorage.getItem("subjectCode")
this.uploadSubjectId = this.$route.query.subjectId this.uploadSubjectId = this.$route.query.subjectId||localStorage.getItem("subjectId")
this.uploadTrialCriterion = this.trialCriterion this.uploadTrialCriterion = this.trialCriterion
this.uploadStatus = status this.uploadStatus = status
this[`${status}ImageVisible`] = true this[`${status}ImageVisible`] = true
@@ -81,7 +81,7 @@
:render-header="renderHeader" :render-header="renderHeader"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="q.Unit > 0"> <span v-if="q.Unit > 0 && !isNaN(parseFloat(scope.row[q.Id]))">
{{ `${scope.row[q.Id]} ${$fd('ValueUnit', parseInt(q.Unit))}` }} {{ `${scope.row[q.Id]} ${$fd('ValueUnit', parseInt(q.Unit))}` }}
</span> </span>
<span v-else-if="q.DictionaryCode"> <span v-else-if="q.DictionaryCode">
@@ -721,7 +721,8 @@ export default {
const span = document.createElement('span') const span = document.createElement('span')
span.innerText = column.label span.innerText = column.label
document.body.appendChild(span) document.body.appendChild(span)
column.minWidth = span.getBoundingClientRect().width + 20 const w = span.getBoundingClientRect().width
column.minWidth = w > 65 ? w + 10 : w > 60 ? w + 15 : w + 20
document.body.removeChild(span) document.body.removeChild(span)
return h('span', column.label) return h('span', column.label)
} }
@@ -81,7 +81,7 @@
:render-header="renderHeader" :render-header="renderHeader"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<span v-if="q.Unit > 0"> <span v-if="q.Unit > 0 && !isNaN(parseFloat(scope.row[q.Id]))">
{{ `${scope.row[q.Id]} ${$fd('ValueUnit', parseInt(q.Unit))}` }} {{ `${scope.row[q.Id]} ${$fd('ValueUnit', parseInt(q.Unit))}` }}
</span> </span>
<span v-else-if="q.DictionaryCode"> <span v-else-if="q.DictionaryCode">
@@ -732,7 +732,8 @@ export default {
const span = document.createElement('span') const span = document.createElement('span')
span.innerText = column.label span.innerText = column.label
document.body.appendChild(span) document.body.appendChild(span)
column.minWidth = span.getBoundingClientRect().width + 30 const w = span.getBoundingClientRect().width
column.minWidth = w > 65 ? w + 10 : w > 60 ? w + 15 : w + 30
document.body.removeChild(span) document.body.removeChild(span)
return h('span', column.label) return h('span', column.label)
} }
@@ -1064,16 +1064,15 @@ export default {
var frame = imageInfo.frame var frame = imageInfo.frame
this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null this.stack.frame = this.stack.isExistMutiFrames ? parseInt(frame) : null
this.stack.instanceId = instanceId this.stack.instanceId = instanceId
const element = this.$refs.canvas
cornerstone.enable(element)
element.tabIndex = 0
element.focus()
const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager const ToolStateManager = cornerstoneTools.globalImageIdSpecificToolStateManager
ToolStateManager.clearImageIdToolState(dicomSeries.imageIds) ToolStateManager.clearImageIdToolState(dicomSeries.imageIds)
this.toggleClipPlay(false) this.toggleClipPlay(false)
this.toolState.viewportInvert = false this.toolState.viewportInvert = false
this.toolState.dicomInfoVisible = false this.toolState.dicomInfoVisible = false
const element = this.$refs.canvas
cornerstone.enable(element)
element.tabIndex = 0
element.focus()
var scope = this var scope = this
// var p = parseInt(new Date().getTime()) // var p = parseInt(new Date().getTime())
// requestPoolManager.loadAndCacheImagePlus(this.stack.imageIds[this.stack.currentImageIdIndex], this.stack.seriesId, p*100).then(image=>{ // requestPoolManager.loadAndCacheImagePlus(this.stack.imageIds[this.stack.currentImageIdIndex], this.stack.seriesId, p*100).then(image=>{
@@ -1083,8 +1083,8 @@ export default {
if (idx > -1) { if (idx > -1) {
this.taskId = this.visitTaskList[idx].VisitTaskId this.taskId = this.visitTaskList[idx].VisitTaskId
} }
this.uploadSubjectCode = this.$route.query.subjectCode this.uploadSubjectCode = this.$route.query.subjectCode||localStorage.getItem("subjectCode")
this.uploadSubjectId = this.$route.query.subjectId this.uploadSubjectId = this.$route.query.subjectId||localStorage.getItem("subjectId")
this.uploadTrialCriterion = this.trialCriterion this.uploadTrialCriterion = this.trialCriterion
this.uploadStatus = status this.uploadStatus = status
this[`${status}ImageVisible`] = true this[`${status}ImageVisible`] = true
@@ -25,14 +25,14 @@
</div> </div>
<div class="questions-footer"> <div class="questions-footer">
<i class="el-icon-question feedback-icon" @click="openFeedBackTable" /> <i class="el-icon-question feedback-icon" @click="openFeedBackTable" />
<el-button v-if="readingTaskState<2" style="margin-right: 10px" size="small" @click="handleSave(true)"> <el-button v-if="readingTaskState<2" style="margin-right: 10px" type="primary" size="small" @click="handleSave(true)">
{{$t('common:button:save')}} {{$t('common:button:save')}}
</el-button> </el-button>
<el-button v-if="readingTaskState<2 && IseCRFShowInDicomReading" type="primary" size="small" @click="skipTask"> <el-button v-if="readingTaskState<2 && IseCRFShowInDicomReading" type="primary" style="margin-right: 10px" size="small" @click="skipTask">
<!-- 跳过 --> <!-- 跳过 -->
{{ $t('trials:readingReport:button:skip') }} {{ $t('trials:readingReport:button:skip') }}
</el-button> </el-button>
<el-button style="margin-right: 10px" size="small" v-if="readingTaskState<2 && IseCRFShowInDicomReading" @click="handleConfirm"> <el-button style="margin-right: 10px" type="primary" size="small" v-if="readingTaskState<2 && IseCRFShowInDicomReading" @click="handleConfirm">
{{ $t('common:button:submit') }}</el-button> {{ $t('common:button:submit') }}</el-button>
</div> </div>
<!-- 签名框 --> <!-- 签名框 -->
@@ -82,7 +82,7 @@ export default {
var answers = [] var answers = []
for (const k in this.questionForm) { for (const k in this.questionForm) {
if (this.questionForm[k] instanceof Array) {} else { if (this.questionForm[k] instanceof Array) {} else {
answers.push({ id: k, answer: this.questionForm[k].toString() }) answers.push({ id: k, answer: this.questionForm[k] })
} }
} }
var params = { var params = {
@@ -319,6 +319,7 @@ export default {
// } // }
// } // }
this.subjectId = res.Result.SubjectId this.subjectId = res.Result.SubjectId
localStorage.setItem('subjectId', res.Result.SubjectId)
this.subjectCode = res.Result.SubjectCode this.subjectCode = res.Result.SubjectCode
localStorage.setItem('subjectCode', res.Result.SubjectCode) localStorage.setItem('subjectCode', res.Result.SubjectCode)
this.taskBlindName = res.Result.TaskBlindName this.taskBlindName = res.Result.TaskBlindName
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -104,7 +104,7 @@
? `${(scope.row.size / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.size / 1024 / 1024).toFixed(2)}MB`
: scope.row.Size && scope.row.Size > 0 : scope.row.Size && scope.row.Size > 0
? `${(scope.row.Size / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.Size / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -156,7 +156,7 @@
<span>{{ <span>{{
scope.row.FileSize && scope.row.FileSize > 0 scope.row.FileSize && scope.row.FileSize > 0
? `${(scope.row.FileSize / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.FileSize / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -151,7 +151,7 @@
:value="trialInfo.UserFeedBackUnDealedCount || 0" :value="trialInfo.UserFeedBackUnDealedCount || 0"
:max="99" :max="99"
class="inBox" class="inBox"
v-hasPermi="['role:pm', 'role:admin', 'role:spm']" v-hasPermi="['role:pm', 'role:admin', 'role:apm']"
> >
<i class="el-icon-message" @click.stop="openFeedBack"></i> <i class="el-icon-message" @click.stop="openFeedBack"></i>
</el-badge> </el-badge>
@@ -6,7 +6,7 @@
<!-- 中心编号 --> <!-- 中心编号 -->
<el-form-item :label="$t('trials:uploadMonitor:table:siteId')"> <el-form-item :label="$t('trials:uploadMonitor:table:siteId')">
<el-select <el-select
v-model="searchData.SiteId" v-model="searchData.TrialSiteId"
clearable clearable
filterable filterable
style="width: 120px" style="width: 120px"
@@ -387,7 +387,7 @@ const searchDataDefault = () => {
PageIndex: 1, PageIndex: 1,
PageSize: 20, PageSize: 20,
TrialId: '', TrialId: '',
SiteId: '', TrialSiteId: '',
SubjectId: '', SubjectId: '',
SubjectVisitId: '', SubjectVisitId: '',
SubjectInfo: '', SubjectInfo: '',
@@ -324,7 +324,7 @@
<span>{{ <span>{{
scope.row.Size && scope.row.Size > 0 scope.row.Size && scope.row.Size > 0
? `${(scope.row.Size / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.Size / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -75,7 +75,7 @@
<span>{{ <span>{{
scope.row.FileSize && scope.row.FileSize > 0 scope.row.FileSize && scope.row.FileSize > 0
? `${(scope.row.FileSize / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.FileSize / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -409,7 +409,7 @@
<span>{{ <span>{{
scope.row.size && scope.row.size > 0 scope.row.size && scope.row.size > 0
? `${(scope.row.size / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.size / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
@@ -329,7 +329,7 @@
<span>{{ <span>{{
scope.row.Size && scope.row.Size > 0 scope.row.Size && scope.row.Size > 0
? `${(scope.row.Size / 1024 / 1024).toFixed(2)}MB` ? `${(scope.row.Size / 1024 / 1024).toFixed(2)}MB`
: 0 : ''
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>