Compare commits

...

794 Commits
v1.8.0 ... main

Author SHA1 Message Date
wangxiaoshuang 6674989249 自定义结构化录入的临床数据,配置工具存在问题
continuous-integration/drone/push Build is passing Details
2025-06-20 18:04:34 +08:00
wangxiaoshuang 06167d4ff5 项目邮件阅片标准修改
continuous-integration/drone/push Build is passing Details
2025-06-20 15:27:39 +08:00
wangxiaoshuang 2a1dc4d2dd 自定义结构化录入的临床数据,配置工具存在问题
continuous-integration/drone/push Build is running Details
2025-06-20 13:17:21 +08:00
wangxiaoshuang 3d6cd67493 字典配置修改为可查看
continuous-integration/drone/push Build is passing Details
2025-06-20 11:26:20 +08:00
wangxiaoshuang c448f4cda8 上传影像预览窗宽窗位问题
continuous-integration/drone/push Build is passing Details
2025-06-20 11:05:27 +08:00
wangxiaoshuang 155158f954 项目配置检查名称问题解决
continuous-integration/drone/push Build is passing Details
2025-06-20 09:44:08 +08:00
wangxiaoshuang 551620c3c3 1
continuous-integration/drone/push Build is passing Details
2025-06-19 17:44:31 +08:00
wangxiaoshuang 4540f39051 切换靶段时清空备注 2025-06-19 17:42:25 +08:00
wangxiaoshuang 848bf0c8b2 自定义报告单选显示问题修改
continuous-integration/drone/push Build is passing Details
2025-06-19 17:24:35 +08:00
wangxiaoshuang aa1f4dae9b IVUS和OCT表单修改,新增靶段
continuous-integration/drone/push Build is passing Details
2025-06-19 16:53:11 +08:00
wangxiaoshuang a41359111f 字典子项增加排序
continuous-integration/drone/push Build is passing Details
2025-06-19 13:39:12 +08:00
wangxiaoshuang 50ae94bf08 1
continuous-integration/drone/push Build is passing Details
2025-06-19 13:18:07 +08:00
wangxiaoshuang 19785bd266 邮件模板编辑阅片标准改为多选
continuous-integration/drone/push Build is passing Details
2025-06-19 13:13:12 +08:00
wangxiaoshuang cc5a4ed2df 邮件模板编辑样式修改
continuous-integration/drone/push Build is passing Details
2025-06-19 11:42:53 +08:00
wangxiaoshuang 5efcbae09a 邮件模板阅片标准字段更改 2025-06-19 11:40:46 +08:00
wangxiaoshuang 6f5d48cdcd 如果上传影像都是问题影像,此时会显示数量0/0
continuous-integration/drone/push Build is passing Details
2025-06-19 11:28:14 +08:00
wangxiaoshuang fead8b8c8f 导出文件格式问题
continuous-integration/drone/push Build is passing Details
2025-06-18 14:28:08 +08:00
wangxiaoshuang 6980cd275e Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
2025-06-18 13:48:05 +08:00
wangxiaoshuang a14aefca2c 上传影像文件统计问题
continuous-integration/drone/push Build encountered an error Details
2025-06-18 13:33:39 +08:00
wangxiaoshuang 334882cc68 阅片下载压缩包名称修改 2025-06-18 13:30:36 +08:00
wangxiaoshuang de250ecbf5 Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
# Conflicts:
#	src/views/trials/trials-panel/reading/dicoms3D/components/ReadPage.vue
2025-06-18 09:56:39 +08:00
wangxiaoshuang d8315fbfff 阅片上传下载按钮添加
continuous-integration/drone/push Build encountered an error Details
2025-06-18 09:55:16 +08:00
wangxiaoshuang 1022fa2888 阅片顺序添加admin角色权限
continuous-integration/drone/push Build encountered an error Details
2025-06-17 16:49:15 +08:00
wangxiaoshuang a14451b82b 影像汇总导出表格
continuous-integration/drone/push Build is passing Details
2025-06-17 16:43:55 +08:00
wangxiaoshuang 24ff1772dd Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
2025-06-16 17:24:31 +08:00
wangxiaoshuang 48633a1ed4 阅片顺序手动修改添加限制条件
continuous-integration/drone/push Build encountered an error Details
2025-06-16 17:24:14 +08:00
wangxiaoshuang 0634df6e33 Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
# Conflicts:
#	src/views/trials/trials-panel/trial-summary/audit-record/index.vue
2025-06-16 16:06:54 +08:00
wangxiaoshuang 108d01f81c 阅片顺序默认排序、阅片中禁用
continuous-integration/drone/push Build encountered an error Details
2025-06-16 16:05:49 +08:00
caiyiling ae808679a0 1
continuous-integration/drone/push Build is passing Details
2025-06-13 18:02:55 +08:00
wangxiaoshuang 12e4128b7b 提交裁判阅片结果详情oldValue改为--
continuous-integration/drone/push Build encountered an error Details
2025-06-13 16:49:50 +08:00
caiyiling fbb23065e5 1
continuous-integration/drone/push Build is passing Details
2025-06-13 16:33:59 +08:00
caiyiling 0d85f138a5 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-06-13 16:07:17 +08:00
caiyiling f60d845725 自定义阅片更改 2025-06-13 16:06:54 +08:00
wangxiaoshuang f848e9a9dd Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
# Conflicts:
#	src/api/trials/reading.js
#	src/views/trials/trials-panel/trial-summary/audit-record/index.vue
2025-06-13 14:34:59 +08:00
wangxiaoshuang b512112d96 肿瘤学阅片查看屏蔽跳过按钮
continuous-integration/drone/push Build encountered an error Details
2025-06-13 14:33:55 +08:00
wangxiaoshuang a7251ce65c 阅片顺序
continuous-integration/drone/push Build encountered an error Details
2025-06-13 14:17:58 +08:00
wangxiaoshuang 19896b85e0 1
continuous-integration/drone/push Build is passing Details
2025-06-13 11:43:07 +08:00
wangxiaoshuang f94013103e Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-06-13 11:17:38 +08:00
wangxiaoshuang ccdfe9d83e 阅片排序 2025-06-13 11:17:28 +08:00
caiyiling 657010202c Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-06-13 10:44:35 +08:00
caiyiling 9c2c6191d2 播放工具更改 2025-06-13 10:44:12 +08:00
wangxiaoshuang 7e2ff6de1b 稽查图片不存在展示问题
continuous-integration/drone/push Build encountered an error Details
2025-06-12 16:23:44 +08:00
wangxiaoshuang c865608313 阅片顺序页面
continuous-integration/drone/push Build is passing Details
2025-06-12 16:19:08 +08:00
wangxiaoshuang 818a8add3d Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web 2025-06-12 16:18:49 +08:00
wangxiaoshuang 53343e37d6 稽查图片不存在展示问题 2025-06-12 16:18:45 +08:00
caiyiling a3e17bbefe Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is failing Details
2025-06-12 15:44:23 +08:00
caiyiling 19bb1eccd8 自定义阅片表单更改 2025-06-12 15:43:59 +08:00
wangxiaoshuang e60260f68d 培训记录查看页面中角色筛选项缺少ZYBS、ZYSS角色
continuous-integration/drone/push Build is pending Details
2025-06-12 11:02:37 +08:00
wangxiaoshuang 2b89163419 项目文档历史记录文件名称修改方式修改
continuous-integration/drone/push Build is passing Details
2025-06-11 16:53:22 +08:00
wangxiaoshuang 3489d34628 影像汇总导出影像、关键图
continuous-integration/drone/push Build is passing Details
2025-06-11 16:34:46 +08:00
wangxiaoshuang 613d434af9 影像汇总
continuous-integration/drone/push Build is passing Details
2025-06-10 18:02:37 +08:00
wangxiaoshuang 123f178673 稽查图片显示问题
continuous-integration/drone/push Build is passing Details
2025-06-10 15:26:34 +08:00
wangxiaoshuang e8e066ab80 稽查操作名查询字段变更
continuous-integration/drone/push Build is passing Details
2025-06-10 09:41:55 +08:00
wangxiaoshuang 4aa5acc401 1
continuous-integration/drone/push Build is passing Details
2025-06-09 16:56:29 +08:00
wangxiaoshuang fa4c00230f 项目文档历史记录修改
continuous-integration/drone/push Build is passing Details
2025-06-09 15:58:52 +08:00
wangxiaoshuang 6ea46c076b 检查部位、检查技术、检查名称已使用禁止取消、删除
continuous-integration/drone/push Build is passing Details
2025-06-09 11:18:09 +08:00
caiyiling dbffc2787d Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-06-06 17:25:59 +08:00
caiyiling f98ea18205 自定义标准阅片交互更改 2025-06-06 17:25:23 +08:00
wangxiaoshuang 00e53c4742 项目培训图片预览问题
continuous-integration/drone/push Build is passing Details
2025-06-06 16:58:38 +08:00
wangxiaoshuang 5de61dd125 项目培训发布状态默认值
continuous-integration/drone/push Build is passing Details
2025-06-06 16:28:07 +08:00
wangxiaoshuang ae8767c70f 配置中检查部位已在项目中使用禁止取消勾选和修改
continuous-integration/drone/push Build is passing Details
2025-06-06 14:34:42 +08:00
wangxiaoshuang 623a7b9858 1
continuous-integration/drone/push Build is passing Details
2025-06-06 14:26:45 +08:00
wangxiaoshuang ce2a0d9936 邮件管理批量编辑 2025-06-06 14:26:37 +08:00
wangxiaoshuang 18b0ec2042 pm重阅跟踪、spm重阅审批弹框列表高度修改
continuous-integration/drone/push Build is passing Details
2025-06-06 13:47:33 +08:00
caiyiling 8d5dfd0258 自定义阅片配置更改
continuous-integration/drone/push Build is passing Details
2025-06-06 11:15:31 +08:00
caiyiling 45f83322ec 1
continuous-integration/drone/push Build is passing Details
2025-06-05 18:32:22 +08:00
caiyiling 3d7ccafa76 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-06-05 18:03:50 +08:00
caiyiling f148c76a7f 自定义阅片更改 2025-06-05 18:03:32 +08:00
wangxiaoshuang 1ffd9e3863 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is failing Details
2025-06-05 16:59:56 +08:00
wangxiaoshuang 3bcf097c52 邮件管理编辑内容方式修改 2025-06-05 16:59:44 +08:00
caiyiling 1e4fd0083a 1
continuous-integration/drone/push Build is passing Details
2025-06-05 16:26:02 +08:00
caiyiling d504039d82 自定义标准配置更改
continuous-integration/drone/push Build is passing Details
2025-06-05 16:22:42 +08:00
caiyiling 0c4b3e5aed 表格问题配置更改
continuous-integration/drone/push Build is passing Details
2025-06-05 16:10:23 +08:00
caiyiling 262541ac08 1
continuous-integration/drone/push Build is passing Details
2025-06-05 16:03:06 +08:00
caiyiling dce3719c58 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2025-06-05 16:00:49 +08:00
caiyiling d05a4437d4 自定义标准配置更改及自定义阅片更改 2025-06-05 16:00:12 +08:00
wangxiaoshuang 10f2953a94 如果不能下载影像,则检查也不需要能够选择
continuous-integration/drone/push Build is passing Details
2025-06-05 13:12:49 +08:00
wangxiaoshuang 7a6cded333 培训材料视频禁止下载
continuous-integration/drone/push Build is passing Details
2025-06-05 11:38:08 +08:00
wangxiaoshuang c1f10036b0 项目文档增加附件
continuous-integration/drone/push Build is passing Details
2025-06-04 17:15:45 +08:00
caiyiling 8e01f3af87 Merge branch 'uat' into main
continuous-integration/drone/push Build is passing Details
2025-06-04 16:50:53 +08:00
caiyiling a66e15eb39 MRI-PDFF测量逻辑更改
continuous-integration/drone/push Build encountered an error Details
2025-06-04 16:25:48 +08:00
wangxiaoshuang 386901316d 1
continuous-integration/drone/push Build is passing Details
2025-06-04 15:58:30 +08:00
caiyiling 122f333c77 Merge branch 'uat' into main
continuous-integration/drone/push Build is passing Details
2025-06-04 13:42:00 +08:00
caiyiling 164437ea70 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-06-04 13:37:46 +08:00
caiyiling 86a8e2faeb 测量工具配置文件更改 2025-06-04 13:37:12 +08:00
caiyiling 895e3a6bed MRI-PDFF更改
continuous-integration/drone/push Build encountered an error Details
2025-06-04 13:35:42 +08:00
wangxiaoshuang b5b67cc5e3 稽查搜索框内容接口获取
continuous-integration/drone/push Build is passing Details
2025-06-04 13:34:42 +08:00
caiyiling 9dddc0c012 MRI-PDFF测量逻辑更改
continuous-integration/drone/push Build encountered an error Details
2025-06-04 10:53:45 +08:00
caiyiling a965f08a1e MRI-PDFF标准更改
continuous-integration/drone/push Build encountered an error Details
2025-06-04 09:24:41 +08:00
wangxiaoshuang d667bb4e79 审批页面优化
continuous-integration/drone/push Build is passing Details
2025-06-03 18:01:04 +08:00
caiyiling c7e0fab789 非Dicom工具更改
continuous-integration/drone/push Build is passing Details
2025-06-03 16:14:28 +08:00
caiyiling 35b16876c9 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-06-03 14:27:27 +08:00
caiyiling 549b028809 非dicom更改 2025-06-03 14:27:09 +08:00
wangxiaoshuang 330b1cf644 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-06-03 13:54:34 +08:00
wangxiaoshuang b51a8e94de 稽查轨迹的记录的操作可以在在项目配置 2025-06-03 13:54:19 +08:00
caiyiling b85853aa5e 阅片结果导出配置更改
continuous-integration/drone/push Build is passing Details
2025-06-03 11:32:48 +08:00
wangxiaoshuang 5386dba134 稽查新增字段是否默认
continuous-integration/drone/push Build is passing Details
2025-05-30 09:27:30 +08:00
caiyiling 3f63c126ff 1
continuous-integration/drone/push Build is passing Details
2025-05-29 17:21:25 +08:00
caiyiling f1b816fd85 自定义阅片更改
continuous-integration/drone/push Build is passing Details
2025-05-29 17:04:00 +08:00
caiyiling 43a221de00 自定义阅片更改
continuous-integration/drone/push Build is passing Details
2025-05-29 14:49:53 +08:00
caiyiling 642c708c74 Merge remote-tracking branch 'origin/uat' into main
continuous-integration/drone/push Build is passing Details
2025-05-29 09:58:39 +08:00
caiyiling aa8831ce54 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2025-05-29 09:57:35 +08:00
caiyiling d73970117d 自定义标准更改 2025-05-29 09:57:02 +08:00
wangxiaoshuang 9d462f69f6 人员管理中,当人员退出时,显示加入项目的时间
continuous-integration/drone/push Build is passing Details
2025-05-29 09:38:11 +08:00
caiyiling 9962b1a829 反色bug修复
continuous-integration/drone/push Build encountered an error Details
2025-05-28 18:46:53 +08:00
caiyiling 049128b90e 添加阅片完成支持添加临时标注(历史标注不允许更改)功能及阅片页面双击放大缺陷修复
continuous-integration/drone/push Build encountered an error Details
2025-05-28 15:44:38 +08:00
caiyiling d77c79acbd 自定义标准问题配置扩充影像标记属性
continuous-integration/drone/push Build is passing Details
2025-05-27 11:10:56 +08:00
caiyiling 1e300b4529 CDISC导出配置支持表格问题更改
continuous-integration/drone/push Build is passing Details
2025-05-27 09:06:04 +08:00
wangxiaoshuang 45e6a20988 Merge branch 'uat'
continuous-integration/drone/push Build encountered an error Details
# Conflicts:
#	src/utils/metaDataProvider.js
2025-05-26 12:30:44 +08:00
wangxiaoshuang 5141eb5cbd 发布配置修改
continuous-integration/drone/push Build is passing Details
2025-05-23 18:12:49 +08:00
wangxiaoshuang 073b06a76f 1
continuous-integration/drone/push Build is passing Details
2025-05-23 17:10:45 +08:00
wangxiaoshuang 20723e8d2c 1
continuous-integration/drone/push Build is passing Details
2025-05-23 16:25:30 +08:00
wangxiaoshuang fba00157a1 crc一致性核查回复弹窗添加取消按钮
continuous-integration/drone/push Build is passing Details
2025-05-23 16:06:12 +08:00
wangxiaoshuang f0e6708533 1
continuous-integration/drone/push Build is passing Details
2025-05-23 15:24:49 +08:00
wangxiaoshuang e770dc1078 1 2025-05-23 15:24:07 +08:00
wangxiaoshuang e15934d7ba iqc质控页面数据已退回禁用所有按钮
continuous-integration/drone/push Build is passing Details
2025-05-23 13:49:36 +08:00
wangxiaoshuang 4baf039d71 iqc下载非dicom文件夹名称问题
continuous-integration/drone/push Build is passing Details
2025-05-23 13:38:59 +08:00
wangxiaoshuang 5c4bc96a26 pm重传审批样式修改
continuous-integration/drone/push Build is passing Details
2025-05-23 13:27:51 +08:00
wangxiaoshuang 30f9e807b7 crc一致性核查逻辑变更
continuous-integration/drone/push Build is passing Details
2025-05-23 11:07:17 +08:00
wangxiaoshuang 269f9f9477 pm重传审批修改
continuous-integration/drone/push Build is passing Details
2025-05-23 10:11:52 +08:00
wangxiaoshuang 810c786512 1
continuous-integration/drone/push Build is passing Details
2025-05-22 18:04:29 +08:00
wangxiaoshuang e27705eb22 IRC国际化替换
continuous-integration/drone/push Build is passing Details
2025-05-22 17:49:43 +08:00
wangxiaoshuang 83bf082c43 crc一致性核查回复信息有误
continuous-integration/drone/push Build is passing Details
2025-05-22 16:52:50 +08:00
wangxiaoshuang 37f12b30cc 阅片跟踪影像退回添加退回原因
continuous-integration/drone/push Build is passing Details
2025-05-22 15:30:14 +08:00
wangxiaoshuang f045f68115 一致性核查回复修改
continuous-integration/drone/push Build is passing Details
2025-05-22 14:06:38 +08:00
wangxiaoshuang 64e67ad106 一致性核查回复修改
continuous-integration/drone/push Build is passing Details
2025-05-22 13:54:27 +08:00
wangxiaoshuang f2ee666083 重阅审批的弹框,国际化取值不正确修改
continuous-integration/drone/push Build is passing Details
2025-05-22 11:04:30 +08:00
caiyiling 8ece8915ff 高亮颜色更改
continuous-integration/drone/push Build is passing Details
2025-05-21 16:01:04 +08:00
caiyiling 8270841ca1 典型肝内病灶鼠标悬浮显示
continuous-integration/drone/push Build is passing Details
2025-05-21 15:21:33 +08:00
caiyiling e99c4527b9 阅片页面radio样式更改及病灶信息高亮更改
continuous-integration/drone/push Build is passing Details
2025-05-21 15:10:49 +08:00
caiyiling e295bff859 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-05-21 14:06:54 +08:00
caiyiling 7a53a75038 影像质量不正常时维护病灶默认状态 2025-05-21 14:06:06 +08:00
wangxiaoshuang d96822818c 1
continuous-integration/drone/push Build is passing Details
2025-05-21 14:02:23 +08:00
caiyiling 9e2255e324 阅片标准更改
continuous-integration/drone/push Build is passing Details
2025-05-21 10:37:12 +08:00
caiyiling dbdd18dcf6 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-05-21 09:49:22 +08:00
caiyiling 4ae2504278 阅片标准更改 2025-05-21 09:48:54 +08:00
wangxiaoshuang 6a0a5f4724 1
continuous-integration/drone/push Build is passing Details
2025-05-20 16:14:40 +08:00
wangxiaoshuang ee2e33405c 申请原因必填添加星号
continuous-integration/drone/push Build is passing Details
2025-05-20 11:07:41 +08:00
wangxiaoshuang 286865ba8f 影像质疑列表操作栏样式调整
continuous-integration/drone/push Build is passing Details
2025-05-20 09:43:02 +08:00
wangxiaoshuang 75a0f3a91a 影像退回添加申请原因、备注
continuous-integration/drone/push Build is passing Details
2025-05-19 17:53:54 +08:00
wangxiaoshuang 4fbcd8f8f5 项目培训新增默认字段IsPublish修改
continuous-integration/drone/push Build is passing Details
2025-05-19 16:05:36 +08:00
wangxiaoshuang 3c2edbffc5 1
continuous-integration/drone/push Build is passing Details
2025-05-19 15:39:04 +08:00
caiyiling 38fb56e09e Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-05-19 15:19:18 +08:00
caiyiling 105537c49e 非淋巴结靶病灶保存验证更改 2025-05-19 15:18:48 +08:00
wangxiaoshuang 355f6bcf86 培训文档管理预览附件
continuous-integration/drone/push Build is passing Details
2025-05-19 14:48:47 +08:00
wangxiaoshuang d6e9f9ddc2 培训文档管理预览附件
continuous-integration/drone/push Build is passing Details
2025-05-19 14:35:17 +08:00
wangxiaoshuang 16e005e664 test环境新增onlyoffice地址配置
continuous-integration/drone/push Build is passing Details
2025-05-19 14:27:00 +08:00
wangxiaoshuang b92b55a45a 培训课程管理问题
continuous-integration/drone/push Build is passing Details
2025-05-19 14:18:59 +08:00
wangxiaoshuang 0ed070ecd7 【临床数据】新增临床数据时,选择模板同时存在中文模板和英文模板,根据语言环境只显示一个 2025-05-19 14:18:45 +08:00
caiyiling 49940ab034 lugano更改
continuous-integration/drone/push Build is passing Details
2025-05-19 14:15:41 +08:00
caiyiling aca5b0c721 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-05-19 11:28:14 +08:00
caiyiling 8ea7540581 阅片报告页更改 2025-05-19 11:27:50 +08:00
wangxiaoshuang ec6a72e143 影像质控问题配置未勾选问题提交会报错
continuous-integration/drone/push Build is passing Details
2025-05-15 16:44:16 +08:00
wangxiaoshuang f512c1456a 阅片结果查看跳转修改
continuous-integration/drone/push Build is passing Details
2025-05-15 15:39:23 +08:00
wangxiaoshuang 4aa74b5420 阅片结果查看跳转修改
continuous-integration/drone/push Build is passing Details
2025-05-15 15:32:24 +08:00
wangxiaoshuang 50c37824aa ir已阅查看跳转修改
continuous-integration/drone/push Build is passing Details
2025-05-15 15:21:47 +08:00
wangxiaoshuang 358864c6c6 onlyoffice引入方式修改
continuous-integration/drone/push Build is passing Details
2025-05-15 11:08:33 +08:00
wangxiaoshuang e2db9c2d51 通用培训文档修改 2025-05-15 11:08:06 +08:00
wangxiaoshuang 78fbae1c1f 通用培训记录的相关文件添加/编辑弹框需要增加标题
continuous-integration/drone/push Build is passing Details
2025-05-15 09:46:25 +08:00
wangxiaoshuang 26c58f14fa 稽查轨迹关联操作页面的标题需要区分
continuous-integration/drone/push Build is passing Details
2025-05-14 16:14:05 +08:00
caiyiling f8774224b3 视角信息更改
continuous-integration/drone/push Build is passing Details
2025-05-14 16:05:43 +08:00
caiyiling bc41f4b4c1 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-05-14 15:48:29 +08:00
caiyiling 0280dfb959 lugano更改 2025-05-14 15:48:08 +08:00
wangxiaoshuang 49aa98af9f suv融合pt图像调整
continuous-integration/drone/push Build is passing Details
2025-05-14 15:06:52 +08:00
wangxiaoshuang 9ce6ff25b9 1
continuous-integration/drone/push Build is passing Details
2025-05-14 14:23:04 +08:00
wangxiaoshuang fca8c1c9bf suv问题修复
continuous-integration/drone/push Build is passing Details
2025-05-14 14:12:31 +08:00
wangxiaoshuang d0ebc3e791 融合影像数存在较大差距校验
continuous-integration/drone/push Build is passing Details
2025-05-14 13:39:45 +08:00
caiyiling ea4f23fb16 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-05-14 13:18:17 +08:00
caiyiling 01d01b1126 视口信息更改 2025-05-14 13:17:56 +08:00
wangxiaoshuang 040d9309b9 影像质控问题配置未勾选问题提交会报错
continuous-integration/drone/push Build is passing Details
2025-05-14 13:05:00 +08:00
caiyiling 1d6656a5b8 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-05-14 11:25:22 +08:00
caiyiling 76e328dcca 阅片页面视角信息更改 2025-05-14 11:24:49 +08:00
wangxiaoshuang 9852d99a4a crc上传文件大小统计修改
continuous-integration/drone/push Build is passing Details
2025-05-13 15:40:30 +08:00
wangxiaoshuang 39f7ba7181 标记缓存修改
continuous-integration/drone/push Build is passing Details
2025-05-13 15:24:32 +08:00
wangxiaoshuang fb68892cd4 基线二维上的病灶被渲染到了随访的融合上
continuous-integration/drone/push Build is passing Details
2025-05-12 17:22:05 +08:00
caiyiling 1e6ec0df27 1
continuous-integration/drone/push Build is passing Details
2025-05-12 17:02:08 +08:00
caiyiling 4ff6416edb 矩形工具更改
continuous-integration/drone/push Build is passing Details
2025-05-12 16:45:48 +08:00
wangxiaoshuang b2645f6423 从随访切到基线再切到随访,测量工具会被禁用,当前访视无法标记
continuous-integration/drone/push Build is passing Details
2025-05-12 15:38:21 +08:00
wangxiaoshuang 122c76d9b2 suv部分问题解决
continuous-integration/drone/push Build is passing Details
2025-05-12 14:58:07 +08:00
wangxiaoshuang 2d155612e5 1
continuous-integration/drone/push Build is passing Details
2025-05-12 13:31:41 +08:00
wangxiaoshuang 329d6b1ff6 【NM自定义】三维MIP视口影像显示异常
continuous-integration/drone/push Build is passing Details
2025-05-12 13:22:36 +08:00
wangxiaoshuang 7006cf849e suv融合部分问题修复
continuous-integration/drone/push Build is passing Details
2025-05-12 13:13:36 +08:00
wangxiaoshuang 71f3519769 suv融合部分问题修复
continuous-integration/drone/push Build is passing Details
2025-05-09 17:54:14 +08:00
wangxiaoshuang bbf2dd16e6 【NM自定义】pet视口放大缩小,标记显示的位置产生了偏移
continuous-integration/drone/push Build is passing Details
2025-05-09 15:58:27 +08:00
wangxiaoshuang 520d499a0b 1
continuous-integration/drone/push Build is passing Details
2025-05-09 14:26:23 +08:00
wangxiaoshuang 00cfb92087 suv融合
continuous-integration/drone/push Build is passing Details
2025-05-09 14:20:24 +08:00
wangxiaoshuang 8eb0b96c8e 重传审批操作添加权限判断
continuous-integration/drone/push Build is passing Details
2025-05-09 10:05:22 +08:00
wangxiaoshuang 24b9120a0a 部分问题解决
continuous-integration/drone/push Build is passing Details
2025-05-08 14:47:26 +08:00
wangxiaoshuang 02fcc4a2c1 suv融合
continuous-integration/drone/push Build is passing Details
2025-05-08 10:36:57 +08:00
wangxiaoshuang f53412acbf 复制、粘贴快捷方式不禁用默认事件
continuous-integration/drone/push Build is passing Details
2025-05-07 13:39:30 +08:00
caiyiling 3948596014 阅片页面更改
continuous-integration/drone/push Build is passing Details
2025-05-06 09:13:59 +08:00
wangxiaoshuang e899c0814e 部分问题修复
continuous-integration/drone/push Build is passing Details
2025-04-30 14:51:13 +08:00
wangxiaoshuang d12b4adb68 部分问题修复
continuous-integration/drone/push Build is passing Details
2025-04-30 13:43:23 +08:00
wangxiaoshuang 3551a521c8 suv融合
continuous-integration/drone/push Build is passing Details
2025-04-29 17:51:54 +08:00
caiyiling e80d439377 阅片更改
continuous-integration/drone/push Build is passing Details
2025-04-28 18:32:16 +08:00
caiyiling f499557c01 1
continuous-integration/drone/push Build is passing Details
2025-04-28 17:37:34 +08:00
caiyiling ecaca550ab 自定义阅片工具更改
continuous-integration/drone/push Build is passing Details
2025-04-28 17:32:40 +08:00
caiyiling b7d7b93c4a 获取病灶截图更改
continuous-integration/drone/push Build is passing Details
2025-04-28 17:07:15 +08:00
caiyiling 7bf92c60ea 阅片完成后禁用“更多”操作
continuous-integration/drone/push Build is passing Details
2025-04-28 16:38:49 +08:00
caiyiling 36a08d1055 自定义阅片报告页更改
continuous-integration/drone/push Build is passing Details
2025-04-28 16:31:45 +08:00
caiyiling 5ebf9032a5 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-28 16:12:02 +08:00
caiyiling 1896c58b50 自定义阅片bug修复 2025-04-28 16:11:08 +08:00
wangxiaoshuang 9168ef3ad7 1
continuous-integration/drone/push Build is passing Details
2025-04-28 15:55:27 +08:00
wangxiaoshuang 4ad299e243 suv融合
continuous-integration/drone/push Build is passing Details
2025-04-28 15:47:07 +08:00
caiyiling 5d337b0b26 自定义阅片bug修复
continuous-integration/drone/push Build is passing Details
2025-04-28 14:22:35 +08:00
caiyiling ca579f8731 自定义阅片更改
continuous-integration/drone/push Build is passing Details
2025-04-28 10:19:37 +08:00
caiyiling 92d41dff28 1
continuous-integration/drone/push Build is passing Details
2025-04-27 18:00:53 +08:00
wangxiaoshuang 8d6ae3a49f suv融合
continuous-integration/drone/push Build is passing Details
2025-04-27 17:04:54 +08:00
caiyiling 18f23d2bba 阅片交互更改
continuous-integration/drone/push Build is passing Details
2025-04-25 15:27:00 +08:00
caiyiling 0a428bf954 多帧图像保存病灶更改及关键帧渲染更改
continuous-integration/drone/push Build is passing Details
2025-04-25 15:02:13 +08:00
caiyiling a6b5d0b196 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-25 10:53:09 +08:00
caiyiling 8bf6d5f515 自定义标准工具添加 2025-04-25 10:52:37 +08:00
wangxiaoshuang 74f3852ecc Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-04-25 09:39:03 +08:00
wangxiaoshuang 9408ce12e2 稽查文档删除添加二次确定 2025-04-25 09:38:08 +08:00
wangxiaoshuang 06a2361ea0 【通用培训管理】新员工培训时限默认值设为14天 2025-04-25 09:37:45 +08:00
caiyiling e3313edefd mRecist标准bug修复
continuous-integration/drone/push Build is passing Details
2025-04-24 16:47:08 +08:00
caiyiling 2676ff4295 阅片单元配置更改
continuous-integration/drone/push Build is passing Details
2025-04-24 10:34:24 +08:00
caiyiling 41b3a98594 recist1.1标准bug修复
continuous-integration/drone/push Build is passing Details
2025-04-23 16:59:54 +08:00
caiyiling c2aba6c3fe 自定义阅片更改
continuous-integration/drone/push Build is passing Details
2025-04-23 15:14:35 +08:00
caiyiling 81a5d5af17 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-23 14:10:26 +08:00
caiyiling 23ac15f978 布局更改 2025-04-23 14:10:08 +08:00
wangxiaoshuang 1ec4c25472 稽查文档通用培训记录导出
continuous-integration/drone/push Build is running Details
2025-04-23 14:10:06 +08:00
wangxiaoshuang ac8710b26b 稽查文档右键下载问题
continuous-integration/drone/push Build is passing Details
2025-04-23 11:44:05 +08:00
caiyiling 1130b55677 视口滚动图像翻页更改
continuous-integration/drone/push Build is passing Details
2025-04-23 09:21:32 +08:00
caiyiling fb57dfe90c 新版本阅片添加iRecist标准
continuous-integration/drone/push Build is failing Details
2025-04-22 17:44:50 +08:00
caiyiling 2784958ccb 多帧对齐更改
continuous-integration/drone/push Build is passing Details
2025-04-22 15:00:35 +08:00
caiyiling d6a3bcba30 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-22 13:43:19 +08:00
caiyiling 4ff9a7c482 多帧渲染更改 2025-04-22 13:42:58 +08:00
wangxiaoshuang 33b3818a9e 测试
continuous-integration/drone/push Build is passing Details
2025-04-22 10:44:48 +08:00
wangxiaoshuang 38c31af137 已发布、已下线的培训文档默认不可多选
continuous-integration/drone/push Build is passing Details
2025-04-21 11:28:41 +08:00
wangxiaoshuang fb671defb5 1
continuous-integration/drone/push Build is passing Details
2025-04-21 11:09:55 +08:00
wangxiaoshuang a25aa2482f 通用培训材料发布、下线功能修改
continuous-integration/drone/push Build is passing Details
2025-04-21 10:57:32 +08:00
wangxiaoshuang 4249ccd9d6 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-04-21 09:47:31 +08:00
wangxiaoshuang 9a88930a04 通用培训创建默认设置为失效 2025-04-21 09:47:20 +08:00
caiyiling aea6a3f8c8 病灶对齐逻辑更改
continuous-integration/drone/push Build is passing Details
2025-04-18 17:02:52 +08:00
caiyiling c657bb8783 标注序列图标维护
continuous-integration/drone/push Build is passing Details
2025-04-18 16:46:27 +08:00
caiyiling b0ae3cbd27 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-18 16:01:28 +08:00
caiyiling 10487640cd 视图工具维护 2025-04-18 16:01:00 +08:00
wangxiaoshuang 83fa937537 通用培训文档新增发布功能
continuous-integration/drone/push Build is passing Details
2025-04-18 14:23:29 +08:00
wangxiaoshuang dd1fb94562 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-04-18 09:55:17 +08:00
wangxiaoshuang 116402f865 【账号登录日志】去除用户类型查询条件 2025-04-18 09:55:06 +08:00
caiyiling 76fe08ed23 重置视口时重置窗宽窗位
continuous-integration/drone/push Build is passing Details
2025-04-18 09:43:21 +08:00
caiyiling 993d97e205 测量时病灶默认状态维护
continuous-integration/drone/push Build is passing Details
2025-04-18 09:21:47 +08:00
caiyiling 11471525af 任务切换或者单个病灶保存时前端缓存当前状态不刷新ecrf
continuous-integration/drone/push Build is passing Details
2025-04-17 17:36:35 +08:00
caiyiling 600abc3ce1 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-17 16:02:57 +08:00
caiyiling 9609768e5e 全局阅片更改 2025-04-17 16:02:39 +08:00
wangxiaoshuang ce565e00ff Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-04-17 15:14:00 +08:00
wangxiaoshuang e49fe23396 通用培训问题修复 2025-04-17 15:13:56 +08:00
caiyiling 85463ad240 典型肝内病灶提示更改
continuous-integration/drone/push Build is passing Details
2025-04-17 14:59:19 +08:00
caiyiling fc228622e1 病灶保存更改
continuous-integration/drone/push Build is passing Details
2025-04-17 14:20:00 +08:00
caiyiling 8840ddc77a 病灶清除修复
continuous-integration/drone/push Build is passing Details
2025-04-17 11:40:34 +08:00
caiyiling 3b31132616 mRecist表单更改
continuous-integration/drone/push Build is passing Details
2025-04-17 10:22:28 +08:00
caiyiling c7df59e564 1
continuous-integration/drone/push Build is passing Details
2025-04-17 09:29:23 +08:00
caiyiling aeef8eaacf 清除病灶信息bug修复
continuous-integration/drone/push Build is passing Details
2025-04-17 09:07:46 +08:00
caiyiling b0c4cfd0bf 阅片页面矩形工具补充
continuous-integration/drone/push Build is passing Details
2025-04-16 17:26:48 +08:00
caiyiling 38c06595aa 病灶保存bug修复
continuous-integration/drone/push Build is passing Details
2025-04-16 17:10:15 +08:00
caiyiling a0c5c7d304 病灶验证更改
continuous-integration/drone/push Build is passing Details
2025-04-16 16:43:30 +08:00
caiyiling 2323cbdd27 病灶保存成功时关闭窗口
continuous-integration/drone/push Build is passing Details
2025-04-16 15:57:33 +08:00
caiyiling c2f3e02ef1 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2025-04-16 15:55:44 +08:00
caiyiling b069c881f2 mRecist病灶验证更改 2025-04-16 15:55:13 +08:00
wangxiaoshuang faaaf8f28f 附件数量为0时不打开预览弹框
continuous-integration/drone/push Build is passing Details
2025-04-15 17:39:54 +08:00
wangxiaoshuang 1e5bd46a40 附件预览筛选是否下线
continuous-integration/drone/push Build is passing Details
2025-04-15 17:27:54 +08:00
wangxiaoshuang 7d2af46845 通用培训问题解决
continuous-integration/drone/push Build is passing Details
2025-04-15 16:29:56 +08:00
wangxiaoshuang e1c41d2327 通用培训文档优化:增加附件、培训时限
continuous-integration/drone/push Build is passing Details
2025-04-15 15:49:22 +08:00
wangxiaoshuang d4ae366fa6 非dicom上传去除限制
continuous-integration/drone/push Build is passing Details
2025-04-15 11:13:52 +08:00
wangxiaoshuang 26963b0f94 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-04-15 10:01:10 +08:00
wangxiaoshuang c391e3e2e7 通用培训新增附件 2025-04-15 10:00:59 +08:00
caiyiling 23feb84e30 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-14 16:46:00 +08:00
caiyiling d5ae075aa8 多帧图像渲染更改 2025-04-14 16:45:40 +08:00
wangxiaoshuang b22374db9e Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-04-14 14:04:37 +08:00
wangxiaoshuang ba17d51f72 文档模板需要区分Elevate和Extensive的需要。 2025-04-14 14:04:28 +08:00
caiyiling 0f9963d939 箭头工具更改
continuous-integration/drone/push Build is passing Details
2025-04-14 13:41:42 +08:00
caiyiling ca0d406e45 recist标准更改
continuous-integration/drone/push Build is passing Details
2025-04-14 13:11:00 +08:00
caiyiling 8e0ad5ca9d mRecist标准更改
continuous-integration/drone/push Build is passing Details
2025-04-14 11:39:53 +08:00
DESKTOP-775TN7O\wxs e0321bae72 影像预览问题解决
continuous-integration/drone/push Build encountered an error Details
2025-04-12 12:04:20 +08:00
wangxiaoshuang 10c1fb0bbc 重传审批添加默认查询条件
continuous-integration/drone/push Build is passing Details
2025-04-11 15:42:24 +08:00
wangxiaoshuang 3ab9b48842 工作台增加通用培训
continuous-integration/drone/push Build is passing Details
2025-04-11 15:17:05 +08:00
wangxiaoshuang 58a590bbb7 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-04-10 17:46:47 +08:00
wangxiaoshuang b331b43b28 表格双击、授权按钮区分 2025-04-10 17:46:35 +08:00
caiyiling 162b649c3c Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-10 17:12:06 +08:00
caiyiling fcc5398bcb 阅片更改 2025-04-10 17:11:47 +08:00
wangxiaoshuang 9df1444e3d 版本记录删除与下载问题
continuous-integration/drone/push Build is passing Details
2025-04-10 16:23:45 +08:00
wangxiaoshuang 0f944343b3 历史版本打开有误
continuous-integration/drone/push Build is passing Details
2025-04-10 15:46:14 +08:00
wangxiaoshuang adeecf0b07 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-04-10 15:41:23 +08:00
wangxiaoshuang 1965abc9fd 设置忽略异地登录 2025-04-10 15:41:13 +08:00
caiyiling 1c19301f28 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-10 15:26:31 +08:00
caiyiling 42711dadb5 dicom阅片更改 2025-04-10 15:26:11 +08:00
wangxiaoshuang d9d2a2169e 表格双击、展开行事件区分
continuous-integration/drone/push Build is passing Details
2025-04-10 14:53:16 +08:00
wangxiaoshuang 9775ef24c8 1
continuous-integration/drone/push Build is failing Details
2025-04-10 14:42:10 +08:00
wangxiaoshuang 9af3cd4280 稽查文档管理问题修复
continuous-integration/drone/push Build is passing Details
2025-04-10 14:32:21 +08:00
wangxiaoshuang ab058d6659 稽查文档排序、新增文件夹更换接口
continuous-integration/drone/push Build is passing Details
2025-04-10 13:27:10 +08:00
wangxiaoshuang 0d446746e6 稽查文档管理问题修复
continuous-integration/drone/push Build is passing Details
2025-04-10 10:29:25 +08:00
wangxiaoshuang aaa366934b 影像退回
continuous-integration/drone/push Build is passing Details
2025-04-10 09:56:02 +08:00
wangxiaoshuang 7614f7a327 1
continuous-integration/drone/push Build is passing Details
2025-04-09 15:59:36 +08:00
wangxiaoshuang 0035ac1266 邮件管理中子页的操作列中文显示为英文,英文环境下按钮位置需要调整
continuous-integration/drone/push Build is passing Details
2025-04-09 13:56:49 +08:00
wangxiaoshuang 298d335a03 【忘记密码】点击上一步无法退回到上一个页面
continuous-integration/drone/push Build is passing Details
2025-04-09 13:50:21 +08:00
wangxiaoshuang 1bddd30709 账户日志的操作类型支持多选
continuous-integration/drone/push Build is passing Details
2025-04-09 13:43:47 +08:00
wangxiaoshuang 1d6ebe6388 项目切换时,需要根据项目状态过滤项目
continuous-integration/drone/push Build is passing Details
2025-04-09 13:37:39 +08:00
wangxiaoshuang 236a565250 工作台稽查文档
continuous-integration/drone/push Build is passing Details
2025-04-09 10:05:30 +08:00
wangxiaoshuang 318954b360 稽查文档管理新增文件夹
continuous-integration/drone/push Build is passing Details
2025-04-08 17:28:40 +08:00
wangxiaoshuang 91d31b4226 稽查文档预览
continuous-integration/drone/push Build is passing Details
2025-04-08 16:17:54 +08:00
wangxiaoshuang 1fb76ca72d 稽查文档预览
continuous-integration/drone/push Build is passing Details
2025-04-08 15:09:04 +08:00
wangxiaoshuang b76d157fca 稽查文档管理
continuous-integration/drone/push Build is passing Details
2025-04-07 18:00:10 +08:00
wangxiaoshuang fa71af24ad 1
continuous-integration/drone/push Build is passing Details
2025-04-07 10:12:32 +08:00
wangxiaoshuang a9edab9227 稽查文档管理
continuous-integration/drone/push Build is failing Details
2025-04-03 17:35:25 +08:00
wangxiaoshuang 1e720e399d 确认收入项,修改选项后,其他文件也改了
continuous-integration/drone/push Build encountered an error Details
2025-04-03 11:15:54 +08:00
wangxiaoshuang 1368397da9 项目总览—>上传记录:中心编号 查询条件,查询结果不对 2025-04-03 11:15:36 +08:00
wangxiaoshuang c8c049b5d0 DICOM影像中,存在Tag最大像素值、最小像素值等,但是和实际的数据统计结果不同 2025-04-03 11:15:22 +08:00
wangxiaoshuang 31c9db368c 稽查文档管理
continuous-integration/drone/push Build is failing Details
2025-04-03 10:28:59 +08:00
wangxiaoshuang 866dc923c7 中心查询条件修改trialSiteId
continuous-integration/drone/push Build is failing Details
2025-04-03 09:46:21 +08:00
wangxiaoshuang a6b958ce4e dicom文件maxValue tag有问题 2025-04-03 09:45:50 +08:00
wangxiaoshuang 662cc93d85 稽查文档管理
continuous-integration/drone/push Build is failing Details
2025-04-01 17:59:24 +08:00
caiyiling e3ad114207 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-04-01 16:48:50 +08:00
caiyiling 0960b480a6 阅片页面更改 2025-04-01 16:48:04 +08:00
wangxiaoshuang 9a4eb1b210 工作台稽查文档
continuous-integration/drone/push Build is passing Details
2025-03-28 18:01:45 +08:00
wangxiaoshuang 0567534367 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-27 13:31:59 +08:00
wangxiaoshuang 481a436169 项目文档确认收入项问题解决 2025-03-27 13:31:54 +08:00
caiyiling 4188c0110f 非dicom阅片受试者内随机初始化图像逻辑更改
continuous-integration/drone/push Build is passing Details
2025-03-26 15:23:29 +08:00
wangxiaoshuang 01206716ab 1
continuous-integration/drone/push Build is passing Details
2025-03-24 16:56:27 +08:00
wangxiaoshuang 7fcbd7f983 生产环境配置修改
continuous-integration/drone/push Build encountered an error Details
2025-03-24 13:59:21 +08:00
wangxiaoshuang 779badb041 项目文档系统数据中英文转换
continuous-integration/drone/push Build is passing Details
2025-03-24 09:31:49 +08:00
caiyiling ef5e5527fd 标注更改及检查名称更改
continuous-integration/drone/push Build is passing Details
2025-03-21 16:29:47 +08:00
caiyiling 52ac12d6b6 阅片页面显示检查名称
continuous-integration/drone/push Build is passing Details
2025-03-21 15:36:23 +08:00
caiyiling 272c28a988 自定义阅片更改及非dicom阅片添加个性化配置
continuous-integration/drone/push Build is passing Details
2025-03-21 15:03:21 +08:00
caiyiling 6b10d07e2a 自定义阅片预览paf更改
continuous-integration/drone/push Build is passing Details
2025-03-21 14:03:53 +08:00
caiyiling 032e710890 阅片工具及报告页查看pdf更改
continuous-integration/drone/push Build is passing Details
2025-03-21 13:09:36 +08:00
caiyiling 032150904e 非dicom阅片更改
continuous-integration/drone/push Build is passing Details
2025-03-20 19:23:20 +08:00
wangxiaoshuang d91161a139 网速监控改为三位小数
continuous-integration/drone/push Build is passing Details
2025-03-19 15:53:41 +08:00
wangxiaoshuang bba2237337 文件大小改为保留3位小数
continuous-integration/drone/push Build is passing Details
2025-03-19 15:36:53 +08:00
wangxiaoshuang 707ca5602c Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-18 17:59:20 +08:00
wangxiaoshuang 3b03d6ba76 项目文档搜索栏样式问题 2025-03-18 17:59:10 +08:00
caiyiling 9277d48c85 1
continuous-integration/drone/push Build is passing Details
2025-03-18 17:55:22 +08:00
caiyiling d753fbc2ab 非dicom阅片测量工具更改
continuous-integration/drone/push Build is passing Details
2025-03-18 16:53:03 +08:00
caiyiling 5678e3302b 国际化补充
continuous-integration/drone/push Build is passing Details
2025-03-18 15:34:12 +08:00
caiyiling c25cb097ab 1
continuous-integration/drone/push Build is passing Details
2025-03-18 15:28:13 +08:00
caiyiling 070db5158d Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2025-03-18 15:27:16 +08:00
caiyiling 121bf497bb 非dicom阅片更改 2025-03-18 15:26:51 +08:00
wangxiaoshuang e2ffd76504 阅片人筛选机构城市国家中英文显示
continuous-integration/drone/push Build is passing Details
2025-03-18 15:18:26 +08:00
wangxiaoshuang cfbe3b4839 项目文档培训记录培训人数校验修改
continuous-integration/drone/push Build is running Details
2025-03-18 15:16:31 +08:00
wangxiaoshuang 81bef8abe0 项目文档培训记录培训人数添加校验
continuous-integration/drone/push Build is passing Details
2025-03-18 14:15:31 +08:00
wangxiaoshuang 84b1263340 浏览器页签标题修改
continuous-integration/drone/push Build is passing Details
2025-03-18 13:57:07 +08:00
wangxiaoshuang 4016e71c37 项目文档阅片人问题修复
continuous-integration/drone/push Build is passing Details
2025-03-18 13:51:25 +08:00
wangxiaoshuang 3b0afd3913 1
continuous-integration/drone/push Build is passing Details
2025-03-18 13:45:13 +08:00
wangxiaoshuang 3672892451 项目文档阅片人问题修复
continuous-integration/drone/push Build is passing Details
2025-03-18 09:54:33 +08:00
wangxiaoshuang c46ca18a42 项目文档菜单与列表是否适用字段联动
continuous-integration/drone/push Build is passing Details
2025-03-17 16:38:14 +08:00
wangxiaoshuang 0e0b5c2c4c 项目文档同意入项记录上传方式修改
continuous-integration/drone/push Build is passing Details
2025-03-17 14:34:24 +08:00
wangxiaoshuang 5339e2df63 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-17 13:23:25 +08:00
wangxiaoshuang 66d5591d50 项目文档同意入项记录上传更改为弹框 2025-03-17 13:23:21 +08:00
caiyiling bfe2f1dbfb Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-17 11:37:30 +08:00
caiyiling 24806f57ed 自定义阅片bug修复 2025-03-17 11:37:09 +08:00
wangxiaoshuang b0ff8e7163 项目文档培训记录效果改为可输入所有字符
continuous-integration/drone/push Build is passing Details
2025-03-17 11:34:03 +08:00
caiyiling c9ef6cd19f Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-17 11:24:01 +08:00
caiyiling 00cc5d5d27 非dicom阅片ecrf更改 2025-03-17 11:23:24 +08:00
wangxiaoshuang 25ddd422a3 1
continuous-integration/drone/push Build is passing Details
2025-03-17 09:29:56 +08:00
wangxiaoshuang a060c1745d 项目文档资质材料
continuous-integration/drone/push Build is passing Details
2025-03-14 17:09:38 +08:00
wangxiaoshuang 1a4bfe64f9 项目文档上传文件路径更改
continuous-integration/drone/push Build is passing Details
2025-03-14 13:15:44 +08:00
caiyiling 2fd6e1893b Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-14 10:35:46 +08:00
caiyiling dc0229810d 国际化补充 2025-03-14 10:35:20 +08:00
wangxiaoshuang 08c911d4a0 项目文档申报方同意入项记录审核人角色字段更改
continuous-integration/drone/push Build is passing Details
2025-03-14 10:25:35 +08:00
wangxiaoshuang 08cdcffd82 项目文档申报方同意入项记录
continuous-integration/drone/push Build is passing Details
2025-03-13 17:10:42 +08:00
wangxiaoshuang a5f16c866d 检查名称配置更改
continuous-integration/drone/push Build is passing Details
2025-03-13 16:37:08 +08:00
caiyiling 3167c2bea7 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-13 15:01:16 +08:00
caiyiling 26cca57f75 系统标准国际化补充 2025-03-13 15:00:50 +08:00
wangxiaoshuang ff88cbd6e2 1
continuous-integration/drone/push Build is passing Details
2025-03-13 13:23:56 +08:00
wangxiaoshuang c4a498d953 检查被IQC标记删除:在crc查看时,该行记录增加删除线
continuous-integration/drone/push Build is passing Details
2025-03-13 11:14:34 +08:00
wangxiaoshuang f58e2ff82f 影像重传,确认完成时,签名中XXX未替换 2025-03-13 11:14:00 +08:00
wangxiaoshuang 1696fb6294 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-12 17:33:10 +08:00
wangxiaoshuang 3c81a8a678 1 2025-03-12 17:32:58 +08:00
caiyiling afcd1b82c0 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main 2025-03-12 17:22:44 +08:00
caiyiling 96864b808c 配置文件更改 2025-03-12 17:22:18 +08:00
wangxiaoshuang 5ba2abb8f5 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is failing Details
2025-03-12 17:11:15 +08:00
wangxiaoshuang dc0329032e 项目文档菜单添加滚动条 2025-03-12 17:11:05 +08:00
caiyiling 4097389447 图片渲染窗口滚动条优化
continuous-integration/drone/push Build is passing Details
2025-03-12 16:11:16 +08:00
caiyiling cf39a84370 全局和裁判阅片签名更改
continuous-integration/drone/push Build is passing Details
2025-03-12 15:42:56 +08:00
caiyiling aae2d6a1c5 非dicom全局和裁判阅片更改
continuous-integration/drone/push Build is passing Details
2025-03-12 15:18:23 +08:00
caiyiling 10f4bf7480 pdf文件替换
continuous-integration/drone/push Build is passing Details
2025-03-12 14:56:17 +08:00
caiyiling 57f0938efc 非dicom文件交互更改
continuous-integration/drone/push Build is passing Details
2025-03-12 14:50:55 +08:00
caiyiling 615580331b 后台管理页面调整
continuous-integration/drone/push Build is passing Details
2025-03-12 14:42:05 +08:00
caiyiling 4b4058b0da 文件渲染视口样式更改
continuous-integration/drone/push Build is passing Details
2025-03-12 13:16:47 +08:00
caiyiling f77820df79 临床数据查看更改
continuous-integration/drone/push Build is running Details
2025-03-12 13:14:31 +08:00
caiyiling 398bc21666 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-12 13:10:53 +08:00
caiyiling 7db8e231b6 切换pdf时取消取消全屏 2025-03-12 13:10:26 +08:00
wangxiaoshuang 581e2c3879 培训记录备注可输入值变更
continuous-integration/drone/push Build is passing Details
2025-03-12 11:47:27 +08:00
caiyiling ce030d23cd Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-12 11:35:06 +08:00
caiyiling f3c073286b 非dicom表单更改及渲染视口双击事件优化 2025-03-12 11:34:18 +08:00
wangxiaoshuang d5b342ddc6 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-12 11:22:32 +08:00
wangxiaoshuang d616512a72 项目文档按钮权限更改 2025-03-12 11:22:20 +08:00
caiyiling bf57b75bed 肿瘤学阅片配置更改
continuous-integration/drone/push Build is passing Details
2025-03-12 10:46:38 +08:00
caiyiling 0d9a77f4a5 文件管理模块列宽调整
continuous-integration/drone/push Build is passing Details
2025-03-12 10:24:25 +08:00
caiyiling 7f3da436c4 后台管理页面样式调整
continuous-integration/drone/push Build is passing Details
2025-03-12 10:21:40 +08:00
caiyiling 9e1cd5a099 配置文件更改
continuous-integration/drone/push Build is passing Details
2025-03-12 09:34:50 +08:00
caiyiling 639351c469 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-12 09:31:16 +08:00
caiyiling fa173a32fb 非dicom文件更改 2025-03-12 09:30:51 +08:00
wangxiaoshuang b93ab130fb 追溯显示信息右对齐
continuous-integration/drone/push Build is passing Details
2025-03-12 09:20:56 +08:00
caiyiling c6a6029f38 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-11 17:41:03 +08:00
caiyiling ca907a5196 非dicom阅片更改 2025-03-11 17:40:44 +08:00
wangxiaoshuang b4fe2a1c06 ir重阅,pm驳回,签名后无响应
continuous-integration/drone/push Build is passing Details
2025-03-11 17:00:01 +08:00
wangxiaoshuang 40061db7f7 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web 2025-03-11 16:59:49 +08:00
wangxiaoshuang 513e9b018a spm审批签署-重阅审批,中心编号筛选查询无效 2025-03-11 16:37:59 +08:00
wangxiaoshuang 0c7b4fbfdd 影像重传,确认完成时,签名中XXX未替换 2025-03-11 16:35:10 +08:00
caiyiling 74893a51c7 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-11 16:04:55 +08:00
caiyiling 305b6ab294 非dicom缩略图更改 2025-03-11 16:00:10 +08:00
wangxiaoshuang 920c95f611 非dicom预览pdf和zip缩略图
continuous-integration/drone/push Build is passing Details
2025-03-11 15:05:31 +08:00
wangxiaoshuang f73eabed03 培训记录删除文件后授权状态改为否、禁用下载按钮
continuous-integration/drone/push Build is passing Details
2025-03-11 14:41:34 +08:00
wangxiaoshuang e99c77fb0d 培训记录上传单个文件问题修复
continuous-integration/drone/push Build is running Details
2025-03-11 14:39:36 +08:00
wangxiaoshuang ec37ca2d3e 一般文件记录删除文件后授权状态改为否、禁用下载按钮
continuous-integration/drone/push Build is passing Details
2025-03-11 14:32:49 +08:00
wangxiaoshuang 6a6a26feb7 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-11 14:18:07 +08:00
wangxiaoshuang 5676bb6e57 1 2025-03-11 14:17:57 +08:00
caiyiling 200aa7c0f8 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2025-03-11 14:16:16 +08:00
caiyiling bf4f0c7245 本地预览影像更改 2025-03-11 14:15:52 +08:00
wangxiaoshuang 21dab27e0b 国际化排序
continuous-integration/drone/push Build is passing Details
2025-03-11 14:11:18 +08:00
wangxiaoshuang 7b90715953 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-11 13:53:55 +08:00
wangxiaoshuang cb8bc506a7 项目文档上传弹框文件数量没有限制时2才显示上传文件夹按钮 2025-03-11 13:53:38 +08:00
caiyiling 7a69227888 邮件列表列宽调整
continuous-integration/drone/push Build is passing Details
2025-03-11 13:11:59 +08:00
caiyiling 0785219954 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-11 11:52:52 +08:00
caiyiling b5f2cfeaff 国际化补充 2025-03-11 11:52:38 +08:00
wangxiaoshuang 4164b24bd9 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-11 11:41:49 +08:00
wangxiaoshuang 49b723ab01 上传同名文件时进度条出错 2025-03-11 11:41:30 +08:00
caiyiling 0de49faed1 国际化补充
continuous-integration/drone/push Build is passing Details
2025-03-11 10:59:22 +08:00
caiyiling 7f85302c1b 国际化补充
continuous-integration/drone/push Build is passing Details
2025-03-11 10:42:34 +08:00
caiyiling 4305f2536c institutions模块国际化更改
continuous-integration/drone/push Build is passing Details
2025-03-11 10:30:07 +08:00
caiyiling 55783de27f Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-10 17:59:25 +08:00
caiyiling 465ea59906 国际化更改 2025-03-10 17:59:10 +08:00
wangxiaoshuang 81fab97ee4 项目文档部分字段去除排序
continuous-integration/drone/push Build is passing Details
2025-03-10 17:33:38 +08:00
wangxiaoshuang 2c93ba2882 国际化修改
continuous-integration/drone/push Build is running Details
2025-03-10 17:31:42 +08:00
wangxiaoshuang f3a237b0bf 1
continuous-integration/drone/push Build is passing Details
2025-03-10 17:08:43 +08:00
caiyiling c0588661ce Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-10 16:11:22 +08:00
caiyiling 381acf8d76 ecrf表单中分类问题bug修复 2025-03-10 16:10:41 +08:00
wangxiaoshuang e6715a429b 项目文档阅片人简历、阅片人培训记录、阅片人阅片记录、阅片人医学审核记录
continuous-integration/drone/push Build is passing Details
2025-03-10 15:24:11 +08:00
caiyiling 33ac08f4e4 非dicom阅片更改
continuous-integration/drone/push Build is passing Details
2025-03-10 15:20:02 +08:00
caiyiling d117bac7f6 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-10 15:09:37 +08:00
caiyiling 7051312855 国际化更改 2025-03-10 15:09:18 +08:00
wangxiaoshuang ff5a868377 项目文档部分问题修复
continuous-integration/drone/push Build is passing Details
2025-03-10 11:03:19 +08:00
wangxiaoshuang ea44f97985 非dicom列表改变状态时列表不重置
continuous-integration/drone/push Build is passing Details
2025-03-07 16:04:34 +08:00
wangxiaoshuang 156411fea3 非dicom列表改变状态时列表不重置
continuous-integration/drone/push Build is passing Details
2025-03-07 15:51:59 +08:00
wangxiaoshuang 822c2dc955 预览按钮位置交换
continuous-integration/drone/push Build is passing Details
2025-03-07 15:26:49 +08:00
wangxiaoshuang d729c4d34e 阅片期操作按钮样式问题
continuous-integration/drone/push Build is passing Details
2025-03-07 15:00:46 +08:00
caiyiling a887e686a8 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-07 14:25:09 +08:00
caiyiling 21cb32f1a9 自定义阅片数值问题渲染bug修复 2025-03-07 14:24:32 +08:00
wangxiaoshuang c74b482f0d 非dicom预览样式调整
continuous-integration/drone/push Build is passing Details
2025-03-07 14:13:57 +08:00
wangxiaoshuang 1af302961b 非dicom预览样式调整
continuous-integration/drone/push Build is running Details
2025-03-07 14:11:53 +08:00
wangxiaoshuang e83ac6714d 非dicom列表获取参数iReading默认为false
continuous-integration/drone/push Build is passing Details
2025-03-07 13:37:22 +08:00
wangxiaoshuang fc98aa0312 1
continuous-integration/drone/push Build is running Details
2025-03-07 13:34:36 +08:00
wangxiaoshuang 278c051f51 质控非dicom添加预览阅片影像功能
continuous-integration/drone/push Build is passing Details
2025-03-07 12:23:40 +08:00
wangxiaoshuang 5b8716f9ae 质控删除后数据不显示
continuous-integration/drone/push Build is passing Details
2025-03-07 11:02:30 +08:00
wangxiaoshuang cfef89c703 根据角色权限表核对开放页面以及功能
continuous-integration/drone/push Build is passing Details
2025-03-06 15:37:13 +08:00
caiyiling bf33f9d589 中心调研表更改
continuous-integration/drone/push Build is passing Details
2025-03-06 15:15:09 +08:00
caiyiling d74da23d41 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-06 15:10:50 +08:00
caiyiling cd630a70fb 阅片布局调整及中心调研更改 2025-03-06 15:10:11 +08:00
wangxiaoshuang 0b688bc33f PM在阅片期上传临床数据页面调整
continuous-integration/drone/push Build is passing Details
2025-03-06 14:56:28 +08:00
wangxiaoshuang a602be255b 项目文档部分问题修复
continuous-integration/drone/push Build is passing Details
2025-03-06 14:39:51 +08:00
wangxiaoshuang fb7891a2af 项目文档部分问题解决
continuous-integration/drone/push Build is passing Details
2025-03-06 13:20:47 +08:00
wangxiaoshuang 620f0d92ca 追溯角色可查看详情 2025-03-06 13:13:43 +08:00
wangxiaoshuang 8f43c697c0 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-03-06 13:05:40 +08:00
wangxiaoshuang 55769e906d 项目文档菜单增加排序字段 2025-03-06 11:41:17 +08:00
caiyiling 4ad67e5501 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-06 11:02:41 +08:00
caiyiling 1265cef6f9 系统标准阅片bug修复及非dicom阅片更改 2025-03-06 11:01:46 +08:00
wangxiaoshuang 86f5e2c782 非DICOM影像质控时,可以设置影像为删除、不阅片
continuous-integration/drone/push Build is passing Details
2025-03-05 16:14:29 +08:00
wangxiaoshuang 5450188a6e DICOM影像上传时缩略图的生成与存储
continuous-integration/drone/push Build is passing Details
2025-03-05 14:52:27 +08:00
wangxiaoshuang c8601f6f8f 文件模板
continuous-integration/drone/push Build is passing Details
2025-03-05 14:34:07 +08:00
wangxiaoshuang 299481a124 Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
2025-03-05 13:32:23 +08:00
wangxiaoshuang 5ca123e90b 培训记录
continuous-integration/drone/push Build is running Details
2025-03-05 13:32:00 +08:00
wangxiaoshuang af452bb04e 排序改为升序
continuous-integration/drone/push Build encountered an error Details
2025-03-05 13:12:55 +08:00
wangxiaoshuang bc34ed5c25 Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
2025-03-05 10:58:20 +08:00
wangxiaoshuang 1ef1d4f303 质控dicom检查信息添加更新时间和上传时间
continuous-integration/drone/push Build encountered an error Details
2025-03-05 10:50:47 +08:00
wangxiaoshuang fd67edcb0e dicom列表时间顺序调换
continuous-integration/drone/push Build encountered an error Details
2025-03-05 10:14:06 +08:00
wangxiaoshuang ecebeb2271 Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
# Conflicts:
#	src/views/trials/trials-panel/visit/crc-upload/components/studyInfo.vue
#	src/views/trials/trials-panel/visit/crc-upload/components/uploadDicomFiles2.vue
2025-03-05 10:12:21 +08:00
wangxiaoshuang ba26476c52 pdf预览默认缩放改为100%
continuous-integration/drone/push Build encountered an error Details
2025-03-05 09:56:51 +08:00
wangxiaoshuang 821475b7d6 影像检查排序、字符集问题
continuous-integration/drone/push Build encountered an error Details
2025-03-05 09:51:33 +08:00
wangxiaoshuang a0594cab96 培训记录
continuous-integration/drone/push Build is passing Details
2025-03-05 09:26:40 +08:00
wangxiaoshuang bcde358584 影像检查排序、字符集问题
continuous-integration/drone/push Build is passing Details
2025-03-04 16:16:04 +08:00
caiyiling 067162e1d7 自定义标准更改
continuous-integration/drone/push Build is passing Details
2025-03-04 11:48:00 +08:00
caiyiling b5b5830b1f Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-04 10:57:19 +08:00
caiyiling fb1d87e84b 非dicom阅片更改 2025-03-04 10:56:55 +08:00
wangxiaoshuang 6b42b4e88c 一般文件记录
continuous-integration/drone/push Build is passing Details
2025-03-03 17:54:07 +08:00
caiyiling 2516be481d Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-03-03 13:47:21 +08:00
caiyiling 3aa66af253 非dicom阅片更改 2025-03-03 13:46:57 +08:00
wangxiaoshuang fa339dcdb0 项目文档报告/文档功能实现
continuous-integration/drone/push Build is passing Details
2025-02-28 17:55:10 +08:00
wangxiaoshuang 541e309d1d 用户追溯添加跳转至项目详情
continuous-integration/drone/push Build is passing Details
2025-02-28 11:18:19 +08:00
wangxiaoshuang 949ec6d2d6 Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
2025-02-28 11:02:37 +08:00
wangxiaoshuang 83b6c9f2cc 1
continuous-integration/drone/push Build encountered an error Details
2025-02-28 10:24:09 +08:00
wangxiaoshuang 996b691ef4 访视中预览,dicom检查没有显示检查名称 2025-02-28 10:21:52 +08:00
wangxiaoshuang 8bfaf7241a 检查名称问题修复
continuous-integration/drone/push Build encountered an error Details
2025-02-28 09:58:07 +08:00
wangxiaoshuang 35bff089b7 非dicom预览显示顺序问题
continuous-integration/drone/push Build encountered an error Details
2025-02-27 18:01:38 +08:00
wangxiaoshuang 6b1f8c26b2 受试者第二编号也需要隐藏
continuous-integration/drone/push Build encountered an error Details
2025-02-27 17:28:53 +08:00
wangxiaoshuang 5bffb48b99 修改配置应用到影像上传以及影像质控
continuous-integration/drone/push Build encountered an error Details
2025-02-27 16:32:58 +08:00
wangxiaoshuang 858a650986 项目配置修改 2025-02-27 15:13:56 +08:00
wangxiaoshuang 6b331ab6f6 项目文档
continuous-integration/drone/push Build is passing Details
2025-02-27 10:34:06 +08:00
wangxiaoshuang 00a7e8e609 部分问题修复 2025-02-27 10:33:57 +08:00
wangxiaoshuang c686850292 锁定弹窗支持邮箱校验
continuous-integration/drone/push Build is passing Details
2025-02-26 11:43:12 +08:00
wangxiaoshuang 887bb2534b Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-02-26 09:24:49 +08:00
wangxiaoshuang 3192ec7516 用户编辑保存按钮国际化 2025-02-26 09:24:42 +08:00
caiyiling 5f960348ed 1
continuous-integration/drone/push Build is passing Details
2025-02-25 17:55:17 +08:00
caiyiling d2757c6f9b Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-02-25 17:35:41 +08:00
caiyiling 734d6dc1a5 非dicom图像阅片更改 2025-02-25 17:35:02 +08:00
wangxiaoshuang be95951f40 用户来源问题修复
continuous-integration/drone/push Build is passing Details
2025-02-25 16:58:26 +08:00
wangxiaoshuang f4af0fc157 管理端用户列表角色过滤
continuous-integration/drone/push Build is passing Details
2025-02-25 11:31:56 +08:00
wangxiaoshuang 2090866521 管理端添加账号追溯页面 2025-02-25 11:31:32 +08:00
wangxiaoshuang d61131ed61 文件记录删除添加权限
continuous-integration/drone/push Build is passing Details
2025-02-25 09:52:36 +08:00
wangxiaoshuang 20aee53a3f 管理端添加文件记录列表
continuous-integration/drone/push Build is passing Details
2025-02-24 15:36:58 +08:00
wangxiaoshuang 05c75c32cf 角色与用户问题修复 2025-02-24 15:35:33 +08:00
wangxiaoshuang 2575e27d22 角色添加启用、停用功能
continuous-integration/drone/push Build is passing Details
2025-02-24 14:20:31 +08:00
wangxiaoshuang e7dcdb33c4 上传影像缩略图去除中心目录
continuous-integration/drone/push Build is passing Details
2025-02-24 09:04:59 +08:00
caiyiling d4c1b75423 1
continuous-integration/drone/push Build is passing Details
2025-02-21 17:05:36 +08:00
caiyiling d1159a09b4 图像窗口添加切换访视功能
continuous-integration/drone/push Build is running Details
2025-02-21 17:04:18 +08:00
caiyiling d69d8802cd Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is failing Details
2025-02-21 16:13:45 +08:00
caiyiling 6223eac81a 阅片页面图像预览更改 2025-02-21 16:13:17 +08:00
wangxiaoshuang b453eede31 打包配置修改,pdf预览文件
continuous-integration/drone/push Build is passing Details
2025-02-20 11:49:06 +08:00
wangxiaoshuang e5330765af 重阅审批页面查询条件中心初始化修改
continuous-integration/drone/push Build is passing Details
2025-02-20 10:07:29 +08:00
wangxiaoshuang 493b155678 国际化查询框换行问题
continuous-integration/drone/push Build is passing Details
2025-02-20 09:40:58 +08:00
wangxiaoshuang a2b2fd65af 国际化修改
continuous-integration/drone/push Build is passing Details
2025-02-19 11:25:57 +08:00
caiyiling 551cdf0ed3 工作台跳转中心调研异常bug修复
continuous-integration/drone/push Build is passing Details
2025-02-18 17:22:21 +08:00
caiyiling cadb3e8f7a 配置及样式更改
continuous-integration/drone/push Build is running Details
2025-02-18 17:15:09 +08:00
caiyiling 4da35daa3c cornerstone3D库升级及其他文件调整
continuous-integration/drone/push Build is failing Details
2025-02-18 15:09:25 +08:00
caiyiling 0f50ff6ded Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-02-17 17:18:04 +08:00
caiyiling 2f371f0435 1 2025-02-17 17:17:40 +08:00
wangxiaoshuang 245d4edca7 影像上传列表数据采集显示临床数据
continuous-integration/drone/push Build is passing Details
2025-02-17 14:56:11 +08:00
wangxiaoshuang 42d1c713bd 阅片人简历邮箱更改,admin禁用
continuous-integration/drone/push Build is passing Details
2025-02-17 13:35:47 +08:00
caiyiling 65b81fc633 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-02-17 10:15:49 +08:00
caiyiling 3a1d4ee15d 阅片任务中反馈状态修复 2025-02-17 10:15:19 +08:00
wangxiaoshuang c0eab7e896 Merge branch 'uat'
continuous-integration/drone/push Build is passing Details
2025-02-17 09:46:49 +08:00
wangxiaoshuang 4ba4d7cf00 登录日志详情添加账号状态
continuous-integration/drone/push Build encountered an error Details
2025-02-14 18:08:24 +08:00
caiyiling bfe9817544 Merge branch 'uat' into main
continuous-integration/drone/push Build is passing Details
2025-02-14 17:42:54 +08:00
caiyiling f5fd1252c9 登录日志参数更改
continuous-integration/drone/push Build encountered an error Details
2025-02-14 17:41:15 +08:00
caiyiling 596ea8f658 Merge branch 'uat' into main
continuous-integration/drone/push Build is passing Details
2025-02-14 17:26:58 +08:00
caiyiling b24548dd8b 登录日志查询条件更改
continuous-integration/drone/push Build encountered an error Details
2025-02-14 17:25:30 +08:00
caiyiling 4a479258f2 Merge branch 'uat' into main
continuous-integration/drone/push Build is passing Details
2025-02-14 17:06:14 +08:00
caiyiling 29d0cc7653 登录日志个更改
continuous-integration/drone/push Build encountered an error Details
2025-02-14 16:56:25 +08:00
caiyiling 6de9cd26a4 影像阅片页面反馈按钮优化
continuous-integration/drone/push Build is passing Details
2025-02-14 16:07:40 +08:00
caiyiling caf3f41465 Merge branch 'uat' into main
continuous-integration/drone/push Build is passing Details
2025-02-14 14:52:03 +08:00
caiyiling 8896737a9e Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-02-14 14:32:57 +08:00
caiyiling 1be46686a3 国际化更改 2025-02-14 14:32:39 +08:00
caiyiling 0cd07b76f8 多帧对齐bug修复
continuous-integration/drone/push Build encountered an error Details
2025-02-14 14:30:55 +08:00
wangxiaoshuang d74c0028f6 版本记录页面国际化
continuous-integration/drone/push Build is passing Details
2025-02-13 15:37:08 +08:00
caiyiling ab5645f28a popper弹出层优化
continuous-integration/drone/push Build encountered an error Details
2025-02-13 13:50:27 +08:00
caiyiling efb88b7ad1 多帧影像质控更改
continuous-integration/drone/push Build encountered an error Details
2025-02-13 11:50:29 +08:00
wangxiaoshuang 129548031c 影像上传页面,临床数据统计
continuous-integration/drone/push Build is passing Details
2025-02-13 10:17:42 +08:00
wangxiaoshuang 5dbddbea57 Merge commit 'dba4466ac26890fcedfd8d20d8c20c9fd45e8850' into uat
continuous-integration/drone/push Build encountered an error Details
2025-02-13 09:28:59 +08:00
caiyiling 689782bf36 后台管理页面部分国际化更改
continuous-integration/drone/push Build is passing Details
2025-02-13 09:25:32 +08:00
wangxiaoshuang 89fe4e4c00 阅片人简历邮箱更改
continuous-integration/drone/push Build is passing Details
2025-02-12 17:20:23 +08:00
wangxiaoshuang a582daf686 il8n页面国际化 2025-02-12 17:20:10 +08:00
wangxiaoshuang 3e680d0033 临床数据上传依赖,排序改为枚举值
continuous-integration/drone/push Build is passing Details
2025-02-11 14:39:01 +08:00
wangxiaoshuang af343d43d8 邮件模板预览样式调整
continuous-integration/drone/push Build is passing Details
2025-02-11 14:17:41 +08:00
wangxiaoshuang 4b9216229c 国际化编辑新增迭代版本、状态
continuous-integration/drone/push Build is passing Details
2025-02-11 13:13:39 +08:00
wangxiaoshuang 2952762ce7 切换角色、项目返回时清除项目路由缓存
continuous-integration/drone/push Build is passing Details
2025-02-10 10:42:10 +08:00
caiyiling 361aed4a0c dicom文件上传批量验证提示更改
continuous-integration/drone/push Build is passing Details
2025-02-10 09:22:44 +08:00
caiyiling 19b419c29e 一致性核查更改
continuous-integration/drone/push Build is passing Details
2025-02-08 15:06:11 +08:00
caiyiling 7e9a9b62f6 样式调整
continuous-integration/drone/push Build is passing Details
2025-02-08 14:10:00 +08:00
caiyiling 3921f369c3 阅片单元样式调整
continuous-integration/drone/push Build is passing Details
2025-02-08 13:07:46 +08:00
caiyiling 0ffe7ff1a7 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-02-08 11:31:23 +08:00
caiyiling 5ec969c2f9 临床数据补充英文模板及界面样式调整 2025-02-08 11:30:07 +08:00
wangxiaoshuang dba4466ac2 国际化修改
continuous-integration/drone/push Build is passing Details
2025-01-24 16:27:39 +08:00
wangxiaoshuang 9187bbe64f 阅片人简历预览水印
continuous-integration/drone/push Build is passing Details
2025-01-24 13:27:47 +08:00
caiyiling a0f593a22f Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-24 10:05:07 +08:00
caiyiling 89f7aee973 管理后台按钮调整及医学审核文本超长处理 2025-01-24 10:04:25 +08:00
wangxiaoshuang ced57cbfe4 logo显示有误
continuous-integration/drone/push Build is running Details
2025-01-24 10:01:17 +08:00
wangxiaoshuang 99d099496e 1
continuous-integration/drone/push Build is passing Details
2025-01-23 18:41:10 +08:00
caiyiling d3afa7b676 中心列表添加快捷跳转入口
continuous-integration/drone/push Build is passing Details
2025-01-23 18:18:29 +08:00
wangxiaoshuang c08d701143 重复新增角色弹框未清空
continuous-integration/drone/push Build is passing Details
2025-01-23 14:13:01 +08:00
caiyiling a2d06ba72f 多帧关键序列更改
continuous-integration/drone/push Build is passing Details
2025-01-23 10:21:51 +08:00
caiyiling 148aa4908b Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-23 09:32:37 +08:00
caiyiling 53738c2da4 1 2025-01-23 09:32:15 +08:00
wangxiaoshuang 3513c08adf Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-23 09:22:28 +08:00
wangxiaoshuang 9eb3f2f322 1 2025-01-23 09:22:24 +08:00
caiyiling b16e351779 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-23 09:11:21 +08:00
caiyiling b176ab0716 关键序列渲染更改 2025-01-23 09:10:40 +08:00
wangxiaoshuang c7eb323eaa 通用培训课件添加国际化
continuous-integration/drone/push Build is passing Details
2025-01-22 17:29:20 +08:00
wangxiaoshuang 7b3fe42654 部分问题修复
continuous-integration/drone/push Build is passing Details
2025-01-22 15:27:20 +08:00
wangxiaoshuang 21c96300ad 1
continuous-integration/drone/push Build is passing Details
2025-01-22 10:21:32 +08:00
caiyiling 8f46819b9a Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-22 09:48:44 +08:00
caiyiling 6e66dd8bbe 导表配置更改 2025-01-22 09:48:28 +08:00
wangxiaoshuang b209c6566b 添加外部人员弹框按钮样式修改
continuous-integration/drone/push Build is running Details
2025-01-22 09:48:25 +08:00
wangxiaoshuang f8bd826c9c Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-21 17:12:45 +08:00
wangxiaoshuang e3f6f9107d 角色可切换选项不足时不显示切换角色按钮 2025-01-21 17:12:33 +08:00
caiyiling f1c72c66e8 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-21 16:49:29 +08:00
caiyiling 79caed3fd9 1 2025-01-21 16:49:02 +08:00
wangxiaoshuang e56440634e 1
continuous-integration/drone/push Build is running Details
2025-01-21 16:47:19 +08:00
wangxiaoshuang ac657a162f Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-21 16:38:56 +08:00
wangxiaoshuang 9d362e13de 用户登录只有一个角色可以选择时自动登录 2025-01-21 16:38:52 +08:00
wangxiaoshuang d04898dc28 管理员新增用户角色必填 2025-01-21 16:38:16 +08:00
caiyiling e0f42e815e 1
continuous-integration/drone/push Build is passing Details
2025-01-21 16:26:03 +08:00
caiyiling efe3d937b4 医学审核更改
continuous-integration/drone/push Build is passing Details
2025-01-21 16:16:23 +08:00
caiyiling 5cf6ab24bd Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-21 15:59:04 +08:00
caiyiling ff0ddeea9a 医学审核问题更改 2025-01-21 15:58:45 +08:00
wangxiaoshuang 42083afb8d 密码校验提示遮挡问题
continuous-integration/drone/push Build is passing Details
2025-01-21 14:01:42 +08:00
wangxiaoshuang de1b22ff48 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-21 11:28:37 +08:00
wangxiaoshuang 66cbbbbb75 退出至登录页国际化问题 2025-01-21 11:28:33 +08:00
caiyiling 3d89939a98 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-21 11:12:27 +08:00
caiyiling ade4ab3e03 项目模块下样式调整及中心调研调整 2025-01-21 11:11:47 +08:00
wangxiaoshuang a3550c44bd 后端开启限制登录后国际化问题
continuous-integration/drone/push Build is passing Details
2025-01-21 10:01:43 +08:00
wangxiaoshuang 9e85e9705e 后端开启限制登录后国际化问题
continuous-integration/drone/push Build is passing Details
2025-01-21 09:38:42 +08:00
wangxiaoshuang e1d5db8cf5 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-21 09:31:30 +08:00
wangxiaoshuang 6f3381c267 后端开启限制登录后国际化问题 2025-01-21 09:31:26 +08:00
caiyiling 0c52bde525 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-21 09:24:29 +08:00
caiyiling 102089c16f 我的项目模块下Tab样式更改 2025-01-21 09:23:40 +08:00
wangxiaoshuang 6e1d07ee95 多页签登录清楚缓存uerId和identityUserId
continuous-integration/drone/push Build is passing Details
2025-01-20 17:32:49 +08:00
wangxiaoshuang 55ae6bac7e lili关于页面
continuous-integration/drone/push Build is passing Details
2025-01-20 16:14:06 +08:00
wangxiaoshuang 823ac2f085 登陆页面国际化
continuous-integration/drone/push Build is passing Details
2025-01-20 15:58:19 +08:00
wangxiaoshuang 73e0a13e91 简历英文姓名展示修改
continuous-integration/drone/push Build is passing Details
2025-01-20 15:47:31 +08:00
caiyiling 7f179fb393 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-20 14:29:42 +08:00
caiyiling 3441793bcb 返回功能样式更改 2025-01-20 14:29:17 +08:00
wangxiaoshuang dbe651fe98 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-20 14:05:45 +08:00
wangxiaoshuang f54ff927ec 登录页国际化问题 2025-01-20 14:05:36 +08:00
caiyiling 535b37e830 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-20 13:49:40 +08:00
caiyiling 13191c914e 系统阅片标准配置页字段更改 2025-01-20 13:49:16 +08:00
wangxiaoshuang 70735f2c47 重置密码完成后国际化问题
continuous-integration/drone/push Build is passing Details
2025-01-20 13:19:51 +08:00
wangxiaoshuang 8ad77f1679 问题修复
continuous-integration/drone/push Build is passing Details
2025-01-20 11:23:09 +08:00
wangxiaoshuang 3a76a7c24d 1
continuous-integration/drone/push Build is passing Details
2025-01-17 13:43:31 +08:00
wangxiaoshuang 5393ca571c 邮件模板预览修改
continuous-integration/drone/push Build is passing Details
2025-01-17 13:30:50 +08:00
wangxiaoshuang 4cef62ccba 中心列表参与人员去除排序
continuous-integration/drone/push Build is passing Details
2025-01-17 10:32:06 +08:00
wangxiaoshuang 2772168c3b 1
continuous-integration/drone/push Build is passing Details
2025-01-17 10:23:22 +08:00
wangxiaoshuang 89be8d8a12 项目培训记录列表添加创建时间
continuous-integration/drone/push Build is passing Details
2025-01-17 10:00:43 +08:00
wangxiaoshuang 041266c250 admin项目用户角色权限配置、部分国际化问题解决
continuous-integration/drone/push Build is passing Details
2025-01-17 09:31:06 +08:00
wangxiaoshuang cbcb84a768 1
continuous-integration/drone/push Build is passing Details
2025-01-16 17:21:35 +08:00
wangxiaoshuang 830718c228 人员管理禁用更换字典
continuous-integration/drone/push Build is passing Details
2025-01-16 17:02:58 +08:00
wangxiaoshuang 6977ed3713 稽查查询下拉选择框可搜索
continuous-integration/drone/push Build is passing Details
2025-01-16 16:18:14 +08:00
wangxiaoshuang 28ea52797e 系统配置签名文档国际化
continuous-integration/drone/push Build is passing Details
2025-01-16 14:41:10 +08:00
wangxiaoshuang 1348d5f864 IP不一致登陆提示
continuous-integration/drone/push Build is passing Details
2025-01-16 11:29:01 +08:00
wangxiaoshuang cd34ad7ef7 登录账号同时修改密码和登录IP不一致提示
continuous-integration/drone/push Build is running Details
2025-01-16 11:22:51 +08:00
wangxiaoshuang 5af7e8dd3c 锁定弹窗问题
continuous-integration/drone/push Build is passing Details
2025-01-16 10:25:17 +08:00
caiyiling 455f808f49 导表配置更改
continuous-integration/drone/push Build is passing Details
2025-01-14 15:06:43 +08:00
caiyiling a0d5e58311 导表配置更改
continuous-integration/drone/push Build is passing Details
2025-01-14 14:53:08 +08:00
caiyiling 84dbcd49f0 导表配置更改
continuous-integration/drone/push Build is passing Details
2025-01-14 13:43:16 +08:00
caiyiling a4ec387814 CDISC导表配置更改
continuous-integration/drone/push Build is passing Details
2025-01-14 11:00:30 +08:00
caiyiling 3a6c3d451c Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-14 10:42:20 +08:00
caiyiling f396901731 CDISC导表配置更改 2025-01-14 10:41:38 +08:00
wangxiaoshuang 0b00f4bc7e Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-13 16:13:32 +08:00
wangxiaoshuang e58695aeff 异地登录提示 2025-01-13 16:13:18 +08:00
caiyiling 65a9dd3cf1 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-13 15:50:18 +08:00
caiyiling 63743dbbc1 系统阅片标准配置更改及项目导出配置更改 2025-01-13 15:49:46 +08:00
wangxiaoshuang b5643d3774 1
continuous-integration/drone/push Build is passing Details
2025-01-13 15:22:28 +08:00
wangxiaoshuang 4c1a770969 简历采集英文环境填写工作所属医院,未保存成功
continuous-integration/drone/push Build is passing Details
2025-01-13 14:51:36 +08:00
wangxiaoshuang 7ff0273c29 用户评审辅助功能
continuous-integration/drone/push Build is passing Details
2025-01-13 13:44:30 +08:00
wangxiaoshuang 3f2a339cba 增加后台批量编辑国际化翻译功能
continuous-integration/drone/push Build is passing Details
2025-01-13 11:49:16 +08:00
caiyiling d3dd4ecffc ecrf配置去除导出标识属性
continuous-integration/drone/push Build is passing Details
2025-01-13 11:21:42 +08:00
wangxiaoshuang d636813210 账号禁用或无权限自动退出
continuous-integration/drone/push Build is passing Details
2025-01-10 17:38:54 +08:00
caiyiling 66d09ca284 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-10 14:25:01 +08:00
caiyiling e672e6bd18 保存验证更改 2025-01-10 14:24:39 +08:00
wangxiaoshuang 9c964f11a1 国际化批量编辑
continuous-integration/drone/push Build is passing Details
2025-01-10 13:54:28 +08:00
caiyiling 0a473dcae3 肝分段保存状态维护
continuous-integration/drone/push Build is passing Details
2025-01-10 12:31:54 +08:00
caiyiling 85b3960f97 分段是否可测量逻辑更改
continuous-integration/drone/push Build is passing Details
2025-01-10 11:37:49 +08:00
caiyiling b96f5b9910 表格默认折叠更改
continuous-integration/drone/push Build is passing Details
2025-01-10 10:19:53 +08:00
caiyiling 31196e850e 计算平均值bug修复
continuous-integration/drone/push Build is passing Details
2025-01-10 09:44:05 +08:00
caiyiling c309410c04 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-09 16:21:59 +08:00
caiyiling 0a671fb330 清除标注信息bug修复 2025-01-09 16:21:36 +08:00
wangxiaoshuang febdfd7b4f Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-09 15:42:43 +08:00
wangxiaoshuang e1da0c9ea5 个人账号操作日志修改 2025-01-09 15:42:29 +08:00
caiyiling 54be84c300 阅片跟踪国际化更改
continuous-integration/drone/push Build is running Details
2025-01-09 15:42:11 +08:00
caiyiling 78c1b57770 阅片结果更改
continuous-integration/drone/push Build is passing Details
2025-01-09 14:52:30 +08:00
caiyiling 39ce8fd355 阅片结果导出国际化补充
continuous-integration/drone/push Build is passing Details
2025-01-09 14:36:49 +08:00
caiyiling 130862518f 阅片结果功能按钮添加图标
continuous-integration/drone/push Build is passing Details
2025-01-09 14:13:04 +08:00
caiyiling a129adbc4b Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-09 11:42:27 +08:00
caiyiling 3066781ee6 ecrf系统配置更改及MRI-PDFF阅片bug修复 2025-01-09 11:41:51 +08:00
wangxiaoshuang df4880dc08 新建用户邮件初始化密码无法输入问题
continuous-integration/drone/push Build is passing Details
2025-01-09 10:43:12 +08:00
wangxiaoshuang 29e2a6ea65 新建用户邮件初始化取消按钮功能修改
continuous-integration/drone/push Build is passing Details
2025-01-09 10:19:38 +08:00
caiyiling ae12c3d517 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-08 17:40:23 +08:00
caiyiling cbe346a049 MRI-PDFF计算更改 2025-01-08 17:39:49 +08:00
wangxiaoshuang c8c5ab72bb 阅片期列表样式问题
continuous-integration/drone/push Build is passing Details
2025-01-08 16:08:06 +08:00
caiyiling 37dc4a960f 阅片报告页更改
continuous-integration/drone/push Build is passing Details
2025-01-08 16:01:50 +08:00
caiyiling 05cf250c21 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2025-01-08 15:58:56 +08:00
caiyiling b2ca803f94 肝分段状态维护 2025-01-08 15:58:30 +08:00
wangxiaoshuang 2ff2f5106e 项目课件状态
continuous-integration/drone/push Build is passing Details
2025-01-08 15:44:53 +08:00
wangxiaoshuang 67c2d47689 项目课件状态
continuous-integration/drone/push Build is passing Details
2025-01-08 15:31:02 +08:00
wangxiaoshuang 67a3c4f926 1.07部分问题修复
continuous-integration/drone/push Build is passing Details
2025-01-08 14:26:45 +08:00
wangxiaoshuang 9ab7afa06f 1
continuous-integration/drone/push Build is passing Details
2025-01-08 14:02:41 +08:00
wangxiaoshuang e5a17d20b1 1.07部分问题修复
continuous-integration/drone/push Build is running Details
2025-01-08 14:01:26 +08:00
wangxiaoshuang 3c664e9ba6 1.07部分问题修复
continuous-integration/drone/push Build is passing Details
2025-01-08 13:33:56 +08:00
caiyiling 50dd74b4ce 肝脏分段脂肪分数测量交互更改
continuous-integration/drone/push Build is passing Details
2025-01-08 13:26:54 +08:00
caiyiling b22b9d338e MRI-PDFF标准更改及导表配置更改
continuous-integration/drone/push Build is passing Details
2025-01-08 13:19:52 +08:00
wangxiaoshuang a13ef6e5d2 管理端国际化批量更新问题
continuous-integration/drone/push Build is passing Details
2025-01-08 09:23:15 +08:00
wangxiaoshuang 58141aaca9 中心调研已废除禁用审批
continuous-integration/drone/push Build is passing Details
2025-01-07 15:50:29 +08:00
wangxiaoshuang 17b868e7ed 版本记录lili版本改为非必填
continuous-integration/drone/push Build is passing Details
2025-01-07 13:54:10 +08:00
wangxiaoshuang bbc4da7b9e 质疑弹框用户名修改为姓名
continuous-integration/drone/push Build is passing Details
2025-01-07 13:12:15 +08:00
wangxiaoshuang c14079efe3 1
continuous-integration/drone/push Build is passing Details
2025-01-07 11:15:29 +08:00
wangxiaoshuang ecf5119269 1
continuous-integration/drone/push Build is passing Details
2025-01-07 10:54:05 +08:00
wangxiaoshuang b35ff2b7dc 质疑弹框用户名修改为姓名
continuous-integration/drone/push Build is running Details
2025-01-07 10:51:23 +08:00
wangxiaoshuang bae5b9c51c 导出更改
continuous-integration/drone/push Build is passing Details
2025-01-07 10:23:34 +08:00
wangxiaoshuang be5b9efa7b Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-06 15:37:00 +08:00
wangxiaoshuang efab56f6bd 项目添加外部人员角色禁用提示国际化 2025-01-06 15:36:51 +08:00
caiyiling a239bccc90 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-06 15:28:02 +08:00
caiyiling 7dd15434bf 导出配置更改 2025-01-06 15:27:26 +08:00
wangxiaoshuang 437b4377ed 项目添加外部人员角色禁用提示国际化
continuous-integration/drone/push Build is running Details
2025-01-06 15:23:58 +08:00
wangxiaoshuang 7229bc65a9 mfa提示文字样式修改
continuous-integration/drone/push Build is passing Details
2025-01-06 15:00:29 +08:00
wangxiaoshuang bf95ea96e2 MFA验证重发
continuous-integration/drone/push Build is passing Details
2025-01-06 14:51:06 +08:00
wangxiaoshuang 013a657f78 系统文档签署后,已签署统计数未刷新
continuous-integration/drone/push Build is passing Details
2025-01-06 14:18:47 +08:00
wangxiaoshuang 8d4e9368c6 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-06 14:08:33 +08:00
wangxiaoshuang d71fff7393 1 2025-01-06 14:08:25 +08:00
caiyiling d243d3cd11 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-06 14:01:49 +08:00
caiyiling 221ad89fd4 保存肝分段标记逻辑更改 2025-01-06 14:01:08 +08:00
wangxiaoshuang af42a3aec0 系统文档签署后,统计数未刷新
continuous-integration/drone/push Build is passing Details
2025-01-06 13:49:19 +08:00
wangxiaoshuang b0529dca5f 添加项目邮件模板时,收件人过滤条件去除RC和admin
continuous-integration/drone/push Build is passing Details
2025-01-06 13:19:51 +08:00
caiyiling 17ee60de81 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-06 10:58:40 +08:00
caiyiling b9ef4fd3f3 阅片交互更改及阅片标准导出配置更改 2025-01-06 10:57:44 +08:00
wangxiaoshuang 252333ea5b 邮件在项目中不能配置问题
continuous-integration/drone/push Build is passing Details
2025-01-06 10:10:03 +08:00
caiyiling a5445804e2 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-03 17:41:27 +08:00
caiyiling 0cabf49c43 报表导出更改 2025-01-03 17:41:11 +08:00
wangxiaoshuang 5ee7ba9820 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-03 17:05:47 +08:00
wangxiaoshuang 4f2419fe03 项目添加人员账号角色禁用增加提示 2025-01-03 17:05:43 +08:00
caiyiling 28bb98099c Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2025-01-03 17:02:29 +08:00
caiyiling 5963fc629d 保存标记时优化处理 2025-01-03 17:01:33 +08:00
wangxiaoshuang 44feb21f63 中心调研弹窗
continuous-integration/drone/push Build is passing Details
2025-01-03 13:57:25 +08:00
wangxiaoshuang 343813158f Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-03 11:54:19 +08:00
wangxiaoshuang 5e80fe2c3f 1 2025-01-03 11:54:09 +08:00
caiyiling 2e8095939b Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2025-01-03 10:23:42 +08:00
caiyiling b0dc5400aa Lugano脾脏测量bug修复 2025-01-03 10:23:09 +08:00
wangxiaoshuang 7f18e717b7 1
continuous-integration/drone/push Build is failing Details
2025-01-03 09:47:57 +08:00
wangxiaoshuang 6e66b77857 MFA验证登录逻辑修改
continuous-integration/drone/push Build is running Details
2025-01-03 09:42:47 +08:00
caiyiling 5328217853 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2025-01-03 09:38:14 +08:00
caiyiling 0f4819f5db 肝脏分段平均值更改 2025-01-03 09:37:45 +08:00
wangxiaoshuang 907371b693 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2025-01-03 09:19:12 +08:00
wangxiaoshuang f65042a5c2 MFA验证 2025-01-03 09:19:07 +08:00
caiyiling 518ce72fd2 阅片接口更改
continuous-integration/drone/push Build is passing Details
2025-01-02 16:59:29 +08:00
caiyiling ba54da2814 阅片接口更改
continuous-integration/drone/push Build is passing Details
2025-01-02 15:43:55 +08:00
caiyiling d381b10bcd CDISC导出配置更改
continuous-integration/drone/push Build is passing Details
2025-01-02 15:36:00 +08:00
caiyiling d127637922 保存肝脏分段信息接口更改
continuous-integration/drone/push Build is passing Details
2025-01-02 14:50:22 +08:00
caiyiling 0e0c2ca55d 肝脏分段标注保存接口更改
continuous-integration/drone/push Build is passing Details
2025-01-02 14:37:26 +08:00
caiyiling 98502230c3 阅片跟踪页报表导出更改
continuous-integration/drone/push Build is passing Details
2025-01-02 13:49:43 +08:00
caiyiling 2b987fb1ae 报表导出配置及阅片bug修复
continuous-integration/drone/push Build is passing Details
2025-01-02 10:57:58 +08:00
caiyiling f1dee25987 核医学标准添加融合演示案例
continuous-integration/drone/push Build encountered an error Details
2025-01-02 09:18:20 +08:00
wangxiaoshuang 8799431f7a 中心调研登录问题解决
continuous-integration/drone/push Build is passing Details
2024-12-31 18:02:59 +08:00
wangxiaoshuang a8fe3d6073 项目添加人员角色去除已禁用角色
continuous-integration/drone/push Build is passing Details
2024-12-31 10:29:44 +08:00
wangxiaoshuang 3578882ec0 项目中所有pm角色禁止禁用,所有包含pm账号的禁止退出
continuous-integration/drone/push Build is passing Details
2024-12-31 10:11:32 +08:00
caiyiling d5c9298aab 阅片报告页更改
continuous-integration/drone/push Build is passing Details
2024-12-30 16:57:02 +08:00
caiyiling 59df7214d4 MRI-PDFF标准交互优化
continuous-integration/drone/push Build is passing Details
2024-12-30 16:21:32 +08:00
caiyiling 6c50257972 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2024-12-30 15:58:55 +08:00
caiyiling 58b8cf1391 系统标准配置及MRI-PDFF交互更改 2024-12-30 15:58:23 +08:00
wangxiaoshuang 1f6ee08a8b 用户角色编辑修改
continuous-integration/drone/push Build is passing Details
2024-12-30 15:42:29 +08:00
wangxiaoshuang c5fb53a05f 1
continuous-integration/drone/push Build is passing Details
2024-12-30 15:20:37 +08:00
wangxiaoshuang 24e05ebc3e 登录日志修改
continuous-integration/drone/push Build is passing Details
2024-12-30 14:18:41 +08:00
wangxiaoshuang a78d848424 管理端用户切换角色
continuous-integration/drone/push Build is passing Details
2024-12-30 13:30:10 +08:00
wangxiaoshuang 75f3b37c05 仲裁规则配置需要调整
continuous-integration/drone/push Build is passing Details
2024-12-30 13:18:19 +08:00
wangxiaoshuang ca4f2c4a8e 登录日志详情弹框样式修改 2024-12-30 13:15:50 +08:00
wangxiaoshuang 4defa157ee 临床数据上传时,匹配符未替换
continuous-integration/drone/push Build is passing Details
2024-12-30 09:35:10 +08:00
wangxiaoshuang 13ba919484 按钮位置调整
continuous-integration/drone/push Build is passing Details
2024-12-27 18:02:18 +08:00
wangxiaoshuang bf407a49fd 1
continuous-integration/drone/push Build is passing Details
2024-12-27 17:22:23 +08:00
wangxiaoshuang 3c50254a2d 切换角色样式调整
continuous-integration/drone/push Build is passing Details
2024-12-27 16:40:07 +08:00
wangxiaoshuang 41ac3d562a 用户列表时间查询默认值
continuous-integration/drone/push Build is passing Details
2024-12-27 16:24:43 +08:00
wangxiaoshuang d790a95952 新增、编辑角色时去除RC和Dash
continuous-integration/drone/push Build is running Details
2024-12-27 16:21:01 +08:00
wangxiaoshuang 328359dfde 登录ip不一致提示
continuous-integration/drone/push Build is passing Details
2024-12-27 14:49:58 +08:00
wangxiaoshuang 1286cd1212 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is failing Details
2024-12-27 11:49:00 +08:00
wangxiaoshuang f739563fe9 外部人员发送邮件接口添加UserTypeId参数 2024-12-27 11:48:49 +08:00
wangxiaoshuang 2f4ace45b8 用户列表新增最后一次修改密码字段 2024-12-27 11:48:22 +08:00
caiyiling 407f0b85d2 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2024-12-27 10:53:13 +08:00
caiyiling 3052b269e9 MRI-PDFF阅片标准添加国际化标识及报告更改 2024-12-27 10:52:18 +08:00
wangxiaoshuang a7c3bf09f8 登录日志
continuous-integration/drone/push Build is passing Details
2024-12-27 10:29:45 +08:00
wangxiaoshuang 65d9c7b711 管理端登录日志详情
continuous-integration/drone/push Build is passing Details
2024-12-26 17:55:11 +08:00
wangxiaoshuang 3ca1e9d8ed 登录存储userId
continuous-integration/drone/push Build is passing Details
2024-12-26 17:17:59 +08:00
caiyiling f27fda4a5f MRI-PDFF标准阅片更改
continuous-integration/drone/push Build is passing Details
2024-12-26 16:20:24 +08:00
caiyiling 27352f572c 1
continuous-integration/drone/push Build is passing Details
2024-12-26 16:10:19 +08:00
caiyiling 47c6b30d4a Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is running Details
2024-12-26 16:07:52 +08:00
caiyiling 91bd50d565 MRI-PDFF标准阅片时不可测量时,系统自动清空测量值及标注 2024-12-26 16:06:53 +08:00
wangxiaoshuang d1ed8b39f0 首次登录修改密码去除调用logout接口
continuous-integration/drone/push Build is passing Details
2024-12-26 15:52:40 +08:00
wangxiaoshuang 3925652428 登录禁用的角色置灰
continuous-integration/drone/push Build is passing Details
2024-12-26 15:19:39 +08:00
wangxiaoshuang 37f8f2fff1 项目配置检查技术选择修改
continuous-integration/drone/push Build is passing Details
2024-12-26 15:11:38 +08:00
wangxiaoshuang 32551e3faa 项目配置检查技术选择修改
continuous-integration/drone/push Build is passing Details
2024-12-26 14:55:08 +08:00
wangxiaoshuang 43f99b02c4 用户角色切换刷新问题
continuous-integration/drone/push Build is passing Details
2024-12-26 14:37:27 +08:00
wangxiaoshuang 9c22809bae 中心调研表二维码下载名称变更
continuous-integration/drone/push Build is passing Details
2024-12-26 14:18:15 +08:00
wangxiaoshuang be9e78ec73 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2024-12-26 14:13:29 +08:00
wangxiaoshuang d645df58c2 管理端用户修改角色 2024-12-26 14:13:20 +08:00
caiyiling 5d9adab706 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2024-12-26 14:07:56 +08:00
caiyiling 291f9b5d66 1 2024-12-26 14:07:21 +08:00
wangxiaoshuang 5dedcbc2ef 影像上传提示
continuous-integration/drone/push Build is passing Details
2024-12-26 13:53:52 +08:00
wangxiaoshuang 940a860352 退出登录接口新增参数IdentityUserId
continuous-integration/drone/push Build is passing Details
2024-12-26 13:29:02 +08:00
wangxiaoshuang 9cd540d1ec 切换角色跳转页面问题
continuous-integration/drone/push Build is passing Details
2024-12-26 12:29:55 +08:00
wangxiaoshuang 9e8d537358 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2024-12-26 11:03:12 +08:00
wangxiaoshuang 7882c9b631 链接跳转新增账号修改 2024-12-26 11:02:58 +08:00
caiyiling 5dd1935997 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2024-12-26 10:00:49 +08:00
caiyiling 47d60769be 新增MRI-PDFF阅片标准 2024-12-26 09:58:42 +08:00
wangxiaoshuang 8225eacb7e 个人中心修改信息更换接口
continuous-integration/drone/push Build is passing Details
2024-12-25 17:50:15 +08:00
wangxiaoshuang 57a8bb4e24 中心添加AE标题修改
continuous-integration/drone/push Build is passing Details
2024-12-25 16:53:13 +08:00
wangxiaoshuang 36ffd8b371 中心列表字段修改
continuous-integration/drone/push Build is passing Details
2024-12-25 16:24:21 +08:00
wangxiaoshuang 7fc6f4494b 1
continuous-integration/drone/push Build is passing Details
2024-12-25 16:08:42 +08:00
wangxiaoshuang 9d3ba7eb57 1
continuous-integration/drone/push Build is passing Details
2024-12-25 15:55:36 +08:00
wangxiaoshuang 7ed4dd7e24 1
continuous-integration/drone/push Build is passing Details
2024-12-25 14:51:36 +08:00
wangxiaoshuang b233535d95 项目角色状态修改
continuous-integration/drone/push Build is running Details
2024-12-25 14:47:12 +08:00
wangxiaoshuang 9bdb8f64b3 1
continuous-integration/drone/push Build is passing Details
2024-12-25 14:10:31 +08:00
wangxiaoshuang f637f746cb 重置密码
continuous-integration/drone/push Build is passing Details
2024-12-25 13:27:31 +08:00
wangxiaoshuang dec01d779d 编辑用户角色
continuous-integration/drone/push Build is passing Details
2024-12-25 11:42:11 +08:00
wangxiaoshuang 7363b0049d 新增、编辑角色
continuous-integration/drone/push Build is passing Details
2024-12-25 11:23:00 +08:00
wangxiaoshuang a95a129dde 项目内切换角色
continuous-integration/drone/push Build is passing Details
2024-12-24 16:21:23 +08:00
wangxiaoshuang 177510643d 分角色登录
continuous-integration/drone/push Build is passing Details
2024-12-23 18:05:21 +08:00
wangxiaoshuang eeac5b76c4 分角色登录
continuous-integration/drone/push Build is passing Details
2024-12-23 17:23:51 +08:00
wangxiaoshuang a17359a56e 密码输入问题
continuous-integration/drone/push Build is passing Details
2024-12-23 16:12:03 +08:00
wangxiaoshuang 28c7cf7d67 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web
continuous-integration/drone/push Build is passing Details
2024-12-23 13:59:40 +08:00
wangxiaoshuang d9091fbb79 SPM/CPM增加 流程审批与否的控制 2024-12-23 13:59:35 +08:00
caiyiling 7e52005dab Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2024-12-23 13:35:06 +08:00
caiyiling 5866535fb5 系统标准配置更改 2024-12-23 13:34:46 +08:00
wangxiaoshuang 862c6d64cc 简历医院信息维护
continuous-integration/drone/push Build is passing Details
2024-12-23 13:13:44 +08:00
wangxiaoshuang 2c0c2e8111 培训文件显示创建时间,不展示更新时间
continuous-integration/drone/push Build is passing Details
2024-12-20 11:03:46 +08:00
wangxiaoshuang c24c98b334 列表label名修改
continuous-integration/drone/push Build is passing Details
2024-12-19 11:45:21 +08:00
caiyiling 97caeae753 系统标准配置更改
continuous-integration/drone/push Build is passing Details
2024-12-19 11:02:34 +08:00
caiyiling 6725f6e276 Merge branch 'main' of https://gitea.frp.extimaging.com/XCKJ/irc_web into main
continuous-integration/drone/push Build is passing Details
2024-12-18 18:05:54 +08:00
caiyiling 38ad4e72a2 系统标准配置更改 2024-12-18 18:05:28 +08:00
wangxiaoshuang c9c4826274 对于DICOM和非DICOM的Tab可以根据配置来控制显示
continuous-integration/drone/push Build is passing Details
2024-12-18 17:08:27 +08:00
494 changed files with 87103 additions and 37674 deletions

View File

@ -5,7 +5,8 @@ NODE_ENV = 'development'
VUE_APP_BASE_PATH = '/' VUE_APP_BASE_PATH = '/'
VUE_APP_IS_TEST = false VUE_APP_IS_TEST = false
# onlyoffice地址
VUE_APP_ONLYOFFICE_URL = "https://onlyoffice.test.extimaging.com"
# base api # base api
VUE_APP_BASE_API = 'http://123.56.94.154:7000' VUE_APP_BASE_API = 'http://123.56.94.154:7000'

View File

@ -5,6 +5,9 @@ NODE_ENV = 'prod'
# base public path # base public path
VUE_APP_BASE_PATH = '/' VUE_APP_BASE_PATH = '/'
# onlyoffice地址
VUE_APP_ONLYOFFICE_URL = "https://office.extimaging.com"
# 是否开启登陆限制 true:是 false:否 # 是否开启登陆限制 true:是 false:否
VUE_APP_LOGIN_FOR_PERMISSION = true VUE_APP_LOGIN_FOR_PERMISSION = true

View File

@ -3,6 +3,8 @@ ENV = 'production'
NODE_ENV = 'production' NODE_ENV = 'production'
# base public path # base public path
VUE_APP_BASE_PATH = '/' VUE_APP_BASE_PATH = '/'
# onlyoffice地址
VUE_APP_ONLYOFFICE_URL = "https://onlyoffice.test.extimaging.com"
VUE_APP_IS_TEST = true VUE_APP_IS_TEST = true

View File

@ -2,6 +2,9 @@
ENV = 'prop' ENV = 'prop'
NODE_ENV = 'prop' NODE_ENV = 'prop'
# base public path
VUE_APP_BASE_PATH = '/'
# 是否开启登陆限制 true:是 false:否 # 是否开启登陆限制 true:是 false:否
VUE_APP_LOGIN_FOR_PERMISSION = true VUE_APP_LOGIN_FOR_PERMISSION = true

View File

@ -4,6 +4,9 @@ NODE_ENV = 'production'
# base public path # base public path
VUE_APP_BASE_PATH = '/' VUE_APP_BASE_PATH = '/'
# onlyoffice地址
VUE_APP_ONLYOFFICE_URL = "https://onlyoffice.test.extimaging.com"
# base public path # base public path
VUE_APP_BASE_PATH = '/' VUE_APP_BASE_PATH = '/'

View File

@ -1,48 +1,58 @@
module.exports = { module.exports = {
root: true, root: true,
parserOptions: { parserOptions: {
parser: 'babel-eslint', parser: '@babel/eslint-parser',
sourceType: 'module' sourceType: 'module'
}, },
globals: { globals: {
"zzSessionStorage": true 'zzSessionStorage': true
}, },
env: { env: {
browser: true, browser: true,
node: true, node: true,
es6: true es6: true
}, },
extends: ["plugin:vue/recommended"], extends: ['plugin:vue/recommended'],
// add your custom rules here // add your custom rules here
//it is base on https://github.com/vuejs/eslint-config-vue // it is base on https://github.com/vuejs/eslint-config-vue
rules: { rules: {
"vue/max-attributes-per-line": [ // "rule-name": "off"
2, // "vue/max-attributes-per-line": [
// 2,
// {
// singleline: 10,
// multiline: {
// max: 1,
// allowFirstLine: false
// }
// }
// ],
'vue/max-attributes-per-line': [
'error',
{ {
singleline: 10, singleline: 10,
multiline: { multiline: {
max: 1, max: 1
allowFirstLine: false
} }
} }
], ],
"vue/singleline-html-element-content-newline": "off", 'vue/singleline-html-element-content-newline': 'off',
"vue/multiline-html-element-content-newline": "off", 'vue/multiline-html-element-content-newline': 'off',
"vue/name-property-casing": ["error", "PascalCase"], 'vue/name-property-casing': ['error', 'PascalCase'],
"vue/no-v-html": "off", 'vue/no-v-html': 'off',
"accessor-pairs": 2, 'accessor-pairs': 2,
"arrow-spacing": [ 'arrow-spacing': [
2, 2,
{ {
before: true, before: true,
after: true after: true
} }
], ],
"block-spacing": [2, "always"], 'block-spacing': [2, 'always'],
"brace-style": [ 'brace-style': [
2, 2,
"1tbs", '1tbs',
{ {
allowSingleLine: true allowSingleLine: true
} }
@ -50,31 +60,31 @@ module.exports = {
camelcase: [ camelcase: [
0, 0,
{ {
properties: "always" properties: 'always'
} }
], ],
"comma-dangle": [2, "never"], 'comma-dangle': [2, 'never'],
"comma-spacing": [ 'comma-spacing': [
2, 2,
{ {
before: false, before: false,
after: true after: true
} }
], ],
"comma-style": [2, "last"], 'comma-style': [2, 'last'],
"constructor-super": 2, 'constructor-super': 2,
curly: [2, "multi-line"], curly: [2, 'multi-line'],
"dot-location": [2, "property"], 'dot-location': [2, 'property'],
"eol-last": 2, 'eol-last': 2,
eqeqeq: ["error", "always", { null: "ignore" }], eqeqeq: ['error', 'always', { null: 'ignore' }],
"generator-star-spacing": [ 'generator-star-spacing': [
2, 2,
{ {
before: true, before: true,
after: true after: true
} }
], ],
"handle-callback-err": [2, "^(err|error)$"], 'handle-callback-err': [2, '^(err|error)$'],
indent: [ indent: [
2, 2,
2, 2,
@ -82,197 +92,197 @@ module.exports = {
SwitchCase: 1 SwitchCase: 1
} }
], ],
"jsx-quotes": [2, "prefer-single"], 'jsx-quotes': [2, 'prefer-single'],
"key-spacing": [ 'key-spacing': [
2, 2,
{ {
beforeColon: false, beforeColon: false,
afterColon: true afterColon: true
} }
], ],
"keyword-spacing": [ 'keyword-spacing': [
2, 2,
{ {
before: true, before: true,
after: true after: true
} }
], ],
"new-cap": [ 'new-cap': [
2, 2,
{ {
newIsCap: true, newIsCap: true,
capIsNew: false capIsNew: false
} }
], ],
"new-parens": 2, 'new-parens': 2,
"no-array-constructor": 2, 'no-array-constructor': 2,
"no-caller": 2, 'no-caller': 2,
"no-console": "off", 'no-console': 'off',
"no-class-assign": 2, 'no-class-assign': 2,
"no-cond-assign": 2, 'no-cond-assign': 2,
"no-const-assign": 2, 'no-const-assign': 2,
"no-control-regex": 0, 'no-control-regex': 0,
"no-delete-var": 2, 'no-delete-var': 2,
"no-dupe-args": 2, 'no-dupe-args': 2,
"no-dupe-class-members": 2, 'no-dupe-class-members': 2,
"no-dupe-keys": 2, 'no-dupe-keys': 2,
"no-duplicate-case": 2, 'no-duplicate-case': 2,
"no-empty-character-class": 2, 'no-empty-character-class': 2,
"no-empty-pattern": 2, 'no-empty-pattern': 2,
"no-eval": 2, 'no-eval': 2,
"no-ex-assign": 2, 'no-ex-assign': 2,
"no-extend-native": 2, 'no-extend-native': 2,
"no-extra-bind": 2, 'no-extra-bind': 2,
"no-extra-boolean-cast": 2, 'no-extra-boolean-cast': 2,
"no-extra-parens": [2, "functions"], 'no-extra-parens': [2, 'functions'],
"no-fallthrough": 2, 'no-fallthrough': 2,
"no-floating-decimal": 2, 'no-floating-decimal': 2,
"no-func-assign": 2, 'no-func-assign': 2,
"no-implied-eval": 2, 'no-implied-eval': 2,
"no-inner-declarations": [2, "functions"], 'no-inner-declarations': [2, 'functions'],
"no-invalid-regexp": 2, 'no-invalid-regexp': 2,
"no-irregular-whitespace": 2, 'no-irregular-whitespace': 2,
"no-iterator": 2, 'no-iterator': 2,
"no-label-var": 2, 'no-label-var': 2,
"no-labels": [ 'no-labels': [
2, 2,
{ {
allowLoop: false, allowLoop: false,
allowSwitch: false allowSwitch: false
} }
], ],
"no-lone-blocks": 2, 'no-lone-blocks': 2,
"no-mixed-spaces-and-tabs": 2, 'no-mixed-spaces-and-tabs': 2,
"no-multi-spaces": 2, 'no-multi-spaces': 2,
"no-multi-str": 2, 'no-multi-str': 2,
"no-multiple-empty-lines": [ 'no-multiple-empty-lines': [
2, 2,
{ {
max: 1 max: 1
} }
], ],
"no-native-reassign": 2, 'no-native-reassign': 2,
"no-negated-in-lhs": 2, 'no-negated-in-lhs': 2,
"no-new-object": 2, 'no-new-object': 2,
"no-new-require": 2, 'no-new-require': 2,
"no-new-symbol": 2, 'no-new-symbol': 2,
"no-new-wrappers": 2, 'no-new-wrappers': 2,
"no-obj-calls": 2, 'no-obj-calls': 2,
"no-octal": 2, 'no-octal': 2,
"no-octal-escape": 2, 'no-octal-escape': 2,
"no-path-concat": 2, 'no-path-concat': 2,
"no-proto": 2, 'no-proto': 2,
"no-redeclare": 2, 'no-redeclare': 2,
"no-regex-spaces": 2, 'no-regex-spaces': 2,
"no-return-assign": [2, "except-parens"], 'no-return-assign': [2, 'except-parens'],
"no-self-assign": 2, 'no-self-assign': 2,
"no-self-compare": 2, 'no-self-compare': 2,
"no-sequences": 2, 'no-sequences': 2,
"no-shadow-restricted-names": 2, 'no-shadow-restricted-names': 2,
"no-spaced-func": 2, 'no-spaced-func': 2,
"no-sparse-arrays": 2, 'no-sparse-arrays': 2,
"no-this-before-super": 2, 'no-this-before-super': 2,
"no-throw-literal": 2, 'no-throw-literal': 2,
"no-trailing-spaces": 2, 'no-trailing-spaces': 2,
"no-undef": 2, 'no-undef': 2,
"no-undef-init": 2, 'no-undef-init': 2,
"no-unexpected-multiline": 2, 'no-unexpected-multiline': 2,
"no-unmodified-loop-condition": 2, 'no-unmodified-loop-condition': 2,
"no-unneeded-ternary": [ 'no-unneeded-ternary': [
2, 2,
{ {
defaultAssignment: false defaultAssignment: false
} }
], ],
"no-unreachable": 2, 'no-unreachable': 2,
"no-unsafe-finally": 2, 'no-unsafe-finally': 2,
"no-unused-vars": [ 'no-unused-vars': [
2, 2,
{ {
vars: "all", vars: 'all',
args: "none" args: 'none'
} }
], ],
"no-useless-call": 2, 'no-useless-call': 2,
"no-useless-computed-key": 2, 'no-useless-computed-key': 2,
"no-useless-constructor": 2, 'no-useless-constructor': 2,
"no-useless-escape": 0, 'no-useless-escape': 0,
"no-whitespace-before-property": 2, 'no-whitespace-before-property': 2,
"no-with": 2, 'no-with': 2,
"one-var": [ 'one-var': [
2, 2,
{ {
initialized: "never" initialized: 'never'
} }
], ],
"operator-linebreak": [ 'operator-linebreak': [
2, 2,
"after", 'after',
{ {
overrides: { overrides: {
"?": "before", '?': 'before',
":": "before" ':': 'before'
} }
} }
], ],
"padded-blocks": [2, "never"], 'padded-blocks': [2, 'never'],
quotes: [ quotes: [
2, 2,
"single", 'single',
{ {
avoidEscape: true, avoidEscape: true,
allowTemplateLiterals: true allowTemplateLiterals: true
} }
], ],
semi: [2, "never"], semi: [2, 'never'],
"semi-spacing": [ 'semi-spacing': [
2, 2,
{ {
before: false, before: false,
after: true after: true
} }
], ],
"space-before-blocks": [2, "always"], 'space-before-blocks': [2, 'always'],
"space-before-function-paren": [2, "never"], 'space-before-function-paren': [2, 'never'],
"space-in-parens": [2, "never"], 'space-in-parens': [2, 'never'],
"space-infix-ops": 2, 'space-infix-ops': 2,
"space-unary-ops": [ 'space-unary-ops': [
2, 2,
{ {
words: true, words: true,
nonwords: false nonwords: false
} }
], ],
"spaced-comment": [ 'spaced-comment': [
2, 2,
"always", 'always',
{ {
markers: [ markers: [
"global", 'global',
"globals", 'globals',
"eslint", 'eslint',
"eslint-disable", 'eslint-disable',
"*package", '*package',
"!", '!',
"," ','
] ]
} }
], ],
"template-curly-spacing": [2, "never"], 'template-curly-spacing': [2, 'never'],
"use-isnan": 2, 'use-isnan': 2,
"valid-typeof": 2, 'valid-typeof': 2,
"wrap-iife": [2, "any"], 'wrap-iife': [2, 'any'],
"yield-star-spacing": [2, "both"], 'yield-star-spacing': [2, 'both'],
yoda: [2, "never"], yoda: [2, 'never'],
"prefer-const": 2, 'prefer-const': 2,
//"no-debugger": process.env.NODE_ENV === "production" ? 2 : 0, // "no-debugger": process.env.NODE_ENV === "production" ? 2 : 0,
"object-curly-spacing": [ 'object-curly-spacing': [
2, 2,
"always", 'always',
{ {
objectsInObjects: false objectsInObjects: false
} }
], ],
"array-bracket-spacing": [2, "never"] 'array-bracket-spacing': [2, 'never']
} }
}; }

View File

@ -10516,7 +10516,7 @@ class BaseViewer {
const pageNumber = this._currentPageNumber, const pageNumber = this._currentPageNumber,
state = this.#scrollModePageState, state = this.#scrollModePageState,
viewer = this.viewer; viewmr = this.viewer;
viewer.textContent = ""; viewer.textContent = "";
state.pages.length = 0; state.pages.length = 0;

View File

@ -5,3 +5,6 @@ npm install
# 启动服务 # 启动服务
npm run dev npm run dev
# v1.9.0修改
1. 角色修改全局userId实际意义修改为userRoleId用户角色id新增identityUserId新的用户id

View File

@ -1,10 +1,12 @@
module.exports = { module.exports = {
presets: [ presets: [
'@vue/cli-plugin-babel/preset', // '@vue/cli-plugin-babel/preset',
// ["@babel/preset-env", { "modules": false }]
'@babel/preset-env' '@babel/preset-env'
], ],
plugins: [ plugins: [
'@babel/plugin-proposal-optional-chaining', '@vue/babel-plugin-transform-vue-jsx'
'@babel/plugin-proposal-nullish-coalescing-operator' // '@babel/plugin-proposal-optional-chaining',
// '@babel/plugin-proposal-nullish-coalescing-operator'
] ]
} }

36827
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -14,23 +14,20 @@
"i18n:en": "node i18nGenerate.js lang=en keyCol=5 valCol=7" "i18n:en": "node i18nGenerate.js lang=en keyCol=5 valCol=7"
}, },
"dependencies": { "dependencies": {
"@aws-sdk/client-s3": "^3.370.0", "@aws-sdk/client-s3": "^3.701.0",
"@cornerstonejs/adapters": "^2.19.7",
"@cornerstonejs/calculate-suv": "^1.1.0", "@cornerstonejs/calculate-suv": "^1.1.0",
"@cornerstonejs/core": "^1.27.4", "@cornerstonejs/core": "^2.19.7",
"@cornerstonejs/dicom-image-loader": "^1.27.4", "@cornerstonejs/dicom-image-loader": "^2.19.7",
"@cornerstonejs/streaming-image-volume-loader": "1.23.2", "@cornerstonejs/tools": "^2.19.7",
"@cornerstonejs/tools": "^1.27.4", "@icr/polyseg-wasm": "^0.4.0",
"@ffmpeg/core": "^0.10.0", "@microsoft/signalr": "^8.0.7",
"@ffmpeg/ffmpeg": "^0.10.1", "@riophae/vue-treeselect": "^0.4.0",
"@microsoft/signalr": "^6.0.8",
"@riophae/vue-treeselect": "0.4.0",
"@vue-office/docx": "^1.6.2", "@vue-office/docx": "^1.6.2",
"@vue-office/excel": "^1.7.11", "@vue-office/excel": "^1.7.11",
"@vue/composition-api": "^1.7.2", "@vue/composition-api": "^1.7.2",
"ali-oss": "^6.17.1", "ali-oss": "^6.17.1",
"axios": "0.18.1", "axios": "^0.18.1",
"babel-eslint": "7.2.3",
"copy-webpack-plugin": "^4.5.2",
"core-js": "^3.8.3", "core-js": "^3.8.3",
"cornerstone-core": "^2.6.1", "cornerstone-core": "^2.6.1",
"cornerstone-math": "^0.1.10", "cornerstone-math": "^0.1.10",
@ -41,67 +38,70 @@
"dicom-parser": "^1.8.9", "dicom-parser": "^1.8.9",
"dicomedit": "^0.1.0", "dicomedit": "^0.1.0",
"echarts": "^4.8.0", "echarts": "^4.8.0",
"element-ui": "^2.15.8", "element-ui": "^2.15.14",
"exceljs": "^4.1.0", "exceljs": "^4.4.0",
"file-saver": "^2.0.5", "file-saver": "^2.0.5",
"hammerjs": "^2.0.8", "hammerjs": "^2.0.8",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
"js-md5": "^0.7.3", "js-md5": "^0.8.3",
"jsencrypt": "^3.3.2", "jsencrypt": "^3.3.2",
"jszip": "^3.7.1", "jszip": "^3.10.1",
"moment": "^2.27.0", "minio": "^7.1.3",
"node-polyfill-webpack-plugin": "^2.0.1", "moment": "^2.30.1",
"node-sass": "^4.14.1", "moment-timezone": "^0.5.46",
"normalize.css": "7.0.0", "node-xlsx": "^0.24.0",
"nprogress": "0.2.0", "normalize.css": "^8.0.1",
"path-to-regexp": "2.4.0", "nprogress": "^0.2.0",
"pdfobject": "^2.2.8", "path-to-regexp": "^0.1.10",
"popper.js": "^1.16.1", "pdfobject": "^2.3.0",
"qrcodejs2": "0.0.2", "prismjs": "^1.30.0",
"sass-loader": "^8.0.0", "qrcodejs2": "^0.0.2",
"screenfull": "^4.2.0", "screenfull": "^6.0.2",
"sortablejs": "^1.15.0", "sortablejs": "^1.15.5",
"streamsaver": "^2.0.6", "streamsaver": "^2.0.6",
"v-viewer": "^1.6.4", "svg-sprite-loader": "^4.1.3",
"svgo": "^1.2.2",
"v-viewer": "^1.7.4",
"vcrontab": "^0.3.5", "vcrontab": "^0.3.5",
"vue": "^2.6.11", "vue": "^2.6.14",
"vue-clipboard2": "^0.3.1", "vue-clipboard2": "^0.3.3",
"vue-contextmenujs": "^1.3.13", "vue-contextmenujs": "^1.4.11",
"vue-count-to": "^1.0.13", "vue-count-to": "^1.0.13",
"vue-demi": "^0.14.6", "vue-demi": "^0.14.10",
"vue-i18n": "^8.7.0", "vue-i18n": "^8.28.2",
"vue-pdf": "^4.3.0", "vue-prism-editor": "^1.3.0",
"vue-puzzle-vcode": "^1.1.10", "vue-puzzle-vcode": "^1.1.10",
"vue-router": "3.0.6", "vue-router": "^3.0.6",
"vue-seamless-scroll": "^1.1.21", "vue-seamless-scroll": "^1.1.23",
"vuedraggable": "^2.24.3", "vuedraggable": "^2.24.3",
"vuex": "3.1.0", "vuex": "^3.1.0",
"webpack-aliyun-oss": "^0.4.9" "webpack-aliyun-oss": "^0.3.13"
}, },
"devDependencies": { "devDependencies": {
"@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", "@babel/core": "^7.12.16",
"@babel/plugin-proposal-optional-chaining": "^7.21.0", "@babel/eslint-parser": "^7.12.16",
"@vue/cli-plugin-babel": "~4.5.4", "@babel/plugin-transform-class-static-block": "^7.26.0",
"@vue/cli-plugin-eslint": "~4.5.4", "@vue/babel-plugin-transform-vue-jsx": "^1.4.0",
"@vue/cli-service": "~4.5.4", "@vue/cli-plugin-babel": "~5.0.0",
"autoprefixer": "^9.5.1", "@vue/cli-plugin-eslint": "~5.0.0",
"aws-sdk": "^2.1532.0", "@vue/cli-service": "~5.0.0",
"babel-eslint": "^10.1.0", "autoprefixer": "^10.4.20",
"chalk": "2.4.2", "clean-webpack-plugin": "^4.0.0",
"connect": "3.6.6", "copy-webpack-plugin": "^12.0.2",
"eslint": "^6.7.2", "css-minimizer-webpack-plugin": "^7.0.0",
"eslint-plugin-vue": "^6.2.2", "eslint": "^7.32.0",
"html-webpack-plugin": "3.2.0", "eslint-plugin-vue": "^8.0.3",
"minio": "^7.1.3", "html-webpack-plugin": "^5.6.3",
"moment-timezone": "^0.5.45", "mini-css-extract-plugin": "^2.9.2",
"node-xlsx": "^0.21.0", "node-polyfill-webpack-plugin": "^4.0.0",
"runjs": "^4.3.2", "path-browserify": "^1.0.1",
"script-ext-html-webpack-plugin": "2.1.3", "process": "^0.11.10",
"script-loader": "0.7.2", "sass": "^1.63.2",
"serve-static": "^1.13.2", "sass-loader": "^10.4.1",
"svg-sprite-loader": "4.1.3", "terser-webpack-plugin": "^5.3.10",
"svgo": "1.2.2", "vue-template-compiler": "^2.6.14",
"vue-template-compiler": "^2.6.11" "webpack": "^5.96.1",
"webpack-bundle-analyzer": "^4.10.2"
}, },
"eslintConfig": { "eslintConfig": {
"root": true, "root": true,
@ -109,19 +109,19 @@
"node": true "node": true
}, },
"extends": [ "extends": [
"plugin:vue/essential" "plugin:vue/essential",
"eslint:recommended"
], ],
"parserOptions": { "parserOptions": {
"parser": "babel-eslint" "parser": "@babel/eslint-parser",
"requireConfigFile": false
}, },
"rules": {} "rules": {}
}, },
"engines": {
"node": ">=8.9",
"npm": ">= 3.0.0"
},
"browserslist": [ "browserslist": [
"> 1%", "> 1%",
"last 2 versions" "last 2 versions",
"not dead",
"not op_mini all"
] ]
} }

197
public/cease.html Normal file

File diff suppressed because one or more lines are too long

View File

@ -30,7 +30,6 @@
</script> </script>
<% } else { %> <% } else { %>
<script> <script>
console.log(2)
window.zzSessionStorage = { window.zzSessionStorage = {
setItem: (item, value) => { setItem: (item, value) => {
return sessionStorage.setItem(item, value) return sessionStorage.setItem(item, value)

View File

@ -23,12 +23,38 @@
> >
i18n i18n
</div> </div>
<el-drawer title="国际化" :visible.sync="drawer" direction="rtl" size="80%"> <el-drawer
<div style="width: 320px"> :title="$t('il8n:title')"
<el-form label-width="100px" @submit.native.prevent size="small"> :visible.sync="drawer"
<el-form-item label="关键字"> direction="rtl"
size="80%"
>
<div style="width: 800px">
<el-form
label-width="100px"
@submit.native.prevent
size="small"
:inline="true"
class="demo-form-inline"
>
<el-form-item :label="$t('il8n:search:keyword')">
<el-input v-model="key" @input="keyChange" /> <el-input v-model="key" @input="keyChange" />
</el-form-item> </el-form-item>
<el-form-item :label="$t('il8n:search:state')">
<el-select
v-model="State"
clearable
filterable
@change="handleStateChange"
>
<el-option
v-for="item of $d.InternationalizationKeyState"
:key="'InternationalizationKeyState' + item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-form-item>
</el-form> </el-form>
</div> </div>
<el-table <el-table
@ -36,12 +62,14 @@
v-adaptive="{ bottomOffset: 50 }" v-adaptive="{ bottomOffset: 50 }"
height="100" height="100"
style="width: 100%" style="width: 100%"
@sort-change="handleSortByColumn"
> >
<el-table-column <el-table-column
prop="Code" prop="Code"
label="标签" :label="$t('il8n:table:label')"
width="300" width="300"
show-overflow-tooltip show-overflow-tooltip
sortable="custom"
> >
</el-table-column> </el-table-column>
<!-- <el-table-column--> <!-- <el-table-column-->
@ -53,7 +81,11 @@
<!-- {{scope.row.Description}}--> <!-- {{scope.row.Description}}-->
<!-- </template>--> <!-- </template>-->
<!-- </el-table-column>--> <!-- </el-table-column>-->
<el-table-column prop="Value" label="英文"> <el-table-column
prop="Value"
:label="$t('il8n:table:en')"
sortable="custom"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input <el-input
v-model="scope.row.Value" v-model="scope.row.Value"
@ -66,7 +98,11 @@
></el-input> ></el-input>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="ValueCN" label="中文"> <el-table-column
prop="ValueCN"
:label="$t('il8n:table:cn')"
sortable="custom"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-input <el-input
v-model="scope.row.ValueCN" v-model="scope.row.ValueCN"
@ -79,12 +115,41 @@
></el-input> ></el-input>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column
prop="ValueCN"
:label="$t('il8n:table:state')"
sortable="custom"
>
<template slot-scope="scope">
<el-select
v-model="scope.row.State"
clearable
filterable
size="mini"
>
<el-option
v-for="item of $d.InternationalizationKeyState"
:key="'InternationalizationKeyState' + item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</template>
</el-table-column>
<el-table-column
prop="Version"
:label="$t('il8n:table:Version')"
sortable="custom"
>
</el-table-column>
</el-table> </el-table>
<div style="text-align: right; padding-top: 10px; padding-right: 10px"> <div style="text-align: right; padding-top: 10px; padding-right: 10px">
<el-button size="mini" @click="drawer = false">取消 </el-button> <el-button size="mini" @click="drawer = false"
<el-button size="mini" type="primary" @click="handleSave" >{{ $t('common:button:cancel') }}
>保存</el-button </el-button>
> <el-button size="mini" type="primary" @click="handleSave">{{
$t('common:button:save')
}}</el-button>
</div> </div>
</el-drawer> </el-drawer>
<feedBack v-if="$route.matched.length > 0" /> <feedBack v-if="$route.matched.length > 0" />
@ -110,10 +175,13 @@ export default {
show: false, show: false,
key: null, key: null,
arr: [], arr: [],
il8nExternal: false,
State: null,
} }
}, },
mounted() { mounted() {
this.show = process.env.VUE_APP_OSS_PATH === '/test/dist' this.show = process.env.VUE_APP_OSS_PATH === '/test/dist'
Vue.prototype.$openI18n = this.openI18n
}, },
// watch: { // watch: {
// '$route.query': { // '$route.query': {
@ -145,6 +213,23 @@ export default {
// }, // },
// }, // },
methods: { methods: {
//
handleSortByColumn(column) {
if (column.order === 'ascending') {
this.tableData.sort((a, b) =>
a[column.prop].localeCompare(b[column.prop])
)
} else {
this.tableData.sort((a, b) =>
b[column.prop].localeCompare(a[column.prop])
)
}
},
handleStateChange() {
this.tableData.forEach((item) => {
item.State = this.State
})
},
changeValue(target, attr, e) { changeValue(target, attr, e) {
this.$set(target, attr, e) this.$set(target, attr, e)
}, },
@ -154,9 +239,12 @@ export default {
[], [],
this.arr.filter( this.arr.filter(
(v) => (v) =>
~v.Code.indexOf(this.key) || (v.Code &&
~v.Value.indexOf(this.key) || ~v.Code.toLowerCase().indexOf(this.key.toLowerCase())) ||
~v.ValueCN.indexOf(this.key) (v.Value &&
~v.Value.toLowerCase().indexOf(this.key.toLowerCase())) ||
(v.ValueCN &&
~v.ValueCN.toLowerCase().indexOf(this.key.toLowerCase()))
) )
) )
} else { } else {
@ -164,12 +252,14 @@ export default {
} }
}, },
handleSave() { handleSave() {
this.$confirm('确定修改当前页面国际化内容?').then(() => { this.$confirm(this.$t("i18n:confirm:updatei18n"))
.then(() => {
batchAddOrUpdateFrontInternationalization(this.tableData).then( batchAddOrUpdateFrontInternationalization(this.tableData).then(
async (res) => { async (res) => {
var zhMessages = {}, var zhMessages = {},
enMessages = {} enMessages = {}
var Internationalization = await getFrontInternationalizationList() var Internationalization =
await getFrontInternationalizationList()
Vue.prototype.$tl = Internationalization.Result Vue.prototype.$tl = Internationalization.Result
this.tableData.forEach((v) => { this.tableData.forEach((v) => {
// zhMessages[v.Description + '_' + v.Code] = v.ValueCN // zhMessages[v.Description + '_' + v.Code] = v.ValueCN
@ -180,23 +270,57 @@ export default {
i18n.mergeLocaleMessage('zh', zhMessages) i18n.mergeLocaleMessage('zh', zhMessages)
i18n.mergeLocaleMessage('en', enMessages) i18n.mergeLocaleMessage('en', enMessages)
this.drawer = false this.drawer = false
this.$message.success('国际化修改成功') this.$message.success(this.$t("i18n:message:updatei18nSuccessfully"))
if (this.il8nExternal) {
this.$EventBus.$emit('il8nUpdate')
}
} }
) )
}) })
.catch((err) => {
console.log(err)
})
}, },
openI18n() { openI18n(ARRAY) {
this.tableData = [] this.tableData = []
this.il8nExternal = false
this.State = null
this.key = null this.key = null
this.drawer = true this.drawer = true
let arr = [] let arr = []
let tableData = this.$tl.map((v) => { let tableData = []
if (ARRAY && Array.isArray(ARRAY)) {
this.il8nExternal = true
let data = ARRAY.map((v) => {
let a = { ...v }
return a
})
tableData = data.map((item) => {
return {
Code: item.Code,
Description: item.Description,
FrontType: item.FrontType,
Module: item.Module,
Value: item.Value,
ValueCN: item.ValueCN,
State: item.State,
Version: item.Version,
InternationalizationType: item.InternationalizationType,
}
})
this.tableData = Object.assign([], tableData)
this.arr = Object.assign([], tableData)
return false
} else {
tableData = this.$tl.map((v) => {
let a = { ...v } let a = { ...v }
// if (!a.Description) { // if (!a.Description) {
// a.Description = this.$route.path // a.Description = this.$route.path
// } // }
return a return a
}) })
}
tableData = tableData.filter((v) => { tableData = tableData.filter((v) => {
// return ~this.$path.indexOf(v.Description + '_' + v.Code) // return ~this.$path.indexOf(v.Description + '_' + v.Code)
return ~this.$path.indexOf(v.Code) return ~this.$path.indexOf(v.Code)
@ -213,6 +337,9 @@ export default {
Description: null, Description: null,
Value: null, Value: null,
ValueCN: null, ValueCN: null,
State: 0,
Version: this.$version.Version,
InternationalizationType: 0,
}) })
} }
}) })

View File

@ -44,11 +44,19 @@ export function updateUser(param) {
data: param data: param
}) })
} }
export function updateUserBasicInfo(param) {
export function getUser(userId) {
return request({ return request({
url: `/user/getUser/${userId}`, url: `/user/updateUserBasicInfo`,
method: 'get' method: 'put',
data: param
})
}
export function getUser(params) {
return request({
url: `/user/getUser`,
method: 'get',
params
}) })
} }
@ -317,3 +325,28 @@ export function useUserIDGetDoctorID(data) {
data data
}) })
} }
// 管理端修改用户角色
export function updateUserRoleInfo(data) {
return request({
url: `/User/updateUserRoleInfo`,
method: 'put',
data
})
}
// 管理端新增用户发送邮件
export function addNewUserSendEmail(data) {
return request({
url: `/User/addNewUserSendEmail`,
method: 'post',
data
})
}
// 用户追溯
export function getUserJoinedTrialList(data) {
return request({
url: `/TrialMaintenance/getUserJoinedTrialList`,
method: 'post',
data
})
}

View File

@ -212,7 +212,20 @@ export function getSystemDocumentList(param) {
data: param data: param
}) })
} }
export function publishSystemDocument(param) {
return request({
url: `/SystemDocument/publishSystemDocument`,
method: 'post',
data: param
})
}
export function outLineSystemDocument(param) {
return request({
url: `/SystemDocument/outLineSystemDocument`,
method: 'post',
data: param
})
}
export function addOrUpdateSystemDocument(param) { export function addOrUpdateSystemDocument(param) {
return request({ return request({
url: `/SystemDocument/addOrUpdateSystemDocument`, url: `/SystemDocument/addOrUpdateSystemDocument`,
@ -220,6 +233,29 @@ export function addOrUpdateSystemDocument(param) {
data: param data: param
}) })
} }
// 新增/修改通用培训附件
export function addOrUpdateSystemDocumentAttachment(param) {
return request({
url: `/SystemDocument/addOrUpdateSystemDocumentAttachment`,
method: 'post',
data: param
})
}
// 通用培训附件列表
export function getSystemDocumentAttachmentList(param) {
return request({
url: `/SystemDocument/getSystemDocumentAttachmentList`,
method: 'post',
data: param
})
}
// 删除通用培训附件
export function deleteSystemDocumentAttachment(systemDocumentAttachmentId) {
return request({
url: `/SystemDocument/deleteSystemDocumentAttachment/${systemDocumentAttachmentId}`,
method: 'delete',
})
}
export function deleteSystemDocument(id) { export function deleteSystemDocument(id) {
return request({ return request({
@ -382,10 +418,11 @@ export function addOrUpdateBasicDic(param) {
}) })
} }
export function getDictionaryChildList(id) { export function getDictionaryChildList(data) {
return request({ return request({
url: `/Dictionary/getChildList/${id}`, url: `/Dictionary/getChildList`,
method: 'get' method: 'post',
data
}) })
} }
@ -1070,3 +1107,293 @@ export function batchAddEnrollOrPdEmailConfig(params) {
params params
}) })
} }
// 文件记录-系统文件列表
export function getSysFileTypeList(data) {
return request({
url: `/SysFileType/getSysFileTypeList`,
method: 'post',
data
})
}
// 文件记录-新增/编辑系统文件
export function addOrUpdateSysFileType(data) {
return request({
url: `/SysFileType/addOrUpdateSysFileType`,
method: 'post',
data
})
}
// 文件记录-删除系统文件
export function deleteSysFileType(id) {
return request({
url: `/SysFileType/deleteSysFileType/${id}`,
method: 'delete'
})
}
// 项目文档-获取项目菜单
export function getTrialFileTypeData(data) {
return request({
url: `/TrialFileType/getTrialFileTypeData`,
method: 'post',
data
})
}
// 项目文档-修改项目菜单启用
export function setAuthorizedView(data) {
return request({
url: `/TrialFileType/setAuthorizedView`,
method: 'post',
data
})
}
// 项目文档-新增/修改项目菜单
export function addOrUpdateTrialFileType(data) {
return request({
url: `/TrialFileType/addOrUpdateTrialFileType`,
method: 'post',
data
})
}
// 项目文档-删除项目菜单
export function deleteTrialFileType(id) {
return request({
url: `/TrialFileType/deleteTrialFileType/${id}`,
method: 'delete',
})
}
// 项目文档-报告/文档列表
export function getTrialFinalRecordList(data) {
return request({
url: `/TrialFinalRecord/getTrialFinalRecordList`,
method: 'post',
data
})
}
// 项目文档-报告/文档授权
export function authorizedTrialFinalRecord(data) {
return request({
url: `/TrialFinalRecord/authorizedTrialFinalRecord`,
method: 'post',
data
})
}
// 项目文档-报告/文档新增/修改
export function addOrUpdateTrialFinalRecord(data) {
return request({
url: `/TrialFinalRecord/addOrUpdateTrialFinalRecord`,
method: 'post',
data
})
}
// 项目文档-删除报告/文档
export function deleteTrialFinalRecord(id) {
return request({
url: `/TrialFinalRecord/deleteTrialFinalRecord/${id}`,
method: 'delete',
})
}
// 项目文档-一般文件记录列表
export function getTrialNormalRecordList(data) {
return request({
url: `/TrialNormalRecord/getTrialNormalRecordList`,
method: 'post',
data
})
}
// 项目文档-一般文件记录授权
export function authorizedTTrialNormalRecord(data) {
return request({
url: `/TrialNormalRecord/authorizedTTrialNormalRecord`,
method: 'post',
data
})
}
// 项目文档-一般文件记录批量新增
export function batchAddTrialNormalRecord(data) {
return request({
url: `/TrialNormalRecord/batchAddTrialNormalRecord`,
method: 'post',
data
})
}
// 项目文档-一般文件记录新增/修改
export function addOrUpdateTrialNormalRecord(data) {
return request({
url: `/TrialNormalRecord/addOrUpdateTrialNormalRecord`,
method: 'post',
data
})
}
// 项目文档-删除一般文件记录
export function deleteTrialNormalRecord(id) {
return request({
url: `/TrialNormalRecord/deleteTrialNormalRecord/${id}`,
method: 'delete',
})
}
// 项目文档-批量删除一般文件记录
export function deleteTrialNormalRecordList(data) {
return request({
url: `/TrialNormalRecord/deleteTrialNormalRecordList`,
method: 'post',
data
})
}
// 项目文档-培训记录列表
export function getTrialTrianingRecordList(data) {
return request({
url: `/TrialTrianingRecord/getTrialTrianingRecordList`,
method: 'post',
data
})
}
// 项目文档-培训记录新增/修改
export function addOrUpdateTrialTrianingRecord(data) {
return request({
url: `/TrialTrianingRecord/addOrUpdateTrialTrianingRecord`,
method: 'post',
data
})
}
// 项目文档-培训记录批量新增/修改
export function batchAddTrialTrianingRecord(data) {
return request({
url: `/TrialTrianingRecord/batchAddTrialTrianingRecord`,
method: 'post',
data
})
}
// 项目文档-删除培训记录
export function deleteTrialTrianingRecord(id) {
return request({
url: `/TrialTrianingRecord/deleteTrialTrianingRecord/${id}`,
method: 'delete',
})
}
// 项目文档-培训记录授权
export function authorizedTrialTrianingRecord(data) {
return request({
url: `/TrialTrianingRecord/authorizedTrialTrianingRecord`,
method: 'post',
data
})
}
// 项目文档-阅片人简历
export function getTrialDoctorList(data) {
return request({
url: `/DoctorList/getTrialDoctorList`,
method: 'post',
data
})
}
// 项目文档-上传同意入项记录
export function uploadTrialFileTypeFile(data) {
return request({
url: `/TrialFileType/uploadTrialFileTypeFile`,
method: 'post',
data
})
}
// 项目文档-获取上传同意入项记录
export function getTrialFileTypeFile(data) {
return request({
url: `/TrialFileType/getTrialFileTypeFile`,
method: 'post',
data
})
}
// 项目文档-删除上传同意入项记录
export function deleteTrialTypeFile(params) {
return request({
url: `/TrialFileType/deleteTrialTypeFile`,
method: 'post',
params
})
}
// 项目文档-获取资质材料列表
export function getTrialAttachments(data) {
return request({
url: `/Attachment/getTrialAttachments`,
method: 'post',
data
})
}
// 项目文档-修改资质材料稽查状态
export function setAuthorizedViewC(data) {
return request({
url: `/Attachment/setAuthorizedView`,
method: 'post',
data
})
}
// 项目文档-上传资质材料
export function saveTrialAttachments(data) {
return request({
url: `/Attachment/saveTrialAttachments`,
method: 'post',
data
})
}
// 项目文档-资质材料(获取医生列表)
export function getTrialDoctorListC(data) {
return request({
url: `/Attachment/getTrialDoctorList`,
method: 'post',
data
})
}
// 项目文档-修改资质材料
export function updateTrialAttachments(data) {
return request({
url: `/Attachment/updateTrialAttachments`,
method: 'post',
data
})
}
// 项目文档-删除资质材料
export function deleteAttachment(data) {
return request({
url: `/Attachment/deleteAttachment`,
method: 'post',
data
})
}
// 项目文档-获取历史记录列表
export function getTrialHistoryRecordFileList(data) {
return request({
url: `/TrialHistoryRecordFile/getTrialHistoryRecordFileList`,
method: 'post',
data
})
}
// 项目文档-新增/修改历史记录
export function addOrUpdateTrialHistoryRecordFile(data) {
return request({
url: `/TrialHistoryRecordFile/addOrUpdateTrialHistoryRecordFile`,
method: 'post',
data
})
}
// 项目文档-批量新增历史记录
export function batchAddTrialHistoryRecordFile(data) {
return request({
url: `/TrialHistoryRecordFile/batchAddTrialHistoryRecordFile`,
method: 'post',
data
})
}
// 项目文档-删除历史记录
export function deleteTrialHistoryRecordFile(id) {
return request({
url: `/TrialHistoryRecordFile/deleteTrialHistoryRecordFile/${id}`,
method: 'delete',
})
}
// 邮件管理-批量修改邮件
export function batchUpdateEmail(data) {
return request({
url: `/EmailNoticeConfig/batchUpdateEmail`,
method: 'post',
data
})
}

View File

@ -45,10 +45,19 @@ export function changeFrontAuditSort(param) {
}) })
} }
export function getModuleTypeDescriptionList(param) { export function getModuleTypeDescriptionList(params) {
return request({ return request({
url: `${param === '' ? '/FrontAuditConfig/getModuleTypeDescriptionList' : '/FrontAuditConfig/getModuleTypeDescriptionList?moduleTypeId=' + param}`, url: `/FrontAuditConfig/getModuleTypeDescriptionList`,
method: 'get' method: 'get',
params
})
}
export function getModuleTypeList(data) {
return request({
url: `/FrontAuditConfig/getModuleTypeList`,
method: 'post',
data
}) })
} }

View File

@ -72,7 +72,14 @@ export function getReadingTaskList_Export(param) {
data: param data: param
}) })
} }
export function getTrialVisitImageStatList_Export(param) {
return requestDownload({
url: '/ExcelExport/getTrialVisitImageStatList_Export',
method: 'post',
responseType: 'blob',
data: param
})
}
export function getReReadingTaskList_Export(param) { export function getReReadingTaskList_Export(param) {
return requestDownload({ return requestDownload({
url: '/ExcelExport/getReReadingTaskList_Export', url: '/ExcelExport/getReReadingTaskList_Export',
@ -178,6 +185,15 @@ export function pMTrainingRecordList_Export(data) {
data data
}) })
} }
// 导出系统培训记录
export function getSysDocumentConfirmList_Export(data) {
return requestDownload({
url: `/ExcelExport/getSysDocumentConfirmList_Export`,
responseType: 'blob',
method: 'post',
data
})
}
// 导出影像指控 // 导出影像指控
export function qCVisitList_Export(data) { export function qCVisitList_Export(data) {
return requestDownload({ return requestDownload({

View File

@ -251,3 +251,37 @@ export function uploadOCTLipidAngleTemplate(param) {
data: param data: param
}) })
} }
export function saveTableQuestionMark(param, type) {
return request({
url: `/saveTableQuestionMark/${type}`,
method: 'post',
data: param
})
}
export function deleteTableQuestionMark(param, type) {
return request({
url: `/deleteTableQuestionMark/${type}`,
method: 'post',
data: param
})
}
export function submitTaskRowInfo(param, type) {
return request({
url: `/SubmitTaskRowInfo/${type}`,
method: 'post',
data: param
})
}
export function deleteSingleTableQuestionMark(param, type) {
return request({
url: `/DeleteSingleTableQuestionMark/${type}`,
method: 'post',
data: param
})
}

View File

@ -1035,7 +1035,27 @@ export function getQCVisitList(param) {
data: param data: param
}) })
} }
export function getImageBackList(param) {
return request({
url: `/QCList/getImageBackList`,
method: 'post',
data: param
})
}
export function getImageBackApplyUserList(params) {
return request({
url: `/QCList/getImageBackApplyUserList`,
method: 'get',
params
})
}
export function auditImageBack(params) {
return request({
url: `/QCOperation/auditImageBack`,
method: 'put',
params
})
}
export function getQCChallengeList(param) { export function getQCChallengeList(param) {
return request({ return request({
url: `/QCList/getQCChallengeList`, url: `/QCList/getQCChallengeList`,
@ -1080,6 +1100,19 @@ export function setSeriesStatus(trialId, subjectVisitId, studyId, seriesId, stat
method: 'put' method: 'put'
}) })
} }
export function setNodicomStudyState(params) {
return request({
url: `/QCOperation/setNodicomStudyState`,
method: 'put',
params
})
}
export function setInstanceStatus(trialId, subjectVisitId, seriesId, instanceId, state) {
return request({
url: `/QCOperation/setInstanceState/${trialId}/${subjectVisitId}/${seriesId}/${instanceId}/${state}`,
method: 'put'
})
}
export function getVisitQCStudyAndSeriesList(subjectVisitId) { export function getVisitQCStudyAndSeriesList(subjectVisitId) {
return request({ return request({
@ -1365,9 +1398,9 @@ export function getForwardList(param) {
}) })
} }
export function getNoneDicomStudyList(subjectVisitId, sudyId = '', isFilterZip = false, visitTaskId = '') { export function getNoneDicomStudyList(subjectVisitId, sudyId = '', isFilterZip = false, visitTaskId = '', IsReading = false) {
return request({ return request({
url: `/NoneDicomStudy/getNoneDicomStudyList?subjectVisitId=${subjectVisitId}&nonedicomStudyId=${sudyId}&isFilterZip=${isFilterZip}&visitTaskId=${visitTaskId}`, url: `/NoneDicomStudy/getNoneDicomStudyList?subjectVisitId=${subjectVisitId}&nonedicomStudyId=${sudyId}&isFilterZip=${isFilterZip}&visitTaskId=${visitTaskId}&IsReading=${IsReading}`,
method: 'get' method: 'get'
}) })
} }
@ -1586,6 +1619,13 @@ export function getDocumentConfirmList(param) {
data: param data: param
}) })
} }
export function getSysDocumentConfirmList(param) {
return request({
url: `/TrialDocument/getSysDocumentConfirmList`,
method: 'post',
data: param
})
}
export function getTrialUserSelect(trialId) { export function getTrialUserSelect(trialId) {
return request({ return request({
url: `/TrialDocument/getTrialUserSelect/${trialId}`, url: `/TrialDocument/getTrialUserSelect/${trialId}`,
@ -1600,6 +1640,13 @@ export function getTrialDocAndSystemDocType(trialId) {
}) })
} }
export function getSysDocSignUserList() {
return request({
url: `/TrialDocument/getSysDocSignUserList`,
method: 'get'
})
}
export function updateSubjectStatus(param) { export function updateSubjectStatus(param) {
return request({ return request({
url: `/Subject/updateSubjectStatus`, url: `/Subject/updateSubjectStatus`,
@ -3295,6 +3342,13 @@ export function getReReadingApplyToBeDoneList(param) {
data: param data: param
}) })
} }
export function getPMImageBackToBeDoneList(param) {
return request({
url: `/PersonalWorkstation/getPMImageBackToBeDoneList`,
method: 'post',
data: param
})
}
export function deleteClinicalForm(param) { export function deleteClinicalForm(param) {
return request({ return request({
@ -3915,3 +3969,232 @@ export function getVisitClinicalDataName(data) {
data data
}) })
} }
// 修改外部人员权限配置
export function configTrialSPMInfo(data) {
return request({
url: `/TrialConfig/configTrialSPMInfo`,
method: 'post',
data
})
}
// 项目添加角色修改权限
export function updateTrialUserRole(data) {
return request({
url: `/TrialMaintenance/updateTrialUserRole`,
method: 'put',
data
})
}
// 获取报表配置
export function getTrialQuestionExportResult(data) {
return request({
url: `/ReadingQuestion/getTrialQuestionExportResult`,
method: 'post',
data
})
}
// 修改报表配置
export function setTrialQuestionExportResult(data) {
return request({
url: `/ReadingQuestion/SetTrialQuestionExportResult`,
method: 'post',
data
})
}
// 项目加入人员发送邮件
export function trialUserSendJoinEmail(data) {
return request({
url: `/TrialMaintenance/trialUserSendJoinEmail`,
method: 'post',
data
})
}
// 获取非Dicom标记
export function getNoneDicomMarkListOutDto(data) {
return request({
url: `/ReadingImageTask/getNoneDicomMarkListOutDto`,
method: 'post',
data
})
}
// 添加非Dicom标记
export function addNoneDicomMark(data) {
return request({
url: `/ReadingImageTask/addNoneDicomMark`,
method: 'post',
data
})
}
// 删除非Dicom标记
export function deleteTrialFileType(id) {
return request({
url: `/ReadingImageTask/deleteTrialFileType/${id}`,
method: 'post'
})
}
// 工作台-获取稽查文档
export function getAuditDocumentData(data) {
return request({
url: `/AuditDocument/getAuditDocumentData`,
method: 'post',
data
})
}
// 工作台-新增稽查文档
export function addAuditDocument(data) {
return request({
url: `/AuditDocument/addAuditDocument`,
method: 'post',
data
})
}
// 工作台-获取当前目录层级
export function getBreadcrumbData(data) {
return request({
url: `/AuditDocument/getBreadcrumbData`,
method: 'post',
data
})
}
// 工作台-修改稽查文档
export function updateAuditDocument(data) {
return request({
url: `/AuditDocument/updateAuditDocument`,
method: 'post',
data
})
}
// 工作台-删除稽查文档
export function deleteAuditDocument(data) {
return request({
url: `/AuditDocument/deleteAuditDocument`,
method: 'post',
data
})
}
// 工作台-稽查文档获取历史版本
export function getHistoricalVersion(data) {
return request({
url: `/AuditDocument/getHistoricalVersion`,
method: 'post',
data
})
}
// 工作台-稽查文档设置当前版本
export function setCurrentVersion(data) {
return request({
url: `/AuditDocument/setCurrentVersion`,
method: 'post',
data
})
}
// 工作台-稽查文档移动
export function movieFileOrFolder(data) {
return request({
url: `/AuditDocument/movieFileOrFolder`,
method: 'post',
data
})
}
// 工作台-稽查文档复制
export function copyFileOrFolder(data) {
return request({
url: `/AuditDocument/copyFileOrFolder`,
method: 'post',
data
})
}
// 工作台-稽查文档授权
export function setIsAuthorization(data) {
return request({
url: `/AuditDocument/setIsAuthorization`,
method: 'post',
data
})
}
// 工作台-稽查文档新增文件夹
export function addFolder(data) {
return request({
url: `/AuditDocument/addFolder`,
method: 'post',
data
})
}
// 配置-项目文档发布
export function publishTrialDocument(data) {
return request({
url: `/TrialDocument/publishTrialDocument`,
method: 'post',
data
})
}
// 配置-获取项目文档附件列表
export function getTrialDocumentAttachmentList(data) {
return request({
url: `/TrialDocument/getTrialDocumentAttachmentList`,
method: 'post',
data
})
}
// 配置-新增或修改项目文档附件
export function addOrUpdateTrialDocumentAttachment(data) {
return request({
url: `/TrialDocument/addOrUpdateTrialDocumentAttachment`,
method: 'post',
data
})
}
// 配置-删除项目文档附件
export function deleteTrialDocumentAttachment(data) {
return request({
url: `/TrialDocument/deleteTrialDocumentAttachment/${data}`,
method: 'delete',
})
}
// 配置-获取稽查管理列表
export function getTrialShowInspection(data) {
return request({
url: `/Inspection/getTrialShowInspection`,
method: 'post',
data
})
}
// 配置-设置稽查管理配置
export function setTrialShowInspection(data) {
return request({
url: `/Inspection/setTrialShowInspection`,
method: 'post',
data
})
}
// 影像汇总-获取列表
export function getTrialVisitImageStatList(data) {
return request({
url: `/DownloadAndUpload/getTrialVisitImageStatList`,
method: 'post',
data
})
}
// 影像汇总-获取统计
export function getTrialVisitImageStatInfo(params) {
return request({
url: `/DownloadAndUpload/getTrialVisitImageStatInfo`,
method: 'get',
params
})
}
// 影像汇总-影像下载
export function getExportSubjectVisitImageList(data) {
return request({
url: `/DownloadAndUpload/getExportSubjectVisitImageList`,
method: 'post',
data
})
}

View File

@ -346,9 +346,9 @@ export function getReReadingOrBackInfluenceTaskList(taskId, isReReading, applyId
}) })
} }
export function PMSetTaskBack(trialId, taskId) { export function PMSetTaskBack(trialId, taskId, pmBackReason) {
return request({ return request({
url: `/VisitTask/PMSetTaskBack/${trialId}/${taskId}`, url: `/VisitTask/PMSetTaskBack/${trialId}/${taskId}/${pmBackReason}`,
method: 'put' method: 'put'
}) })
} }
@ -459,9 +459,9 @@ export function setMedicalReviewInvalid(params) {
}) })
} }
export function getTrialCriterionList(trialId) { export function getTrialCriterionList(trialId, isRandom = false) {
return request({ return request({
url: `/VisitTask/getTrialCriterionList?TrialId=${trialId}`, url: `/VisitTask/getTrialCriterionList?TrialId=${trialId}&isRandom=${isRandom}`,
method: 'get' method: 'get'
}) })
} }
@ -480,3 +480,11 @@ export function resetReadingRestTime() {
method: 'post' method: 'post'
}) })
} }
// 设置随机排序
export function setRandomTaskOrder(data) {
return request({
url: `/VisitTask/setRandomTaskOrder`,
method: 'post',
data
})
}

View File

@ -110,4 +110,12 @@ export function addOrUpdateTrialBodyPart(data) {
data data
}) })
} }
// 修改检查名称列表
export function updateTrialStudyNameList(data) {
return request({
url: `/TrialConfig/updateTrialStudyNameList`,
method: 'post',
data
})
}

View File

@ -287,4 +287,12 @@ export function forwardSVDicomImage(param) {
data: param data: param
}) })
} }
// crc、iqc申请影像退回
export function requestImageBack(params) {
return request({
url: `/QCOperation/requestImageBack`,
method: 'put',
params
})
}

View File

@ -179,11 +179,11 @@ export function verifyMFACode(params) {
} }
// 发送MFA邮件 // 发送MFA邮件
export function sendMFAEmail(params) { export function sendMFAEmail(data) {
return request({ return request({
url: `/User/sendMFAEmail`, url: `/User/sendMFAEmail`,
method: 'post', method: 'post',
params data
}) })
} }
// 获取公钥 // 获取公钥
@ -193,3 +193,27 @@ export function getPublicKey() {
method: 'get', method: 'get',
}) })
} }
// 登陆获取角色
export function getUserLoginRoleList(data) {
return request({
url: `/User/getUserLoginRoleList`,
method: 'post',
data,
})
}
// 登陆角色id获取token
export function loginSelectUserRole(params) {
return request({
url: `/User/loginSelectUserRole`,
method: 'get',
params,
})
}
// 忽略异地登录
export function setIsIgnoreUncommonly(data) {
return request({
url: `/User/setIsIgnoreUncommonly`,
method: 'post',
data,
})
}

BIN
src/assets/0.file-16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
src/assets/color-bg.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 665 B

BIN
src/assets/menu_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.8 KiB

BIN
src/assets/pdf.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

BIN
src/assets/stickup.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

BIN
src/assets/zip.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@ -4,6 +4,7 @@
<el-col :span="24"> <el-col :span="24">
<div class="box"> <div class="box">
<div class="box-body"> <div class="box-body">
<slot name="title-container" />
<div class="search"> <div class="search">
<slot name="search-container" /> <slot name="search-container" />
</div> </div>
@ -24,35 +25,35 @@ export default {
props: { props: {
noTitle: { noTitle: {
type: Boolean, type: Boolean,
default: false default: false,
} },
}, },
computed: { computed: {
contentClass() { contentClass() {
return this.noTitle ? 'content-notitle' : 'content' return this.noTitle ? 'content-notitle' : 'content'
} },
} },
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.box-body{ .box-body {
padding: 0px; padding: 0px;
background-color: #fff; background-color: #fff;
.el-card__body { .el-card__body {
padding: 0px; padding: 0px;
} }
.search{ .search {
display: flex; display: flex;
padding: 5px; padding: 5px;
.mr5{ .mr5 {
margin-right:5px; margin-right: 5px;
} }
.el-form-item{ .el-form-item {
margin-bottom: 10px; margin-bottom: 10px;
} }
} }
.page{ .page {
text-align: right; text-align: right;
padding-top: 3px; padding-top: 3px;
} }
@ -61,5 +62,5 @@ export default {
font-weight: bold; font-weight: bold;
font-size: 14px; font-size: 14px;
} }
} }
</style> </style>

View File

@ -1,7 +1,7 @@
<!-- 搜索表单 --> <!-- 搜索表单 -->
<template> <template>
<div class="base-search-form"> <div class="base-search-form">
<el-form :size="size" :inline="true" :label-width="labelWidth"> <el-form :inline="true" :label-width="labelWidth">
<el-form-item <el-form-item
v-for="item in searchForm" v-for="item in searchForm"
:key="item.prop" :key="item.prop"
@ -13,6 +13,7 @@
v-model="searchData[item.prop]" v-model="searchData[item.prop]"
:placeholder="item.placeholder" :placeholder="item.placeholder"
size="mini" size="mini"
clearable
:style="{ width: item.width }" :style="{ width: item.width }"
:readonly="item.readonly" :readonly="item.readonly"
/> />
@ -22,6 +23,7 @@
v-model="searchData[item.prop]" v-model="searchData[item.prop]"
:placeholder="item.placeholder" :placeholder="item.placeholder"
size="mini" size="mini"
clearable
:style="{ width: item.width }" :style="{ width: item.width }"
@change="item.change && item.change(that, searchData[item.prop])" @change="item.change && item.change(that, searchData[item.prop])"
> >
@ -37,6 +39,7 @@
v-model="searchData[item.prop]" v-model="searchData[item.prop]"
:placeholder="item.placeholder" :placeholder="item.placeholder"
size="mini" size="mini"
clearable
:style="{ width: item.width }" :style="{ width: item.width }"
@change="item.change && item.change(that, searchData[item.prop])" @change="item.change && item.change(that, searchData[item.prop])"
> >
@ -96,6 +99,7 @@
value-format="yyyy-MM-dd" value-format="yyyy-MM-dd"
format="yyyy-MM-dd" format="yyyy-MM-dd"
:picker-options="item.pickerOption" :picker-options="item.pickerOption"
clearable
/> />
<!-- 时间 --> <!-- 时间 -->
<el-time-select <el-time-select
@ -104,6 +108,7 @@
:placeholder="item.placeholder" :placeholder="item.placeholder"
type="" type=""
:style="{ width: item.width }" :style="{ width: item.width }"
clearable
/> />
<!-- 日期时间 --> <!-- 日期时间 -->
<el-date-picker <el-date-picker
@ -114,12 +119,14 @@
value-format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss"
:disabled="item.disable && item.disable(searchData[item.prop])" :disabled="item.disable && item.disable(searchData[item.prop])"
:style="{ width: item.width }" :style="{ width: item.width }"
clearable
/> />
<!-- 日期时间段 --> <!-- 日期时间段 -->
<el-date-picker <el-date-picker
v-if="item.type === 'Daterange'" v-if="item.type === 'Daterange'"
v-model="searchData[item.prop]" v-model="searchData[item.prop]"
type="datetimerange" type="datetimerange"
:default-time="['00:00:00', '23:59:59']"
:range-separator="$t('baseForm:daterange:rangeSeparator')" :range-separator="$t('baseForm:daterange:rangeSeparator')"
:start-placeholder="$t('baseForm:daterange:startPlaceholder')" :start-placeholder="$t('baseForm:daterange:startPlaceholder')"
:end-placeholder="$t('baseForm:daterange:startendPlaceholder')" :end-placeholder="$t('baseForm:daterange:startendPlaceholder')"
@ -139,17 +146,18 @@
<!-- 具名slot --> <!-- 具名slot -->
<slot v-if="item.type === 'Custom'" :name="item.slot" /> <slot v-if="item.type === 'Custom'" :name="item.slot" />
</el-form-item> </el-form-item>
<div style="display: inline-block;width: fit-content;">
<el-form-item v-for="item in searchHandle" :key="item.label"> <el-form-item v-for="item in searchHandle" :key="item.label">
<slot v-if="item.slot" :name="item.slot" /> <slot v-if="item.slot" :name="item.slot" />
<el-button <el-button
v-else v-else
:type="item.type" :type="item.type"
:size="item.size || size"
:icon="item.icon || ''" :icon="item.icon || ''"
@click="handleClick(item.emitKey)" @click="handleClick(item.emitKey)"
>{{ item.label }}</el-button >{{ item.label }}</el-button
> >
</el-form-item> </el-form-item>
</div>
</el-form> </el-form>
</div> </div>
</template> </template>
@ -167,11 +175,11 @@ export default {
}, },
labelWidth: { labelWidth: {
type: String, type: String,
default: "", default: '',
}, },
size: { size: {
type: String, type: String,
default: "mini", default: 'mini',
}, },
searchForm: { searchForm: {
type: Array, type: Array,
@ -189,10 +197,10 @@ export default {
methods: { methods: {
handleClick(emitKey) { handleClick(emitKey) {
// emit // emit
this.$emit(`${emitKey}`); this.$emit(`${emitKey}`)
}, },
}, },
}; }
</script> </script>
<style lang="scss"> <style lang="scss">
.base-search-form { .base-search-form {

View File

@ -48,6 +48,7 @@
:show-overflow-tooltip="column.showOverflowTooltip || false" :show-overflow-tooltip="column.showOverflowTooltip || false"
:sortable="column.sortable || false" :sortable="column.sortable || false"
:prop="column.prop" :prop="column.prop"
:fixed="column.fixed"
> >
<template slot-scope="scope"> <template slot-scope="scope">
<!-- 仅仅显示文字 --> <!-- 仅仅显示文字 -->
@ -61,8 +62,11 @@
</a> --> </a> -->
<span v-for="(operate, i) in column.operates" :key="i"> <span v-for="(operate, i) in column.operates" :key="i">
<el-button <el-button
:size="operate.size || 'mini'"
:type="operate.type || 'primary'" :type="operate.type || 'primary'"
v-if="
(operate.show && scope.row[operate.show]) ||
!operate.show
"
style="margin-right: 5px" style="margin-right: 5px"
@click="handleClick(operate, scope.row)" @click="handleClick(operate, scope.row)"
>{{ operate.name }}</el-button >{{ operate.name }}</el-button

View File

@ -1,15 +1,7 @@
<template> <template>
<div <div id="canvas" ref="canvas" v-loading="loading" element-loading-text="Loading..."
id="canvas" element-loading-background="rgba(0, 0, 0, 0.8)" style="width:100%;height:100%;position:relative;"
ref="canvas" class="cornerstone-element" @contextmenu.prevent="onContextmenu" @mouseup="sliderMouseup">
v-loading="loading"
element-loading-text="Loading..."
element-loading-background="rgba(0, 0, 0, 0.8)"
style="width:100%;height:100%;position:relative;"
class="cornerstone-element"
@contextmenu.prevent="onContextmenu"
@mouseup="sliderMouseup"
>
<div v-show="dicomInfo.series" class="info-series"> <div v-show="dicomInfo.series" class="info-series">
<div>Series #{{ dicomInfo.series }}</div> <div>Series #{{ dicomInfo.series }}</div>
<div>Image #{{ dicomInfo.frame }}</div> <div>Image #{{ dicomInfo.frame }}</div>
@ -26,9 +18,11 @@
<div v-show="dicomInfo.location">Location {{ dicomInfo.location }}mm</div> --> <div v-show="dicomInfo.location">Location {{ dicomInfo.location }}mm</div> -->
<!-- <div v-show="toolState.clipPlaying">FPS {{ dicomInfo.fps }}</div> --> <!-- <div v-show="toolState.clipPlaying">FPS {{ dicomInfo.fps }}</div> -->
<div v-show="mousePosition.mo"> <div v-show="mousePosition.mo">
Pos: {{ mousePosition.x?mousePosition.x.toFixed(0):'' }}, {{ mousePosition.y?mousePosition.y.toFixed(0):'' }} Pos: {{ mousePosition.x ? mousePosition.x.toFixed(0) : '' }}, {{ mousePosition.y ? mousePosition.y.toFixed(0) :
'' }}
</div> </div>
<div v-if="(dicomInfo.modality === 'CT' || dicomInfo.modality === 'DR' || dicomInfo.modality === 'CR') && mousePosition.mo"> <div
v-if="(dicomInfo.modality === 'CT' || dicomInfo.modality === 'DR' || dicomInfo.modality === 'CR') && mousePosition.mo">
HU: {{ mousePosition.mo }} HU: {{ mousePosition.mo }}
</div> </div>
<div v-else-if="(dicomInfo.modality === 'PT' && mousePosition.suv)"> <div v-else-if="(dicomInfo.modality === 'PT' && mousePosition.suv)">
@ -53,8 +47,12 @@
<!-- <div v-show="dicomInfo.acc">ACC {{ dicomInfo.acc }}</div> --> <!-- <div v-show="dicomInfo.acc">ACC {{ dicomInfo.acc }}</div> -->
<!-- <div>{{ dicomInfo.time }}</div> --> <!-- <div>{{ dicomInfo.time }}</div> -->
</div> </div>
<div ref="sliderBox" class="my_slider_box" style="position: absolute;right: 1px;height: calc(100% - 100px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer" @click.stop="goViewer($event)"> <div ref="sliderBox" class="my_slider_box"
<div :style="{top: height + '%'}" style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move" @mousedown="sliderMousedown($event)" /> style="position: absolute;right: 1px;height: calc(100% - 100px);transform: translateY(-50%);top: calc(50% - 30px);width: 10px;background: #333;cursor: pointer"
@click.stop="goViewer($event)">
<div :style="{ top: height + '%' }"
style="z-index:10;background: #9e9e9e;height: 20px;width: 100%;position: absolute;top: 0;cursor: move"
@mousedown="sliderMousedown($event)" />
</div> </div>
<div style="position: absolute;left: 50%;top: 15px;color: #f44336;"> <div style="position: absolute;left: 50%;top: 15px;color: #f44336;">
{{ markers.top }} {{ markers.top }}
@ -81,16 +79,9 @@
<!-- <div v-show="stack.firstImageLoading" class="load-indicator"> <!-- <div v-show="stack.firstImageLoading" class="load-indicator">
Loading Series #{{ stack.seriesNumber }}... Loading Series #{{ stack.seriesNumber }}...
</div>--> </div>-->
<el-dialog <el-dialog v-if="dcmTag.visible" :visible.sync="dcmTag.visible" :close-on-click-modal="false" :title="dcmTag.title"
v-if="dcmTag.visible" width="1000px" custom-class="base-dialog-wrapper" append-to-body>
:visible.sync="dcmTag.visible" <dicom-tags :image-id="stack.imageIds[stack.currentImageIdIndex]" @close="dcmTag.visible = false" />
:close-on-click-modal="false"
:title="dcmTag.title"
width="1000px"
custom-class="base-dialog-wrapper"
append-to-body
>
<DicomTags :image-id="stack.imageIds[stack.currentImageIdIndex]" @close="dcmTag.visible = false" />
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -217,10 +208,10 @@ export default {
this.stack.description = dicomSeries.description this.stack.description = dicomSeries.description
this.toolState.viewportInvert = false this.toolState.viewportInvert = false
this.toolState.dicomInfoVisible = false this.toolState.dicomInfoVisible = false
var imageId = this.stack.imageIds[this.stack.currentImageIdIndex] // var imageId = this.stack.imageIds[this.stack.currentImageIdIndex]
var instanceId = imageId.split('/')[imageId.split('/').length - 1] // var instanceId = imageId.split('/')[imageId.split('/').length - 1]
instanceId = instanceId.split('.')[0] // instanceId = instanceId.split('.')[0]
this.stack.instanceId = instanceId // this.stack.instanceId = instanceId
this.toolState.clipPlaying = false this.toolState.clipPlaying = false
const element = this.$refs.canvas const element = this.$refs.canvas
cornerstone.enable(element) cornerstone.enable(element)
@ -263,9 +254,9 @@ export default {
) )
if (!toolAlreadyAddedToElement) { if (!toolAlreadyAddedToElement) {
if (toolName === 'RectangleRoi') { if (toolName === 'RectangleRoi') {
cornerstoneTools.addToolForElement(element, apiTool, { configuration: { showMinMax: true, showStatsText: true}}) cornerstoneTools.addToolForElement(element, apiTool, { configuration: { showMinMax: true, showStatsText: true } })
} else if (toolName === 'EllipticalRoi') { } else if (toolName === 'EllipticalRoi') {
cornerstoneTools.addToolForElement(element, apiTool, { configuration: { showMinMax: true}}) cornerstoneTools.addToolForElement(element, apiTool, { configuration: { showMinMax: true } })
} else { } else {
cornerstoneTools.addToolForElement(element, apiTool) cornerstoneTools.addToolForElement(element, apiTool)
} }
@ -346,9 +337,9 @@ export default {
// return // return
// } // }
// this.stack.instanceId = image.imageId.split('/')[image.imageId.split('/').length - 1] // this.stack.instanceId = image.imageId.split('/')[image.imageId.split('/').length - 1]
var instanceId = image.imageId.split('/')[image.imageId.split('/').length - 1] // var instanceId = image.imageId.split('/')[image.imageId.split('/').length - 1]
instanceId = instanceId.split('.')[0] // instanceId = instanceId.split('.')[0]
this.stack.instanceId = instanceId // this.stack.instanceId = instanceId
this.height = (this.stack.currentImageIdIndex) * 100 / (this.stack.imageIds.length - 1) this.height = (this.stack.currentImageIdIndex) * 100 / (this.stack.imageIds.length - 1)
this.resetWwwc() this.resetWwwc()
}, },
@ -368,8 +359,7 @@ export default {
data.string('x00080030') data.string('x00080030')
) )
this.dicomInfo.series = data.string('x00200011') this.dicomInfo.series = data.string('x00200011')
this.dicomInfo.frame = `${this.stack.currentImageIdIndex + 1}/${ this.dicomInfo.frame = `${this.stack.currentImageIdIndex + 1}/${this.stack.imageIds.length
this.stack.imageIds.length
}` }`
this.dicomInfo.size = `${data.uint16('x00280011')}x${data.uint16( this.dicomInfo.size = `${data.uint16('x00280011')}x${data.uint16(
'x00280010' 'x00280010'
@ -415,15 +405,16 @@ export default {
}, },
onImageRendered(e) { onImageRendered(e) {
var imageId = e.detail.image.imageId // var imageId = e.detail.image.imageId
var instanceId = imageId.split('/')[imageId.split('/').length - 1] // var instanceId = imageId.split('/')[imageId.split('/').length - 1]
instanceId = instanceId.split('.')[0] // instanceId = instanceId.split('.')[0]
if (this.imageId !== instanceId) { // if (this.imageId !== instanceId) {
// this.getOrientationMarker(e.detail.element)
// this.imageId = instanceId
// }
this.getOrientationMarker(e.detail.element) this.getOrientationMarker(e.detail.element)
this.imageId = instanceId // this.stack.instanceId = instanceId
}
this.stack.instanceId = instanceId
var viewport = e.detail.viewport var viewport = e.detail.viewport
this.dicomInfo.wwwc = `${Math.round( this.dicomInfo.wwwc = `${Math.round(
viewport.voi.windowWidth viewport.voi.windowWidth
@ -432,6 +423,9 @@ export default {
this.dicomInfo.zoom = viewport.scale.toFixed(4) this.dicomInfo.zoom = viewport.scale.toFixed(4)
var data = e.detail.image.data var data = e.detail.image.data
const position = data.string('x00201041') const position = data.string('x00201041')
const windowCenter = data.string('x00281050')
const windowWidth = data.string('x00281051')
this.setWwwc(windowWidth, windowCenter)
this.dicomInfo.location = position this.dicomInfo.location = position
}, },
getOrientationMarker(element) { getOrientationMarker(element) {
@ -677,7 +671,7 @@ export default {
cornerstoneTools.getToolState( cornerstoneTools.getToolState(
this.canvas, this.canvas,
'playClip' 'playClip'
).data[0].loop = false ).data[0].loop = true
}, },
setFps(fps) { setFps(fps) {
this.dicomInfo.fps = fps this.dicomInfo.fps = fps
@ -1135,6 +1129,7 @@ export default {
font-size: 12px; font-size: 12px;
/* z-index: 1; */ /* z-index: 1; */
} }
.info-image { .info-image {
position: absolute; position: absolute;
left: 10px; left: 10px;
@ -1154,6 +1149,7 @@ export default {
font-size: 12px; font-size: 12px;
/* z-index: 1; */ /* z-index: 1; */
} }
.info-instance { .info-instance {
position: absolute; position: absolute;
right: 15px; right: 15px;
@ -1186,6 +1182,7 @@ export default {
margin: 10px; margin: 10px;
cursor: default; cursor: default;
} }
.menu__item:hover { .menu__item:hover {
color: #ff0000; color: #ff0000;
} }
@ -1205,7 +1202,8 @@ li:hover {
background-color: #e0e0e2; background-color: #e0e0e2;
color: white; color: white;
} }
.my_slider_box:after{
.my_slider_box:after {
content: ''; content: '';
position: absolute; position: absolute;
bottom: -20px; bottom: -20px;

View File

@ -21,7 +21,7 @@
label-width="100px" label-width="100px"
> >
<!-- 邮箱 --> <!-- 邮箱 -->
<p class="tip"> <p class="tip_mfa">
<i class="el-icon-warning" style="color: #409eff"></i> <i class="el-icon-warning" style="color: #409eff"></i>
<span>{{ tip }}</span> <span>{{ tip }}</span>
</p> </p>
@ -83,7 +83,7 @@ export default {
second: 60, second: 60,
form: { form: {
Code: null, Code: null,
UserId: null, IdentityUserId: null,
EMail: null, EMail: null,
username: null, username: null,
}, },
@ -115,7 +115,7 @@ export default {
methods: { methods: {
open(data) { open(data) {
let { UserId, status, username, EMail } = data; let { UserId, status, username, EMail } = data;
this.form.UserId = UserId; this.form.IdentityUserId = UserId;
this.status = status ? status : "login"; this.status = status ? status : "login";
this.form.username = username; this.form.username = username;
this.form.EMail = EMail; this.form.EMail = EMail;
@ -134,10 +134,10 @@ export default {
let res = await verifyMFACode(this.form); let res = await verifyMFACode(this.form);
this.loading = false; this.loading = false;
if (res.IsSuccess) { if (res.IsSuccess) {
if (this.status === "login") { // if (this.status === "login") {
this.$message.success(this.$t("mfa:message:verifySuccess")); // this.$message.success(this.$t("mfa:message:verifySuccess"));
} // }
this.$emit("success", this.form.UserId); this.$emit("success", this.form.IdentityUserId);
this.cancel(); this.cancel();
} }
} catch (err) { } catch (err) {
@ -154,7 +154,7 @@ export default {
this.timer = null; this.timer = null;
} }
let data = { let data = {
UserId: this.form.UserId, IdentityUserId: this.form.IdentityUserId,
}; };
if (this.status === "lock") { if (this.status === "lock") {
data.MfaType = 1; data.MfaType = 1;
@ -189,7 +189,7 @@ export default {
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.tip { .tip_mfa {
width: 86%; width: 86%;
margin: auto; margin: auto;
margin-bottom: 20px; margin-bottom: 20px;

View File

@ -1,28 +1,30 @@
<template> <template>
<div class="preview-wrapper"> <div class="preview-wrapper">
<iframe <iframe v-if="fileType.indexOf('jpg') !== -1 || fileType.indexOf('png') !== -1" frameborder="0" :src="filePath"
v-if="fileType.indexOf('jpg') !== -1 || fileType.indexOf('png') !== -1" width="100%" height="100%" />
frameborder="0"
:src="filePath"
width="100%"
height="100%"
/>
<!-- <embed v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" style="width: 100%; height: 100%"> --> <!-- <embed v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" style="width: 100%; height: 100%"> -->
<!-- <iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" width="100%" height="100%" frameborder="0" /> --> <!-- <iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="filePath+'#toolbar=0'" width="100%" height="100%" frameborder="0" /> -->
<iframe v-else-if="fileType.indexOf('pdf') !== -1" :src="`/static/pdfjs/web/viewer.html?file=${OSSclientConfig.basePath}${filePath}?userName=${currentUser}&COMPANY=${COMPANY}`" width="100%" height="100%" frameborder="0" crossorigin="anonymous" /> <iframe v-else-if="fileType.indexOf('pdf') !== -1"
:src="`/static/pdfjs/web/viewer.html?file=${OSSclientConfig.basePath}${filePath}?userName=${currentUser}&COMPANY=${COMPANY}`"
width="100%" height="100%" frameborder="0" crossorigin="anonymous" />
<!-- <pdf--> <!-- <pdf-->
<!-- v-else-if="fileType.indexOf('pdf') !== -1"--> <!-- v-else-if="fileType.indexOf('pdf') !== -1"-->
<!-- :src="`/static/pdfjs/web/viewer.html?file=${filePath}`">--> <!-- :src="`/static/pdfjs/web/viewer.html?file=${filePath}`">-->
<!-- </pdf>--> <!-- </pdf>-->
<div v-else> <video :src="`${OSSclientConfig.basePath}${filePath}`" style="width: 100%;height: 99%;" autoplay controls
controlsList="nodownload" v-else-if="fileType.indexOf('mp4') !== -1"></video>
<iframe v-else
:src="`/static/onlyOffice/viewer.html?url=${OSSclientConfig.basePath}${filePath}?onlyOffice_url=${onlyOffice_url}&type=${fileType}&title=${title}&documentType=${documentType}&userName=${currentUser}`"
width="100%" height="100%" frameborder="0" crossorigin="anonymous" />
<!-- <div v-else>
{{ $t('common:message:downloadFile') }} {{ $t('common:message:downloadFile') }}
<el-link type="primary" @click="downLoadFile">{{ $t('common:button:download') }}</el-link> <el-link type="primary" @click="downLoadFile">{{ $t('common:button:download') }}</el-link>
</div> </div> -->
</div> </div>
</template> </template>
<script> <script>
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import DOCUMENTTYPE from "@/utils/onlyOffice_type.js"
export default { export default {
name: 'PreviewFile', name: 'PreviewFile',
computed: { computed: {
@ -36,12 +38,22 @@ export default {
fileType: { fileType: {
type: String, type: String,
required: true required: true
} },
title: {
type: String,
default: ''
},
}, },
data() { data() {
return { return {
currentUser: zzSessionStorage.getItem('userName'), currentUser: zzSessionStorage.getItem('userName'),
COMPANY:process.env.VUE_APP_COMPANY_NAME COMPANY: process.env.VUE_APP_COMPANY_NAME,
onlyOffice_url: process.env.VUE_APP_ONLYOFFICE_URL
}
},
computed: {
documentType() {
return DOCUMENTTYPE[`.${this.fileType}`]
} }
}, },
mounted() { mounted() {
@ -62,14 +74,16 @@ export default {
} }
</script> </script>
<style lang="scss"> <style lang="scss">
.preview-wrapper{ .preview-wrapper {
height: 100%; height: 100%;
width:100%; width: 100%;
padding: 10px; padding: 10px;
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 7px; width: 7px;
height: 7px; height: 7px;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
border-radius: 10px; border-radius: 10px;
background: #d0d0d0; background: #d0d0d0;

View File

@ -0,0 +1,23 @@
import Vue from "vue";
import OnlyOffice from "./index.vue";
const PreviewConstructor = Vue.extend(OnlyOffice);
const onlyOffice = options => {
const { path, type, title } = options;
if (!path) throw `path is requred.but ${path}`
const id = `OnlyOffice_${new Date().getTime()}`;
const instance = new PreviewConstructor();
instance.id = id;
instance.vm = instance.$mount();
if (instance.vm.visible) return;
document.body.appendChild(instance.vm.$el);
instance.vm.open(path, type, title);
instance.vm.$on("closed", () => {
instance.vm.docEditor = null
document.body.removeChild(instance.vm.$el);
instance.vm.$destroy();
});
return instance.vm;
}
export default onlyOffice;

View File

@ -0,0 +1,7 @@
import OnlyOffice from "./index.vue";
import onlyOffice from "./fun";
export default Vue => {
Vue.component(OnlyOffice.name, OnlyOffice);
Vue.prototype.$onlyOffice = onlyOffice;
};

View File

@ -0,0 +1,46 @@
<template>
<el-dialog v-if="visible" :visible.sync="visible" :title="title" :fullscreen="true" append-to-body
custom-class="base-dialog-wrapper" @close="handleClose">
<div class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
<iframe v-if="visible"
:src="`/static/onlyOffice/viewer.html?url=${OSSclientConfig.basePath}${path}?onlyOffice_url=${onlyOffice_url}&type=${type}&title=${title}&documentType=${documentType}&userName=${currentUser}`"
width="100%" height="99%" frameborder="0" crossorigin="anonymous" />
</div>
</el-dialog>
</template>
<script>
import DOCUMENTTYPE from "@/utils/onlyOffice_type.js"
export default {
name: "OnlyOffice",
data() {
return {
visible: false,
path: null,
type: null,
title: null,
documentType: null,
currentUser: zzSessionStorage.getItem('userName'),
onlyOffice_url: process.env.VUE_APP_ONLYOFFICE_URL
};
},
methods: {
open(path, type, title) {
this.path = path;
this.type = type.toLowerCase();
this.documentType = DOCUMENTTYPE[`.${this.type}`]
this.title = title;
this.visible = true;
},
handleClose() {
this.$emit("closed");
},
},
};
</script>
<style lang="scss" scoped>
#placeholder {
width: 100%;
height: 100%;
}
</style>

View File

@ -0,0 +1,23 @@
import Vue from "vue";
import Video from "./index.vue";
const PreviewConstructor = Vue.extend(Video);
const video = options => {
const { path, type, title } = options;
if (!path) throw `path is requred.but ${path}`
const id = `OnlyOffice_${new Date().getTime()}`;
const instance = new PreviewConstructor();
instance.id = id;
instance.vm = instance.$mount();
if (instance.vm.visible) return;
document.body.appendChild(instance.vm.$el);
instance.vm.open(path, type, title);
instance.vm.$on("closed", () => {
instance.vm.docEditor = null
document.body.removeChild(instance.vm.$el);
instance.vm.$destroy();
});
return instance.vm;
}
export default video;

View File

@ -0,0 +1,7 @@
import Video from "./index.vue";
import video from "./fun";
export default Vue => {
Vue.component(Video.name, Video);
Vue.prototype.$video = video;
};

View File

@ -0,0 +1,38 @@
<template>
<el-dialog v-if="visible" :visible.sync="visible" :title="title" :fullscreen="true" append-to-body
custom-class="base-dialog-wrapper" @close="handleClose">
<div class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
<video :src="path" style="width: 100%;height: 99%;" autoplay controls controlsList="nodownload"></video>
</div>
</el-dialog>
</template>
<script>
export default {
name: "Video",
data() {
return {
visible: false,
path: null,
type: null,
title: null,
};
},
methods: {
open(path, type, title) {
this.path = this.OSSclientConfig.basePath + path;
this.title = title;
this.visible = true;
},
handleClose() {
this.$emit("closed");
},
},
};
</script>
<style lang="scss" scoped>
#placeholder {
width: 100%;
height: 100%;
}
</style>

View File

@ -3,7 +3,7 @@
<div class="trialsTab"> <div class="trialsTab">
<el-tabs v-model="trialsTab" @tab-click="clickTab"> <el-tabs v-model="trialsTab" @tab-click="clickTab">
<el-tab-pane v-for="item of trialsRouter.children.find(v => {return v.name == 'TrialsPanel'}).children" :key="`tab${item.path}`" :disabled="TotalNeedSignTrialDocCount !== 0 && item.path !== '/trials/trials-panel/attachments'" :label="$t(item.LanguageMark)" :name="item.path"> <el-tab-pane v-for="item of trialsRouter.children.find(v => {return v.name == 'TrialsPanel'}).children" :key="`tab${item.path}`" :disabled="TotalNeedSignTrialDocCount !== 0 && item.path !== '/trials/trials-panel/attachments'" :label="$t(item.LanguageMark)" :name="item.path">
<el-tabs v-if="!item.tabHiddn" v-model="trialsTabChild" @tab-click="clickTab"> <el-tabs v-if="!item.tabHiddn" v-model="trialsTabChild" @tab-click="clickTab" style="background-color: #f5f7fa;">
<template v-for="item1 of item.children"> <template v-for="item1 of item.children">
<el-tab-pane <el-tab-pane
v-if="TrialConfig && isShow(item1.path)" v-if="TrialConfig && isShow(item1.path)"
@ -22,11 +22,14 @@
<i class="iconfont" style="font-size: 30px;color:#ccc">&#xe680;</i> <i class="iconfont" style="font-size: 30px;color:#ccc">&#xe680;</i>
</div> </div>
<!-- 返回项目列表 --> <!-- 返回项目列表 -->
<div class="my_icon_box" :title="$t('trials:trials:title:backTrialList')" @click="goBack"> <el-button type="primary" size="small" @click="goBack">
<i class="iconfont">&#xe670;</i> <i class="iconfont">&#xe670;</i>
<!-- 返回 -->
<span>{{ $t('trials:trials:title:back') }}</span> <span>{{ $t('trials:trials:title:back') }}</span>
</div> </el-button>
<!-- <div class="my_icon_box" :title="$t('trials:trials:title:backTrialList')" @click="goBack">
<i class="iconfont">&#xe670;</i>
<span>{{ $t('trials:trials:title:back') }}</span>
</div> -->
</div> </div>
</div> </div>
</template> </template>
@ -146,6 +149,7 @@ export default {
return isShow return isShow
}, },
goBack() { goBack() {
zzSessionStorage.removeItem('lastWorkbench')
this.$router.push({ path: '/trials/trials-list' }) this.$router.push({ path: '/trials/trials-list' })
}, },
selectTrials(v) { selectTrials(v) {
@ -221,6 +225,9 @@ export default {
.el-tabs__header{ .el-tabs__header{
margin-bottom: 3px; margin-bottom: 3px;
} }
.el-tabs__item.is-active{
font-weight: bold;
}
position: relative; position: relative;
.el-input--medium .el-input__inner{ .el-input--medium .el-input__inner{
height: 44px;line-height: 44px;width: 280px; height: 44px;line-height: 44px;width: 280px;

View File

@ -1,21 +1,16 @@
<template> <template>
<div class="criterion-form-item"> <div class="criterion-form-item">
<div <div v-if="!!question.QuestionName && question.ClinicalQuestionType === 'group'"
v-if="!!question.QuestionName && question.ClinicalQuestionType==='group'" style="font-weight: bold;font-size: 16px;margin: 5px 0px;margin-bottom: 10px">
style="font-weight: bold;font-size: 16px;margin: 5px 0px;margin-bottom: 10px" {{ language === 'en' ? question.QuestionEnName : question.QuestionName }}
> </div>
{{ language==='en'?question.QuestionEnName:question.QuestionName }} <div v-else-if="question.ClinicalQuestionType === 'summary'"
style="background:#f3f3f3;border-radius:4px;font-size: 12px;margin: 5px 0px;margin-bottom: 10px;font-size: 12px;padding: 10px">
{{ language === 'en' ? question.QuestionEnName : question.QuestionName }}
</div> </div>
<div <div
v-else-if="question.ClinicalQuestionType==='summary'" v-else-if="question.ClinicalQuestionType === 'table' && ((question.ClinicalQuestionShowEnum === 1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum === 0)"
style="background:#f3f3f3;border-radius:4px;font-size: 12px;margin: 5px 0px;margin-bottom: 10px;font-size: 12px;padding: 10px" style="font-weight: bold;font-size: 14px;margin: 5px 0px;">
>
{{ language==='en'?question.QuestionEnName:question.QuestionName }}
</div>
<div
v-else-if="question.ClinicalQuestionType==='table' && ((question.ClinicalQuestionShowEnum===1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum===0)"
style="font-weight: bold;font-size: 14px;margin: 5px 0px;"
>
<div style="display: flex;justify-content: space-between;"> <div style="display: flex;justify-content: space-between;">
<span> <span>
{{ question.QuestionName }} {{ question.QuestionName }}
@ -25,27 +20,17 @@
{{ $t('trials:readingUnit:qsList:title:add') }} {{ $t('trials:readingUnit:qsList:title:add') }}
</el-button> </el-button>
</div> </div>
<el-table <el-table :data="questionForm[question.Id]">
:data="questionForm[question.Id]" <el-table-column v-for="item of question.TableQuestions" :key="item.Id" :prop="item.Id"
> :label="item.QuestionName" min-width="100" show-overflow-tooltip />
<el-table-column <el-table-column :label="$t('common:action:action')" min-width="100" show-overflow-tooltip>
v-for="item of question.TableQuestions"
:key="item.Id"
:prop="item.Id"
:label="item.QuestionName"
min-width="100"
show-overflow-tooltip
/>
<el-table-column
:label="$t('common:action:action')"
min-width="100"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button type="text" size="mini" @click="openAddTableCol(question, scope.$index)"> <el-button type="text" size="mini" @click="openAddTableCol(question, scope.$index)">
{{ $t('common:button:edit') }} {{ $t('common:button:edit') }}
</el-button> </el-button>
<el-button type="text" size="mini" v-if="scope.row.IsCurrentTaskAdd === 'True' || !question.IsCopyLesions || IsBaseline" @click="deleteTableCol(question, scope.$index)"> <el-button type="text" size="mini"
v-if="scope.row.IsCurrentTaskAdd === 'True' || !question.IsCopyLesions || IsBaseline"
@click="deleteTableCol(question, scope.$index)">
{{ $t('common:button:delete') }} {{ $t('common:button:delete') }}
</el-button> </el-button>
</template> </template>
@ -54,187 +39,109 @@
</div> </div>
<el-col v-else :span="12"> <el-col v-else :span="12">
<el-form-item <el-form-item
v-if="(question.ClinicalQuestionShowEnum===1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum===0" v-if="(question.ClinicalQuestionShowEnum === 1 && question.ParentTriggerValue === questionForm[question.ParentId].toString()) || question.ClinicalQuestionShowEnum === 0"
:label="`${question.QuestionName}`" :label="`${question.QuestionName}`" :prop="question.Id" :rules="[
:prop="question.Id" {
:rules="[ required: (question.IsRequired === 0 || (question.IsRequired === 1 && question.RelevanceId && (question.RelevanceValue === questionForm[question.RelevanceId].toString()))) && question.ClinicalQuestionType !== 'summary' && question.ClinicalQuestionType !== 'group' && question.ClinicalQuestionType !== 'table',
{ required: (question.IsRequired === 0 || (question.IsRequired ===1 && question.RelevanceId && (question.RelevanceValue === questionForm[question.RelevanceId].toString()))) && question.ClinicalQuestionType !== 'summary' && question.ClinicalQuestionType!=='group' && question.ClinicalQuestionType!=='table', message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']
message: this.$t('common:ruleMessage:specify'), trigger: ['blur', 'change']} }
]" ]" :class="[question.Type === 'group' ? 'mb' : question.Type === 'upload' ? 'uploadWrapper' : '']">
:class="[question.Type==='group'?'mb':question.Type==='upload'?'uploadWrapper':'']"
>
<!-- 输入框 --> <!-- 输入框 -->
<el-input <el-input v-if="question.ClinicalQuestionType === 'input'" v-model="questionForm[question.Id]"
v-if="question.ClinicalQuestionType==='input'"
v-model="questionForm[question.Id]"
:disabled="question.TableQuestionType === 2" :disabled="question.TableQuestionType === 2"
:max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200" :max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200" />
/>
<!-- 多行文本输入框 --> <!-- 多行文本输入框 -->
<el-input <el-input v-if="question.ClinicalQuestionType === 'textarea'" v-model="questionForm[question.Id]"
v-if="question.ClinicalQuestionType==='textarea'" type="textarea" :max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200"
v-model="questionForm[question.Id]" :autosize="{ minRows: 2, maxRows: 4 }" />
type="textarea"
:max-length="question.MaxAnswerLength ? question.MaxAnswerLength : 200"
:autosize="{ minRows: 2, maxRows: 4}"
/>
<!-- 下拉框 --> <!-- 下拉框 -->
<el-select <el-select v-if="question.ClinicalQuestionType === 'select'" v-model="questionForm[question.Id]" clearable
v-if="question.ClinicalQuestionType==='select'"
v-model="questionForm[question.Id]"
clearable
:disabled="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode" :disabled="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && !!question.DictionaryCode"
@change="((val)=>{formItemChange(val, question)})" @change="((val) => { formItemChange(val, question) })">
>
<template v-if="question.TableQuestionType === 1"> <template v-if="question.TableQuestionType === 1">
<el-option <el-option v-for="item in organList" :key="item.Id" :label="item[question.DataTableColumn]"
v-for="item in organList" :value="item[question.DataTableColumn]" />
:key="item.Id"
:label="item[question.DataTableColumn]"
:value="item[question.DataTableColumn]"
/>
</template> </template>
<template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3"> <template v-else-if="question.TableQuestionType === 3 || question.QuestionGenre === 3">
<el-option <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="item.value"
v-for="item of $d[question.DictionaryCode]" :label="item.label" />
:key="item.id"
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode"> <template
<el-option v-else-if="(question.TableQuestionType === 2 || question.QuestionGenre === 2) && question.DictionaryCode">
v-for="item of $d[question.DictionaryCode]" <el-option v-for="item of $d[question.DictionaryCode]" :key="item.id" :value="item.value"
:key="item.id" :label="item.label" />
:value="item.value"
:label="item.label"
/>
</template> </template>
<template v-else> <template v-else>
<el-option <el-option v-for="val in question.TypeValue.split('|')" :key="val" :label="val" :value="val.trim()" />
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val.trim()"
/>
</template> </template>
</el-select> </el-select>
<!-- 日期 -->
<el-date-picker v-if="question.ClinicalQuestionType === 'time'" v-model="questionForm[question.Id]"
style="width: 200px" align="right" type="date" format="yyyy-MM-dd" value-format="yyyy-MM-dd" />
<!-- 单选 --> <!-- 单选 -->
<el-date-picker <el-radio-group v-if="question.ClinicalQuestionType === 'radio'" v-model="questionForm[question.Id]"
v-if="question.ClinicalQuestionType === 'time'" @change="((val) => { formItemChange(val, question) })">
v-model="questionForm[question.Id]"
style="width: 200px"
align="right"
type="date"
format="yyyy-MM-dd"
value-format="yyyy-MM-dd"
/>
<!-- 单选 -->
<el-radio-group
v-if="question.ClinicalQuestionType==='radio'"
v-model="questionForm[question.Id]"
@change="((val)=>{formItemChange(val, question)})"
>
<template v-if="question.DictionaryCode"> <template v-if="question.DictionaryCode">
<el-radio <el-radio v-for="item of $d[question.DictionaryCode]" :key="item.id" :label="item.value">
v-for="item of $d[question.DictionaryCode]"
:key="item.id"
:label="item.value"
>
{{ item.label }} {{ item.label }}
</el-radio> </el-radio>
</template> </template>
<template v-if="question.TypeValue"> <template v-if="question.TypeValue">
<el-radio <el-radio v-for="val in question.TypeValue.split('|')" :key="val" :label="val">
v-for="val in question.TypeValue.split('|')"
:key="val"
:label="val"
>
{{ val }} {{ val }}
</el-radio> </el-radio>
</template> </template>
</el-radio-group> </el-radio-group>
<!-- 复选框 --> <!-- 复选框 -->
<el-checkbox-group <el-checkbox-group v-if="question.ClinicalQuestionType === 'checkbox' && questionForm[question.Id] !== ''"
v-if="question.ClinicalQuestionType==='checkbox' && questionForm[question.Id] !== ''" v-model="questionForm[question.Id]">
v-model="questionForm[question.Id]" <el-checkbox v-for="val of question.TypeValue.split('|')" :key="val" :label="val" :value="val">
>
<el-checkbox
v-for="val of question.TypeValue.split('|')"
:key="val"
:label="val"
:value="val"
>
{{ val }} {{ val }}
</el-checkbox> </el-checkbox>
</el-checkbox-group> </el-checkbox-group>
<el-input <el-input v-if="question.ClinicalQuestionType === 'number'" :ref="question.Id"
v-if="question.ClinicalQuestionType === 'number'" v-model="questionForm[question.Id]" type="number" style="width: 200px"
:ref="question.Id" :disabled="question.CustomCalculateMark > 0" @input="limitInput($event, questionForm, question)">
v-model="questionForm[question.Id]"
type="number"
style="width: 200px"
:disabled="question.CustomCalculateMark > 0"
@input="limitInput($event, questionForm, question)"
>
<template v-if="question.Unit" slot="append">{{ question.Unit }}</template> <template v-if="question.Unit" slot="append">{{ question.Unit }}</template>
</el-input> </el-input>
<span v-if="question.CustomCalculateMark === 11 && question.ClinicalQuestionType === 'number'" v-show="questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] <= questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId]" style="margin-left: 10px"> <span v-if="question.CustomCalculateMark === 11 && question.ClinicalQuestionType === 'number'"
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{ questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId] }} v-show="questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] <= questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId]"
style="margin-left: 10px">
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{
questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId] }}
</span> </span>
<span v-if="question.CustomCalculateMark === 10 && question.ClinicalQuestionType === 'number' && questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId]" style="margin-left: 10px"> <span
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{ questionForm.CreateTime ? questionForm.CreateTime : parseTime(new Date(), '{y}-{m}-{d}') }} v-if="question.CustomCalculateMark === 10 && question.ClinicalQuestionType === 'number' && questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId]"
style="margin-left: 10px">
{{ questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] }}~{{ questionForm.CreateTime ?
questionForm.CreateTime : parseTime(new Date(), '{y}-{m}-{d}') }}
</span> </span>
<!-- 生日不能大于截止日期 --> <!-- 生日不能大于截止日期 -->
<span v-if="question.CustomCalculateMark === 11 && question.ClinicalQuestionType === 'number'" v-show="questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] > questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId]" style="margin-left: 10px;font-size: 12px;color:#f66"> <span v-if="question.CustomCalculateMark === 11 && question.ClinicalQuestionType === 'number'"
v-show="questionForm[JSON.parse(question.CalculateQuestions)[0].TableQuestionId] > questionForm[JSON.parse(question.CalculateQuestions)[0].QuestionId]"
style="margin-left: 10px;font-size: 12px;color:#f66">
{{ $t('trials:components:clinicalDataQS:msg:birthDay') }} {{ $t('trials:components:clinicalDataQS:msg:birthDay') }}
</span> </span>
</el-form-item> </el-form-item>
</el-col> </el-col>
<!-- eslint-disable vue/no-use-v-if-with-v-for --> <!-- eslint-disable vue/no-use-v-if-with-v-for -->
<!-- eslint-disable vue/valid-v-for --> <!-- eslint-disable vue/valid-v-for -->
<el-col v-for="(item) in question.Childrens" v-if="question.Childrens && question.Childrens.length>0 && question.ClinicalQuestionType !== 'table'" :span="['group', 'summary', 'table'].includes(item.ClinicalQuestionType) || item.Childrens.length > 0 ? 24 : 12"> <el-col v-for="(item) in question.Childrens" :key="item.Id"
<QuestionFormItem v-if="question.Childrens && question.Childrens.length > 0 && question.ClinicalQuestionType !== 'table'"
:key="item.Id" :span="['group', 'summary', 'table'].includes(item.ClinicalQuestionType) || item.Childrens.length > 0 ? 24 : 12">
:question="item" <QuestionFormItem :key="item.Id" :question="item" :question-form="questionForm"
:question-form="questionForm" :trial-clinical-id="trialClinicalId" @formItemNumberChange="formItemNumberChange"
:trial-clinical-id="trialClinicalId" @setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" />
@formItemNumberChange="formItemNumberChange"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
</el-col> </el-col>
<el-dialog <el-dialog v-if="addOrEdit.visible" class="my_dialog" :visible.sync="addOrEdit.visible"
v-if="addOrEdit.visible" :close-on-click-modal="false" :title="addOrEdit.title" width="400px" append-to-body>
class="my_dialog" <el-form ref="tableQsForm" v-loading="loading" size="small" :model="QuestionsForm">
:visible.sync="addOrEdit.visible" <QuestionTableFormItem v-for="(item) in QuestionsList" :key="item.Id" :question="item"
:close-on-click-modal="false" :question-form="QuestionsForm" @setFormItemData="setFormItemData" @resetFormItemData="resetFormItemData" />
:title="addOrEdit.title"
width="400px"
append-to-body
>
<el-form
ref="tableQsForm"
v-loading="loading"
size="small"
:model="QuestionsForm"
>
<QuestionTableFormItem
v-for="(item) in QuestionsList"
:key="item.Id"
:question="item"
:question-form="QuestionsForm"
@setFormItemData="setFormItemData"
@resetFormItemData="resetFormItemData"
/>
<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>
<!-- 取消 --> <!-- 取消 -->
<el-button <el-button size="small" type="primary" @click="addOrEdit.visible = false">
size="small"
type="primary"
@click="addOrEdit.visible = false"
>
{{ $t('common:button:cancel') }} {{ $t('common:button:cancel') }}
</el-button> </el-button>
<!-- 保存 --> <!-- 保存 -->
@ -282,7 +189,7 @@ export default {
}, },
data() { data() {
return { return {
addOrEdit: { visible: false, title: '', id: null, index: 0}, addOrEdit: { visible: false, title: '', id: null, index: 0 },
fileList: [], fileList: [],
accept: '.png,.jpg,.jpeg', accept: '.png,.jpg,.jpeg',
imgVisible: false, imgVisible: false,
@ -406,8 +313,6 @@ export default {
}) })
break break
case 6: case 6:
console.log(this.questionForm[o.QuestionId])
console.log(this.questionForm)
this.questionForm[o.QuestionId].forEach((q, qi) => { this.questionForm[o.QuestionId].forEach((q, qi) => {
if (qi === 0) { if (qi === 0) {
num = parseFloat(q[o.TableQuestionId]) num = parseFloat(q[o.TableQuestionId])
@ -450,11 +355,16 @@ export default {
} }
break break
case 11: case 11:
if (parseFloat(this.getCurrentAgeByBirthDate2(this.questionForm[o.TableQuestionId], this.questionForm[o.QuestionId])) > 0) { if (parseFloat(this.getCurrentAgeByBirthDate(this.questionForm[o.TableQuestionId])) > 0) {
num = parseFloat(this.getCurrentAgeByBirthDate2(this.questionForm[o.TableQuestionId], this.questionForm[o.QuestionId])) num = parseFloat(this.getCurrentAgeByBirthDate(this.questionForm[o.TableQuestionId]))
} else { } else {
num = 0 num = 0
} }
// if (parseFloat(this.getCurrentAgeByBirthDate2(this.questionForm[o.TableQuestionId], this.questionForm[o.QuestionId])) > 0) {
// num = parseFloat(this.getCurrentAgeByBirthDate2(this.questionForm[o.TableQuestionId], this.questionForm[o.QuestionId]))
// } else {
// num = 0
// }
break break
} }
} else { } else {
@ -501,12 +411,10 @@ export default {
try { try {
if (isTable) { if (isTable) {
this.calculationList.forEach((v, i) => { this.calculationList.forEach((v, i) => {
console.log(v, i)
var find = v.CalculateQuestionList.filter(o => { var find = v.CalculateQuestionList.filter(o => {
return o.QuestionId === questionId return o.QuestionId === questionId
}) })
// findnumber // findnumber
console.log('find', find)
if (find) { if (find) {
var num = this.logic(v) var num = this.logic(v)
if (num !== false) { if (num !== false) {
@ -520,7 +428,6 @@ export default {
return o.TableQuestionId === questionId return o.TableQuestionId === questionId
}) })
// findnumber // findnumber
console.log('find', find)
// findnumber // findnumber
if (find) { if (find) {
var num = this.logic(v) var num = this.logic(v)
@ -591,40 +498,47 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.my_dialog{ .my_dialog {
.criterion-form-item{ .criterion-form-item {
>>>.el-form-item__content{ ::v-deep .el-form-item__content {
width: auto; width: auto;
} }
} }
} }
.el-col-12 .el-col-12{
.el-col-12 .el-col-12 {
width: 100%; width: 100%;
} }
.criterion-form-item{
.el-form-item{ .criterion-form-item {
.el-form-item {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
align-items: flex-start; align-items: flex-start;
} }
.el-input{
width:100%; .el-input {
width: 100%;
} }
.mb{
.mb {
margin-bottom: 0px; margin-bottom: 0px;
} }
.disabled{
>>>.el-upload--picture-card { .disabled {
::v-deep .el-upload--picture-card {
display: none; display: none;
} }
} }
.uploadWrapper{
.uploadWrapper {
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: flex-start; align-items: flex-start;
} }
} }
.clearfix:after{
.clearfix:after {
content: ''; content: '';
display: table; display: table;
clear: both; clear: both;

View File

@ -222,7 +222,7 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
.my_dialog{ .my_dialog{
.criterion-form-item{ .criterion-form-item{
>>>.el-form-item__content{ ::v-deep .el-form-item__content{
width: auto; width: auto;
} }
} }
@ -233,7 +233,7 @@ export default {
flex-direction: row; flex-direction: row;
align-items: flex-start; align-items: flex-start;
} }
>>>.el-form-item__content{ ::v-deep .el-form-item__content{
width: 500px; width: 500px;
} }
.el-input{ .el-input{
@ -243,7 +243,7 @@ export default {
margin-bottom: 0px; margin-bottom: 0px;
} }
.disabled{ .disabled{
>>>.el-upload--picture-card { ::v-deep .el-upload--picture-card {
display: none; display: none;
} }
} }

View File

@ -1,42 +1,28 @@
<template> <template>
<div v-loading="loading"> <div v-loading="loading">
<QuestionsForm <QuestionsForm v-if="clinicalUploadType === 2" :data="data" :trial-clinical-id="trialClinicalId"
v-if="clinicalUploadType === 2" :is-viewer="isViewer" :visit-id="visitId" :subject-id="subjectId" :open-type="openType"
:data="data" :system-clinical-id="systemClinicalId" :trial-id="trialId" :reading-id="readingId"
:trial-clinical-id="trialClinicalId" :clinical-form-id="clinicalFormId" :clinical-data-level="clinicalDataLevel" @close="close"></QuestionsForm>
:is-viewer="isViewer" <uploadClinicalData v-else :subject-visit-id="subjectVisitId" :data="data" :enum-type="0" :allow-add-or-edit="true"
:visit-id="visitId" @getList="() => { }">
:subject-id="subjectId"
:open-type="openType"
:system-clinical-id="systemClinicalId"
:trial-id="trialId"
:reading-id="readingId"
:clinical-form-id="clinicalFormId"
:clinical-data-level="clinicalDataLevel"
@close="close"
></QuestionsForm>
<uploadClinicalData v-else :subject-visit-id="subjectVisitId" :data="data" :enum-type="0" :allow-add-or-edit="true" @getList="() => {}">
</uploadClinicalData> </uploadClinicalData>
<div class="base-dialog-footer" v-if="!isViewer && openType !== 'look' && [0, 1].includes(clinicalDataLevel)" style="text-align:right;margin-top:10px;"> <div class="base-dialog-footer" v-if="!isViewer && openType !== 'look' && [0, 1].includes(clinicalDataLevel)"
style="text-align:right;margin-top:10px;">
<!-- 保存 --> <!-- 保存 -->
<el-button size="small" type="primary" @click="submitClinicalForm"> <el-button size="small" type="primary" @click="submitClinicalForm">
{{ $t('common:button:submit') }} {{ $t('common:button:submit') }}
</el-button> </el-button>
</div> </div>
<!-- 临床数据签名框 --> <!-- 临床数据签名框 -->
<el-dialog <el-dialog v-if="signVisible" :visible.sync="signVisible" :close-on-click-modal="false" width="600px" append-to-body
v-if="signVisible" custom-class="base-dialog-wrapper">
:visible.sync="signVisible"
:close-on-click-modal="false"
width="600px"
append-to-body
custom-class="base-dialog-wrapper"
>
<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">{{ `(${$t('common:label:sign')}${currentUser})` }}</span>
</div> </div>
<SignForm ref="signForm" :sign-code-enum="signCode" :subject-visit-id="subjectVisitId" @closeDialog="closeSignDialog" /> <SignForm ref="signForm" :sign-code-enum="signCode" :subject-visit-id="subjectVisitId"
@closeDialog="closeSignDialog" />
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
@ -49,7 +35,7 @@ import uploadClinicalData from './components/uploadClinicalData'
import const_ from '@/const/sign-code' import const_ from '@/const/sign-code'
export default { export default {
name: "index", name: "index",
components: { QuestionsForm, uploadClinicalData, SignForm }, components: { QuestionsForm, uploadClinicalData, SignForm },
methods: { methods: {
submitClinicalForm() { submitClinicalForm() {
@ -148,7 +134,7 @@ name: "index",
}, },
data: { data: {
type: Object, type: Object,
default: () => {} default: () => { }
}, },
trialClinicalId: { trialClinicalId: {
type: String, type: String,
@ -166,6 +152,4 @@ name: "index",
} }
</script> </script>
<style scoped> <style scoped></style>
</style>

View File

@ -1,39 +1,19 @@
<template> <template>
<el-dialog <el-dialog :visible.sync="visible" :fullscreen="true" :close-on-click-modal="false" :before-close="beforeClose"
:visible.sync="visible" :append-to-body="true" v-loading="btnLoading" class="downloadDicomAndNonedicom">
:fullscreen="true"
:close-on-click-modal="false"
:before-close="beforeClose"
:append-to-body="true"
v-loading="btnLoading"
class="downloadDicomAndNonedicom"
>
<span slot="title">{{ title }}</span> <span slot="title">{{ title }}</span>
<div class="top"> <div class="top">
<span>{{ $t('download:top:title') }}</span> <span>{{ $t('download:top:title') }}</span>
<div class="btnBox"> <div class="btnBox">
<el-button <el-button type="primary" size="mini" v-if="hasDicom" @click.stop="getIRReadingDownloadStudyInfo('dicom')">
type="primary"
size="mini"
v-if="hasDicom"
@click.stop="getIRReadingDownloadStudyInfo('dicom')"
>
{{ $t('download:button:downloadDicom') }} {{ $t('download:button:downloadDicom') }}
</el-button> </el-button>
<el-button <el-button type="primary" size="mini" v-if="hasNonedicom"
type="primary" @click.stop="getIRReadingDownloadStudyInfo('noneDicom')">
size="mini"
v-if="hasNonedicom"
@click.stop="getIRReadingDownloadStudyInfo('noneDicom')"
>
{{ $t('download:button:downloadNonedicom') }} {{ $t('download:button:downloadNonedicom') }}
</el-button> </el-button>
<el-button <el-button type="primary" size="mini" v-if="hasDicom || hasNonedicom"
type="primary" @click.stop="getIRReadingDownloadStudyInfo('all')">
size="mini"
v-if="hasDicom || hasNonedicom"
@click.stop="getIRReadingDownloadStudyInfo('all')"
>
{{ $t('download:button:downloadAll') }} {{ $t('download:button:downloadAll') }}
</el-button> </el-button>
</div> </div>
@ -43,16 +23,9 @@
<div v-html="$t('download:tip:message')"></div> <div v-html="$t('download:tip:message')"></div>
</div> </div>
<!--上传列表@selection-change="handleSelectionChange"--> <!--上传列表@selection-change="handleSelectionChange"-->
<el-table <el-table ref="dicomFilesTable" v-adaptive="{ bottomOffset: 85 }" height="100" :data="list" :loading="loading"
ref="dicomFilesTable" class="dicomFiles-table" @sort-change="handleSortByColumn"
v-adaptive="{ bottomOffset: 85 }" :default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
height="100"
:data="list"
:loading="loading"
class="dicomFiles-table"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'TaskBlindName', order: 'descending' }"
>
<!-- <el-table-column <!-- <el-table-column
type="selection" type="selection"
width="55" width="55"
@ -60,50 +33,28 @@
/> --> /> -->
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<!--受试者--> <!--受试者-->
<el-table-column <el-table-column :label="$t('download:table:subjectCode')" min-width="130" prop="SubjectCode"
:label="$t('download:table:subjectCode')" show-overflow-tooltip />
min-width="130"
prop="SubjectCode"
show-overflow-tooltip
/>
<!--任务名称--> <!--任务名称-->
<el-table-column <el-table-column :label="$t('download:table:taskName')" min-width="130" show-overflow-tooltip prop="TaskBlindName"
:label="$t('download:table:taskName')" sortable="custom" />
min-width="130"
show-overflow-tooltip
prop="TaskBlindName"
sortable="custom"
/>
<!--检查类型--> <!--检查类型-->
<el-table-column <el-table-column :label="$t('download:table:studyType')" min-width="130" show-overflow-tooltip prop="IsDicom"
:label="$t('download:table:studyType')" sortable="custom">
min-width="130"
show-overflow-tooltip
prop="IsDicom"
sortable="custom"
>
<template slot-scope="scope"> <template slot-scope="scope">
<span>{{ $fd('IsDicom', scope.row.IsDicom) }}</span> <span>{{ $fd('IsDicom', scope.row.IsDicom) }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('download:table:orginalStudyListNum')" min-width="150" show-overflow-tooltip>
:label="$t('download:table:orginalStudyListNum')"
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button v-if="
v-if="
(scope.row.IsDicom && (scope.row.IsDicom &&
scope.row.DicomStudyList && scope.row.DicomStudyList &&
scope.row.DicomStudyList.length >= 1) || scope.row.DicomStudyList.length >= 1) ||
(!scope.row.IsDicom && (!scope.row.IsDicom &&
scope.row.NoneDicomStudyList && scope.row.NoneDicomStudyList &&
scope.row.NoneDicomStudyList.length >= 1) scope.row.NoneDicomStudyList.length >= 1)
" " type="text" @click="handleOpenDialog(scope.row)">
type="text"
@click="handleOpenDialog(scope.row)"
>
<span>{{ <span>{{
scope.row.IsDicom scope.row.IsDicom
? scope.row.DicomStudyList.length ? scope.row.DicomStudyList.length
@ -113,37 +64,19 @@
<span v-else>0</span> <span v-else>0</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('common:action:action')" fixed="right" width="150">
:label="$t('common:action:action')"
fixed="right"
width="150"
>
<template slot-scope="scope"> <template slot-scope="scope">
<!--预览---> <!--预览--->
<el-button <el-button circle icon="el-icon-view" :title="$t('download:button:preview')"
circle @click.stop="preview(scope.row)" />
icon="el-icon-view"
:title="$t('download:button:preview')"
@click.stop="preview(scope.row)"
/>
<!--下载---> <!--下载--->
<el-button <el-button circle icon="el-icon-download" :title="$t('download:button:download')"
circle @click.stop="getIRReadingDownloadStudyInfo('one', scope.row)" />
icon="el-icon-download"
:title="$t('download:button:download')"
@click.stop="getIRReadingDownloadStudyInfo('one', scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<study-view <study-view v-if="model_cfg.visible" :model_cfg="model_cfg" :modelList="modelList" :bodyPart="bodyPart"
v-if="model_cfg.visible" :IsDicom="IsDicom" :visitTaskId="modelTaskId" />
:model_cfg="model_cfg"
:modelList="modelList"
:bodyPart="bodyPart"
:IsDicom="IsDicom"
:visitTaskId="modelTaskId"
/>
</el-dialog> </el-dialog>
</template> </template>
<script> <script>
@ -358,7 +291,8 @@ export default {
name = `${list[0].SubjectCode}_${list[0].TaskBlindName}.zip` name = `${list[0].SubjectCode}_${list[0].TaskBlindName}.zip`
} }
if (this.IsReadingTaskViewInOrder === 0) { if (this.IsReadingTaskViewInOrder === 0) {
name = `${list[0].TaskBlindName}.zip` // name = `${list[0].TaskBlindName}.zip`
name = `${list[0].SubjectCode}_${list[0].TaskBlindName}.zip`
} }
list.forEach((data) => { list.forEach((data) => {
if (data.StudyList && data.StudyList.length > 0) { if (data.StudyList && data.StudyList.length > 0) {
@ -370,10 +304,8 @@ export default {
series.InstancePathList.forEach((instance) => { series.InstancePathList.forEach((instance) => {
let fileName = instance.Path.split('/').pop() let fileName = instance.Path.split('/').pop()
let obj = { let obj = {
name: `${data.SubjectCode}/${ name: `${data.SubjectCode}/${data.TaskBlindName
data.TaskBlindName }/${this.$fd('IsDicom', true)}/${study.StudyCode
}/${this.$fd('IsDicom', true)}/${
study.StudyCode
}/${fileName}`, }/${fileName}`,
url: this.OSSclientConfig.basePath + instance.Path, url: this.OSSclientConfig.basePath + instance.Path,
} }
@ -500,10 +432,12 @@ export default {
justify-content: space-between; justify-content: space-between;
margin: 10px 0; margin: 10px 0;
} }
.tip { .tip {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
margin-top: 5px; margin-top: 5px;
i { i {
margin: 3px 5px 0 0; margin: 3px 5px 0 0;
} }

View File

@ -0,0 +1,126 @@
<template>
<el-dialog
v-if="visible"
:visible.sync="visible"
v-dialogDrag
width="540px"
:close-on-click-modal="false"
:close-on-press-escape="false"
append-to-body
:title="$t('toggleRole:tip:title')"
center
top="30vh"
:show-close="false"
:before-close="cancel"
>
<template v-if="hasRole">
<el-radio-group v-model="form.userRoleId" class="roles">
<el-radio
v-for="item in roles"
:key="item.Id"
:label="item.Id"
:disabled="item.IsUserRoleDisabled"
style="margin-bottom: 10px"
>
{{ item.UserTypeShortName }}
</el-radio>
</el-radio-group>
</template>
<div v-else style="text-align: center">
{{ $t('toggleRole:tip:noRole') }}
</div>
<div slot="footer">
<!-- 取消 -->
<el-button size="small" @click="cancel()">
{{ $t('common:button:cancel') }}
</el-button>
<!-- 保存 -->
<el-button
type="primary"
size="small"
@click="save"
:disabled="saveDisabled"
:loading="loading"
v-if="hasRole"
>
{{ $t('common:button:confirm') }}
</el-button>
</div>
</el-dialog>
</template>
<script>
export default {
name: 'toggleRole',
props: {
visible: {
type: Boolean,
default: false,
},
loading: {
type: Boolean,
default: false,
},
},
data() {
return {
form: {
userRoleId: null,
},
}
},
created() {
this.form.userRoleId = zzSessionStorage.getItem('userId')
},
computed: {
roles() {
return this.$store.state.user.roles
},
hasRole() {
return this.roles && this.roles.length > 0
},
saveDisabled() {
return this.form.userRoleId === zzSessionStorage.getItem('userId')
},
},
methods: {
cancel() {
this.$emit('update:visible', false)
this.$emit('cancel')
},
async save() {
try {
if (!this.form.userRoleId)
return this.$message.warning(this.$t('toggleRole:ruleMessage:select'))
zzSessionStorage.removeItem('lastWorkbench')
this.$emit('save', this.form.userRoleId)
} catch (err) {
console.log(err)
}
},
},
}
</script>
<style lang="scss" scoped>
.roles {
max-width: 365px;
width: fit-content;
display: flex;
align-content: center;
// justify-content: center;
flex-wrap: wrap;
margin: auto;
}
::v-deep .el-radio__original {
display: none !important; /* 隐藏原生 radio 输入,但仍然允许交互 */
}
::v-deep.el-radio:focus:not(.is-focus):not(:active):not(.is-disabled)
.el-radio__inner {
box-shadow: none !important;
}
.el-radio {
width: 60px;
}
</style>

View File

@ -4,123 +4,63 @@
<span>{{ $t('upload:dicom:title') }}</span> <span>{{ $t('upload:dicom:title') }}</span>
<div class="tip"> <div class="tip">
<i class="el-icon-warning-outline"></i> <i class="el-icon-warning-outline"></i>
<div <div v-html="$t(`upload:dicom:tip:message${isReadingTaskViewInOrder}`)"></div>
v-html="$t(`upload:dicom:tip:message${isReadingTaskViewInOrder}`)"
></div>
</div> </div>
</div> </div>
<!--检查列表--> <!--检查列表-->
<el-table :data="list" style="width: 100%" height="300" :loading="loading"> <el-table :data="list" style="width: 100%" height="300" :loading="loading">
<!--受试者--> <!--受试者-->
<el-table-column <el-table-column prop="SubjectCode" :label="$t('upload:dicom:table:subjectCode')" />
prop="SubjectCode"
:label="$t('upload:dicom:table:subjectCode')"
/>
<!--任务名称--> <!--任务名称-->
<el-table-column <el-table-column prop="TaskBlindName" :label="$t('upload:dicom:table:taskBlindName')" />
prop="TaskBlindName"
:label="$t('upload:dicom:table:taskBlindName')"
/>
<!--原始检查数--> <!--原始检查数-->
<el-table-column <el-table-column prop="OrginalStudyList" :label="$t('upload:dicom:table:orginalStudyListNum')">
prop="OrginalStudyList"
:label="$t('upload:dicom:table:orginalStudyListNum')"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button v-if="
v-if="
scope.row.OrginalStudyList && scope.row.OrginalStudyList &&
scope.row.OrginalStudyList.length >= 1 scope.row.OrginalStudyList.length >= 1
" " type="text" @click="handleOpenDialog(scope.row, 'OrginalStudyList')">
type="text"
@click="handleOpenDialog(scope.row, 'OrginalStudyList')"
>
<span>{{ scope.row.OrginalStudyList.length }}</span> <span>{{ scope.row.OrginalStudyList.length }}</span>
</el-button> </el-button>
<span v-else>0</span> <span v-else>0</span>
</template> </template>
</el-table-column> </el-table-column>
<!--后处理检查数--> <!--后处理检查数-->
<el-table-column <el-table-column prop="UploadStudyList" :label="$t('upload:dicom:table:uploadStudyListNum')">
prop="UploadStudyList"
:label="$t('upload:dicom:table:uploadStudyListNum')"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button v-if="
v-if="
scope.row.UploadStudyList && scope.row.UploadStudyList.length >= 1 scope.row.UploadStudyList && scope.row.UploadStudyList.length >= 1
" " type="text" @click="handleOpenDialog(scope.row, 'UploadStudyList', true)">
type="text"
@click="handleOpenDialog(scope.row, 'UploadStudyList', true)"
>
<span>{{ scope.row.UploadStudyList.length }}</span> <span>{{ scope.row.UploadStudyList.length }}</span>
</el-button> </el-button>
<span v-else>0</span> <span v-else>0</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('common:action:action')" fixed="right" width="180">
:label="$t('common:action:action')"
fixed="right"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
<div class="btnBox"> <div class="btnBox">
<!--上传---> <!--上传--->
<form <form id="inputForm" :ref="`uploadForm_${scope.row.Id}`" enctype="multipart/form-data">
id="inputForm"
:ref="`uploadForm_${scope.row.Id}`"
enctype="multipart/form-data"
>
<div class="form-group" style="margin-right: 10px"> <div class="form-group" style="margin-right: 10px">
<div <div :id="`directoryInputWrapper_${scope.row.Id}`" class="btn btn-link file-input">
:id="`directoryInputWrapper_${scope.row.Id}`" <el-button circle icon="el-icon-upload2" :disabled="btnLoading" :loading="btnLoading"
class="btn btn-link file-input" :title="$t('upload:dicom:button:upload')" />
> <input :title="$t('upload:dicom:button:upload')" type="file" :name="`file_${scope.row.VisitTaskId}`"
<el-button :ref="`pathClear_${scope.row.VisitTaskId}`" :disabled="btnLoading" webkitdirectory multiple @change="
circle
icon="el-icon-upload2"
:disabled="btnLoading"
:loading="btnLoading"
:title="$t('upload:dicom:button:upload')"
/>
<input
:title="$t('upload:dicom:button:upload')"
type="file"
:name="`file_${scope.row.VisitTaskId}`"
:ref="`pathClear_${scope.row.VisitTaskId}`"
:disabled="btnLoading"
webkitdirectory
multiple
@change="
($event) => beginScanFiles($event, scope.row.VisitTaskId) ($event) => beginScanFiles($event, scope.row.VisitTaskId)
" " />
/>
</div> </div>
</div> </div>
</form> </form>
<!--预览---> <!--预览--->
<el-button <el-button circle icon="el-icon-view" :disabled="!scope.row.UploadStudyList ||
circle
icon="el-icon-view"
:disabled="
!scope.row.UploadStudyList ||
scope.row.UploadStudyList.length <= 0 scope.row.UploadStudyList.length <= 0
" " @click.stop="handleViewReadingImages(scope.row)" :title="$t('upload:dicom:button:preview')" />
@click.stop="handleViewReadingImages(scope.row)"
:title="$t('upload:dicom:button:preview')"
/>
<!--删除---> <!--删除--->
<el-button <el-button circle :disabled="!scope.row.UploadStudyList ||
circle
:disabled="
!scope.row.UploadStudyList ||
scope.row.UploadStudyList.length <= 0 || scope.row.UploadStudyList.length <= 0 ||
scope.row.ReadingTaskState === 2 scope.row.ReadingTaskState === 2
" " icon="el-icon-delete" :title="$t('upload:dicom:button:delete')" @click.stop="remove(scope.row)" />
icon="el-icon-delete"
:title="$t('upload:dicom:button:delete')"
@click.stop="remove(scope.row)"
/>
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
@ -134,38 +74,19 @@
<form id="inputForm" ref="uploadForm" enctype="multipart/form-data"> <form id="inputForm" ref="uploadForm" enctype="multipart/form-data">
<div class="form-group"> <div class="form-group">
<div id="directoryInputWrapper" class="btn btn-link file-input"> <div id="directoryInputWrapper" class="btn btn-link file-input">
<el-button <el-button type="primary" :disabled="btnLoading" :loading="btnLoading" size="mini">
type="primary"
:disabled="btnLoading"
:loading="btnLoading"
size="mini"
>
{{ $t('upload:dicom:button:batchUpload') }} {{ $t('upload:dicom:button:batchUpload') }}
</el-button> </el-button>
<input <input type="file" name="file" ref="pathClear" :disabled="btnLoading" webkitdirectory multiple title=""
type="file" @change="beginScanFiles($event)" />
name="file"
ref="pathClear"
:disabled="btnLoading"
webkitdirectory
multiple
title=""
@change="beginScanFiles($event)"
/>
</div> </div>
</div> </div>
</form> </form>
</div> </div>
</div> </div>
<!--上传列表--> <!--上传列表-->
<el-table <el-table ref="dicomFilesTable" v-adaptive="{ bottomOffset: 80 }" height="100" :data="uploadQueues"
ref="dicomFilesTable" class="dicomFiles-table" @selection-change="handleSelectionChange">
v-adaptive="{ bottomOffset: 80 }"
height="100"
:data="uploadQueues"
class="dicomFiles-table"
@selection-change="handleSelectionChange"
>
<el-table-column type="index" width="40" /> <el-table-column type="index" width="40" />
<el-table-column min-width="200" show-overflow-tooltip> <el-table-column min-width="200" show-overflow-tooltip>
<template slot="header"> <template slot="header">
@ -182,28 +103,21 @@
<div style="line-height: 15px"> <div style="line-height: 15px">
<div> <div>
<div> <div>
<span v-if="scope.row.dicomInfo.accNumber" <span v-if="scope.row.dicomInfo.accNumber"><span style="font-weight: 500">Acc:</span>
><span style="font-weight: 500">Acc:</span> {{ scope.row.dicomInfo.accNumber }}</span>
{{ scope.row.dicomInfo.accNumber }}</span
>
<span v-else style="color: #f44336">N/A</span> <span v-else style="color: #f44336">N/A</span>
</div> </div>
<div style="display: inline-block; margin-right: 2px"> <div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.dicomInfo.modality.length > 0"> <span v-if="scope.row.dicomInfo.modality.length > 0">
{{ scope.row.dicomInfo.modality.join('、') }},</span {{ scope.row.dicomInfo.modality.join('、') }},</span>
>
<span v-else style="color: #f44336">N/A,</span> <span v-else style="color: #f44336">N/A,</span>
</div> </div>
<div style="display: inline-block; margin-right: 2px"> <div style="display: inline-block; margin-right: 2px">
<span v-if="scope.row.seriesList.length" <span v-if="scope.row.seriesList.length">{{ scope.row.seriesList.length }} Series,</span>
>{{ scope.row.seriesList.length }} Series,</span
>
<span v-else style="color: #f44336">N/A,</span> <span v-else style="color: #f44336">N/A,</span>
</div> </div>
<div style="display: inline-block"> <div style="display: inline-block">
<span v-if="scope.row.fileList.length" <span v-if="scope.row.fileList.length">{{ scope.row.fileList.length }} Instances</span>
>{{ scope.row.fileList.length }} Instances</span
>
<span v-else style="color: #f44336">N/A</span> <span v-else style="color: #f44336">N/A</span>
</div> </div>
</div> </div>
@ -217,8 +131,7 @@
</div> </div>
<div style="display: inline-block"> <div style="display: inline-block">
<span v-if="scope.row.dicomInfo.description"> <span v-if="scope.row.dicomInfo.description">
{{ scope.row.dicomInfo.description }}</span {{ scope.row.dicomInfo.description }}</span>
>
<span v-else style="color: #f44336">N/A</span> <span v-else style="color: #f44336">N/A</span>
</div> </div>
</div> </div>
@ -242,16 +155,12 @@
<template slot-scope="scope"> <template slot-scope="scope">
<div style="line-height: 15px"> <div style="line-height: 15px">
<div> <div>
<span v-if="scope.row.dicomInfo.patientId" <span v-if="scope.row.dicomInfo.patientId"><span style="font-weight: 500">PID: </span>{{
><span style="font-weight: 500">PID: </span scope.row.dicomInfo.patientId }}</span>
>{{ scope.row.dicomInfo.patientId }}</span
>
<span v-else style="color: #f44336">N/A</span> <span v-else style="color: #f44336">N/A</span>
</div> </div>
<div> <div>
<span <span :class="[scope.row.dicomInfo.patientName ? '' : 'colorOfRed']">
:class="[scope.row.dicomInfo.patientName ? '' : 'colorOfRed']"
>
{{ {{
scope.row.dicomInfo.patientName scope.row.dicomInfo.patientName
? scope.row.dicomInfo.patientName ? scope.row.dicomInfo.patientName
@ -260,9 +169,7 @@
</span> </span>
</div> </div>
<div> <div>
<span <span :class="[scope.row.dicomInfo.patientSex ? '' : 'colorOfRed']">
:class="[scope.row.dicomInfo.patientSex ? '' : 'colorOfRed']"
>
{{ {{
scope.row.dicomInfo.patientSex scope.row.dicomInfo.patientSex
? scope.row.dicomInfo.patientSex ? scope.row.dicomInfo.patientSex
@ -270,9 +177,7 @@
}}, }},
</span> </span>
<span <span :class="[scope.row.dicomInfo.patientAge ? '' : 'colorOfRed']">
:class="[scope.row.dicomInfo.patientAge ? '' : 'colorOfRed']"
>
{{ {{
scope.row.dicomInfo.patientAge scope.row.dicomInfo.patientAge
? scope.row.dicomInfo.patientAge ? scope.row.dicomInfo.patientAge
@ -280,11 +185,9 @@
}}, }},
</span> </span>
<span <span :class="[
:class="[
scope.row.dicomInfo.patientBirthDate ? '' : 'colorOfRed', scope.row.dicomInfo.patientBirthDate ? '' : 'colorOfRed',
]" ]">
>
{{ {{
scope.row.dicomInfo.patientBirthDate scope.row.dicomInfo.patientBirthDate
? scope.row.dicomInfo.patientBirthDate ? scope.row.dicomInfo.patientBirthDate
@ -295,114 +198,74 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('trials:uploadDicomList:table:failedFileCount')" min-width="150"
:label="$t('trials:uploadDicomList:table:failedFileCount')" show-overflow-tooltip>
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-progress <el-progress color="#409eff" :percentage="(
color="#409eff"
:percentage="
(
(scope.row.dicomInfo.uploadFileSize * 100) / (scope.row.dicomInfo.uploadFileSize * 100) /
scope.row.dicomInfo.fileSize (scope.row.dicomInfo.fileSize ? scope.row.dicomInfo.fileSize : 1)
).toFixed(2) * 1 ).toFixed(2) * 1
" " />
/>
<span> <span>
{{ $t('trials:uploadDicomList:table:uploadNow') {{ $t('trials:uploadDicomList:table:uploadNow')
}}{{ scope.row.dicomInfo.failedFileCount }}/{{ }}{{ scope.row.dicomInfo.failedFileCount }}/{{
scope.row.dicomInfo.fileCount scope.row.dicomInfo.fileCount
}} }}
({{ ({{
(scope.row.dicomInfo.uploadFileSize / 1024 / 1024).toFixed(2) (scope.row.dicomInfo.uploadFileSize / 1024 / 1024).toFixed(3)
}}MB/{{ }}MB/{{
(scope.row.dicomInfo.fileSize / 1024 / 1024).toFixed(2) (scope.row.dicomInfo.fileSize / 1024 / 1024).toFixed(3)
}}MB) }}MB)
</span> </span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('trials:uploadDicomList:table:status')" min-width="140" show-overflow-tooltip>
:label="$t('trials:uploadDicomList:table:status')"
min-width="140"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<span <span v-if="
v-if="
!scope.row.dicomInfo.failedFileCount && !scope.row.dicomInfo.failedFileCount &&
!scope.row.dicomInfo.isInit !scope.row.dicomInfo.isInit
" ">
> {{ $t('trials:uploadDicomList:table:status1') }}</span>
{{ $t('trials:uploadDicomList:table:status1') }}</span <span style="color: #409eff" v-else-if="
>
<span
style="color: #409eff"
v-else-if="
!scope.row.dicomInfo.failedFileCount && !scope.row.dicomInfo.failedFileCount &&
scope.row.dicomInfo.isInit && scope.row.dicomInfo.isInit &&
btnLoading btnLoading
" ">{{ $t('trials:uploadDicomList:table:status2') }}</span>
>{{ $t('trials:uploadDicomList:table:status2') }}</span <span style="color: #409eff" v-else-if="
>
<span
style="color: #409eff"
v-else-if="
scope.row.dicomInfo.failedFileCount < scope.row.dicomInfo.failedFileCount <
scope.row.dicomInfo.fileCount && !scope.row.uploadState.record scope.row.dicomInfo.fileCount && !scope.row.uploadState.record
" ">{{ $t('trials:uploadDicomList:table:status2') }}</span>
>{{ $t('trials:uploadDicomList:table:status2') }}</span <span style="color: #2cc368" v-else-if="
>
<span
style="color: #2cc368"
v-else-if="
scope.row.dicomInfo.failedFileCount === scope.row.dicomInfo.failedFileCount ===
scope.row.dicomInfo.fileCount scope.row.dicomInfo.fileCount
" ">{{ $t('trials:uploadDicomList:table:status3') }}</span>
>{{ $t('trials:uploadDicomList:table:status3') }}</span <span style="color: #f66" v-else-if="
>
<span
style="color: #f66"
v-else-if="
scope.row.uploadState.record && scope.row.uploadState.record &&
scope.row.uploadState.record.fileCount === 0 scope.row.uploadState.record.fileCount === 0
" ">{{ $t('trials:uploadDicomList:table:status5') }}</span>
>{{ $t('trials:uploadDicomList:table:status5') }}</span
>
<span style="color: #f66" v-else>{{ <span style="color: #f66" v-else>{{
$t('trials:uploadDicomList:table:Failed') $t('trials:uploadDicomList:table:Failed')
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('trials:uploadDicomList:table:record')" min-width="140" show-overflow-tooltip>
:label="$t('trials:uploadDicomList:table:record')"
min-width="140"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tooltip placement="top" v-if="scope.row.uploadState.record"> <el-tooltip placement="top" v-if="scope.row.uploadState.record">
<div slot="content"> <div slot="content">
<div style="max-height: 500px; overflow-y: auto"> <div style="max-height: 500px; overflow-y: auto">
{{ $t('trials:uploadDicomList:table:Existed') }}: {{ $t('trials:uploadDicomList:table:Existed') }}:
<div v-if="scope.row.uploadState.record.Existed.length"> <div v-if="scope.row.uploadState.record.Existed.length">
<div <div v-for="item of scope.row.uploadState.record.Existed" :key="item"
v-for="item of scope.row.uploadState.record.Existed" style="font-size: 12px; color: #baa72a">
:key="item"
style="font-size: 12px; color: #baa72a"
>
{{ item }} {{ item }}
</div> </div>
</div> </div>
<div v-else>&nbsp;</div> <div v-else>&nbsp;</div>
{{ $t('trials:uploadDicomList:table:Uploaded') }}: {{ $t('trials:uploadDicomList:table:Uploaded') }}:
<div v-if="scope.row.uploadState.record.Uploaded.length"> <div v-if="scope.row.uploadState.record.Uploaded.length">
<div <div v-for="item of scope.row.uploadState.record.Uploaded" :key="item"
v-for="item of scope.row.uploadState.record.Uploaded" style="font-size: 12px; color: #24b837">
:key="item"
style="font-size: 12px; color: #24b837"
>
{{ item }} {{ item }}
</div> </div>
</div> </div>
@ -410,11 +273,8 @@
<br /> <br />
{{ $t('trials:uploadDicomList:table:Failed') }}: {{ $t('trials:uploadDicomList:table:Failed') }}:
<div v-if="scope.row.uploadState.record.Failed.length"> <div v-if="scope.row.uploadState.record.Failed.length">
<div <div v-for="item of scope.row.uploadState.record.Failed" :key="item"
v-for="item of scope.row.uploadState.record.Failed" style="font-size: 12px; color: #f66">
:key="item"
style="font-size: 12px; color: #f66"
>
{{ item }} {{ item }}
</div> </div>
</div> </div>
@ -438,16 +298,8 @@
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<study-view <study-view v-if="model_cfg.visible" :model_cfg="model_cfg" :IsDicom="true" :bodyPart="bodyPart"
v-if="model_cfg.visible" :modelList="modelList" :isUpload="openIsUpload" :TrialModality="TrialModality" @getList="getList" />
:model_cfg="model_cfg"
:IsDicom="true"
:bodyPart="bodyPart"
:modelList="modelList"
:isUpload="openIsUpload"
:TrialModality="TrialModality"
@getList="getList"
/>
</div> </div>
</template> </template>
<script> <script>
@ -795,7 +647,7 @@ export default {
}) })
var validFilesCount = 0 var validFilesCount = 0
for (var i = 0; i < checkFiles.length; ++i) { for (var i = 0; i < checkFiles.length; ++i) {
;(function (index) { ; (function (index) {
p = p.then(function () { p = p.then(function () {
if ( if (
checkFiles[index].name.toUpperCase().indexOf('DICOMDIR') === -1 checkFiles[index].name.toUpperCase().indexOf('DICOMDIR') === -1
@ -834,6 +686,7 @@ export default {
var studyUid = data.string('x0020000d') var studyUid = data.string('x0020000d')
if (!studyUid) return resolve() if (!studyUid) return resolve()
var pixelDataElement = data.elements.x7fe00010 var pixelDataElement = data.elements.x7fe00010
if (!pixelDataElement && modality !== 'SR') return resolve()
var studyIndex = 0 var studyIndex = 0
while ( while (
studyIndex < scope.uploadQueues.length && studyIndex < scope.uploadQueues.length &&
@ -936,19 +789,19 @@ export default {
) { ) {
++instanceIndex ++instanceIndex
} }
if (instanceIndex >= fileList.length) { // if (instanceIndex >= fileList.length) {
fileList.push({ // fileList.push({
instanceUid: instanceUid, // instanceUid: instanceUid,
file: file, // file: file,
}) // })
} // }
scope.uploadQueues[studyIndex].dicomInfo.fileCount = fileList.length // scope.uploadQueues[studyIndex].dicomInfo.fileCount = fileList.length
scope.uploadQueues[studyIndex].dicomInfo.fileSize = fileList.reduce( // scope.uploadQueues[studyIndex].dicomInfo.fileSize = fileList.reduce(
(prev, next) => { // (prev, next) => {
return prev + next.file.size // return prev + next.file.size
}, // },
0 // 0
) // )
var seriesUid = data.string('x0020000e') var seriesUid = data.string('x0020000e')
var seriesList = scope.uploadQueues[studyIndex].seriesList var seriesList = scope.uploadQueues[studyIndex].seriesList
@ -1046,6 +899,19 @@ export default {
} }
instanceList.push(instanceItem) instanceList.push(instanceItem)
} }
if (instanceIndex >= fileList.length) {
fileList.push({
instanceUid: instanceUid,
file: file,
})
}
scope.uploadQueues[studyIndex].dicomInfo.fileCount = fileList.length
scope.uploadQueues[studyIndex].dicomInfo.fileSize = fileList.reduce(
(prev, next) => {
return prev + next.file.size
},
0
)
resolve() resolve()
} catch (error) { } catch (error) {
console.log(error) console.log(error)
@ -1266,10 +1132,8 @@ export default {
dicomInfo.failedFileCount++ dicomInfo.failedFileCount++
Record.FileCount++ Record.FileCount++
} else { } else {
let path = `/${params.trialId}/Image/${ let path = `/${params.trialId}/Image/${params.subjectId
params.subjectId }/${params.subjectVisitId}/${dicomInfo.visitTaskId
}/${params.subjectVisitId}/${
dicomInfo.visitTaskId
}/${scope.getGuid( }/${scope.getGuid(
dicomInfo.studyUid + dicomInfo.studyUid +
v.seriesUid + v.seriesUid +
@ -1308,7 +1172,7 @@ export default {
o.imageColumns, o.imageColumns,
o.imageRows o.imageRows
) )
let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${v.seriesUid}.png` let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.visitTaskId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
let OSSclient = scope.OSSclient let OSSclient = scope.OSSclient
let seriesRes = await OSSclient.put( let seriesRes = await OSSclient.put(
thumbnailPath, thumbnailPath,
@ -1421,7 +1285,7 @@ export default {
v.instanceList[0].imageColumns, v.instanceList[0].imageColumns,
v.instanceList[0].imageRows v.instanceList[0].imageRows
) )
let thumbnailPath = `/${params.trialId}/Image/${params.trialSiteId}/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.png` let thumbnailPath = `/${params.trialId}/Image/${params.subjectId}/${params.subjectVisitId}/${dicomInfo.studyUid}/${v.seriesUid}.jpg`
let OSSclient = scope.OSSclient let OSSclient = scope.OSSclient
try { try {
let seriesRes = await OSSclient.put(thumbnailPath, blob) let seriesRes = await OSSclient.put(thumbnailPath, blob)
@ -1499,8 +1363,8 @@ export default {
return new Promise((resolve) => { return new Promise((resolve) => {
cornerstone.loadImage(imageId).then(async (image) => { cornerstone.loadImage(imageId).then(async (image) => {
let canvas = document.createElement('canvas') let canvas = document.createElement('canvas')
canvas.width = width canvas.width = (width * 60) / height
canvas.height = height canvas.height = 60
if (image) { if (image) {
cornerstone.renderToCanvas(canvas, image) cornerstone.renderToCanvas(canvas, image)
// Canvas PNG // Canvas PNG
@ -1546,16 +1410,19 @@ export default {
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
} }
.btnBox, .btnBox,
.form-group { .form-group {
display: flex; display: flex;
align-items: center; align-items: center;
} }
#inputForm .file-input { #inputForm .file-input {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
display: inline-block; display: inline-block;
} }
#inputForm .file-input input[type='file'] { #inputForm .file-input input[type='file'] {
position: absolute; position: absolute;
top: 0; top: 0;
@ -1565,10 +1432,12 @@ export default {
opacity: 0; opacity: 0;
cursor: pointer; cursor: pointer;
} }
.tip { .tip {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
margin-top: 5px; margin-top: 5px;
i { i {
margin: 3px 5px 0 0; margin: 3px 5px 0 0;
} }

View File

@ -8,65 +8,29 @@
</div> </div>
</div> </div>
<!--检查列表--> <!--检查列表-->
<el-table <el-table :data="list" style="width: 100%" v-adaptive="{ bottomOffset: 60 }" :loading="loading"
:data="list" @sort-change="handleSortByColumn" :default-sort="{ prop: 'TaskBlindName', order: 'descending' }">
style="width: 100%"
v-adaptive="{ bottomOffset: 60 }"
:loading="loading"
@sort-change="handleSortByColumn"
:default-sort="{ prop: 'TaskBlindName', order: 'descending' }"
>
<!--受试者--> <!--受试者-->
<el-table-column <el-table-column prop="SubjectCode" :label="$t('upload:nonedicom:table:subject')" />
prop="SubjectCode"
:label="$t('upload:nonedicom:table:subject')"
/>
<!--任务名称--> <!--任务名称-->
<el-table-column <el-table-column prop="TaskBlindName" :label="$t('upload:nonedicom:table:taskName')" sortable="custom" />
prop="TaskBlindName"
:label="$t('upload:nonedicom:table:taskName')"
sortable="custom"
/>
<!--检查类型--> <!--检查类型-->
<el-table-column <el-table-column prop="Modality" :label="$t('upload:nonedicom:table:molityType')" sortable="custom">
prop="Modality"
:label="$t('upload:nonedicom:table:molityType')"
sortable="custom"
>
</el-table-column> </el-table-column>
<!--检查部位--> <!--检查部位-->
<el-table-column <el-table-column prop="BodyPart" :label="$t('upload:nonedicom:table:bodyPart')" sortable="custom" />
prop="BodyPart"
:label="$t('upload:nonedicom:table:bodyPart')"
sortable="custom"
/>
<!--原文件数--> <!--原文件数-->
<el-table-column <el-table-column prop="FileCount" :label="$t('upload:nonedicom:table:fileCount')">
prop="FileCount"
:label="$t('upload:nonedicom:table:fileCount')"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-popover <el-popover v-if="scope.row.FileCount" trigger="click" placement="bottom">
v-if="scope.row.FileCount"
trigger="click"
placement="bottom"
>
<el-table :data="scope.row.FileList" height="300" size="small"> <el-table :data="scope.row.FileList" height="300" size="small">
<!-- 文件名称 --> <!-- 文件名称 -->
<el-table-column <el-table-column prop="FileName" :label="$t('trials:audit:table:nonDicomsFileName')" width="200" />
prop="FileName" <el-table-column prop="FileSize" :label="$t('trials:audit:table:nonDicomsFileSize')" width="100">
:label="$t('trials:audit:table:nonDicomsFileName')"
width="200"
/>
<el-table-column
prop="FileSize"
:label="$t('trials:audit:table:nonDicomsFileSize')"
width="100"
>
<template slot-scope="scope"> <template slot-scope="scope">
<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(3)}MB`
: '' : ''
}}</span> }}</span>
</template> </template>
@ -74,27 +38,13 @@
<el-table-column :label="$t('common:action:action')" width="120"> <el-table-column :label="$t('common:action:action')" width="120">
<template slot-scope="files"> <template slot-scope="files">
<!-- 预览 --> <!-- 预览 -->
<viewer <viewer :ref="files.row.Path" style="margin: 0 10px"
:ref="files.row.Path" :images="[`${OSSclientConfig.basePath}${files.row.Path}`]">
style="margin: 0 10px" <el-button circle icon="el-icon-view" :title="$t('upload:nonedicom:button:preview')" :disabled="files.row.FileType &&
:images="[`${OSSclientConfig.basePath}${files.row.Path}`]"
>
<el-button
circle
icon="el-icon-view"
:title="$t('upload:nonedicom:button:preview')"
:disabled="
files.row.FileType &&
files.row.FileType.indexOf('zip') >= 0 files.row.FileType.indexOf('zip') >= 0
" " @click.native.prevent="previewFile(files.row)" />
@click.native.prevent="previewFile(files.row)" <img v-show="false" crossorigin="anonymous" :src="`${OSSclientConfig.basePath}${files.row.Path}`"
/> alt="Image" />
<img
v-show="false"
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${files.row.Path}`"
alt="Image"
/>
</viewer> </viewer>
</template> </template>
</el-table-column> </el-table-column>
@ -109,36 +59,17 @@
</template> </template>
</el-table-column> </el-table-column>
<!--后处理文件数--> <!--后处理文件数-->
<el-table-column <el-table-column prop="UploadedFileCount" :label="$t('upload:nonedicom:table:uploadFileCount')">
prop="UploadedFileCount"
:label="$t('upload:nonedicom:table:uploadFileCount')"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-popover <el-popover v-if="scope.row.UploadedFileCount" trigger="click" placement="bottom">
v-if="scope.row.UploadedFileCount" <el-table :data="scope.row.UploadedFileList" height="300" size="small">
trigger="click"
placement="bottom"
>
<el-table
:data="scope.row.UploadedFileList"
height="300"
size="small"
>
<!-- 文件名称 --> <!-- 文件名称 -->
<el-table-column <el-table-column prop="FileName" :label="$t('trials:audit:table:nonDicomsFileName')" width="200" />
prop="FileName" <el-table-column prop="FileSize" :label="$t('trials:audit:table:nonDicomsFileSize')" width="100">
:label="$t('trials:audit:table:nonDicomsFileName')"
width="200"
/>
<el-table-column
prop="FileSize"
:label="$t('trials:audit:table:nonDicomsFileSize')"
width="100"
>
<template slot-scope="scope"> <template slot-scope="scope">
<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(3)}MB`
: '' : ''
}}</span> }}</span>
</template> </template>
@ -146,27 +77,13 @@
<el-table-column :label="$t('common:action:action')" width="120"> <el-table-column :label="$t('common:action:action')" width="120">
<template slot-scope="files"> <template slot-scope="files">
<!-- 预览 --> <!-- 预览 -->
<viewer <viewer :ref="files.row.Path" style="margin: 0 10px"
:ref="files.row.Path" :images="[`${OSSclientConfig.basePath}${files.row.Path}`]">
style="margin: 0 10px" <el-button circle icon="el-icon-view" :title="$t('upload:nonedicom:button:preview')" :disabled="files.row.FileType &&
:images="[`${OSSclientConfig.basePath}${files.row.Path}`]"
>
<el-button
circle
icon="el-icon-view"
:title="$t('upload:nonedicom:button:preview')"
:disabled="
files.row.FileType &&
files.row.FileType.indexOf('zip') >= 0 files.row.FileType.indexOf('zip') >= 0
" " @click.native.prevent="previewFile(files.row)" />
@click.native.prevent="previewFile(files.row)" <img v-show="false" crossorigin="anonymous" :src="`${OSSclientConfig.basePath}${files.row.Path}`"
/> alt="Image" />
<img
v-show="false"
crossorigin="anonymous"
:src="`${OSSclientConfig.basePath}${files.row.Path}`"
alt="Image"
/>
</viewer> </viewer>
</template> </template>
</el-table-column> </el-table-column>
@ -180,75 +97,34 @@
<span v-else>{{ scope.row.UploadedFileCount }}</span> <span v-else>{{ scope.row.UploadedFileCount }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('common:action:action')" fixed="right" width="180">
:label="$t('common:action:action')"
fixed="right"
width="180"
>
<template slot-scope="scope"> <template slot-scope="scope">
<!--预览---> <!--预览--->
<el-button <el-button circle :disabled="scope.row.UploadedFileCount <= 0" icon="el-icon-view"
circle :title="$t('upload:nonedicom:button:preview')" @click.stop="handlePreviewNoneDicomFiles(scope.row)" />
:disabled="scope.row.UploadedFileCount <= 0"
icon="el-icon-view"
:title="$t('upload:nonedicom:button:preview')"
@click.stop="handlePreviewNoneDicomFiles(scope.row)"
/>
<!--上传---> <!--上传--->
<el-button <el-button circle icon="el-icon-upload2" :title="$t('upload:nonedicom:button:upload')"
circle @click.native.prevent="handleUpload(scope.row)" />
icon="el-icon-upload2"
:title="$t('upload:nonedicom:button:upload')"
@click.native.prevent="handleUpload(scope.row)"
/>
<!--删除---> <!--删除--->
<el-button <el-button :disabled="scope.row.UploadedFileCount <= 0 ||
:disabled="
scope.row.UploadedFileCount <= 0 ||
scope.row.ReadingTaskState === 2 scope.row.ReadingTaskState === 2
" " circle icon="el-icon-delete" :title="$t('upload:nonedicom:button:delete')"
circle @click.stop="remove(scope.row)" />
icon="el-icon-delete"
:title="$t('upload:nonedicom:button:delete')"
@click.stop="remove(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<!-- 预览单个图像 --> <!-- 预览单个图像 -->
<el-dialog <el-dialog v-if="imgObj.visible" :visible.sync="imgObj.visible" :title="$t('upload:nonedicom:dialogTitle:preview')"
v-if="imgObj.visible" append-to-body width="565px">
:visible.sync="imgObj.visible" <div v-loading="imgObj.loading" class="base-modal-body" style="border: 2px solid #ccc; padding: 10px">
:title="$t('upload:nonedicom:dialogTitle:preview')" <el-image :src="`${OSSclientConfig.basePath}${imgObj.url}`" crossorigin="anonymous" fit="fit"
append-to-body style="height: 500px; width: 500px" @error="imgObj.loading = false" @load="imgObj.loading = false" />
width="565px"
>
<div
v-loading="imgObj.loading"
class="base-modal-body"
style="border: 2px solid #ccc; padding: 10px"
>
<el-image
:src="`${OSSclientConfig.basePath}${imgObj.url}`"
crossorigin="anonymous"
fit="fit"
style="height: 500px; width: 500px"
@error="imgObj.loading = false"
@load="imgObj.loading = false"
/>
</div> </div>
</el-dialog> </el-dialog>
<!-- 上传非dicom文件 --> <!-- 上传非dicom文件 -->
<el-dialog <el-dialog v-if="uploadVisible" :visible.sync="uploadVisible" :close-on-click-modal="false"
v-if="uploadVisible" :title="$t('trials:uploadNonDicoms:dialogTitle:upload')" width="800px" append-to-body
:visible.sync="uploadVisible" custom-class="base-dialog-wrapper" @close="resetFileDiaolg">
:close-on-click-modal="false"
:title="$t('trials:uploadNonDicoms:dialogTitle:upload')"
width="800px"
append-to-body
custom-class="base-dialog-wrapper"
@close="resetFileDiaolg"
>
<!-- 多文件上传 --> <!-- 多文件上传 -->
<form id="inputForm" ref="uploadForm"> <form id="inputForm" ref="uploadForm">
<el-divider content-position="left">{{ <el-divider content-position="left">{{
@ -256,33 +132,15 @@
}}</el-divider> }}</el-divider>
<div class="form-group"> <div class="form-group">
<div class="upload" style="margin-right: 10px"> <div class="upload" style="margin-right: 10px">
<input <input multiple="multiple" webkitdirectory="" directory accept="*/*" type="file" name="uploadFolder"
multiple="multiple" class="select-file" title="" @change="beginScanFiles($event)" v-if="!btnLoading" />
webkitdirectory=""
directory
accept="*/*"
type="file"
name="uploadFolder"
class="select-file"
title=""
@change="beginScanFiles($event)"
v-if="!btnLoading"
/>
<div class="btn-select"> <div class="btn-select">
{{ $t('trials:uploadNonDicoms:button:selectFolder') }} {{ $t('trials:uploadNonDicoms:button:selectFolder') }}
</div> </div>
</div> </div>
<div class="upload"> <div class="upload">
<input <input class="select-file" multiple="" :accept="faccept.join(',')" type="file" name="uploadFile" title=""
class="select-file" @change="beginScanFiles($event)" v-if="!btnLoading" />
multiple=""
:accept="faccept.join(',')"
type="file"
name="uploadFile"
title=""
@change="beginScanFiles($event)"
v-if="!btnLoading"
/>
<div class="btn-select"> <div class="btn-select">
{{ $t('trials:uploadNonDicoms:button:select') }} {{ $t('trials:uploadNonDicoms:button:select') }}
</div> </div>
@ -293,82 +151,46 @@
</div> </div>
</form> </form>
<!-- 文件列表 --> <!-- 文件列表 -->
<el-table <el-table ref="filesTable" :data="fileList" class="dicomFiles-table" height="300"
ref="filesTable" @selection-change="handleSelectionChange">
:data="fileList" <el-table-column type="selection" width="55" :selectable="(row, index) => row.status !== 2 && !btnLoading" />
class="dicomFiles-table"
height="300"
@selection-change="handleSelectionChange"
>
<el-table-column
type="selection"
width="55"
:selectable="(row, index) => row.status !== 2 && !btnLoading"
/>
<el-table-column type="index" width="50" /> <el-table-column type="index" width="50" />
<!-- 文件名称 --> <!-- 文件名称 -->
<el-table-column <el-table-column prop="name" :label="$t('trials:uploadNonDicoms:table:fileName')" min-width="100" />
prop="name"
:label="$t('trials:uploadNonDicoms:table:fileName')"
min-width="100"
/>
<!-- 文件大小 --> <!-- 文件大小 -->
<el-table-column <el-table-column prop="size" :label="$t('trials:uploadNonDicoms:table:fileSize')">
prop="size"
:label="$t('trials:uploadNonDicoms:table:fileSize')"
>
<template slot-scope="scope"> <template slot-scope="scope">
<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(3)}MB`
: '' : '0MB'
}}</span> }}</span>
</template> </template>
</el-table-column> </el-table-column>
<!-- 文件类型 --> <!-- 文件类型 -->
<el-table-column <el-table-column prop="type" :label="$t('trials:uploadNonDicoms:table:fileType')" />
prop="type"
:label="$t('trials:uploadNonDicoms:table:fileType')"
/>
<!-- 上传状态 --> <!-- 上传状态 -->
<el-table-column <el-table-column prop="status" :label="$t('trials:uploadNonDicoms:table:uploadStatus')" min-width="100">
prop="status"
:label="$t('trials:uploadNonDicoms:table:uploadStatus')"
min-width="100"
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag <el-tag :type="['warning', 'info', 'success', 'danger'][scope.row.status]"
:type="['warning', 'info', 'success', 'danger'][scope.row.status]" v-if="scope.row.status || scope.row.status === 0">{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
v-if="scope.row.status || scope.row.status === 0"
>{{ $fd('NoneDicomUploadStatus', scope.row.status) }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column :label="$t('trials:uploadNonDicoms:table:failedFileCount')" min-width="150"
:label="$t('trials:uploadNonDicoms:table:failedFileCount')" show-overflow-tooltip>
min-width="150"
show-overflow-tooltip
>
<template slot-scope="scope"> <template slot-scope="scope">
<el-progress <el-progress color="#409eff" :percentage="scope.row.size && scope.row.size > 0 ? ((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
color="#409eff"
:percentage="
((scope.row.uploadFileSize * 100) / scope.row.size).toFixed(2) *
1 1
" : ((scope.row.uploadFileSize * 100) / 1).toFixed(2) *
/> 1
" />
</template> </template>
</el-table-column> </el-table-column>
<el-table-column :label="$t('common:action:action')"> <el-table-column :label="$t('common:action:action')">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button size="mini" icon="el-icon-delete" circle :disabled="btnLoading"
size="mini" :title="$t('trials:crcUpload:action:delete')" @click="handleRemoveFile(scope.row)" />
icon="el-icon-delete"
circle
:disabled="btnLoading"
:title="$t('trials:crcUpload:action:delete')"
@click="handleRemoveFile(scope.row)"
/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -376,13 +198,8 @@
<span style="margin-right: 10px">{{ <span style="margin-right: 10px">{{
$store.state.trials.uploadTip $store.state.trials.uploadTip
}}</span> }}</span>
<el-button <el-button size="small" type="primary" :disabled="selectArr.length == 0" :loading="btnLoading"
size="small" @click="beginUpload">
type="primary"
:disabled="selectArr.length == 0"
:loading="btnLoading"
@click="beginUpload"
>
{{ $t('trials:uploadNonDicoms:action:upload') }} {{ $t('trials:uploadNonDicoms:action:upload') }}
</el-button> </el-button>
</div> </div>
@ -588,7 +405,7 @@ export default {
) )
} }
}) })
.catch(() => {}) .catch(() => { })
}, },
resetUploadForm() { resetUploadForm() {
this.$nextTick(() => { this.$nextTick(() => {
@ -714,8 +531,7 @@ export default {
if (!this.uploadVisible) return if (!this.uploadVisible) return
let file = this.fileList.filter((item) => item.id === arr[index].id)[0] let file = this.fileList.filter((item) => item.id === arr[index].id)[0]
file.status = 1 file.status = 1
let path = `/${this.$route.query.trialId}/TaskImage/${ let path = `/${this.$route.query.trialId}/TaskImage/${this.currentRow.SubjectId
this.currentRow.SubjectId
}/${this.currentRow.VisitTaskId}/${this.$guid()}${file.name }/${this.currentRow.VisitTaskId}/${this.$guid()}${file.name
.substring(file.name.lastIndexOf('.')) .substring(file.name.lastIndexOf('.'))
.toLocaleLowerCase()}` .toLocaleLowerCase()}`
@ -772,7 +588,7 @@ export default {
(percentage, checkpoint, lastPer) => { (percentage, checkpoint, lastPer) => {
item.uploadFileSize += checkpoint.size * (percentage - lastPer) item.uploadFileSize += checkpoint.size * (percentage - lastPer)
if (item.uploadFileSize > file.fileSize) { if (item.uploadFileSize > file.fileSize) {
item.uploadFileSize = file.fileSize item.uploadFileSize = file.fileSize > 0 ? file.fileSize : 1
} }
} }
) )
@ -869,6 +685,7 @@ export default {
.top { .top {
margin: 10px 0; margin: 10px 0;
} }
.upload { .upload {
display: inline-block; display: inline-block;
height: 30px; height: 30px;
@ -883,6 +700,7 @@ export default {
background: #428bca; background: #428bca;
border-color: #428bca; border-color: #428bca;
color: #fff; color: #fff;
.select-file { .select-file {
height: 30px; height: 30px;
width: 90px; width: 90px;
@ -893,6 +711,7 @@ export default {
opacity: 0; opacity: 0;
font-size: 0; font-size: 0;
} }
.btn-select { .btn-select {
// //
width: 90px; width: 90px;
@ -908,10 +727,12 @@ export default {
pointer-events: none; //pointer-events:none穿 pointer-events: none; //pointer-events:none穿
} }
} }
.tip { .tip {
display: flex; display: flex;
align-items: flex-start; align-items: flex-start;
margin-top: 5px; margin-top: 5px;
i { i {
margin: 3px 5px 0 0; margin: 3px 5px 0 0;
} }

View File

@ -567,7 +567,7 @@ export default {
for (let i = 0; i < arr.length; i++) { for (let i = 0; i < arr.length; i++) {
let dicom = arr[i]; let dicom = arr[i];
if (dicom.StudyInstanceUid !== StudyInstanceUid) continue; if (dicom.StudyInstanceUid !== StudyInstanceUid) continue;
let thumbnailPath = `/${dicom.params.TrialId}/TaskImage/${dicom.params.SubjectId}/${dicom.params.VisitTaskId}/${dicom.StudyInstanceUid}/${dicom.SeriesInstanceUid}.png`; let thumbnailPath = `/${dicom.params.TrialId}/TaskImage/${dicom.params.SubjectId}/${dicom.params.VisitTaskId}/${dicom.StudyInstanceUid}/${dicom.SeriesInstanceUid}.jpg`;
if (!studyObj[dicom.StudyId]) { if (!studyObj[dicom.StudyId]) {
studyObj[dicom.StudyId] = { studyObj[dicom.StudyId] = {
StudyId: dicom.StudyId, StudyId: dicom.StudyId,

View File

@ -1,6 +1,5 @@
import { SubjectCheckConfig } from './module/Subject' import { SubjectCheckConfig } from './module/Subject'
console.log(SubjectCheckConfig.moduleType)
export const checkConfig = { export const checkConfig = {
ModuleType: { ModuleType: {
...SubjectCheckConfig.ModuleType ...SubjectCheckConfig.ModuleType

View File

@ -10,7 +10,7 @@ const dialogDrag = Vue.directive('dialogDrag', {
dragDom.style.cssText += ';top:0px;' dragDom.style.cssText += ';top:0px;'
// 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null); // 获取原有属性 ie dom元素.currentStyle 火狐谷歌 window.getComputedStyle(dom元素, null);
const sty = (function() { const sty = (function () {
if (window.document.currentStyle) { if (window.document.currentStyle) {
return (dom, attr) => dom.currentStyle[attr] return (dom, attr) => dom.currentStyle[attr]
} else { } else {
@ -47,8 +47,10 @@ const dialogDrag = Vue.directive('dialogDrag', {
styL = +styL.replace(/\px/g, '') styL = +styL.replace(/\px/g, '')
styT = +styT.replace(/\px/g, '') styT = +styT.replace(/\px/g, '')
} }
const oldMousemove = document.onmousemove
document.onmousemove = function(e) { document.onmousemove = function (e) {
oldMousemove(e)
// 通过事件委托,计算移动的距离 // 通过事件委托,计算移动的距离
let left = e.clientX - disX let left = e.clientX - disX
const top = e.clientY - disY const top = e.clientY - disY
@ -70,8 +72,8 @@ const dialogDrag = Vue.directive('dialogDrag', {
dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;` dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`
} }
document.onmouseup = function(e) { document.onmouseup = function (e) {
document.onmousemove = null document.onmousemove = oldMousemove
document.onmouseup = null document.onmouseup = null
} }
} }

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

View File

@ -14,13 +14,13 @@
<div class="right-menu"> <div class="right-menu">
<div class="navbar-flex-wrapper"> <div class="navbar-flex-wrapper">
<template v-if="device!=='mobile'"> <template v-if="device !== 'mobile'">
<screenfull id="screenfull" class="right-menu-item hover-effect" /> <screenfull id="screenfull" class="right-menu-item hover-effect" />
</template> </template>
<!-- <div class="avatar-container"> <!-- <div class="avatar-container">
<img src="@/assets/avatar.png" class="user-avatar"> <img src="@/assets/avatar.png" class="user-avatar">
</div> --> </div> -->
<div style="margin-left:20px;"> <div style="margin-left: 20px">
<el-dropdown class="dropdown-container" trigger="click"> <el-dropdown class="dropdown-container" trigger="click">
<span class="el-dropdown-link"> <span class="el-dropdown-link">
{{ `${name} (${userTypeShortName})` }} {{ `${name} (${userTypeShortName})` }}
@ -30,10 +30,20 @@
</span> </span>
<el-dropdown-menu slot="dropdown" class="user-dropdown"> <el-dropdown-menu slot="dropdown" class="user-dropdown">
<el-dropdown-item v-if="!isReviewer"> <el-dropdown-item v-if="!isReviewer">
<span style="display:block;" @click="editInfo">{{$t('system:navbar:button:Profile')}}</span> <span style="display: block" @click="editInfo">{{
$t('system:navbar:button:Profile')
}}</span>
</el-dropdown-item>
<!-- 切换角色 -->
<el-dropdown-item divided v-if="hasRole">
<span style="display: block" @click="openToggleRole">{{
$t('system:navbar:button:toggleRole')
}}</span>
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item divided> <el-dropdown-item divided>
<span style="display:block;" @click="logout">{{$t('system:navbar:button:Log Out')}}</span> <span style="display: block" @click="logout">{{
$t('system:navbar:button:Log Out')
}}</span>
</el-dropdown-item> </el-dropdown-item>
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
@ -41,38 +51,119 @@
<TopLang></TopLang> <TopLang></TopLang>
</div> </div>
</div> </div>
<toggleRole
v-if="toggleRoleVisible"
:visible.sync="toggleRoleVisible"
:loading="toggleRoleLoading"
@save="loginByRole"
/>
</div> </div>
</template> </template>
<script> <script>
import {mapGetters, mapMutations} from 'vuex' import { mapGetters, mapMutations } from 'vuex'
import Breadcrumb from '@/components/Breadcrumb' import Breadcrumb from '@/components/Breadcrumb'
import Hamburger from '@/components/Hamburger' import Hamburger from '@/components/Hamburger'
import Screenfull from '@/components/Screenfull' import Screenfull from '@/components/Screenfull'
import TopLang from './topLang' import TopLang from './topLang'
import toggleRole from '@/components/toggleRole'
import { resetRouter } from '@/router'
export default { export default {
components: { components: {
Breadcrumb, Breadcrumb,
Hamburger, Hamburger,
Screenfull, Screenfull,
TopLang TopLang,
toggleRole,
}, },
data() { data() {
return { return {
isReviewer: false, isReviewer: false,
userTypeShortName: zzSessionStorage.getItem('userTypeShortName') toggleRoleVisible: false,
toggleRoleLoading: false,
} }
}, },
computed: { computed: {
...mapGetters(['sidebar', 'name', 'device']) ...mapGetters(['sidebar', 'name', 'device', 'userTypeShortName']),
roles() {
return this.$store.state.user.roles
},
hasRole() {
return this.roles && this.roles.length > 1
},
}, },
created() { created() {
this.isReviewer = JSON.parse(zzSessionStorage.getItem('IsReviewer')) // this.isReviewer = JSON.parse(zzSessionStorage.getItem('IsReviewer'))
}, },
methods: { methods: {
...mapMutations({ setLanguage: 'lang/setLanguage' }), ...mapMutations({ setLanguage: 'lang/setLanguage' }),
openToggleRole() {
this.$store.dispatch('user/getUserInfo').then((res) => {
this.toggleRoleVisible = true
})
},
loginByRole(userRoleId) {
if (this.$store.state.user.userId === userRoleId) {
this.toggleRoleVisible = false
this.toggleRoleLoading = false
return false
}
this.toggleRoleLoading = true
this.$store
.dispatch('user/loginByRole', { userRoleId })
.then((res) => {
if (res) {
this.$store
.dispatch('permission/generateRoutes')
.then(async (res) => {
if (res && res.length > 0) {
resetRouter()
await this.$store.dispatch('global/getNoticeList')
this.$router.addRoutes(res)
this.toggleRoleLoading = false
if (this.loginType === 'DevOps') {
this.$router.replace({ path: res[0].path })
return
}
if (this.hasPermi(['role:radmin'])) {
this.$router.replace({ path: res[0].path })
return
}
if (
this.hasPermi([
'role:air',
'role:rpm',
'role:rcrc',
'role:rir',
])
) {
history.replaceState(null, null, '/trials/trials-list')
history.go(0)
} else {
history.replaceState(null, null, '/trials/trials-workbench')
history.go(0)
}
this.toggleRoleVisible = false
this.toggleRoleLoading = false
this.$EventBus.$emit('reload')
} else {
//
this.toggleRoleLoading = false
this.$message.warning(this.$t('login:message:login2'))
}
})
.catch((err) => {
console.log(err)
this.toggleRoleLoading = false
})
} else {
this.toggleRoleLoading = false
}
})
.catch(() => {
this.toggleRoleLoading = false
})
},
toggleSideBar() { toggleSideBar() {
this.$store.dispatch('app/toggleSideBar') this.$store.dispatch('app/toggleSideBar')
}, },
@ -84,23 +175,23 @@ export default {
} else { } else {
this.$router.push(`/login`) this.$router.push(`/login`)
} }
this.$i18n.locale = 'zh' // //this.$i18n.locale = 'zh'
this.setLanguage('zh') // //this.setLanguage('zh')
this.$updateDictionary() this.$updateDictionary()
}, },
editInfo() { editInfo() {
this.$router.push({ name: 'BaiscInfo' }) this.$router.push({ name: 'BaiscInfo' })
}, },
} },
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.navbar-flex-wrapper{ .navbar-flex-wrapper {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
justify-content: space-between; justify-content: space-between;
} }
.navbar { .navbar {
height: 50px; height: 50px;
overflow: hidden; overflow: hidden;

View File

@ -22,7 +22,7 @@
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import Logo from './Logo' import Logo from './Logo'
import SidebarItem from './SidebarItem' import SidebarItem from './SidebarItem'
import variables from '@/styles/variables.scss' import variables from '@/styles/variables.module.scss'
export default { export default {
components: { SidebarItem, Logo }, components: { SidebarItem, Logo },

View File

@ -73,7 +73,7 @@ export default {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
width: 100%; width: 100%;
/deep/ { ::v-deep {
.el-scrollbar__bar { .el-scrollbar__bar {
bottom: 0px; bottom: 0px;
} }

View File

@ -57,7 +57,7 @@ export default {
<style lang="scss" scoped> <style lang="scss" scoped>
@import "~@/styles/mixin.scss"; @import "~@/styles/mixin.scss";
@import "~@/styles/variables.scss"; @import "~@/styles/variables.module.scss";
.app-wrapper { .app-wrapper {
@include clearfix; @include clearfix;

View File

@ -54,6 +54,10 @@ import upload from '@/components/element-ui/upload'
Vue.use(upload) Vue.use(upload)
import Preview from '@/components/Preview/index' import Preview from '@/components/Preview/index'
Vue.use(Preview) Vue.use(Preview)
import Onlyoffice from '@/components/Preview_onlyoffice/index'
Vue.use(Onlyoffice)
import Video from '@/components/Preview_video/index'
Vue.use(Video)
import MFA from '@/components/MFA/index' import MFA from '@/components/MFA/index'
Vue.use(MFA) Vue.use(MFA)
import FB from '@/components/feedBack/index' import FB from '@/components/feedBack/index'
@ -174,7 +178,7 @@ var _vm
async function VueInit() { async function VueInit() {
var params var params
var res var res
if (~window.location.href.indexOf('/readingDicoms') || ~window.location.href.indexOf('/noneDicomReading') || ~window.location.href.indexOf('/criterionquestions') || ~window.location.href.indexOf('/petct')) { if (~window.location.href.indexOf('/readingDicoms') || ~window.location.href.indexOf('/noneDicomReading') || ~window.location.href.indexOf('/criterionquestions') || ~window.location.href.indexOf('/petct') || ~window.location.href.indexOf('/fusion')) {
params = $q('TrialReadingCriterionId') params = $q('TrialReadingCriterionId')
res = await getBasicDataAllSelect(params) res = await getBasicDataAllSelect(params)
} else if (~window.location.href.indexOf('/ecrfPreview')) { } else if (~window.location.href.indexOf('/ecrfPreview')) {
@ -293,6 +297,7 @@ async function VueInit() {
}() }()
_vm.$forceUpdate() _vm.$forceUpdate()
} }
Vue.prototype.$EventBus = new Vue()
Vue.prototype.$path = [] Vue.prototype.$path = []
var t = function (key) { var t = function (key) {
if (!~Vue.prototype.$path.indexOf(key)) { if (!~Vue.prototype.$path.indexOf(key)) {
@ -307,6 +312,11 @@ async function VueInit() {
text = text.replace(test, item.TrialName) text = text.replace(test, item.TrialName)
}) })
} }
let CompanyInfo = JSON.parse(localStorage.getItem('CompanyInfo'))
if (CompanyInfo && CompanyInfo.SystemShortName) {
let test = new RegExp('IRC', 'ig')
text = text.replace(test, CompanyInfo.SystemShortName)
}
// return i18n.t(key) // return i18n.t(key)
return text; return text;
} }
@ -402,9 +412,13 @@ async function VueInit() {
} }
_vm.$store.dispatch('user/logout').then(res => { _vm.$store.dispatch('user/logout').then(res => {
// window.location.href = `/login` // window.location.href = `/login`
if (_vm.$msgbox) { try {
if (_vm.$msgbox && _vm.$msgbox.close) {
_vm.$msgbox.close(); _vm.$msgbox.close();
} }
} catch (err) {
console.log(err)
}
_vm.$FB.close(); _vm.$FB.close();
_vm.$FBT.close(); _vm.$FBT.close();
_vm.$MFA.close(); _vm.$MFA.close();
@ -456,8 +470,8 @@ async function VueInit() {
var my_username = zzSessionStorage.getItem('my_username') var my_username = zzSessionStorage.getItem('my_username')
var my_password = zzSessionStorage.getItem('my_password') var my_password = zzSessionStorage.getItem('my_password')
let my_userid = zzSessionStorage.getItem('userId') let my_userid = zzSessionStorage.getItem('userId')
let my_EMail = zzSessionStorage.getItem('my_EMail') let my_EMail = zzSessionStorage.getItem('my_EMail') || ''
if (md5(_vm.unlock.my_password) === my_password && my_username === _vm.unlock.my_username) { if (md5(_vm.unlock.my_password) === my_password && (my_username === _vm.unlock.my_username || my_EMail.toUpperCase() === vm.unlock.my_username.toUpperCase())) {
resetReadingRestTime().then(() => { resetReadingRestTime().then(() => {
}) })
const closeLock = (_vm) => { const closeLock = (_vm) => {

View File

@ -1,20 +1,21 @@
import router from './router' import router from './router'
import { resetRouter } from '@/router'
import store from './store' import store from './store'
// import { Message } from 'element-ui' // import { Message } from 'element-ui'
import NProgress from 'nprogress' import NProgress from 'nprogress'
import 'nprogress/nprogress.css' import 'nprogress/nprogress.css'
import { getToken } from '@/utils/auth' import { getToken, removeToken } from '@/utils/auth'
import Vue from 'vue' import Vue from 'vue'
import { OSSclient } from './utils/oss' import { OSSclient } from './utils/oss'
import WHITELIST from "./utils/whiteList" import WHITELIST from './utils/whiteList'
import { getTrialExtralConfig } from '@/api/trials' import { getTrialExtralConfig } from '@/api/trials'
// import getPageTitle from '@/utils/get-page-title' // import getPageTitle from '@/utils/get-page-title'
NProgress.configure({ showSpinner: false }) NProgress.configure({ showSpinner: false })
const whiteList = WHITELIST const whiteList = WHITELIST
store.state.trials.whiteList = whiteList; store.state.trials.whiteList = whiteList
router.beforeEach(async (to, from, next) => { router.beforeEach(async(to, from, next) => {
NProgress.start() NProgress.start()
// 设置页面标题 // 设置页面标题
// document.title = getPageTitle(to.meta.title) store.state.trials.whiteList.indexOf(to.path) === -1 // document.title = getPageTitle(to.meta.title) store.state.trials.whiteList.indexOf(to.path) === -1
@ -26,14 +27,13 @@ router.beforeEach(async (to, from, next) => {
to.query.trialId !== to.query.trialId !==
store.state.trials.config.trialId store.state.trials.config.trialId
) { ) {
console.log(to.query.path) const res = await getTrialExtralConfig({
let res = await getTrialExtralConfig({ TrialId: to.query.trialId
TrialId: to.query.trialId,
}) })
if (res.IsSuccess) { if (res.IsSuccess) {
store.dispatch('trials/setConfig', { store.dispatch('trials/setConfig', {
trialId: to.query.trialId, trialId: to.query.trialId,
...res.Result, ...res.Result
}) })
} }
} }
@ -45,13 +45,13 @@ router.beforeEach(async (to, from, next) => {
to.query.trialId !== to.query.trialId !==
store.state.trials.config.trialId store.state.trials.config.trialId
) { ) {
let res = await getTrialExtralConfig({ const res = await getTrialExtralConfig({
TrialId: to.query.trialId, TrialId: to.query.trialId
}) })
if (res.IsSuccess) { if (res.IsSuccess) {
store.dispatch('trials/setConfig', { store.dispatch('trials/setConfig', {
trialId: to.query.trialId, trialId: to.query.trialId,
...res.Result, ...res.Result
}) })
} }
} }
@ -70,6 +70,16 @@ router.beforeEach(async (to, from, next) => {
} }
next() next()
NProgress.done() NProgress.done()
} else if (from.path === '/researchForm') {
removeToken()
const lang = to.query.lang || zzSessionStorage.getItem('lang')
next(`/researchLogin?trialId=${to.query.trialId}&lang=${lang}`)
NProgress.done()
} else if (from.path === '/researchDetail_m') {
removeToken()
const lang = to.query.lang || zzSessionStorage.getItem('lang')
next(`/researchLogin_m?trialId=${to.query.trialId}&lang=${lang}`)
NProgress.done()
} else { } else {
await OSSclient() await OSSclient()
const hasGetUserInfo = store.getters.userId const hasGetUserInfo = store.getters.userId
@ -79,10 +89,13 @@ router.beforeEach(async (to, from, next) => {
try { try {
// 获取用户信息 // 获取用户信息
await store.dispatch('user/getInfo') await store.dispatch('user/getInfo')
await store.dispatch('user/getUserInfo')
const accessRoutes = await store.dispatch('permission/generateRoutes') const accessRoutes = await store.dispatch('permission/generateRoutes')
resetRouter()
router.addRoutes(accessRoutes) router.addRoutes(accessRoutes)
next({ ...to, replace: true }) next({ ...to, replace: true })
} catch (error) { } catch (error) {
console.log(error)
// 删除token并进入登录页面以重新登录 // 删除token并进入登录页面以重新登录
await store.dispatch('user/resetToken') await store.dispatch('user/resetToken')
next(`/login?redirect=${to.path}`) next(`/login?redirect=${to.path}`)
@ -94,9 +107,10 @@ router.beforeEach(async (to, from, next) => {
/* has no token*/ /* has no token*/
if (whiteList.indexOf(to.path) !== -1) { if (whiteList.indexOf(to.path) !== -1) {
if (to.path === '/researchLogin') { if (to.path === '/researchLogin') {
const lang = to.query.lang || zzSessionStorage.getItem('lang')
const flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i) const flag = navigator.userAgent.match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i)
if (flag) { if (flag) {
next(`/researchLogin_m?trialId=${to.query.trialId}&lang=${to.query.lang}`) next(`/researchLogin_m?trialId=${to.query.trialId}&lang=${lang}`)
} else { } else {
next() next()
} }
@ -109,10 +123,12 @@ router.beforeEach(async (to, from, next) => {
} }
} else { } else {
if (to.path === '/researchForm') { if (to.path === '/researchForm') {
next(`/researchLogin?`) const lang = to.query.lang || zzSessionStorage.getItem('lang')
next(`/researchLogin?trialId=${to.query.trialId}&lang=${lang}`)
NProgress.done() NProgress.done()
} else if (to.path === '/researchDetail_m') { } else if (to.path === '/researchDetail_m') {
next(`/researchLogin_m?`) const lang = to.query.lang || zzSessionStorage.getItem('lang')
next(`/researchLogin_m?trialId=${to.query.trialId}&lang=${lang}`)
NProgress.done() NProgress.done()
} else if (to.path === '/ReviewersResearchForm') { } else if (to.path === '/ReviewersResearchForm') {
next(`/ReviewersResearch?`) next(`/ReviewersResearch?`)

View File

@ -50,12 +50,23 @@ export const constantRoutes = [
component: () => import('@/views/login/index'), component: () => import('@/views/login/index'),
hidden: true hidden: true
}, },
// {
// path: '/test',
// component: () => import('@/views/test/index'),
// hidden: true
// },
{ {
path: '/resetpassword', path: '/resetpassword',
component: () => import('@/views/forgetpassword/index'), component: () => import('@/views/forgetpassword/index'),
name: 'Resetpassword', name: 'Resetpassword',
hidden: true hidden: true
}, },
{
path: '/trials/trials-panel/reading/readingTracking/ReadOrder',
component: () => import('@/views/trials/trials-panel/reading/read-order/index'),
name: 'ReadOrder',
hidden: true
},
{ {
path: '/recompose', path: '/recompose',
component: () => import('@/views/recompose/index'), component: () => import('@/views/recompose/index'),
@ -139,6 +150,12 @@ export const constantRoutes = [
hidden: true, hidden: true,
component: () => import('@/views/trials/trials-panel/reading/dicoms/components/Fusion/PetCt') component: () => import('@/views/trials/trials-panel/reading/dicoms/components/Fusion/PetCt')
}, },
{
path: '/fusion',
name: 'fusion',
hidden: true,
component: () => import('@/views/trials/trials-panel/reading/dicoms/components/Fusion/demo/index')
},
{ {
path: '/historyScreenshot', path: '/historyScreenshot',

View File

@ -1,7 +1,7 @@
// eslint-disable-next-line no-undef // eslint-disable-next-line no-undef
module.exports = { module.exports = {
title: 'IRCIS', title: 'IRC Imaging System',
/** /**
* @type {boolean} true | false * @type {boolean} true | false

View File

@ -3,10 +3,12 @@ const getters = {
device: state => state.app.device, device: state => state.app.device,
token: state => state.user.token, token: state => state.user.token,
name: state => state.user.name, name: state => state.user.name,
userTypeShortName: state => state.user.userTypeShortName,
permissions: state => state.user.permissions, permissions: state => state.user.permissions,
tree: state => state.user.tree, tree: state => state.user.tree,
userName: state => state.user.userName, userName: state => state.user.userName,
userId: state => state.user.userId, userId: state => state.user.userId,
identityUserId: state => state.user.identityUserId,
routes: state => state.permission.routes, routes: state => state.permission.routes,
asyncRoutes: state => state.permission.addRoutes, asyncRoutes: state => state.permission.addRoutes,
visitedViews: state => state.tagsView.visitedViews, visitedViews: state => state.tagsView.visitedViews,
@ -45,6 +47,11 @@ const getters = {
language: state => state.lang.language, language: state => state.lang.language,
TotalNeedSignSystemDocCount: state => state.user.TotalNeedSignSystemDocCount, TotalNeedSignSystemDocCount: state => state.user.TotalNeedSignSystemDocCount,
TotalNeedSignTrialDocCount: state => state.user.TotalNeedSignTrialDocCount, TotalNeedSignTrialDocCount: state => state.user.TotalNeedSignTrialDocCount,
TrialStatusStr: state => state.user.TrialStatusStr IsFirstSysDocNeedSign: state => state.user.IsFirstSysDocNeedSign,
TrialStatusStr: state => state.user.TrialStatusStr,
lastViewportTaskId: state => state.noneDicomReview.lastViewportTaskId,
currentTaskState: state => state.noneDicomReview.currentTaskState,
operateInfo: state => state.dicom3d.operateInfo,
deleteAnnotationIds: state => state.dicom3d.deleteAnnotationIds
} }
export default getters export default getters

View File

@ -12,7 +12,8 @@ import trials from './modules/trials'
import financials from './modules/financials' import financials from './modules/financials'
import reading from './modules/reading' import reading from './modules/reading'
import lang from './modules/lang' import lang from './modules/lang'
import noneDicomReview from './modules/noneDicomReview'
import dicom3d from './modules/dicom3d'
Vue.use(Vuex) Vue.use(Vuex)
const store = new Vuex.Store({ const store = new Vuex.Store({
@ -27,7 +28,9 @@ const store = new Vuex.Store({
trials, trials,
financials, financials,
reading, reading,
lang lang,
noneDicomReview,
dicom3d
}, },
getters getters
}) })

View File

@ -0,0 +1,28 @@
const getDefaultState = () => {
return {
operateInfo: [],
deleteAnnotationIds: []
}
}
const state = getDefaultState
const mutations = {
}
const actions = {
setOperateInfo({ state }, arr) {
state.operateInfo = arr
},
setDeleteAnnotationIds({ state }, arr) {
state.deleteAnnotationIds = arr
},
}
export default {
namespaced: true,
state,
mutations,
actions
}

View File

@ -0,0 +1,28 @@
const getDefaultState = () => {
return {
lastViewportTaskId: null,
currentTaskState: 0
}
}
const state = getDefaultState
const mutations = {
}
const actions = {
setLastViewportTaskId({ state }, id) {
state.lastViewportTaskId = id
},
setCurrentTaskState({ state }, taskState) {
state.currentTaskState = taskState
}
}
export default {
namespaced: true,
state,
mutations,
actions
}

View File

@ -70,6 +70,12 @@ function getQuestions(questions) {
answerObj.angle = angle answerObj.angle = angle
answerObj.saveTypeEnum = isNaN(parseFloat(angle)) ? 1 : 2 answerObj.saveTypeEnum = isNaN(parseFloat(angle)) ? 1 : 2
} }
} else if (criterionType === 21) {
// MRI-PDFF
let isMeasurable = getQuestionAnswer(item.TableQuestions.Questions, 1105, answerObj)
answerObj.isMeasurable = isMeasurable
answerObj.mean = getQuestionAnswer(item.TableQuestions.Questions, 1104, answerObj)
answerObj.saveTypeEnum = parseInt(isMeasurable) === 1 && isNaN(parseFloat(answerObj.mean)) ? 1 : 2
} else { } else {
answerObj.lesionPart = getQuestionAnswer(item.TableQuestions.Questions, 8, answerObj) answerObj.lesionPart = getQuestionAnswer(item.TableQuestions.Questions, 8, answerObj)
answerObj.loctation = getQuestionAnswer(item.TableQuestions.Questions, 6, answerObj) answerObj.loctation = getQuestionAnswer(item.TableQuestions.Questions, 6, answerObj)
@ -507,6 +513,7 @@ const actions = {
}) })
}, },
getMeasuredData({ state }, visitTaskId) { getMeasuredData({ state }, visitTaskId) {
console.log('getMeasuredData')
return new Promise(resolve => { return new Promise(resolve => {
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId) var index = state.visitTaskList.findIndex(i => i.VisitTaskId === visitTaskId)
if (state.visitTaskList[index].measureDataInit) { if (state.visitTaskList[index].measureDataInit) {
@ -523,6 +530,13 @@ const actions = {
el.OtherMeasureData = JSON.parse(el.OtherMeasureData) el.OtherMeasureData = JSON.parse(el.OtherMeasureData)
el.OtherMeasureData.data.remark = el.OrderMarkName el.OtherMeasureData.data.remark = el.OrderMarkName
} }
// if (el.TableQuestionMarkList.length > 0) {
// let list = el.TableQuestionMarkList.map(i=>{
// i.MeasureData = i.MeasureData ? JSON.parse(i.MeasureData) : ''
// return i
// })
// el.TableQuestionMarkList = list
// }
arr.push(el) arr.push(el)
}) })
state.visitTaskList[index].MeasureData = arr state.visitTaskList[index].MeasureData = arr
@ -606,6 +620,13 @@ const actions = {
el.MeasureData = JSON.parse(el.MeasureData) el.MeasureData = JSON.parse(el.MeasureData)
el.MeasureData.data.remark = el.OrderMarkName el.MeasureData.data.remark = el.OrderMarkName
} }
// if (el.TableQuestionMarkList.length > 0) {
// let list = el.TableQuestionMarkList.map(i=>{
// i.MeasureData = i.MeasureData ? JSON.parse(i.MeasureData) : ''
// return i
// })
// el.TableQuestionMarkList = list
// }
arr.push(el) arr.push(el)
}) })
state.visitTaskList[index].MeasureData = arr state.visitTaskList[index].MeasureData = arr
@ -625,9 +646,23 @@ const actions = {
}, },
addMeasuredData({ state }, obj) { addMeasuredData({ state }, obj) {
return new Promise(resolve => { return new Promise(resolve => {
const criterionType = parseInt(localStorage.getItem('CriterionType'))
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId) var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
var measureData = state.visitTaskList[index].MeasureData var measureData = state.visitTaskList[index].MeasureData
// var idx = measureData.findIndex(item => item.MeasureData.uuid === obj.data.MeasureData.data.uuid) // var idx = measureData.findIndex(item => item.MeasureData.uuid === obj.data.MeasureData.data.uuid)
if (criterionType === 21) {
let i = measureData.findIndex(i=>i.TableQuestionId === obj.data.TableQuestionId)
if (i > -1) {
for (const k in state.visitTaskList[index].MeasureData[i]) {
if (k !== 'Id' && obj.data[k]) {
state.visitTaskList[index].MeasureData[i][k] = obj.data[k]
}
}
} else {
state.visitTaskList[index].MeasureData.push(obj.data)
}
} else {
var idx = measureData.findIndex(item => item.QuestionId === obj.data.QuestionId && item.RowIndex === obj.data.RowIndex) var idx = measureData.findIndex(item => item.QuestionId === obj.data.QuestionId && item.RowIndex === obj.data.RowIndex)
if (idx > -1) { if (idx > -1) {
for (const k in state.visitTaskList[index].MeasureData[idx]) { for (const k in state.visitTaskList[index].MeasureData[idx]) {
@ -635,15 +670,14 @@ const actions = {
state.visitTaskList[index].MeasureData[idx][k] = obj.data[k] state.visitTaskList[index].MeasureData[idx][k] = obj.data[k]
} }
} }
// state.visitTaskList[index].MeasureData[idx].MeasureData = obj.data.MeasureData
console.log('更新标记成功', idx) console.log('更新标记成功', idx)
} else { } else {
state.visitTaskList[index].MeasureData.push(obj.data) state.visitTaskList[index].MeasureData.push(obj.data)
console.log('新增标记成功') console.log('新增标记成功')
} }
}
// sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '') // sessionStorage.setItem('visitTaskList', state.visitTaskList.length > 0 ? JSON.stringify(state.visitTaskList) : '')
console.log(state.visitTaskList)
resolve() resolve()
}) })
}, },
@ -738,9 +772,20 @@ const actions = {
return new Promise(resolve => { return new Promise(resolve => {
var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId) var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
var measureData = state.visitTaskList[index].MeasureData var measureData = state.visitTaskList[index].MeasureData
const criterionType = parseInt(localStorage.getItem('CriterionType'))
// var uuid = obj.measureData.data.uuid if (criterionType === 21) {
// var idx = measureData.findIndex(item => item.MeasureData && item.MeasureData.data && item.MeasureData.data.uuid === uuid) const i = measureData.findIndex(item => item.QuestionId === obj.questionId && item.OrderMarkName === obj.orderMarkName)
if (i > -1) {
if (measureData[i].FristAddTaskId) {
measureData[i].MeasureData = ''
console.log('清除标记成功', i)
} else {
measureData.splice(i, 1)
console.log('移除标记成功', i)
}
}
state.visitTaskList[index].MeasureData = measureData
} else {
var idx = measureData.findIndex(item => item.QuestionId === obj.questionId && item.RowIndex === obj.rowIndex) var idx = measureData.findIndex(item => item.QuestionId === obj.questionId && item.RowIndex === obj.rowIndex)
if (idx > -1) { if (idx > -1) {
if (measureData[idx].FristAddTaskId) { if (measureData[idx].FristAddTaskId) {
@ -764,6 +809,8 @@ const actions = {
} }
state.visitTaskList[index].MeasureData = measureData state.visitTaskList[index].MeasureData = measureData
} }
}
// if (idx > -1) { // if (idx > -1) {
// measureData.splice(idx, 1) // measureData.splice(idx, 1)
@ -815,6 +862,7 @@ const actions = {
const data = {} const data = {}
data.StudyId = study.StudyId data.StudyId = study.StudyId
data.StudyCode = study.StudyCode data.StudyCode = study.StudyCode
data.StudyName = study.StudyName
data.Modalities = study.Modalities data.Modalities = study.Modalities
data.SeriesCount = study.SeriesCount data.SeriesCount = study.SeriesCount
data.InstanceCount = study.InstanceCount data.InstanceCount = study.InstanceCount
@ -840,6 +888,12 @@ const actions = {
const imageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?frame=${i}&instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${studyIndex}|${seriesIndex}|${index}` const imageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?frame=${i}&instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${studyIndex}|${seriesIndex}|${index}`
imageIds.push(imageId) imageIds.push(imageId)
}) })
} else if (study.IsCriticalSequence && instance.KeyFramesList.length === 0) {
// 兼容保存标记数据未存NumberOfFrames的情况按序列展示
for (let i = 0; i < instance.NumberOfFrames; i++) {
const imageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?frame=${i}&instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${studyIndex}|${seriesIndex}|${index}`
imageIds.push(imageId)
}
} else { } else {
for (let i = 0; i < instance.NumberOfFrames; i++) { for (let i = 0; i < instance.NumberOfFrames; i++) {
const imageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?frame=${i}&instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${studyIndex}|${seriesIndex}|${index}` const imageId = `wadouri:${localStorage.getItem('location') !== 'USA' ? Vue.prototype.OSSclientConfig.basePath : Vue.prototype.OSSclientConfig.basePath}${instance.Path}?frame=${i}&instanceId=${instance.Id}&visitTaskId=${obj.visitTaskId}&idx=${studyIndex}|${seriesIndex}|${index}`
@ -1034,7 +1088,7 @@ const actions = {
} }
}, },
setImageloadedInfo({ state }, obj) { setImageloadedInfo({ state }, obj) {
console.log('setImageloadedInfo', obj) // console.log('setImageloadedInfo', obj)
// if(obj.instance === '20dd8fc9-51b0-ec63-942b-cb3006c72650') // if(obj.instance === '20dd8fc9-51b0-ec63-942b-cb3006c72650')
// var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId) // var index = state.visitTaskList.findIndex(i => i.VisitTaskId === obj.visitTaskId)
// // const prefetchInstanceCount = state.visitTaskList[index].StudyList[obj.studyIndex].SeriesList[obj.seriesIndex].prefetchInstanceCount // // const prefetchInstanceCount = state.visitTaskList[index].StudyList[obj.studyIndex].SeriesList[obj.seriesIndex].prefetchInstanceCount

View File

@ -1,5 +1,6 @@
import { getToken, setToken, removeToken, setName, removeName } from '@/utils/auth' import { getToken, setToken, removeToken, setName, removeName } from '@/utils/auth'
import { login, loginOut, getUserMenuTree, getUserPermissions } from '@/api/user' import { login, loginOut, getUserMenuTree, getUserPermissions, getUserLoginRoleList, loginSelectUserRole } from '@/api/user'
import { getUser } from '@/api/admin'
import { resetRouter } from '@/router' import { resetRouter } from '@/router'
import md5 from 'js-md5' import md5 from 'js-md5'
@ -7,22 +8,29 @@ const getDefaultState = () => {
return { return {
token: getToken(), token: getToken(),
name: '', name: '',
userTypeShortName: "",
userName: '', userName: '',
userId: '', userId: '',
identityUserId: '',
avatar: '', avatar: '',
permissions: [], permissions: [],
tree: [], tree: [],
/* eslint-disable */ /* eslint-disable */
TotalNeedSignSystemDocCount: eval(process.env.VUE_APP_WORD_FOR_PERMISSION) ? null : 0, TotalNeedSignSystemDocCount: eval(process.env.VUE_APP_WORD_FOR_PERMISSION) ? null : 0,
TotalNeedSignTrialDocCount: eval(process.env.VUE_APP_WORD_FOR_PERMISSION) ? null : 0, TotalNeedSignTrialDocCount: eval(process.env.VUE_APP_WORD_FOR_PERMISSION) ? null : 0,
IsFirstSysDocNeedSign: false,
TrialStatusStr: null, TrialStatusStr: null,
isTestUser: false isTestUser: false,
roles: []
} }
} }
const state = getDefaultState() const state = getDefaultState()
const mutations = { const mutations = {
SET_ROLES: (state, roles) => {
state.roles = roles
},
RESET_STATE: (state) => { RESET_STATE: (state) => {
Object.assign(state, getDefaultState()) Object.assign(state, getDefaultState())
}, },
@ -34,6 +42,9 @@ const mutations = {
SET_NAME: (state, name) => { SET_NAME: (state, name) => {
state.name = name state.name = name
}, },
SET_USERTYPESHORTNAME: (state, userTypeShortName) => {
state.userTypeShortName = userTypeShortName
},
SET_USERNAME: (state, name) => { SET_USERNAME: (state, name) => {
state.userName = name state.userName = name
}, },
@ -49,9 +60,16 @@ const mutations = {
SET_USERID: (state, id) => { SET_USERID: (state, id) => {
state.userId = id state.userId = id
}, },
SET_IDENTITYUSERID: (state, id) => {
state.identityUserId = id
},
SET_ISTESTUSER: (state, isTestUser) => { SET_ISTESTUSER: (state, isTestUser) => {
state.isTestUser = eval(isTestUser) state.isTestUser = eval(isTestUser)
}, },
SET_IS_FIRST_SYSTEM_DOC_SIGN: (state, IsFirstSysDocNeedSign) => {
zzSessionStorage.setItem('IsFirstSysDocNeedSign', IsFirstSysDocNeedSign)
state.IsFirstSysDocNeedSign = IsFirstSysDocNeedSign
},
SET_NEED_SIGN_SYSTEM_DOC_COUNT: (state, TotalNeedSignSystemDocCount) => { SET_NEED_SIGN_SYSTEM_DOC_COUNT: (state, TotalNeedSignSystemDocCount) => {
/* eslint-disable */ /* eslint-disable */
if (eval(process.env.VUE_APP_WORD_FOR_PERMISSION) && !state.isTestUser) { if (eval(process.env.VUE_APP_WORD_FOR_PERMISSION) && !state.isTestUser) {
@ -78,6 +96,9 @@ const mutations = {
} }
const actions = { const actions = {
setRoles({ commit }, roles) {
commit('SET_ROLES', roles)
},
changeUserName({ commit }, userName) { changeUserName({ commit }, userName) {
commit('SET_USERNAME', userName) commit('SET_USERNAME', userName)
}, },
@ -91,7 +112,7 @@ const actions = {
if (UserId) { if (UserId) {
data.UserId = UserId; data.UserId = UserId;
} }
login(data).then(async response => { getUserLoginRoleList(data).then(async response => {
if (response.IsSuccess) { if (response.IsSuccess) {
zzSessionStorage.removeItem('lastWorkbench') zzSessionStorage.removeItem('lastWorkbench')
zzSessionStorage.setItem('my_username', username.trim()) zzSessionStorage.setItem('my_username', username.trim())
@ -99,6 +120,7 @@ const actions = {
zzSessionStorage.setItem('my_EMail', response.Result.BasicInfo.EMail) zzSessionStorage.setItem('my_EMail', response.Result.BasicInfo.EMail)
localStorage.setItem('CompanyInfo', JSON.stringify(response.Result.CompanyInfo)) localStorage.setItem('CompanyInfo', JSON.stringify(response.Result.CompanyInfo))
const data = response.Result const data = response.Result
commit('SET_ROLES', data.BasicInfo.AccountList)
if (data.BasicInfo.IsFirstAdd || data.BasicInfo.LoginState === 1) { if (data.BasicInfo.IsFirstAdd || data.BasicInfo.LoginState === 1) {
try { try {
zzSessionStorage.setItem('userId', data.BasicInfo.Id) zzSessionStorage.setItem('userId', data.BasicInfo.Id)
@ -114,18 +136,61 @@ const actions = {
zzSessionStorage.setItem('IsReviewer', data.BasicInfo.IsReviewer) zzSessionStorage.setItem('IsReviewer', data.BasicInfo.IsReviewer)
zzSessionStorage.setItem('userName', data.BasicInfo.UserName) zzSessionStorage.setItem('userName', data.BasicInfo.UserName)
commit('SET_TOKEN', data.JWTStr) commit('SET_TOKEN', data.JWTStr)
commit('SET_NAME', data.BasicInfo.RealName) // commit('SET_NAME', data.BasicInfo.UserName)
zzSessionStorage.setItem('realName', data.BasicInfo.RealName)
zzSessionStorage.setItem('isTestUser', data.BasicInfo.IsTestUser) zzSessionStorage.setItem('isTestUser', data.BasicInfo.IsTestUser)
commit('SET_ISTESTUSER', data.BasicInfo.IsTestUser) commit('SET_ISTESTUSER', data.BasicInfo.IsTestUser)
commit('SET_USERNAME', data.BasicInfo.UserName) commit('SET_USERNAME', data.BasicInfo.UserName)
commit('SET_USERID', data.BasicInfo.Id)
setToken(data.JWTStr) setToken(data.JWTStr)
setName(data.BasicInfo.RealName) // setName(data.BasicInfo.RealName)
const userString = decodeURIComponent(escape(window.atob(data.JWTStr.split('.')[1].replace(/-/g, '+').replace(/_/g, '/')))) // const userString = decodeURIComponent(escape(window.atob(data.JWTStr.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))))
// const user = JSON.parse(userString)
// zzSessionStorage.setItem('userId', user.identityUserId)
// commit('SET_IDENTITYUSERID', user.identityUserId)
// zzSessionStorage.setItem('identityUserId', user.identityUserId)
// zzSessionStorage.setItem('userTypeEnumInt', user.userTypeEnumInt)
// var permissions = await getUserPermissions()
// var menuTree = await getUserMenuTree()
// commit('SET_TREE', menuTree.Result)
// commit('SET_PERMISSIONS', permissions.Result)
// zzSessionStorage.setItem('newTree', JSON.stringify(menuTree.Result))
// zzSessionStorage.setItem('permissions', JSON.stringify(permissions.Result))
} catch (e) {
console.log(e)
}
resolve(response.Result)
}
} else {
reject(response.ErrorMessage)
}
}).catch(() => {
reject()
})
})
},
loginByRole({ commit }, userInfo) {
const { userRoleId } = userInfo
let params = {
userRoleId
}
return new Promise((resolve, reject) => {
loginSelectUserRole(params).then(async response => {
if (response.IsSuccess) {
const data = response.Result
try {
commit('SET_TOKEN', data)
setToken(data)
commit('SET_USERID', userRoleId)
zzSessionStorage.setItem('userId', userRoleId)
const userString = decodeURIComponent(escape(window.atob(data.split('.')[1].replace(/-/g, '+').replace(/_/g, '/'))))
const user = JSON.parse(userString) const user = JSON.parse(userString)
zzSessionStorage.setItem('userTypeShortName', user.userTypeShortName) zzSessionStorage.setItem('userTypeShortName', user.userTypeShortName)
zzSessionStorage.setItem('userId', user.id) commit('SET_USERTYPESHORTNAME', user.userTypeShortName)
commit('SET_NAME', user.fullName)
setName(user.fullName)
commit('SET_IDENTITYUSERID', user.identityUserId)
zzSessionStorage.setItem('identityUserId', user.identityUserId)
zzSessionStorage.setItem('userTypeEnumInt', user.userTypeEnumInt) zzSessionStorage.setItem('userTypeEnumInt', user.userTypeEnumInt)
var permissions = await getUserPermissions() var permissions = await getUserPermissions()
var menuTree = await getUserMenuTree() var menuTree = await getUserMenuTree()
@ -133,11 +198,12 @@ const actions = {
commit('SET_PERMISSIONS', permissions.Result) commit('SET_PERMISSIONS', permissions.Result)
zzSessionStorage.setItem('newTree', JSON.stringify(menuTree.Result)) zzSessionStorage.setItem('newTree', JSON.stringify(menuTree.Result))
zzSessionStorage.setItem('permissions', JSON.stringify(permissions.Result)) zzSessionStorage.setItem('permissions', JSON.stringify(permissions.Result))
zzSessionStorage.removeItem('lastWorkbench')
} catch (e) { } catch (e) {
console.log(e) console.log(e)
} }
resolve(response.Result) resolve(response.Result)
}
} else { } else {
reject(response.ErrorMessage) reject(response.ErrorMessage)
} }
@ -155,6 +221,9 @@ const actions = {
setTotalNeedSignSystemDocCount({ commit }, TotalNeedSignSystemDocCount) { setTotalNeedSignSystemDocCount({ commit }, TotalNeedSignSystemDocCount) {
commit('SET_NEED_SIGN_SYSTEM_DOC_COUNT', TotalNeedSignSystemDocCount) commit('SET_NEED_SIGN_SYSTEM_DOC_COUNT', TotalNeedSignSystemDocCount)
}, },
setIsFirstSysDocNeedSign({ commit }, IsFirstSysDocNeedSign) {
commit('SET_IS_FIRST_SYSTEM_DOC_SIGN', IsFirstSysDocNeedSign)
},
setTotalNeedSignTrialDocCount({ commit }, TotalNeedSignTrialDocCount) { setTotalNeedSignTrialDocCount({ commit }, TotalNeedSignTrialDocCount) {
commit('SET_NEED_SIGN_TRIALS_DOC_COUNT', TotalNeedSignTrialDocCount) commit('SET_NEED_SIGN_TRIALS_DOC_COUNT', TotalNeedSignTrialDocCount)
}, },
@ -170,32 +239,69 @@ const actions = {
commit('SET_PERMISSIONS', JSON.parse(zzSessionStorage.getItem('permissions'))) commit('SET_PERMISSIONS', JSON.parse(zzSessionStorage.getItem('permissions')))
commit('SET_ISTESTUSER', zzSessionStorage.getItem('isTestUser')) commit('SET_ISTESTUSER', zzSessionStorage.getItem('isTestUser'))
const user = JSON.parse(userString) const user = JSON.parse(userString)
commit('SET_NAME', zzSessionStorage.getItem('realName')) commit('SET_NAME', zzSessionStorage.getItem('Name'))
commit('SET_USERID', user.id) commit('SET_USERTYPESHORTNAME', user.userTypeShortName)
commit('SET_IDENTITYUSERID', user.identityUserId)
commit('SET_USERID', user.userRoleId)
commit('SET_USERNAME', zzSessionStorage.getItem('userName')) commit('SET_USERNAME', zzSessionStorage.getItem('userName'))
commit('SET_NEED_SIGN_SYSTEM_DOC_COUNT', parseInt(zzSessionStorage.getItem('TotalNeedSignSystemDocCount'))) commit('SET_NEED_SIGN_SYSTEM_DOC_COUNT', parseInt(zzSessionStorage.getItem('TotalNeedSignSystemDocCount')))
commit('SET_NEED_SIGN_TRIALS_DOC_COUNT', parseInt(zzSessionStorage.getItem('TotalNeedSignTrialDocCount'))) commit('SET_NEED_SIGN_TRIALS_DOC_COUNT', parseInt(zzSessionStorage.getItem('TotalNeedSignTrialDocCount')))
console.log(zzSessionStorage.getItem('TotalNeedSignSystemDocCount')) commit('SET_IS_FIRST_SYSTEM_DOC_SIGN', zzSessionStorage.getItem('IsFirstSysDocNeedSign'))
console.log(zzSessionStorage.getItem('TotalNeedSignTrialDocCount')) // console.log(zzSessionStorage.getItem('TotalNeedSignSystemDocCount'))
// console.log(zzSessionStorage.getItem('TotalNeedSignTrialDocCount'))
zzSessionStorage.setItem('userName', user.name) zzSessionStorage.setItem('userName', user.name)
zzSessionStorage.setItem('userId', user.id) zzSessionStorage.setItem('userId', user.userRoleId)
zzSessionStorage.setItem('identityUserId', user.identityUserId)
zzSessionStorage.setItem('userTypeShortName', user.userTypeShortName) zzSessionStorage.setItem('userTypeShortName', user.userTypeShortName)
zzSessionStorage.setItem('userTypeEnumInt', user.userTypeEnumInt) zzSessionStorage.setItem('userTypeEnumInt', user.userTypeEnumInt)
return user return user
}, },
updateInfo({ commit, state }) { updateInfo({ commit, state }) {
commit('SET_NAME', zzSessionStorage.getItem('realName')) commit('SET_NAME', zzSessionStorage.getItem('Name'))
},
// 获取用户信息
getUserInfo({ commit, state }) {
return new Promise((resolve, reject) => {
getUser().then(res => {
if (res.Result) {
commit('SET_ROLES', res.Result.AccountList)
}
resolve(res.Result)
}).catch(err => {
reject(err)
})
})
}, },
// user logout // user logout
async logout({ commit, state }) { async logout({ commit, state }) {
try { try {
removeToken() // must remove token first removeToken() // must remove token first
await loginOut({ await loginOut({
Userd: zzSessionStorage.getItem('userId') UserRoleId: zzSessionStorage.getItem('userId'),
IdentityUserId: zzSessionStorage.getItem('identityUserId'),
}) })
resetRouter() resetRouter()
removeName() removeName()
let lang = zzSessionStorage.getItem('lang')
zzSessionStorage.clear() zzSessionStorage.clear()
zzSessionStorage.setItem('lang', lang)
commit('RESET_STATE')
} catch (e) {
console.log(e)
}
},
async resetData({ commit, state }) {
try {
removeToken() // must remove token first
// await loginOut({
// UserRoleId: zzSessionStorage.getItem('userId'),
// IdentityUserId: zzSessionStorage.getItem('identityUserId'),
// })
resetRouter()
removeName()
let lang = zzSessionStorage.getItem('lang')
zzSessionStorage.clear()
zzSessionStorage.setItem('lang', lang)
commit('RESET_STATE') commit('RESET_STATE')
} catch (e) { } catch (e) {
console.log(e) console.log(e)

View File

@ -47,3 +47,6 @@
.el-range-separator { .el-range-separator {
box-sizing: content-box; box-sizing: content-box;
} }
.el-select-dropdown__wrap{
max-height: 350px;
}

View File

@ -1,4 +1,4 @@
@import "./variables.scss"; @import "./variables.module.scss";
@import "./mixin.scss"; @import "./mixin.scss";
@import "./transition.scss"; @import "./transition.scss";
@import "./element-ui.scss"; @import "./element-ui.scss";
@ -68,6 +68,12 @@ body .el-table th.gutter {
} }
} }
.text-ellipsis {
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.el-loading-mask { .el-loading-mask {
background-color: rgba(255, 255, 255, 0.5); background-color: rgba(255, 255, 255, 0.5);
} }

View File

@ -71,29 +71,49 @@ $sideBarWidth: 200px;
border: none; border: none;
height: 100%; height: 100%;
width: 100% !important; width: 100% !important;
background-color: $menuBg;
} }
// menu hover // menu hover
.submenu-title-noDropdown, .submenu-title-noDropdown,
.el-submenu__title { .el-submenu__title {
color: $menuText !important;
&:hover { &:hover {
background-color: $menuHover !important; background-color: $menuHover !important;
color: $menuActiveText !important;
} }
} }
.is-active>.el-submenu__title { .is-active>.el-submenu__title {
color: $subMenuActiveText !important; color: $subMenuActiveText !important;
} }
.el-menu-item {
& .nest-menu .el-submenu>.el-submenu__title, color: $menuText !important;
& .el-submenu .el-menu-item { }
.el-menu-item:focus,
.el-menu-item:hover {
background-color: $subMenuBg !important;
color: $menuActiveText !important;
}
.el-submenu .el-menu-item {
min-width: $sideBarWidth !important; min-width: $sideBarWidth !important;
background-color: $subMenuBg !important; background-color: $subMenuBg !important;
&:hover { &:hover {
background-color: $subMenuHover !important; background-color: $subMenuHover !important;
} }
} }
// &.nest-menu .el-submenu>.el-submenu__title,
// &.el-submenu .el-menu-item {
// min-width: $sideBarWidth !important;
// background-color: $subMenuBg !important;
// &:hover {
// background-color: $subMenuHover !important;
// }
// }
} }
.hideSidebar { .hideSidebar {

View File

@ -40,8 +40,9 @@ Vue.directive('dialogDrag', {
styL = +styL.replace(/\px/g, '') styL = +styL.replace(/\px/g, '')
styT = +styT.replace(/\px/g, '') styT = +styT.replace(/\px/g, '')
} }
const oldMousemove = document.onmousemove
document.onmousemove = function(e) { document.onmousemove = function(e) {
oldMousemove(e)
// 通过事件委托,计算移动的距离 // 通过事件委托,计算移动的距离
let left = e.clientX - disX let left = e.clientX - disX
let top = e.clientY - disY let top = e.clientY - disY
@ -63,7 +64,7 @@ Vue.directive('dialogDrag', {
} }
document.onmouseup = function(e) { document.onmouseup = function(e) {
document.onmousemove = null document.onmousemove = oldMousemove
document.onmouseup = null document.onmouseup = null
} }
return false return false

View File

@ -1,6 +1,6 @@
import defaultSettings from '@/settings' import defaultSettings from '@/settings'
const title = defaultSettings.title || 'IRCIS' const title = defaultSettings.title || 'IRC Imaging System'
export default function getPageTitle(pageTitle) { export default function getPageTitle(pageTitle) {
if (pageTitle) { if (pageTitle) {

View File

@ -34,7 +34,7 @@ export function parseTime(time, cFormat) {
const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => { const time_str = format.replace(/{([ymdhisa])+}/g, (result, key) => {
const value = formatObj[key] const value = formatObj[key]
// Note: getDay() returns 0 on Sunday // Note: getDay() returns 0 on Sunday
if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value ] } if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
return value.toString().padStart(2, '0') return value.toString().padStart(2, '0')
}) })
return time_str return time_str
@ -60,3 +60,35 @@ export function param2Obj(url) {
) )
} }
export function deepClone(source, map = new WeakMap()) {
// 处理基本类型和函数(直接返回)
if (typeof source !== 'object' || source === null) {
return source;
}
// 处理循环引用
if (map.has(source)) {
return map.get(source);
}
// 创建新容器
const target = Array.isArray(source) ? [] : {};
map.set(source, target); // 记录克隆关系
// 克隆普通键值
for (const key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = deepClone(source[key], map);
}
}
// 克隆Symbol键值ES6+
const symbolKeys = Object.getOwnPropertySymbols(source);
for (const symKey of symbolKeys) {
if (source.propertyIsEnumerable(symKey)) {
target[symKey] = deepClone(source[symKey], map);
}
}
return target;
}

View File

@ -39,6 +39,108 @@ function getNumberValues(dataSet, tag, minimumLength) {
return values; return values;
} }
function getLutDescriptor(dataSet, tag) {
if (!dataSet.elements[tag] || dataSet.elements[tag].length !== 6) {
return;
}
return [
dataSet.uint16(tag, 0),
dataSet.uint16(tag, 1),
dataSet.uint16(tag, 2),
];
}
function getLutData(lutDataSet, tag, lutDescriptor) {
const lut = [];
const lutData = lutDataSet.elements[tag];
for (let i = 0; i < lutDescriptor[0]; i++) {
// Output range is always unsigned
if (lutDescriptor[2] === 16) {
lut[i] = lutDataSet.uint16(tag, i);
} else {
lut[i] = lutDataSet.byteArray[i + lutData.dataOffset];
}
}
return lut;
}
function populateSmallestLargestPixelValues(dataSet, imagePixelModule) {
const pixelRepresentation = dataSet.uint16('x00280103');
if (pixelRepresentation === 0) {
imagePixelModule.smallestPixelValue = dataSet.uint16('x00280106');
imagePixelModule.largestPixelValue = dataSet.uint16('x00280107');
} else {
imagePixelModule.smallestPixelValue = dataSet.int16('x00280106');
imagePixelModule.largestPixelValue = dataSet.int16('x00280107');
}
imagePixelModule.largestPixelValue = imagePixelModule.largestPixelValue === 0 ? undefined : imagePixelModule.largestPixelValue;
}
function populatePaletteColorLut(dataSet, imagePixelModule) {
imagePixelModule.redPaletteColorLookupTableDescriptor = getLutDescriptor(
dataSet,
'x00281101'
);
imagePixelModule.greenPaletteColorLookupTableDescriptor = getLutDescriptor(
dataSet,
'x00281102'
);
imagePixelModule.bluePaletteColorLookupTableDescriptor = getLutDescriptor(
dataSet,
'x00281103'
);
// The first Palette Color Lookup Table Descriptor value is the number of entries in the lookup table.
// When the number of table entries is equal to 2ˆ16 then this value shall be 0.
// See http://dicom.nema.org/MEDICAL/DICOM/current/output/chtml/part03/sect_C.7.6.3.html#sect_C.7.6.3.1.5
if (imagePixelModule.redPaletteColorLookupTableDescriptor[0] === 0) {
imagePixelModule.redPaletteColorLookupTableDescriptor[0] = 65536;
imagePixelModule.greenPaletteColorLookupTableDescriptor[0] = 65536;
imagePixelModule.bluePaletteColorLookupTableDescriptor[0] = 65536;
}
// The third Palette Color Lookup Table Descriptor value specifies the number of bits for each entry in the Lookup Table Data.
// It shall take the value of 8 or 16.
// The LUT Data shall be stored in a format equivalent to 8 bits allocated when the number of bits for each entry is 8, and 16 bits allocated when the number of bits for each entry is 16, where in both cases the high bit is equal to bits allocated-1.
// The third value shall be identical for each of the Red, Green and Blue Palette Color Lookup Table Descriptors.
//
// Note: Some implementations have encoded 8 bit entries with 16 bits allocated, padding the high bits;
// this can be detected by comparing the number of entries specified in the LUT Descriptor with the actual value length of the LUT Data entry.
// The value length in bytes should equal the number of entries if bits allocated is 8, and be twice as long if bits allocated is 16.
const numLutEntries =
imagePixelModule.redPaletteColorLookupTableDescriptor[0];
const lutData = dataSet.elements.x00281201;
const lutBitsAllocated = lutData.length === numLutEntries ? 8 : 16;
// If the descriptors do not appear to have the correct values, correct them
if (
imagePixelModule.redPaletteColorLookupTableDescriptor[2] !==
lutBitsAllocated
) {
imagePixelModule.redPaletteColorLookupTableDescriptor[2] = lutBitsAllocated;
imagePixelModule.greenPaletteColorLookupTableDescriptor[2] =
lutBitsAllocated;
imagePixelModule.bluePaletteColorLookupTableDescriptor[2] =
lutBitsAllocated;
}
imagePixelModule.redPaletteColorLookupTableData = getLutData(
dataSet,
'x00281201',
imagePixelModule.redPaletteColorLookupTableDescriptor
);
imagePixelModule.greenPaletteColorLookupTableData = getLutData(
dataSet,
'x00281202',
imagePixelModule.greenPaletteColorLookupTableDescriptor
);
imagePixelModule.bluePaletteColorLookupTableData = getLutData(
dataSet,
'x00281203',
imagePixelModule.bluePaletteColorLookupTableDescriptor
);
}
function metaDataProvider(type, imageId) { function metaDataProvider(type, imageId) {
const parsedImageId = parseImageId(imageId); const parsedImageId = parseImageId(imageId);
const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(parsedImageId.url); const dataSet = cornerstoneWADOImageLoader.wadouri.dataSetCacheManager.get(parsedImageId.url);
@ -99,5 +201,52 @@ function metaDataProvider(type, imageId) {
columnPixelSpacing, columnPixelSpacing,
}; };
} }
if (type === 'imagePixelModule') {
const imagePixelModule = {
samplesPerPixel: dataSet.uint16('x00280002'),
photometricInterpretation: dataSet.string('x00280004'),
rows: dataSet.uint16('x00280010'),
columns: dataSet.uint16('x00280011'),
bitsAllocated: dataSet.uint16('x00280100'),
bitsStored: dataSet.uint16('x00280101'),
highBit: dataSet.uint16('x00280102'),
pixelRepresentation: dataSet.uint16('x00280103'),
planarConfiguration: dataSet.uint16('x00280006'),
pixelAspectRatio: dataSet.string('x00280034'),
};
populateSmallestLargestPixelValues(dataSet, imagePixelModule);
if (
imagePixelModule.photometricInterpretation === 'PALETTE COLOR' &&
dataSet.elements.x00281101
) {
populatePaletteColorLut(dataSet, imagePixelModule);
}
return imagePixelModule;
}
// if (type === 'imagePixelModule') {
// return {
// samplesPerPixel: dataSet.uint16('x00280002'),
// photometricInterpretation: dataSet.string('x00280004'),
// rows: dataSet.uint16('x00280010'),
// columns: dataSet.uint16('x00280011'),
// bitsAllocated: dataSet.uint16('x00280100'),
// bitsStored: dataSet.uint16('x00280101'),
// highBit: dataSet.uint16('x00280102'),
// pixelRepresentation: dataSet.uint16('x00280103'),
// planarConfiguration: dataSet.uint16('x00280006'),
// pixelAspectRatio: dataSet.uint16('x00280034'),
// smallestPixelValue: null,
// largestPixelValue: null,
// // smallestPixelValue: dataSet.uint16('x00280106'),
// // largestPixelValue: dataSet.uint16('x00280107'),
// redPaletteColorLookupTableDescriptor: dataSet.string('x00281101'),
// greenPaletteColorLookupTableDescriptor: dataSet.string('x00281102'),
// bluePaletteColorLookupTableDescriptor: dataSet.string('x00281103'),
// redPaletteColorLookupTableData: dataSet.string('x00281201'),
// greenPaletteColorLookupTableData: dataSet.string('x00281202'),
// bluePaletteColorLookupTableData: dataSet.string('x00281203')
// }
// }
} }
export default metaDataProvider; export default metaDataProvider;

View File

@ -445,7 +445,7 @@ function setTimer() {
totalBytes = totalBytes / 1024; totalBytes = totalBytes / 1024;
unit = "MB/s"; unit = "MB/s";
} }
store.state.trials.uploadTip = totalBytes.toFixed(2) + unit; store.state.trials.uploadTip = totalBytes.toFixed(3) + unit;
} }
if (timeList.length >= 5) { if (timeList.length >= 5) {
delete bytesReceivedPerSecond[timeList[0]] delete bytesReceivedPerSecond[timeList[0]]

View File

@ -150,7 +150,7 @@ function setTimer() {
totalBytes = totalBytes / 1024; totalBytes = totalBytes / 1024;
unit = "MB/s"; unit = "MB/s";
} }
store.state.trials.uploadTip = totalBytes.toFixed(2) + unit; store.state.trials.uploadTip = totalBytes.toFixed(3) + unit;
} }
if (timeList.length >= 5) { if (timeList.length >= 5) {
delete bytesReceivedPerSecond[timeList[0]] delete bytesReceivedPerSecond[timeList[0]]

View File

@ -0,0 +1,66 @@
let TYPES = ['word', 'cell', 'slide', 'pdf']
let DOCUMENTTYPE = {
'.doc': TYPES[0],
'.docm': TYPES[0],
'.docx': TYPES[0],
'.dot': TYPES[0],
'.dotm': TYPES[0],
'.dotx': TYPES[0],
'.epub': TYPES[0],
'.fb2': TYPES[0],
'.fodt': TYPES[0],
'.htm': TYPES[0],
'.html': TYPES[0],
'.mht': TYPES[0],
'.mhtml': TYPES[0],
'.odt': TYPES[0],
'.ott': TYPES[0],
'.pages': TYPES[0],
'.rtf': TYPES[0],
'.stw': TYPES[0],
'.sxw': TYPES[0],
'.txt': TYPES[0],
'.wps': TYPES[0],
'.wpt': TYPES[0],
'.xml': TYPES[0],
'.csv': TYPES[1],
'.et': TYPES[1],
'.ett': TYPES[1],
'.fods': TYPES[1],
'.numbers': TYPES[1],
'.ods': TYPES[1],
'.ots': TYPES[1],
'.sxc': TYPES[1],
'.xls': TYPES[1],
'.xlsb': TYPES[1],
'.xlsm': TYPES[1],
'.xlsx': TYPES[1],
'.xlt': TYPES[1],
'.xltm': TYPES[1],
'.xltx': TYPES[1],
'.xml': TYPES[1],
'.dps': TYPES[2],
'.dpt': TYPES[2],
'.fodp': TYPES[2],
'.key': TYPES[2],
'.odp': TYPES[2],
'.otp': TYPES[2],
'.pot': TYPES[2],
'.potm': TYPES[2],
'.potx': TYPES[2],
'.pps': TYPES[2],
'.ppsm': TYPES[2],
'.ppsx': TYPES[2],
'.ppt': TYPES[2],
'.pptm': TYPES[2],
'.pptx': TYPES[2],
'.sxi': TYPES[2],
'.djvu': TYPES[3],
'.docxf': TYPES[3],
'.oform': TYPES[3],
'.oxps': TYPES[3],
'.pdf': TYPES[3],
'.xps': TYPES[3]
}
export default DOCUMENTTYPE

View File

@ -41,7 +41,13 @@ async function ossGenerateSTS() {
let _vm = router.default.app let _vm = router.default.app
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') { if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') {
var objectItem = objectName.split('/') var objectItem = objectName.split('/')
objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1] // objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
0,
objectItem[objectItem.length - 1].lastIndexOf('.')
)}__${new Date().getTime()}${objectItem[objectItem.length - 1].substring(
objectItem[objectItem.length - 1].lastIndexOf('.')
).toLocaleLowerCase()}`
objectName = objectItem.join('/') objectName = objectItem.join('/')
} }
let res = await OSSclient.put(objectName, object) let res = await OSSclient.put(objectName, object)
@ -78,7 +84,13 @@ async function ossGenerateSTS() {
let _vm = router.default.app let _vm = router.default.app
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') { if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') {
var objectItem = data.path.split('/') var objectItem = data.path.split('/')
objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1] // objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
0,
objectItem[objectItem.length - 1].lastIndexOf('.')
)}__${new Date().getTime()}${objectItem[objectItem.length - 1].substring(
objectItem[objectItem.length - 1].lastIndexOf('.')
).toLocaleLowerCase()}`
data.path = objectItem.join('/') data.path = objectItem.join('/')
} }
let res = await customerHttp(OSSclient, data, progress); let res = await customerHttp(OSSclient, data, progress);
@ -185,7 +197,13 @@ function uploadAWS(aws, data, progress) {
let _vm = router.default.app let _vm = router.default.app
if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') { if (_vm._route.path !== '/trials/trials-panel/visit/crc-upload') {
var objectItem = data.path.split('/') var objectItem = data.path.split('/')
objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1] // objectItem[objectItem.length - 1] = new Date().getTime() + '_' + objectItem[objectItem.length - 1]
objectItem[objectItem.length - 1] = `${objectItem[objectItem.length - 1].substring(
0,
objectItem[objectItem.length - 1].lastIndexOf('.')
)}__${new Date().getTime()}${objectItem[objectItem.length - 1].substring(
objectItem[objectItem.length - 1].lastIndexOf('.')
).toLocaleLowerCase()}`
data.path = objectItem.join('/') data.path = objectItem.join('/')
} }
let bucketName = data.path.split("/")[1] || Vue.prototype.OSSclientConfig.bucket let bucketName = data.path.split("/")[1] || Vue.prototype.OSSclientConfig.bucket

View File

@ -189,8 +189,8 @@ const dicomToPng = (imageId, width, height) => {
return new Promise((resolve) => { return new Promise((resolve) => {
cornerstone.loadImage(imageId).then(async (image) => { cornerstone.loadImage(imageId).then(async (image) => {
let canvas = document.createElement("canvas"); let canvas = document.createElement("canvas");
canvas.width = width; canvas.width = (width * 60) / height
canvas.height = height; canvas.height = 60
if (image) { if (image) {
cornerstone.renderToCanvas(canvas, image); cornerstone.renderToCanvas(canvas, image);
// 将 Canvas 图像对象转换为 PNG 格式 // 将 Canvas 图像对象转换为 PNG 格式

View File

@ -50,7 +50,8 @@ service.interceptors.response.use(
const a = document.createElement('a') const a = document.createElement('a')
// xls类型: application/vnd.ms-excel // xls类型: application/vnd.ms-excel
// xlsx类型application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8 // xlsx类型application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
const href = URL.createObjectURL(new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' })) // const href = URL.createObjectURL(new Blob([res], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8' }))
const href = URL.createObjectURL(new Blob([res], { type: response.headers['content-type'] }))
a.download = fileName a.download = fileName
a.href = href a.href = href
a.click() a.click()
@ -89,9 +90,9 @@ service.interceptors.response.use(
}) })
store.dispatch('user/logout').then(() => { store.dispatch('user/logout').then(() => {
router.push(`/login`) router.push(`/login`)
this.$i18n.locale = 'zh' //this.$i18n.locale = 'zh'
this.setLanguage('zh') //this.setLanguage('zh')
this.$updateDictionary() // this.$updateDictionary()
}) })
} }
} else { } else {

View File

@ -1,14 +1,15 @@
import axios from 'axios' import axios from 'axios'
import _vm from '@/main'
import { Message, MessageBox, Alert } from 'element-ui' import { Message, MessageBox, Alert } from 'element-ui'
import store from '@/store' import store from '@/store'
import router from '@/router' import router from '@/router'
import WHITELIST from "./whiteList" import WHITELIST from "./whiteList"
import moment from 'moment-timezone'; import moment from 'moment-timezone';
import { encryptConfig } from "@/utils/encrypt" import { encryptConfig } from "@/utils/encrypt"
const ROUTER = require('@/router');
axios.defaults.withCredentials = false axios.defaults.withCredentials = false
const service = axios.create({ const service = axios.create({
baseURL: '/api', baseURL: '/api',
// baseURL: process.env.NODE_ENV === 'prod' ? "https://api.irc.extimaging.com" : '/api',
timeout: 2 * 360000, // request timeout timeout: 2 * 360000, // request timeout
withCredentials: false withCredentials: false
}) })
@ -20,6 +21,8 @@ service.interceptors.request.use(
async config => { async config => {
path = router && router.app && router.app._route && router.app._route.path path = router && router.app && router.app._route && router.app._route.path
config.headers['Content-Type'] = 'application/json;charset=UTF-8' config.headers['Content-Type'] = 'application/json;charset=UTF-8'
// config.baseURL = process.env.NODE_ENV === 'prod' ? "https://api.irc.extimaging.com" : '/api'
config.headers['Self-Referer'] = window.location.href
var language = zzSessionStorage.getItem('lang') var language = zzSessionStorage.getItem('lang')
config.headers['Accept-Language'] = language === 'en' ? 'en-US,en;q=0.5' : 'zh-CN,zh;q=0.9' config.headers['Accept-Language'] = language === 'en' ? 'en-US,en;q=0.5' : 'zh-CN,zh;q=0.9'
config.headers['TimeZoneId'] = moment.tz.guess() config.headers['TimeZoneId'] = moment.tz.guess()
@ -91,13 +94,20 @@ service.interceptors.response.use(
const status = error.response.status const status = error.response.status
if (error.response.data && (error.response.data.Code === -1 || error.response.data.Code === -2)) { if (error.response.data && (error.response.data.Code === -1 || error.response.data.Code === -2)) {
store.dispatch('user/logout').then(() => { store.dispatch('user/logout').then(() => {
if (_vm.$msgbox) { let _vm = ROUTER.default.app
try {
if (_vm.$msgbox && _vm.$msgbox.close) {
_vm.$msgbox.close(); _vm.$msgbox.close();
} }
} catch (err) {
console.log(err)
}
router.push(`/login`) router.push(`/login`)
this.$i18n.locale = 'zh' // if (!this.$i18n.locale) {
this.setLanguage('zh') // //this.$i18n.locale = 'zh'
this.$updateDictionary() // //this.setLanguage('zh')
// }
// this.$updateDictionary()
}) })
} }
switch (status) { switch (status) {
@ -127,9 +137,9 @@ service.interceptors.response.use(
} }
store.dispatch('user/logout').then(() => { store.dispatch('user/logout').then(() => {
router.push(`/login`) router.push(`/login`)
this.$i18n.locale = 'zh' // //this.$i18n.locale = 'zh'
this.setLanguage('zh') // //this.setLanguage('zh')
this.$updateDictionary() // this.$updateDictionary()
}) })
} else { } else {
setTimer({ setTimer({
@ -143,6 +153,7 @@ service.interceptors.response.use(
setTimer([message, store.state.lang.language === 'en' ? 'Warning' : '警告', { setTimer([message, store.state.lang.language === 'en' ? 'Warning' : '警告', {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
confirmButtonText: store.state.lang.language === 'en' ? 'ok' : "确定",
callback: action => { } callback: action => { }
}], 'confirm') }], 'confirm')
} }
@ -153,6 +164,7 @@ service.interceptors.response.use(
[store.state.lang.language === 'en' ? 'Please check your networkand try again later' : '请检查网络,稍后重试!', store.state.lang.language === 'en' ? 'Warning' : '警告', { [store.state.lang.language === 'en' ? 'Please check your networkand try again later' : '请检查网络,稍后重试!', store.state.lang.language === 'en' ? 'Warning' : '警告', {
type: 'warning', type: 'warning',
showCancelButton: false, showCancelButton: false,
confirmButtonText: store.state.lang.language === 'en' ? 'ok' : "确定",
callback: action => { } callback: action => { }
}], "confirm" }], "confirm"
) )
@ -171,6 +183,8 @@ const setTimer = (obj, type) => {
Message(obj) Message(obj)
} }
if (type === 'confirm') { if (type === 'confirm') {
obj[2].closeOnClickModal = false
obj[2].closeOnPressEscape = false
MessageBox.confirm(...obj) MessageBox.confirm(...obj)
} }
clearTimeout(timer); clearTimeout(timer);

View File

@ -20,7 +20,7 @@ function zipFiles(zipName, files) {
ctrl.close(); ctrl.close();
} else { } else {
let { name, url } = fileInfo.value; let { name, url } = fileInfo.value;
url = decodeUtf8(url); // url = decodeUtf8(url); // 待定,可能做过特殊处理
return fetch(url).then(res => { return fetch(url).then(res => {
ctrl.enqueue({ ctrl.enqueue({
name, name,
@ -58,7 +58,7 @@ async function updateFile(file, name) {
try { try {
store.dispatch('trials/setUnLock', true) store.dispatch('trials/setUnLock', true)
const fileOutputStream = streamSaver.createWriteStream(name); const fileOutputStream = streamSaver.createWriteStream(name);
file = decodeUtf8(file); // file = decodeUtf8(file);
let res = await fetch(file); let res = await fetch(file);
res.body.pipeTo(fileOutputStream).then(() => { res.body.pipeTo(fileOutputStream).then(() => {
store.dispatch('trials/setUnLock', true) store.dispatch('trials/setUnLock', true)

View File

@ -17,7 +17,7 @@
</el-form-item> </el-form-item>
<el-form-item label="是否内部角色: " prop="IsInternal"> <el-form-item label="是否内部角色: " prop="IsInternal">
<el-radio-group v-model="form.IsInternal"> <el-radio-group v-model="form.IsInternal">
<el-radio v-for="item of $d.YesOrNo" :label="item.value">{{ item.label }}</el-radio> <el-radio v-for="item of $d.YesOrNo" :key="`IsInternal${item.value}`" :label="item.value">{{ item.label }}</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>

View File

@ -5,7 +5,7 @@
:model="user" :model="user"
:rules="userFormRules" :rules="userFormRules"
label-width="150px" label-width="150px"
style="width:800px;" style="width: 800px"
> >
<el-card class="Basic" shadow="never" size="small"> <el-card class="Basic" shadow="never" size="small">
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
@ -25,7 +25,7 @@
<el-form-item label="Given Name: " prop="FirstName"> <el-form-item label="Given Name: " prop="FirstName">
<el-input v-model="user.FirstName" /> <el-input v-model="user.FirstName" />
</el-form-item> </el-form-item>
<el-form-item label="Gender: " prop="Sex" style="margin-right:40px;"> <el-form-item label="Gender: " prop="Sex" style="margin-right: 40px">
<el-radio-group v-model="user.Sex"> <el-radio-group v-model="user.Sex">
<el-radio :label="1">Male</el-radio> <el-radio :label="1">Male</el-radio>
<el-radio :label="0">Female</el-radio> <el-radio :label="0">Female</el-radio>
@ -37,13 +37,24 @@
<el-form-item label="Phone: " prop="Phone"> <el-form-item label="Phone: " prop="Phone">
<el-input v-model="user.Phone" /> <el-input v-model="user.Phone" />
</el-form-item> </el-form-item>
<el-form-item v-if="type==1" label="Disable:"> <el-form-item v-if="type == 1" label="Disable:">
<el-switch v-model="user.Status" :active-value="0" :inactive-value="1" /> <el-switch
v-model="user.Status"
:active-value="0"
:inactive-value="1"
/>
</el-form-item> </el-form-item>
<el-form-item label="User Type: " prop="UserTypeId"> <el-form-item label="User Type: " prop="UserTypeId">
<el-select ref="userType" v-model="user.UserTypeId" size="small" placeholder="Please select" style="width:100%;" :disabled="user.CanEditUserType === false"> <el-select
ref="userType"
v-model="user.UserTypeId"
size="small"
placeholder="Please select"
style="width: 100%"
:disabled="user.CanEditUserType === false"
>
<el-option <el-option
v-for="(userType,key) of userTypeOptions" v-for="(userType, key) of userTypeOptions"
:key="key" :key="key"
:label="userType.UserType" :label="userType.UserType"
:value="userType.Id" :value="userType.Id"
@ -52,17 +63,28 @@
</el-form-item> </el-form-item>
</el-card> </el-card>
<el-card class="Affiliation" shadow="never" style="margin-top:10px;" size="small"> <el-card
class="Affiliation"
shadow="never"
style="margin-top: 10px"
size="small"
>
<div slot="header" class="clearfix"> <div slot="header" class="clearfix">
<span>Affiliation</span> <span>Affiliation</span>
</div> </div>
<el-form-item prop="IsZhiZhun"> <el-form-item prop="IsZhiZhun">
<el-radio-group v-model="user.IsZhiZhun" @change="OrgnizationTypeChanged"> <el-radio-group
v-model="user.IsZhiZhun"
@change="OrgnizationTypeChanged"
>
<el-radio :label="true">Internal</el-radio> <el-radio :label="true">Internal</el-radio>
<el-radio :label="false">External</el-radio> <el-radio :label="false">External</el-radio>
</el-radio-group> </el-radio-group>
</el-form-item> </el-form-item>
<el-form-item v-show="user.IsZhiZhun === false" label="Organization Name: "> <el-form-item
v-show="user.IsZhiZhun === false"
label="Organization Name: "
>
<el-input v-model="user.OrganizationName" /> <el-input v-model="user.OrganizationName" />
</el-form-item> </el-form-item>
@ -78,19 +100,24 @@
type="primary" type="primary"
size="small" size="small"
:disabled="isDisabled" :disabled="isDisabled"
style="margin:10px 15px" style="margin: 10px 15px"
@click="handleSave" @click="handleSave"
>Save</el-button> >Save</el-button
>
</el-form-item> </el-form-item>
</el-form> </el-form>
</template> </template>
<script> <script>
import { getUser, addUser, updateUser, getUserTypeListByUserType } from '@/api/admin.js' import {
getUser,
addUser,
updateUser,
getUserTypeListByUserType,
} from '@/api/admin.js'
export default { export default {
name: 'UserInfo', name: 'UserInfo',
props: { props: {
userId: { type: String, default: '' } userId: { type: String, default: '' },
}, },
data() { data() {
return { return {
@ -105,60 +132,69 @@ export default {
IsZhiZhun: '', IsZhiZhun: '',
OrganizationName: '', OrganizationName: '',
DepartmentName: '', DepartmentName: '',
PositionName: '' PositionName: '',
}, },
userFormRules: { userFormRules: {
UserName: [ UserName: [
{ required: true, message: 'Please specify', trigger: 'blur' }, { required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' } { max: 50, message: 'The maximum length is 50' },
], ],
UserTypeId: [ UserTypeId: [
{ required: true, message: 'Please Select', trigger: ['blur', 'change'] } {
required: true,
message: 'Please Select',
trigger: ['blur', 'change'],
},
], ],
IsZhiZhun: [ IsZhiZhun: [
{ required: true, message: 'Please Select', trigger: ['blur', 'change'] } {
required: true,
message: 'Please Select',
trigger: ['blur', 'change'],
},
], ],
OrganizationName: [ OrganizationName: [
{ required: true, message: 'Please specify', trigger: 'blur' } { required: true, message: 'Please specify', trigger: 'blur' },
], ],
LastName: [ LastName: [
{ required: true, message: 'Please specify', trigger: 'blur' }, { required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' } { max: 50, message: 'The maximum length is 50' },
], ],
FirstName: [ FirstName: [
{ required: true, message: 'Please specify', trigger: 'blur' }, { required: true, message: 'Please specify', trigger: 'blur' },
{ max: 50, message: 'The maximum length is 50' } { max: 50, message: 'The maximum length is 50' },
], ],
Phone: [ Phone: [
{ max: 20, min: 7, message: 'The length is 7 to 20', trigger: ['blur'] } {
max: 20,
min: 7,
message: 'The length is 7 to 20',
trigger: ['blur'],
},
], ],
EMail: [ EMail: [
{ {
required: true, required: true,
message: 'Please input the email address', message: 'Please input the email address',
trigger: 'blur' trigger: 'blur',
}, },
{ {
type: 'email', type: 'email',
message: 'Please input the correct email address', message: 'Please input the correct email address',
trigger: ['blur'] trigger: ['blur'],
}, },
{ max: 50, message: 'The maximum length is 50' } { max: 50, message: 'The maximum length is 50' },
],
Sex: [
{ required: true, message: 'Please specify', trigger: 'blur' }
], ],
Sex: [{ required: true, message: 'Please specify', trigger: 'blur' }],
Status: [ Status: [
{ required: true, message: 'Please specify', trigger: 'blur' } { required: true, message: 'Please specify', trigger: 'blur' },
], ],
DepartmentName: [ DepartmentName: [{ max: 50, message: 'The maximum length is 50' }],
{ max: 50, message: 'The maximum length is 50' }], PositionName: [{ max: 50, message: 'The maximum length is 50' }],
PositionName: [{ max: 50, message: 'The maximum length is 50' }
]
}, },
userTypeOptions: [], userTypeOptions: [],
isDisabled: false, isDisabled: false,
type: 0 // 10 type: 0, // 10
} }
}, },
created() { created() {
@ -172,46 +208,58 @@ export default {
}, },
methods: { methods: {
handleSave() { handleSave() {
this.$refs.userForm.validate(valid => { this.$refs.userForm.validate((valid) => {
if (valid) { if (valid) {
this.isDisabled = true this.isDisabled = true
const selectedUserType = this.userTypeOptions.filter(item => item.Id === this.user.UserTypeId) const selectedUserType = this.userTypeOptions.filter(
(item) => item.Id === this.user.UserTypeId
)
if (selectedUserType.length > 0) { if (selectedUserType.length > 0) {
this.user.UserTypeEnum = selectedUserType[0].UserTypeEnum this.user.UserTypeEnum = selectedUserType[0].UserTypeEnum
} }
if (this.user.Id) { if (this.user.Id) {
updateUser(this.user).then(res => { updateUser(this.user)
.then((res) => {
this.isDisabled = false this.isDisabled = false
this.$message.success('Updated successfully') this.$message.success('Updated successfully')
}).catch(() => { this.isDisabled = false }) })
.catch(() => {
this.isDisabled = false
})
} else { } else {
addUser(this.user).then(res => { addUser(this.user)
.then((res) => {
this.isDisabled = false this.isDisabled = false
this.user.Id = res.Result.Id this.user.Id = res.Result.Id
this.user.UserCode = res.Result.UserCode this.user.UserCode = res.Result.UserCode
this.$emit('getUserId', res.Result.Id) this.$emit('getUserId', res.Result.Id)
this.$message.success('Added successfully') this.$message.success('Added successfully')
this.$router.push({ path: '/system/user/list' }) this.$router.push({ path: '/system/user/list' })
}).catch(() => { this.isDisabled = false }) })
.catch(() => {
this.isDisabled = false
})
} }
} }
}) })
}, },
getUserTypeList() { getUserTypeList() {
getUserTypeListByUserType(0).then(res => { getUserTypeListByUserType(0).then((res) => {
if (res.IsSuccess) { if (res.IsSuccess) {
this.userTypeOptions = res.Result this.userTypeOptions = res.Result
} }
}) })
}, },
getUserInfo() { getUserInfo() {
getUser(this.userId).then(res => { getUser({
IdentityUserId: this.userId,
}).then((res) => {
this.user = res.Result this.user = res.Result
}) })
}, },
OrgnizationTypeChanged(val) { OrgnizationTypeChanged(val) {
this.user.OrganizationName = '' this.user.OrganizationName = ''
} },
} },
} }
</script> </script>

View File

@ -27,7 +27,7 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .el-collapse-item__header{ ::v-deep .el-collapse-item__header{
background-color: #e9eef1; background-color: #e9eef1;
padding: 0 10px; padding: 0 10px;
} }

View File

@ -195,7 +195,7 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
/deep/ .el-collapse-item__header{ ::v-deep .el-collapse-item__header{
background-color: #e9eef1; background-color: #e9eef1;
padding: 0 10px; padding: 0 10px;
} }

View File

@ -131,8 +131,8 @@ export default {
.then(() => { .then(() => {
this.$store.dispatch('user/logout').then(res => { this.$store.dispatch('user/logout').then(res => {
this.$router.push(`/login`) this.$router.push(`/login`)
this.$i18n.locale = 'zh' //this.$i18n.locale = 'zh'
this.setLanguage('zh') //this.setLanguage('zh')
this.$updateDictionary() this.$updateDictionary()
}) })
}) })

View File

@ -1,5 +1,5 @@
<template> <template>
<div ref="preview-wrapper"> <div ref="preview-wrapper" class="preview-wrapper">
<div class="viewerContainer"> <div class="viewerContainer">
<div class="viewerContentWrapper" style="padding-top:25px;"> <div class="viewerContentWrapper" style="padding-top:25px;">
<div class="viewerLeftSidePanel"> <div class="viewerLeftSidePanel">
@ -38,7 +38,39 @@
</span> </span>
</span>--> </span>-->
<div class="viewernavitextwrapper"> <div class="viewernavitextwrapper">
<div style="padding: 1px 5px 1px 1px;display: flex;justify-content: space-between;">
<div style="padding: 1px;">#{{ item.seriesNumber }}</div> <div style="padding: 1px;">#{{ item.seriesNumber }}</div>
<div v-if="item.isExistMutiFrames && item.instanceCount > 1">
<el-popover
v-model="item.isShowPopper"
placement="right-start"
trigger="manual"
popper-class="instance_frame_wrapper"
>
<div style="text-align: right;">
<i class="el-icon-circle-close" style="font-size: 20px;cursor: pointer;color:#ddd;" @click="item.isShowPopper = false" />
</div>
<div class="frame_list">
<div
v-for="(instance, idx) in item.instanceInfoList"
:key="instance.InstanceUid"
class="frame_content"
:style="{'margin-bottom':idx<item.instanceInfoList.length-1? '5px':'0px'}"
@click="showMultiFrames(item, index, instance)"
>
<div>
<div>{{ instance.InstanceNumber }}</div>
<div>
{{ `${instance.NumberOfFrames > 0 ? instance.NumberOfFrames : 1} frame` }}
</div>
</div>
</div>
</div>
<i slot="reference" class="el-icon-connection" style="font-size: 15px;cursor: pointer;" @click="popperClick(seriesList, item)" />
</el-popover>
</div>
</div>
<div style="padding: 1px;">{{ item.description }}</div> <div style="padding: 1px;">{{ item.description }}</div>
<div <div
v-show="item.instanceCount" v-show="item.instanceCount"
@ -147,7 +179,11 @@ export default {
}) })
var imageIds = [] var imageIds = []
let isExistMutiFrames = false
let instanceInfoList = []
series.instanceList.forEach(function(instance) { series.instanceList.forEach(function(instance) {
console.log(instance)
let instanceInfo = {}
var fileId = cornerstoneWADOImageLoader.wadouri.fileManager.add( var fileId = cornerstoneWADOImageLoader.wadouri.fileManager.add(
instance.file instance.file
) )
@ -155,7 +191,19 @@ export default {
for (var i = 0; i < instance.frameCount; ++i) { for (var i = 0; i < instance.frameCount; ++i) {
imageIds.push(`${fileId}?frame=${i}`) imageIds.push(`${fileId}?frame=${i}`)
} }
} else imageIds.push(fileId) isExistMutiFrames = true
instanceInfo.NumberOfFrames = instance.frameCount
instanceInfo.InstanceNumber = instance.instanceNumber
instanceInfo.InstanceUid = instance.instanceUid
instanceInfo.FileId = fileId
} else {
imageIds.push(fileId)
instanceInfo.NumberOfFrames = 0
instanceInfo.InstanceNumber = instance.instanceNumber
instanceInfo.InstanceUid = instance.instanceUid
instanceInfo.FileId = fileId
}
instanceInfoList.push(instanceInfo)
}) })
scope.seriesList.push({ scope.seriesList.push({
@ -164,13 +212,43 @@ export default {
modality: series.modality, modality: series.modality,
instanceCount: series.instanceList.length, instanceCount: series.instanceList.length,
imageIds: imageIds, imageIds: imageIds,
previewImageId: imageIds[0] previewImageId: imageIds[0],
isExistMutiFrames: isExistMutiFrames,
instanceInfoList: instanceInfoList,
isShowPopper: false
}) })
}) })
this.showSeriesImage(0) this.showSeriesImage(0)
}, },
popperClick(seriesList, series) {
for (let i = 0; i < seriesList.length; i++) {
if (seriesList[i].isShowPopper) {
seriesList[i].isShowPopper = false
}
}
series.isShowPopper = !series.isShowPopper
},
showMultiFrames(series, seriesIndex, instanceInfo) {
this.currentSeriesIndex = seriesIndex
const imageIds = []
if (instanceInfo.NumberOfFrames && instanceInfo.NumberOfFrames > 1) {
for (let j = 0; j < instanceInfo.NumberOfFrames; j++) {
imageIds.push(`${instanceInfo.FileId}?frame=${j}`)
}
} else {
imageIds.push(instanceInfo.FileId)
}
const seriesInfo = {
seriesNumber: series.seriesNumber,
description: series.description,
modality: series.modality,
instanceCount: series.instanceCount,
imageIds: imageIds,
previewImageId: imageIds[0],
}
this.$refs.dicomViewer.loadImageStack(seriesInfo)
},
showSeriesImage(seriesIndex) { showSeriesImage(seriesIndex) {
// if (seriesIndex === this.currentSeriesIndex) return; // if (seriesIndex === this.currentSeriesIndex) return;
this.currentSeriesIndex = seriesIndex this.currentSeriesIndex = seriesIndex
@ -183,18 +261,19 @@ export default {
} }
</script> </script>
<style scoped> <style lang="scss">
::-webkit-scrollbar { ::-webkit-scrollbar {
width: 7px; width: 7px;
height: 7px; height: 7px;
} }
::-webkit-scrollbar-thumb { ::-webkit-scrollbar-thumb {
border-radius: 10px; border-radius: 10px;
background: #d0d0d0; background: #d0d0d0;
} }
.viewerContainer { .viewerContainer {
width: 100%;
display: block; display: block;
height: 100%; height: 100%;
margin-top: 20px; margin-top: 20px;
@ -202,9 +281,9 @@ export default {
margin-right: auto; margin-right: auto;
background-color: #444; background-color: #444;
overflow: hidden; overflow: hidden;
} }
.viewerBanner { .viewerBanner {
background: linear-gradient(0, #444, #222); background: linear-gradient(0, #444, #222);
min-height: 28px; min-height: 28px;
font-size: 16px; font-size: 16px;
@ -214,9 +293,9 @@ export default {
padding-left: 5px; padding-left: 5px;
padding-right: 5px; padding-right: 5px;
font-weight: bold; font-weight: bold;
} }
.viewerContentWrapper { .viewerContentWrapper {
display: flex; display: flex;
flex-direction: row; flex-direction: row;
width: 100%; width: 100%;
@ -226,14 +305,14 @@ export default {
overflow: hidden; overflow: hidden;
text-overflow: clip; text-overflow: clip;
white-space: nowrap; white-space: nowrap;
} }
.viewerContentWrapper > div { .viewerContentWrapper > div {
display: inline-block; display: inline-block;
white-space: normal; white-space: normal;
} }
.viewerLeftSidePanel { .viewerLeftSidePanel {
width: 200px; width: 200px;
background-color: #323232; background-color: #323232;
box-sizing: border-box; box-sizing: border-box;
@ -242,39 +321,39 @@ export default {
margin-right: 2px; margin-right: 2px;
color: #d0d0d0; color: #d0d0d0;
overflow-y: auto; overflow-y: auto;
} }
.viewerContentWrapper > div > .sidePanelBody { .viewerContentWrapper > div > .sidePanelBody {
background: rgba(50, 50, 50, 1); background: rgba(50, 50, 50, 1);
word-break: break-all; word-break: break-all;
display: table; display: table;
width: 100%; width: 100%;
border: 1px solid #3e3f3a; border: 1px solid #3e3f3a;
} }
.viewerContentWrapper > div > div.sidePanelBody > div { .viewerContentWrapper > div > div.sidePanelBody > div {
width: 100%; width: 100%;
height: 100%; height: 100%;
} }
.studyDesc { .studyDesc {
font-weight: bold; font-weight: bold;
font-size: 13px; font-size: 13px;
text-align: center; text-align: center;
background: rgb(88 84 83); background: rgb(88 84 83);
color: #d0d0d0; color: #d0d0d0;
padding: 5px; padding: 5px;
} }
.ps { .ps {
overflow: hidden !important; overflow: hidden !important;
overflow-anchor: none; overflow-anchor: none;
-ms-overflow-style: none; -ms-overflow-style: none;
touch-action: auto; touch-action: auto;
-ms-touch-action: auto; -ms-touch-action: auto;
} }
.viewerLeftSidePanel .viewernavigatorwrapper { .viewerLeftSidePanel .viewernavigatorwrapper {
display: flex; display: flex;
width: 196px; width: 196px;
height: 84px; height: 84px;
@ -282,37 +361,72 @@ export default {
margin: 6px 0 6px 1px; margin: 6px 0 6px 1px;
border-radius: 2px; border-radius: 2px;
border: 1px solid #404040; border: 1px solid #404040;
} }
.ui-draggable-handle { .ui-draggable-handle {
-ms-touch-action: none; -ms-touch-action: none;
touch-action: none; touch-action: none;
} }
.viewerLeftSidePanel .image-preview { .viewerLeftSidePanel .image-preview {
border: 2px solid #252525; border: 2px solid #252525;
cursor: pointer; cursor: pointer;
} }
.viewerLeftSidePanel .viewernavitextwrapper { .viewerLeftSidePanel .viewernavitextwrapper {
flex: 1; flex: 1;
padding: 3px 1px 3px 4px; padding: 3px 1px 3px 4px;
vertical-align: top; vertical-align: top;
font-size: 12px; font-size: 12px;
} }
.viewerSideActive { .viewerSideActive {
background: #16477b; background: #16477b;
background: #16477b80; background: #16477b80;
border: 1px solid #23527b; border: 1px solid #23527b;
} }
.viewerContent { .viewerContent {
flex: 1; flex: 1;
height: 100%; height: 100%;
display: block; display: block;
background-color: black; background-color: black;
color: #d0d0d0; color: #d0d0d0;
font-size: 13px; font-size: 13px;
} }
.instance_frame_wrapper{
min-width: 120px;
background-color: #2c2c2c;
border: 1px solid #2c2c2c;
padding: 5px;
}
.frame_list{
max-height: 500px;
overflow-y: auto;
}
.instance_frame_wrapper ::-webkit-scrollbar {
width: 7px;
height: 7px;
}
.instance_frame_wrapper ::-webkit-scrollbar-thumb {
border-radius: 10px;
background: #d0d0d0;
}
.frame_content{
/* height: 50px; */
padding: 10px;
display: flex;
justify-content: flex-start;
color: #ddd;
font-size: 12px;
border: 1px solid #404040;
}
.frame_content:hover {
/* font-weight: bold; */
/* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */
cursor: pointer;
/* color: #428bca; */
border-color: #213a54 !important;
background-color: #213a54;
}
</style> </style>

Some files were not shown because too many files have changed in this diff Show More