Compare commits

...

2585 Commits

Author SHA1 Message Date
he b143ffbcfc 角色禁用不发邮件
continuous-integration/drone/push Build is passing Details
2025-06-20 16:57:59 +08:00
he 1d8be8c04b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-20 16:46:25 +08:00
he 139e1f8186 退出项目不发邮件 2025-06-20 16:46:24 +08:00
hang 81cb43d3a3 修改PD 逻辑
continuous-integration/drone/push Build is passing Details
2025-06-20 16:21:28 +08:00
hang c2db7a2c61 修改项目邮件配置
continuous-integration/drone/push Build is passing Details
2025-06-20 14:46:02 +08:00
hang 8cd19b929c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-20 14:25:43 +08:00
hang c62e7b13a9 修改搜索查询 2025-06-20 14:25:38 +08:00
he fc81738176 修改文档发布发邮件
continuous-integration/drone/push Build is passing Details
2025-06-20 14:10:33 +08:00
he b1e1840c87 修改阅片期计划的排序
continuous-integration/drone/push Build is passing Details
2025-06-20 14:03:37 +08:00
he b31d7ee762 阅片期计划可以选择基线
continuous-integration/drone/push Build is passing Details
2025-06-20 13:55:34 +08:00
he fb0c3879cf 邮件发送
continuous-integration/drone/push Build is passing Details
2025-06-20 11:53:25 +08:00
he 5ffe788a3b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-20 09:31:57 +08:00
he 056573874a 修改受试者内随机 2025-06-20 09:31:55 +08:00
hang c959a47fa6 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-19 17:35:27 +08:00
hang 41fe678708 CDISC导表库bug 2025-06-19 17:35:24 +08:00
he e7bbf09a50 修改稽查的单位翻译
continuous-integration/drone/push Build is passing Details
2025-06-19 16:33:21 +08:00
he 3bd16d7fce 邮件修改
continuous-integration/drone/push Build is passing Details
2025-06-19 16:18:01 +08:00
he db1d1b0f14 修改
continuous-integration/drone/push Build is passing Details
2025-06-19 15:08:24 +08:00
he ef980fdc68 邮件修改
continuous-integration/drone/push Build is passing Details
2025-06-19 14:31:41 +08:00
he 4de186a36b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-19 14:16:54 +08:00
he 0dd73991f0 邮件修改 2025-06-19 14:16:52 +08:00
hang 27e8e0e79c 修改子项排序
continuous-integration/drone/push Build is passing Details
2025-06-19 13:32:34 +08:00
hang fa53d6e88e 修改标准查询条件
continuous-integration/drone/push Build is passing Details
2025-06-19 11:37:54 +08:00
hang f3fc3fa4bf 修改邮件配置
continuous-integration/drone/push Build is passing Details
2025-06-19 11:26:17 +08:00
hang 476f692355 禁用人员系统查看文档
continuous-integration/drone/push Build is passing Details
2025-06-19 10:32:11 +08:00
hang 41b2a638fe 完全随机触发系统盲态名称
continuous-integration/drone/push Build is passing Details
2025-06-19 10:21:33 +08:00
hang c3631eee51 修改有序阅片生成任务bug
continuous-integration/drone/push Build is passing Details
2025-06-18 18:06:16 +08:00
hang 3ed74a578e 修改邮件配置为适配多标准
continuous-integration/drone/push Build is passing Details
2025-06-18 17:14:13 +08:00
hang 918728a42e 修改日志保留天数
continuous-integration/drone/push Build is passing Details
2025-06-18 13:57:50 +08:00
hang a8c0bef99e 关键图像-加上条件,已签名的才导出
continuous-integration/drone/push Build is passing Details
2025-06-18 13:05:53 +08:00
hang b3468a6d1b 修改影像下载bug
continuous-integration/drone/push Build is passing Details
2025-06-18 10:40:14 +08:00
hang dba8d3c964 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-18 10:33:29 +08:00
hang 8f5b024d3b 修改导表bug 2025-06-18 10:33:28 +08:00
he ea836d9349 修改阅片期计划生成裁判的逻辑
continuous-integration/drone/push Build is passing Details
2025-06-17 16:45:09 +08:00
he c32878911d 生成阅片期计划的时候 产生裁判 2025-06-17 16:45:07 +08:00
hang 0c4bd680dd 增加影像统计导出
continuous-integration/drone/push Build is passing Details
2025-06-17 16:30:13 +08:00
hang 90cd6ad0eb 真实随机阅片导表-1
continuous-integration/drone/push Build is passing Details
2025-06-17 09:59:22 +08:00
hang 013561541c 随机阅片导表
continuous-integration/drone/push Build is running Details
2025-06-17 09:58:53 +08:00
he f1f584c337 修改阅片期选择访视下拉框的数据
continuous-integration/drone/push Build is passing Details
2025-06-16 16:46:05 +08:00
he c443969f18 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-16 16:05:33 +08:00
hang 01621511f1 随机阅片排序-5
continuous-integration/drone/push Build is running Details
2025-06-16 16:03:25 +08:00
he 0740b38b10 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8 2025-06-16 15:59:03 +08:00
he ebd70e2202 生成了裁判任务 阅片期不让删除和修改 2025-06-16 15:59:00 +08:00
hang 80c026d5b2 修改CDISC 导出bug
continuous-integration/drone/push Build is passing Details
2025-06-16 15:58:33 +08:00
hang 8e2fbf06c5 随机阅片-NextTask-5
continuous-integration/drone/push Build is passing Details
2025-06-16 15:18:49 +08:00
hang daee20e309 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-16 15:00:48 +08:00
hang 3ba7481df8 末次访视的展示+ 展示基线选择阅片期 2025-06-16 15:00:37 +08:00
he 1e299e3f9e 添加阅片期 产生裁判
continuous-integration/drone/push Build is running Details
2025-06-16 14:59:23 +08:00
he 05cc46a6d6 修改标记信息
continuous-integration/drone/push Build is passing Details
2025-06-13 16:01:23 +08:00
he f1b943b6b0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-13 14:40:47 +08:00
he 9f00c1c49b 修改阅片标记信息 2025-06-13 14:40:47 +08:00
hang b1fd623065 随机阅片NextTask-4
continuous-integration/drone/push Build is passing Details
2025-06-13 14:33:15 +08:00
hang 7683866718 随机阅片序号3
continuous-integration/drone/push Build is passing Details
2025-06-13 11:49:14 +08:00
hang d58395c25e 随机阅片序号2
continuous-integration/drone/push Build is passing Details
2025-06-13 11:38:09 +08:00
hang 15dd21451e 随机阅片随机序号
continuous-integration/drone/push Build is passing Details
2025-06-13 10:46:29 +08:00
hang 483c7c68e8 修改重置阅片稽查3
continuous-integration/drone/push Build is passing Details
2025-06-13 09:53:59 +08:00
hang 738ad29c0b 修改阅片重置稽查
continuous-integration/drone/push Build is passing Details
2025-06-12 17:55:02 +08:00
hang f87b57ecc5 修改重置阅片稽查
continuous-integration/drone/push Build is passing Details
2025-06-12 17:40:50 +08:00
hang fccd704659 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-12 16:36:37 +08:00
hang e5b41735ec 确认浏览临床数据 2025-06-12 16:36:29 +08:00
he 07b496eb67 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-11 15:26:20 +08:00
he 762e46480c 删除标记 2025-06-11 15:26:18 +08:00
hang a7ad22ed28 修改关键图下载
continuous-integration/drone/push Build is passing Details
2025-06-11 14:35:56 +08:00
hang 8610a627ea 修改导出影响接口
continuous-integration/drone/push Build is passing Details
2025-06-11 14:03:50 +08:00
hang 302658d467 修改影响导出列表
continuous-integration/drone/push Build is passing Details
2025-06-11 13:46:13 +08:00
hang 97c882b0b2 肿瘤学稽查修改
continuous-integration/drone/push Build is passing Details
2025-06-11 09:33:24 +08:00
hang d711bb4b7f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-11 09:27:24 +08:00
hang 1a4ca6e36b 增加进入阅片中稽查 2025-06-11 09:27:18 +08:00
he aaac85b7b2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-10 17:16:59 +08:00
he cb3e4bc671 添加数据 2025-06-10 17:16:58 +08:00
hang 9f187e4b36 稽查 申请PM 重阅,有SPM 判断
continuous-integration/drone/push Build is passing Details
2025-06-10 15:11:41 +08:00
hang 663ec11c8d 稽查修改,区分标识
continuous-integration/drone/push Build is passing Details
2025-06-10 13:44:27 +08:00
he 122447a621 修改
continuous-integration/drone/push Build is passing Details
2025-06-10 10:31:09 +08:00
he 31bd3c646b 修改
continuous-integration/drone/push Build is passing Details
2025-06-10 10:11:16 +08:00
he f53fc409cb 修改
continuous-integration/drone/push Build is passing Details
2025-06-10 10:06:11 +08:00
he 7f4357de68 修改
continuous-integration/drone/push Build is passing Details
2025-06-10 09:37:26 +08:00
he 23fa689498 修改
continuous-integration/drone/push Build is passing Details
2025-06-10 09:31:55 +08:00
he e564debbab Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-10 09:13:49 +08:00
he 04aa2c79f6 修改 2025-06-10 09:13:48 +08:00
hang 68d66523e8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-09 17:38:44 +08:00
hang 549f394d43 增加稽查标识 2025-06-09 17:38:41 +08:00
he 5a83bf9221 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-09 17:01:32 +08:00
he 65bffa26b7 修改定时发送 2025-06-09 17:01:30 +08:00
hang 39a6f6a9dc Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-09 15:26:22 +08:00
hang fc02428435 导表修改 2025-06-09 15:26:20 +08:00
he 4262189508 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-09 15:21:34 +08:00
he 6dd6a5f696 修改 2025-06-09 15:21:33 +08:00
hang e03f2e35b5 修改到处临床数据bug
continuous-integration/drone/push Build is running Details
2025-06-09 15:20:02 +08:00
hang ea4a3db145 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-09 14:57:02 +08:00
hang f4ac12d4f8 修改导表+界面展示 2025-06-09 14:57:01 +08:00
he a2afe4f6e4 修改
continuous-integration/drone/push Build is passing Details
2025-06-09 14:44:17 +08:00
he ef31afa1d8 修改
continuous-integration/drone/push Build is passing Details
2025-06-09 14:14:41 +08:00
he d9fda60b99 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-09 13:39:48 +08:00
he 6508698bda 添加字段 2025-06-09 13:39:47 +08:00
hang 734675a1a5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-09 10:31:06 +08:00
hang d2697d5133 检查部位、检查技术、检查名称在确认提交时,增加校验 2025-06-09 10:31:02 +08:00
he 1c7f4eac90 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-09 10:19:03 +08:00
he 6dcaa953d4 添加历史记录 2025-06-09 10:19:00 +08:00
hang 1f67d24abc 修改部位使用
continuous-integration/drone/push Build is passing Details
2025-06-06 14:24:25 +08:00
hang c7a310c1ad Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-06 11:12:51 +08:00
hang 578aaa467c 邮件修改+影像导出 2025-06-06 11:12:46 +08:00
he 82a7c4de29 报错修改
continuous-integration/drone/push Build is passing Details
2025-06-05 16:19:59 +08:00
he fe4df21a68 稽查添加
continuous-integration/drone/push Build is passing Details
2025-06-05 15:19:39 +08:00
he 9cb6fb2a92 添加验证
continuous-integration/drone/push Build is passing Details
2025-06-05 14:52:07 +08:00
he 37cfe07ea6 添加字段
continuous-integration/drone/push Build is passing Details
2025-06-05 09:20:47 +08:00
he 52ffdac948 修改
continuous-integration/drone/push Build is passing Details
2025-06-04 17:09:23 +08:00
he 83a15a0b47 修改
continuous-integration/drone/push Build is passing Details
2025-06-04 16:14:24 +08:00
he 1952a108a9 修改
continuous-integration/drone/push Build is passing Details
2025-06-04 16:00:32 +08:00
he ccff36507f 修改
continuous-integration/drone/push Build is passing Details
2025-06-04 15:51:27 +08:00
he 285fd0e1bb 修改映射
continuous-integration/drone/push Build is passing Details
2025-06-04 15:17:58 +08:00
he 918aafa7e5 测量值可以为空
continuous-integration/drone/push Build is passing Details
2025-06-04 14:24:26 +08:00
he 60accb2f87 修改
continuous-integration/drone/push Build is passing Details
2025-06-04 14:21:56 +08:00
he 018c9afee0 添加表
continuous-integration/drone/push Build is passing Details
2025-06-04 14:13:38 +08:00
he 1b9351b23f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-04 13:36:31 +08:00
he 86ea3373fc 修改 2025-06-04 13:36:30 +08:00
hang dd3b43da7b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-04 13:15:22 +08:00
hang 3151e42e78 访视裁判,裁判选择标记bug 2025-06-04 13:15:21 +08:00
he 5d8f94ef65 修改
continuous-integration/drone/push Build is passing Details
2025-06-04 10:51:32 +08:00
he 26acc94172 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2025-06-04 10:50:28 +08:00
he 5c663ec3e9 添加获取模块类型列表 2025-06-04 10:50:28 +08:00
hang 5c0917f14e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-04 10:20:52 +08:00
hang 74230da400 修改CDISC 多表导出 2025-06-04 10:20:47 +08:00
he df104ec527 验证修改
continuous-integration/drone/push Build is passing Details
2025-06-04 09:42:00 +08:00
he 5cdef2051a 修改
continuous-integration/drone/push Build is passing Details
2025-06-03 17:21:07 +08:00
he 470d05131e 修改
continuous-integration/drone/push Build is passing Details
2025-06-03 16:57:04 +08:00
he 5e046b847d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-06-03 16:12:11 +08:00
he 8b6fcf9ae1 添加字段 2025-06-03 16:12:09 +08:00
hang 4dfa1e9812 表格问题竖列留底
continuous-integration/drone/push Build is passing Details
2025-06-03 16:02:45 +08:00
he a05cb71e0d 修改
continuous-integration/drone/push Build is passing Details
2025-06-03 13:21:56 +08:00
he 137b18446c 修改
continuous-integration/drone/push Build is passing Details
2025-06-03 12:46:51 +08:00
he e44478dafe 修改
continuous-integration/drone/push Build is passing Details
2025-06-03 11:45:57 +08:00
he 0a5a36adb3 添加表
continuous-integration/drone/push Build is passing Details
2025-06-03 10:43:31 +08:00
he 91e4553795 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-30 09:03:29 +08:00
he f504cfee9e 修改 2025-05-30 09:03:26 +08:00
hang 2e7e3acf68 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-29 17:56:20 +08:00
hang c00b98daf8 心动超声后端处理下载,上传,预备 2025-05-29 17:56:19 +08:00
he 235f420e97 添加字段
continuous-integration/drone/push Build is passing Details
2025-05-29 11:37:35 +08:00
he da15b352a1 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-29 11:30:28 +08:00
he 9857b1ae92 添加发送邮件功能 2025-05-29 11:30:24 +08:00
hang 9e83f8df36 返回EnrollId
continuous-integration/drone/push Build is passing Details
2025-05-28 11:35:05 +08:00
he ae431df9b5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-27 13:30:14 +08:00
he e5592c5bfa 修改 2025-05-27 13:30:11 +08:00
hang 1b2bca9f1e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-27 13:15:41 +08:00
hang 4235e6025a 下载项目影像修改 2025-05-27 13:15:38 +08:00
he 209ce439c2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-27 10:27:36 +08:00
he eabf8f4532 添加字段 2025-05-27 10:27:33 +08:00
hang 07ddb7b234 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-26 16:37:44 +08:00
hang 1f157bd1a2 项目下载影像 2025-05-26 16:37:41 +08:00
he 0c28f85f49 修改按照标记时间排序
continuous-integration/drone/push Build is passing Details
2025-05-26 14:11:54 +08:00
hang 44536b803f 裁判阅片明细表bug
continuous-integration/drone/push Build is passing Details
2025-05-23 19:13:23 +08:00
hang 750c31a159 修改导出bug
continuous-integration/drone/push Build is passing Details
2025-05-23 19:00:33 +08:00
hang 8325ccad72 返回系统简称配置
continuous-integration/drone/push Build is passing Details
2025-05-22 17:40:30 +08:00
hang c27c4ce617 生产删除影像
continuous-integration/drone/push Build is passing Details
2025-05-22 17:16:35 +08:00
hang b9ecabf915 稽查退回修改
continuous-integration/drone/push Build is passing Details
2025-05-22 16:36:12 +08:00
hang 4f13a98eff 修改退回
continuous-integration/drone/push Build is passing Details
2025-05-22 15:45:26 +08:00
hang 2a4e4e66fa 阅片跟踪页面,返回该任务退回原因字
continuous-integration/drone/push Build is passing Details
2025-05-22 15:23:59 +08:00
hang b72cc5cbc0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-22 15:19:30 +08:00
hang 04f91560b8 pm设置回退原因 2025-05-22 15:19:27 +08:00
he 87af2edf17 修改领取
continuous-integration/drone/push Build is passing Details
2025-05-22 13:41:38 +08:00
he 856977612d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-22 11:07:00 +08:00
he d1ac17cee1 修改退回的时候不让领取 2025-05-22 11:06:59 +08:00
hang 9748e70cdf 申请退回领取限制
continuous-integration/drone/push Build is passing Details
2025-05-22 11:02:05 +08:00
hang 5ba0a9bbd0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-21 15:15:23 +08:00
hang d8ea1e8f94 修改IR 申请,PM 同意发送邮件 2025-05-21 15:15:21 +08:00
he 806d663cfb Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-21 14:05:17 +08:00
he 7ab1728bc7 修改关键序列排序 2025-05-21 14:05:16 +08:00
hang 32e64eaeff MR MRI 统一,认为是一致的
continuous-integration/drone/push Build is passing Details
2025-05-20 15:24:20 +08:00
he 7b6efd52bb 修改国际化
continuous-integration/drone/push Build is passing Details
2025-05-20 14:30:19 +08:00
he 7467f2ae11 修改
continuous-integration/drone/push Build is passing Details
2025-05-20 10:28:42 +08:00
he c498ffb21b 修改
continuous-integration/drone/push Build is passing Details
2025-05-19 17:15:15 +08:00
he 1dadf7b8b6 修改
continuous-integration/drone/push Build is passing Details
2025-05-19 16:42:33 +08:00
he 793cf1b570 修改
continuous-integration/drone/push Build is passing Details
2025-05-19 16:22:43 +08:00
he 5a8f564b74 修改
continuous-integration/drone/push Build is passing Details
2025-05-19 15:58:27 +08:00
he e24c9e6ac2 代码修改
continuous-integration/drone/push Build is passing Details
2025-05-19 13:54:29 +08:00
he 814f6fd83c 修改发送邮件逻辑
continuous-integration/drone/push Build is passing Details
2025-05-19 13:47:17 +08:00
hang d34be9b07d 修改获取授权
continuous-integration/drone/push Build is passing Details
2025-05-09 09:28:53 +08:00
hang e205ea0018 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-09 09:09:11 +08:00
hang ba9d3a30b9 增加老的获取token的接口 2025-05-09 09:09:10 +08:00
he 10cf908775 修改
continuous-integration/drone/push Build is passing Details
2025-05-08 14:49:57 +08:00
he ee9ad472f0 修改
continuous-integration/drone/push Build is passing Details
2025-05-08 13:57:16 +08:00
he 1cdfc5f2b5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-08 13:41:47 +08:00
he 9e9f07e4fd 修改 2025-05-08 13:41:46 +08:00
hang a0294e6bd6 修改触发逻辑
continuous-integration/drone/push Build is passing Details
2025-05-08 13:16:43 +08:00
hang 55fdf431e0 修改触发邮件逻辑
continuous-integration/drone/push Build is passing Details
2025-05-08 13:12:39 +08:00
hang 9f1110f91a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-08 11:44:42 +08:00
hang d76b24bc25 驳回修改 2025-05-08 11:44:35 +08:00
he 0787875b3b 修改
continuous-integration/drone/push Build is passing Details
2025-05-08 09:50:03 +08:00
he b33aca3230 合并
continuous-integration/drone/push Build is passing Details
2025-05-07 15:47:09 +08:00
he 0b291e8b21 修改邮件 2025-05-07 15:46:32 +08:00
hang 0cf7e5fddd 增加备注
continuous-integration/drone/push Build is passing Details
2025-05-07 15:25:56 +08:00
hang 95f708da58 修改邮件配置
continuous-integration/drone/push Build is passing Details
2025-05-07 14:53:49 +08:00
hang ce47776f19 统一修改邮件配置
continuous-integration/drone/push Build is passing Details
2025-05-07 14:47:22 +08:00
hang 7fff48b07a 修改邮件配置
continuous-integration/drone/push Build is passing Details
2025-05-07 14:17:16 +08:00
hang 4688cb388e 修改触发
continuous-integration/drone/push Build is passing Details
2025-05-07 13:51:32 +08:00
he 21e1a7ab01 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is failing Details
2025-05-07 13:39:52 +08:00
he 5952af85f1 修改 2025-05-07 13:39:51 +08:00
hang 5e193db33b 修改中心调研邮件
continuous-integration/drone/push Build is running Details
2025-05-07 13:38:52 +08:00
he 30bcfcc675 修改
continuous-integration/drone/push Build is passing Details
2025-05-07 13:34:49 +08:00
he 514764ee6e 邮件修改
continuous-integration/drone/push Build is passing Details
2025-05-07 13:16:35 +08:00
he 685269eebf 修改
continuous-integration/drone/push Build is passing Details
2025-05-07 10:25:56 +08:00
he 276ad83080 修改
continuous-integration/drone/push Build is passing Details
2025-05-07 10:21:30 +08:00
he 7a318eae45 代码修改
continuous-integration/drone/push Build is passing Details
2025-05-06 17:08:04 +08:00
hang 0769f8fe05 增加额外参数
continuous-integration/drone/push Build is passing Details
2025-05-06 16:35:05 +08:00
hang 03ac25835e 修改增加TrialId
continuous-integration/drone/push Build is running Details
2025-05-06 16:33:41 +08:00
he 29c3888108 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-06 15:34:22 +08:00
he 91951be107 邮件发送修改 2025-05-06 15:34:20 +08:00
hang 935e46a8f1 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-06 14:19:08 +08:00
hang 1345808019 修改过滤项目参与人员 2025-05-06 14:19:07 +08:00
he 400d0d3336 修改
continuous-integration/drone/push Build is passing Details
2025-05-06 14:12:57 +08:00
he ca0fd77176 邮件修改
continuous-integration/drone/push Build is passing Details
2025-05-06 13:57:31 +08:00
he f7cf6d9669 邮件修改
continuous-integration/drone/push Build is passing Details
2025-05-06 13:39:49 +08:00
he 7f19944005 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-05-06 10:49:43 +08:00
he e8aec5f04c 添加邮件枚举 2025-05-06 10:49:42 +08:00
hang 0afbd24923 增加备注
continuous-integration/drone/push Build is passing Details
2025-05-06 10:30:48 +08:00
hang 932772f8c8 修改阅片人筛选事件触发
continuous-integration/drone/push Build is passing Details
2025-05-06 10:26:39 +08:00
he b7a803678c Revert "修改稽查"
continuous-integration/drone/push Build is passing Details
This reverts commit 5064630d1f.
2025-04-30 09:57:13 +08:00
he e99360bf5b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-29 17:56:16 +08:00
he 5064630d1f 修改稽查 2025-04-29 17:56:14 +08:00
hang 4034da47f2 测量数据里面带任务Id 需要替换
continuous-integration/drone/push Build is passing Details
2025-04-28 18:03:18 +08:00
hang 381b1965cf Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-27 16:24:26 +08:00
hang d5e747becd 修改导出 2025-04-27 16:24:24 +08:00
he 758273d362 修改
continuous-integration/drone/push Build is passing Details
2025-04-27 13:08:22 +08:00
he 1560a0278e 修改
continuous-integration/drone/push Build is passing Details
2025-04-27 13:05:31 +08:00
he 64c275a91c 修改
continuous-integration/drone/push Build is passing Details
2025-04-27 10:18:31 +08:00
he 05189b4e5a 修改稽查
continuous-integration/drone/push Build is passing Details
2025-04-25 17:19:12 +08:00
hang 80aaac997d 没有收件人,默认不发送
continuous-integration/drone/push Build is passing Details
2025-04-25 10:01:32 +08:00
hang c560921092 修改配置
continuous-integration/drone/push Build is passing Details
2025-04-25 09:46:41 +08:00
hang 81cd9aa6b7 修改邮件自动发送配置
continuous-integration/drone/push Build is passing Details
2025-04-25 09:20:06 +08:00
hang 4bfc6dd295 调研表发送邮件修改
continuous-integration/drone/push Build is passing Details
2025-04-24 17:29:22 +08:00
hang a8464364c1 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-24 17:22:54 +08:00
hang e333368528 修改邮件发送配置 2025-04-24 17:22:52 +08:00
he 58c1c25fc2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-24 15:53:26 +08:00
he 3045b0ec48 修改 2025-04-24 15:53:22 +08:00
hang 2d50037c03 外部人员 不能看未签名的文档
continuous-integration/drone/push Build is passing Details
2025-04-24 15:18:55 +08:00
he 6a1cd07951 修改
continuous-integration/drone/push Build is passing Details
2025-04-24 14:55:50 +08:00
he c7103654e3 修改
continuous-integration/drone/push Build is passing Details
2025-04-24 10:02:39 +08:00
he 4e03071c4c 修改
continuous-integration/drone/push Build is passing Details
2025-04-24 09:55:49 +08:00
he bf9e8a6758 修改
continuous-integration/drone/push Build is passing Details
2025-04-24 09:36:57 +08:00
he 00c6705161 修改
continuous-integration/drone/push Build is passing Details
2025-04-24 09:31:56 +08:00
he 209d932757 修改
continuous-integration/drone/push Build is passing Details
2025-04-23 16:25:00 +08:00
he e954ea8538 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-23 13:56:38 +08:00
he f79a8b4cfb 复制修改 2025-04-23 13:56:36 +08:00
hang 8fc01e2509 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-23 13:30:14 +08:00
hang 232e607b8c 增加系统文档导出 2025-04-23 13:30:09 +08:00
he bdeb7c464e 修改
continuous-integration/drone/push Build is passing Details
2025-04-23 10:55:08 +08:00
he 3668079479 修改
continuous-integration/drone/push Build is passing Details
2025-04-23 10:48:16 +08:00
he c115e9453b 修改
continuous-integration/drone/push Build is passing Details
2025-04-23 10:03:24 +08:00
he f157a0f473 登录修改
continuous-integration/drone/push Build is passing Details
2025-04-23 09:54:00 +08:00
he c2252b4e9f 修改
continuous-integration/drone/push Build is passing Details
2025-04-22 17:53:55 +08:00
he b0554119f1 修改
continuous-integration/drone/push Build is passing Details
2025-04-22 13:56:05 +08:00
he 37387692dd 修改
continuous-integration/drone/push Build is passing Details
2025-04-22 13:20:02 +08:00
he 970c41a064 修改
continuous-integration/drone/push Build is passing Details
2025-04-22 11:41:24 +08:00
he 67a3fe0f1b 修改
continuous-integration/drone/push Build is running Details
2025-04-22 11:40:28 +08:00
he 15108156c2 拷贝问题修改
continuous-integration/drone/push Build is passing Details
2025-04-22 11:33:38 +08:00
he 1a2c51da12 修改
continuous-integration/drone/push Build is passing Details
2025-04-22 09:40:16 +08:00
he 3d10482da8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-22 09:29:36 +08:00
he 3abc8787c6 修改 2025-04-22 09:29:32 +08:00
hang df346d31e6 编译错误
continuous-integration/drone/push Build is passing Details
2025-04-22 09:24:30 +08:00
hang a8babb53f2 修改时区测试
continuous-integration/drone/push Build is passing Details
2025-04-22 09:20:49 +08:00
hang 3c1cc92e1b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-21 17:00:28 +08:00
hang 99ee8c4757 增加邮件事件 2025-04-21 17:00:26 +08:00
he fc81d6da22 修改
continuous-integration/drone/push Build is passing Details
2025-04-21 14:50:58 +08:00
he 47edcbd761 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-21 14:26:24 +08:00
he a499971e91 修改 2025-04-21 14:26:23 +08:00
he afd34c7c9b 修改
continuous-integration/drone/push Build is running Details
2025-04-21 14:15:21 +08:00
hang 529c646277 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-21 14:15:20 +08:00
hang b8f03153ca 修改反了 2025-04-21 14:15:19 +08:00
he a14df73879 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-21 14:05:51 +08:00
he cb9141c1ce 修改 2025-04-21 14:05:50 +08:00
hang ff2461dafc 查询启用的角色
continuous-integration/drone/push Build is passing Details
2025-04-21 14:02:39 +08:00
he 779af013e6 修改
continuous-integration/drone/push Build is passing Details
2025-04-21 13:37:50 +08:00
he 75fb357cc5 修改
continuous-integration/drone/push Build is passing Details
2025-04-21 13:24:24 +08:00
he 89eb1032cf 修改
continuous-integration/drone/push Build is passing Details
2025-04-21 11:28:45 +08:00
he eca9c36110 修改
continuous-integration/drone/push Build is passing Details
2025-04-21 11:09:38 +08:00
he 2430651ed4 修改
continuous-integration/drone/push Build is passing Details
2025-04-18 14:13:12 +08:00
he 87d658031b 修改
continuous-integration/drone/push Build is passing Details
2025-04-18 14:10:46 +08:00
he 34b90538ab 修改
continuous-integration/drone/push Build is passing Details
2025-04-18 13:36:53 +08:00
he d2571d5f79 修改
continuous-integration/drone/push Build is passing Details
2025-04-18 11:41:47 +08:00
he 1688d7c934 修改
continuous-integration/drone/push Build is passing Details
2025-04-18 10:24:38 +08:00
he 9ab5dc7d02 修改
continuous-integration/drone/push Build is passing Details
2025-04-17 17:24:15 +08:00
he 97cdec61be 修改
continuous-integration/drone/push Build is passing Details
2025-04-17 17:21:23 +08:00
he c0d6eb3203 修改
continuous-integration/drone/push Build is passing Details
2025-04-17 15:33:44 +08:00
he d125ff6324 x修改
continuous-integration/drone/push Build is passing Details
2025-04-16 13:28:00 +08:00
he 1b830b386e 修改
continuous-integration/drone/push Build is passing Details
2025-04-16 11:30:27 +08:00
he ee83909123 修改
continuous-integration/drone/push Build is passing Details
2025-04-16 10:26:10 +08:00
he 844e27e94e 修改
continuous-integration/drone/push Build is passing Details
2025-04-15 17:55:16 +08:00
he 6fded9f028 修改
continuous-integration/drone/push Build is passing Details
2025-04-15 17:23:45 +08:00
he b5103f1940 修改
continuous-integration/drone/push Build is passing Details
2025-04-15 16:54:38 +08:00
he 8bf54dfc1b 修改
continuous-integration/drone/push Build is running Details
2025-04-15 16:54:24 +08:00
he 1069292c54 修改
continuous-integration/drone/push Build is passing Details
2025-04-15 15:39:59 +08:00
he 88c6f574ec 修改
continuous-integration/drone/push Build is passing Details
2025-04-15 15:36:23 +08:00
he f5f6d3b6ac Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-15 15:16:11 +08:00
he 38f937ea9e 查询修改 2025-04-15 15:16:08 +08:00
hang 2913eb67f4 修改删除的文件统计数字
continuous-integration/drone/push Build is running Details
2025-04-15 15:14:37 +08:00
hang a0ceec28e7 修改删除统计文件数字
continuous-integration/drone/push Build is passing Details
2025-04-15 14:54:32 +08:00
hang b77a50caf6 非dicom 删除上传
continuous-integration/drone/push Build is passing Details
2025-04-15 14:33:03 +08:00
hang e17fc6bce9 修改删除
continuous-integration/drone/push Build is passing Details
2025-04-15 13:20:55 +08:00
hang 0970e2807b 修改非dicom 删除
continuous-integration/drone/push Build is passing Details
2025-04-15 11:37:00 +08:00
hang a64d26513a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-15 11:33:24 +08:00
hang 73e80f2571 修改非dicom 删除 2025-04-15 11:33:23 +08:00
hang 770f361d04 修改非dicom 删除
continuous-integration/drone/push Build is passing Details
2025-04-15 11:05:22 +08:00
hang 7476472071 软删除修改
continuous-integration/drone/push Build is passing Details
2025-04-15 10:54:28 +08:00
hang 1fff2f7256 修改删除
continuous-integration/drone/push Build is passing Details
2025-04-15 09:13:56 +08:00
he 1e4044488d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-14 14:39:42 +08:00
he 1e1822151b 修改 2025-04-14 14:39:40 +08:00
hang c37b6c4c84 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-14 14:23:49 +08:00
hang 8f65b9e60e 修改检查列表查询 2025-04-14 14:23:47 +08:00
he a8a9a09f88 修改
continuous-integration/drone/push Build is passing Details
2025-04-14 14:11:06 +08:00
he 7526ca2905 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2025-04-14 14:10:23 +08:00
he fd83c3e7a7 修改 2025-04-14 14:10:23 +08:00
hang a3c575857a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-14 14:04:53 +08:00
hang c292f6ce44 修改质控删除bug 测试 2025-04-14 14:04:51 +08:00
he 84a7d75174 修改
continuous-integration/drone/push Build is running Details
2025-04-14 14:03:54 +08:00
he 048afdcc7b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-14 13:56:54 +08:00
he 06e319cf09 代码修改 2025-04-14 13:56:52 +08:00
hang cee0730e03 升级nuget包
continuous-integration/drone/push Build is passing Details
2025-04-14 13:54:27 +08:00
he adaa672185 修改
continuous-integration/drone/push Build is passing Details
2025-04-14 11:20:59 +08:00
he b6b5d3e4c9 代码修改
continuous-integration/drone/push Build is passing Details
2025-04-14 11:03:01 +08:00
he 6ac057a0c7 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-14 10:28:33 +08:00
he 6607a0ff8f 修改复制 2025-04-14 10:28:30 +08:00
hang 0374551655 修改限制
continuous-integration/drone/push Build is passing Details
2025-04-11 17:43:07 +08:00
hang be9f0075e3 增加申请限制
continuous-integration/drone/push Build is passing Details
2025-04-11 16:57:39 +08:00
hang 2cc004746e 增加限制
continuous-integration/drone/push Build is passing Details
2025-04-11 16:32:00 +08:00
hang b1a7ac1d28 修改映射字段
continuous-integration/drone/push Build is passing Details
2025-04-11 15:05:18 +08:00
hang 5a31e16c65 修改限制
continuous-integration/drone/push Build is passing Details
2025-04-11 14:06:53 +08:00
hang 0b56836097 升级普通组件包
continuous-integration/drone/push Build is passing Details
2025-04-11 13:40:07 +08:00
hang a4a11aaaec 修改查询条件
continuous-integration/drone/push Build is passing Details
2025-04-11 11:36:29 +08:00
hang ae1b2523b1 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-11 10:21:45 +08:00
hang 87f9d08c74 添加冗余字段 2025-04-11 10:21:42 +08:00
he 81abd9622f 修改病灶验证
continuous-integration/drone/push Build is passing Details
2025-04-11 10:10:46 +08:00
he faf87f5b86 修改记录
continuous-integration/drone/push Build is passing Details
2025-04-10 17:30:09 +08:00
he 66dc231850 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-10 14:01:07 +08:00
he 34ff47bc1c 修改 2025-04-10 14:01:06 +08:00
hang 842b7117a2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-10 11:50:23 +08:00
hang 6543aba53f 文档签署 2025-04-10 11:50:20 +08:00
he 06cee8926e 修改
continuous-integration/drone/push Build is passing Details
2025-04-10 11:18:36 +08:00
he a35fe11f5b 修改
continuous-integration/drone/push Build is passing Details
2025-04-10 11:14:00 +08:00
he cc13544968 修改
continuous-integration/drone/push Build is passing Details
2025-04-10 10:40:05 +08:00
he 19ee511d8d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-10 10:32:18 +08:00
he 0b47d6ca09 新增文件夹 2025-04-10 10:32:15 +08:00
hang 00193bb4bc 修改统计数字
continuous-integration/drone/push Build is passing Details
2025-04-10 10:05:15 +08:00
hang 4379fcbdb3 增加字段
continuous-integration/drone/push Build is passing Details
2025-04-10 09:49:38 +08:00
hang 8464625bbf 修改统计数字
continuous-integration/drone/push Build is passing Details
2025-04-10 09:31:36 +08:00
hang e88f949cb7 增加新的提示
continuous-integration/drone/push Build is passing Details
2025-04-09 17:46:23 +08:00
hang 4fdb0737fc 修改查询条件
continuous-integration/drone/push Build is passing Details
2025-04-09 17:07:18 +08:00
hang 04be8cf642 修改访视查询下拉框
continuous-integration/drone/push Build is passing Details
2025-04-09 17:03:17 +08:00
hang 089ecbf144 增加访视提交时间
continuous-integration/drone/push Build is passing Details
2025-04-09 16:48:22 +08:00
hang b95e97a5df 增加用户列表接口
continuous-integration/drone/push Build is passing Details
2025-04-09 16:45:52 +08:00
hang e84710c4aa 修改查询
continuous-integration/drone/push Build is passing Details
2025-04-09 15:20:40 +08:00
hang f549d1fca9 删除部分迁移文件
continuous-integration/drone/push Build is passing Details
2025-04-09 15:15:26 +08:00
hang 2c72dc000f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-09 15:09:54 +08:00
hang 2ceddc1340 修改统计 2025-04-09 15:09:53 +08:00
he f118c48d0e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-09 15:03:58 +08:00
he a3a1236d5b 修改 2025-04-09 15:03:57 +08:00
hang a7848727ee Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-09 11:27:21 +08:00
hang 5787c36687 修改验证 2025-04-09 11:27:17 +08:00
he 4e66ea43d7 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-09 10:59:42 +08:00
he 68d69181a9 修改 2025-04-09 10:59:39 +08:00
hang b879b3f2c7 国际化修改
continuous-integration/drone/push Build is passing Details
2025-04-08 15:20:09 +08:00
hang 4fd77ce70d 影像回退逻辑增加
continuous-integration/drone/push Build is passing Details
2025-04-08 14:50:45 +08:00
he 8213c6d10f 测试肿瘤学评估
continuous-integration/drone/push Build is passing Details
2025-04-08 09:31:36 +08:00
he b79b4567b4 修改稽查文档
continuous-integration/drone/push Build is passing Details
2025-04-07 17:42:58 +08:00
he 8c5b759a92 同步修改
continuous-integration/drone/push Build is passing Details
2025-04-07 17:25:37 +08:00
he ab1e33a799 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-07 16:29:32 +08:00
he 824b65d5ee 同步系统标准修改 2025-04-07 16:29:31 +08:00
hang c68004b804 维护用户登录区域
continuous-integration/drone/push Build is passing Details
2025-04-07 15:45:43 +08:00
hang d5cd8dc338 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-07 15:24:08 +08:00
hang 1fef5509d1 修改解析IP区域位置的库 以及异地登录判断 2025-04-07 15:24:05 +08:00
he 06d12ce709 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-07 15:12:49 +08:00
he ad7ac80444 复制稽查文档 2025-04-07 15:11:49 +08:00
hang 29d0ebdb7c 账户日志的操作类型支持多选
continuous-integration/drone/push Build is passing Details
2025-04-07 14:31:06 +08:00
hang 9bcaa07c1a 测试新的解析IP的库
continuous-integration/drone/push Build is passing Details
2025-04-07 14:08:30 +08:00
he bf5f56f5f2 修改查询
continuous-integration/drone/push Build is passing Details
2025-04-07 11:06:11 +08:00
he c1c2b59641 修改
continuous-integration/drone/push Build is passing Details
2025-04-03 17:31:51 +08:00
he 33820c2acb 修改
continuous-integration/drone/push Build is passing Details
2025-04-03 17:26:19 +08:00
he 9814f63246 修改
continuous-integration/drone/push Build is passing Details
2025-04-03 16:27:06 +08:00
he 5e6c018199 修改
continuous-integration/drone/push Build is passing Details
2025-04-03 16:10:11 +08:00
he b24751287c 修改
continuous-integration/drone/push Build is running Details
2025-04-03 16:07:48 +08:00
he 759cc6c1be 修改
continuous-integration/drone/push Build is passing Details
2025-04-03 15:29:22 +08:00
he 1a929ce2ca 修改
continuous-integration/drone/push Build is passing Details
2025-04-03 15:10:04 +08:00
he 1e4571a814 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-04-03 14:31:25 +08:00
he 848670d128 修改 2025-04-03 14:31:23 +08:00
hang 6d9b5fdb2d 测试项目降级为8版本
continuous-integration/drone/push Build is passing Details
2025-04-03 14:26:11 +08:00
hang ab00d64725 移除之前的废弃包换用微软新包
continuous-integration/drone/push Build is running Details
2025-04-03 14:23:42 +08:00
hang 5e36054ee9 删除logdashboard 升级下fo-dicom 常见包
continuous-integration/drone/push Build is passing Details
2025-04-03 14:17:24 +08:00
hang 2b11042f35 升级fo-dicom
continuous-integration/drone/push Build is passing Details
2025-04-03 14:04:28 +08:00
hang e9e5075c1c 验证环境生成缩略图测试ok提交
continuous-integration/drone/push Build is passing Details
2025-04-03 13:56:54 +08:00
hang 9149dd6cf6 Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8 2025-04-03 11:30:53 +08:00
hang 24bfb4920c IQC回退到CRC 上传修改
continuous-integration/drone/push Build is passing Details
2025-04-03 11:29:13 +08:00
he 553ad4760c 修改
continuous-integration/drone/push Build is passing Details
2025-04-02 15:55:12 +08:00
he 5acd56689b 修改
continuous-integration/drone/push Build is running Details
2025-04-02 15:52:07 +08:00
hang 5f0643d4d4 修改swagger 展示 2025-04-02 14:03:36 +08:00
he 17e4ed38be 修改
continuous-integration/drone/push Build is passing Details
2025-04-02 13:46:08 +08:00
he c49f16b055 修改
continuous-integration/drone/push Build is passing Details
2025-04-02 13:44:36 +08:00
he aa42d64cac 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 18:05:58 +08:00
he 8f0ef86ab9 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 17:55:48 +08:00
he c17b2f6bac 修改
continuous-integration/drone/push Build is running Details
2025-04-01 17:53:13 +08:00
he be498f2329 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 16:54:23 +08:00
he fea3d8d415 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 16:39:28 +08:00
he bffc8626c7 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 16:31:47 +08:00
he 1efe1228ac 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 16:21:50 +08:00
he f900b811c7 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 16:18:10 +08:00
he a5f7e03f6c 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 16:05:13 +08:00
he 7aba4adc14 修改
continuous-integration/drone/push Build is passing Details
2025-04-01 15:52:37 +08:00
he 12c8c641ea 查询修改
continuous-integration/drone/push Build is passing Details
2025-04-01 15:09:47 +08:00
he 977adf3153 修改项目下拉查询
continuous-integration/drone/push Build is passing Details
2025-04-01 13:10:30 +08:00
he 409b76df26 修改
continuous-integration/drone/push Build is passing Details
2025-03-31 17:48:30 +08:00
he 2d9ebe7094 修改
continuous-integration/drone/push Build is passing Details
2025-03-31 15:26:13 +08:00
he 71e797cf7d 修改
continuous-integration/drone/push Build is passing Details
2025-03-31 14:06:17 +08:00
he f781027388 修改 2025-03-31 14:01:29 +08:00
he 56e316e6a1 修改
continuous-integration/drone/push Build is passing Details
2025-03-31 11:51:19 +08:00
he edef3e1990 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-31 11:09:24 +08:00
he d6d0965467 整体肿瘤评估 计算修改 2025-03-31 11:09:22 +08:00
hang 62f888710c 修改阅片人统计查询
continuous-integration/drone/push Build is passing Details
2025-03-28 14:55:59 +08:00
he 58e8c2392f 添加MRecisthhc
continuous-integration/drone/push Build is passing Details
2025-03-28 11:12:09 +08:00
he 0e1310324d 修改
continuous-integration/drone/push Build is passing Details
2025-03-28 09:48:46 +08:00
he efcda61104 修改
continuous-integration/drone/push Build is passing Details
2025-03-27 17:11:00 +08:00
he 97133a5554 文档修改
continuous-integration/drone/push Build is passing Details
2025-03-27 16:29:55 +08:00
he 577ed42f97 修改文件路径
continuous-integration/drone/push Build is passing Details
2025-03-27 16:19:08 +08:00
he 8f704c4617 修改
continuous-integration/drone/push Build is passing Details
2025-03-27 16:03:12 +08:00
he a03d7f55c7 稽查文档
continuous-integration/drone/push Build is passing Details
2025-03-27 15:48:33 +08:00
he 2bbc101f95 修改
continuous-integration/drone/push Build is passing Details
2025-03-27 11:17:59 +08:00
he 2b11e9165f 修改
continuous-integration/drone/push Build is passing Details
2025-03-27 11:08:06 +08:00
he b25dec68cb 修改项目下拉列表
continuous-integration/drone/push Build is passing Details
2025-03-27 10:55:45 +08:00
hang 2f57238f66 修改swagger 展示
continuous-integration/drone/push Build is passing Details
2025-03-26 14:22:26 +08:00
hang 8239061a84 修改异地登录bug 设置最后一次登录的iP
continuous-integration/drone/push Build is passing Details
2025-03-26 11:11:34 +08:00
hang a43ebc016a 修改异地登录ip逻辑
continuous-integration/drone/push Build is passing Details
2025-03-25 17:49:13 +08:00
hang c036aab9c4 修改refer
continuous-integration/drone/push Build is passing Details
2025-03-24 17:13:43 +08:00
hang dd6419dc44 撤回修改
continuous-integration/drone/push Build is passing Details
2025-03-24 17:13:21 +08:00
hang 54a9cfbb8e 修改refer
continuous-integration/drone/push Build is running Details
2025-03-24 17:12:04 +08:00
hang 2eb85b6b71 Merge branch 'Test_IRC_Net8' into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-24 16:59:47 +08:00
hang 712f1ceb61 修改非dicom 检查
continuous-integration/drone/push Build is passing Details
2025-03-24 16:59:11 +08:00
he adf873639c 修改稽查报错问题
continuous-integration/drone/push Build is passing Details
2025-03-24 16:46:33 +08:00
hang 4e9460e7da 为cdn 部署取项目Id 修改
continuous-integration/drone/push Build is passing Details
2025-03-24 15:17:44 +08:00
hang 5481eac988 增加环境变量
continuous-integration/drone/push Build is passing Details
2025-03-24 11:20:03 +08:00
he b7c9abca02 拷贝表单
continuous-integration/drone/push Build is passing Details
2025-03-20 17:37:18 +08:00
he 447d3fc36f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-20 14:37:26 +08:00
he 71702b2abb 修改显示检查名称 2025-03-20 14:37:25 +08:00
hang 2ffb24d630 维护oss 数据大小
continuous-integration/drone/push Build is passing Details
2025-03-20 13:15:50 +08:00
he 81ecd9ff7f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-20 09:38:24 +08:00
he ebe012ca67 修改 2025-03-20 09:38:22 +08:00
hang 805176c3ea 修改编译错误
continuous-integration/drone/push Build is running Details
2025-03-20 09:35:34 +08:00
hang f99cab6983 获取文件大小 oss
continuous-integration/drone/push Build is passing Details
2025-03-19 17:16:39 +08:00
he c94d800646 移动文件
continuous-integration/drone/push Build is passing Details
2025-03-19 15:47:31 +08:00
he 0cbc345f49 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-18 15:20:07 +08:00
he d34f3f1576 修改 2025-03-18 15:20:05 +08:00
hang 73f5e67e3c 切换账户排序修改
continuous-integration/drone/push Build is passing Details
2025-03-18 13:55:30 +08:00
he 5cf8c7a898 查询撤销
continuous-integration/drone/push Build is passing Details
2025-03-18 10:33:43 +08:00
he 11c9cebf47 接口修改
continuous-integration/drone/push Build is passing Details
2025-03-18 10:08:53 +08:00
he bd9362fb25 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-18 09:43:03 +08:00
he 3aa588f125 修改 2025-03-18 09:43:01 +08:00
hang 6d33a2c1b0 修改角色排序
continuous-integration/drone/push Build is passing Details
2025-03-18 09:33:38 +08:00
he 9e4cf1d1db 修改
continuous-integration/drone/push Build is passing Details
2025-03-17 16:44:43 +08:00
he ae38c84ef7 修改
continuous-integration/drone/push Build is passing Details
2025-03-17 16:30:27 +08:00
he 6306c6752a 修改
continuous-integration/drone/push Build is passing Details
2025-03-17 16:23:38 +08:00
he 5490630922 修改
continuous-integration/drone/push Build is passing Details
2025-03-17 15:31:53 +08:00
he d1ea886e76 修改排序
continuous-integration/drone/push Build is passing Details
2025-03-17 14:48:16 +08:00
he 7dc1205bb6 修改
continuous-integration/drone/push Build is passing Details
2025-03-17 14:14:01 +08:00
he 15b094a422 修改
continuous-integration/drone/push Build is passing Details
2025-03-17 13:52:23 +08:00
he 78c46572a2 修改路径
continuous-integration/drone/push Build is passing Details
2025-03-17 11:21:56 +08:00
he abeda7820d 修改文件路径
continuous-integration/drone/push Build is passing Details
2025-03-17 10:50:21 +08:00
he 2dac67618c 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 17:10:22 +08:00
he bb9b1283bf 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 16:47:39 +08:00
he b9458ecb38 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 16:12:42 +08:00
he b205757f8f 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 16:01:41 +08:00
he 0b937663ff 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 15:11:21 +08:00
he 7a75d107dc 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 14:50:12 +08:00
he 0f682dd184 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 14:40:14 +08:00
he c2360dd519 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 14:25:02 +08:00
he f9c2ac030a 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 13:29:01 +08:00
he 7ce2386aea 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 12:52:14 +08:00
he 67b226ee44 修改
continuous-integration/drone/push Build is passing Details
2025-03-14 11:45:20 +08:00
he 70c7f8a740 查询修改
continuous-integration/drone/push Build is passing Details
2025-03-14 10:20:55 +08:00
he e409aa3c05 修改
continuous-integration/drone/push Build is passing Details
2025-03-13 16:59:47 +08:00
he a3b5129ee2 修改
continuous-integration/drone/push Build is passing Details
2025-03-13 16:43:19 +08:00
he 57cd0281fa 查询条件修改
continuous-integration/drone/push Build is passing Details
2025-03-13 16:33:53 +08:00
he ba9d3abc52 修改
continuous-integration/drone/push Build is passing Details
2025-03-13 16:16:30 +08:00
he b9bc1f6da0 入项记录上传与修改
continuous-integration/drone/push Build is passing Details
2025-03-13 15:43:53 +08:00
he 08f1998e61 修改
continuous-integration/drone/push Build is passing Details
2025-03-13 15:22:40 +08:00
he bc19ead2f5 添加optuserType
continuous-integration/drone/push Build is passing Details
2025-03-13 14:36:37 +08:00
he f9327c56db Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-13 10:42:59 +08:00
he 17f3d821ea 修改 2025-03-13 10:42:57 +08:00
hang 02f3e97654 修改质控看到的列表
continuous-integration/drone/push Build is passing Details
2025-03-12 18:05:34 +08:00
he 94bba7837c 国际化修改
continuous-integration/drone/push Build is passing Details
2025-03-12 11:12:35 +08:00
he 626fcb9cf3 修改
continuous-integration/drone/push Build is passing Details
2025-03-12 09:37:36 +08:00
he bf92165432 修改
continuous-integration/drone/push Build is running Details
2025-03-12 09:36:55 +08:00
he 92e99edbbd 修改项目稽查
continuous-integration/drone/push Build is passing Details
2025-03-11 16:59:34 +08:00
he 94507c7887 修改稽查
continuous-integration/drone/push Build is passing Details
2025-03-11 16:41:36 +08:00
he 0cce75befa Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-11 16:36:34 +08:00
he 96469c28d3 修改 2025-03-11 16:36:33 +08:00
hang a12db2637e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-11 15:37:18 +08:00
hang 0a406da3a4 修改过滤 2025-03-11 15:37:14 +08:00
he 6271dd4144 修改中心排序
continuous-integration/drone/push Build is passing Details
2025-03-11 15:12:57 +08:00
he 4182809657 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-10 17:40:03 +08:00
he ab6ec064fa 修改重复验证的问题 2025-03-10 17:40:03 +08:00
hang d921a48a09 阿里云返回oss 预览地址
continuous-integration/drone/push Build is passing Details
2025-03-10 17:35:30 +08:00
he 0f03dbc75b 修改
continuous-integration/drone/push Build is passing Details
2025-03-10 14:45:03 +08:00
he e5fa3a09b3 修改查询
continuous-integration/drone/push Build is passing Details
2025-03-10 14:17:22 +08:00
he 4cdfb60fdf 添加阅片人接口
continuous-integration/drone/push Build is passing Details
2025-03-10 13:46:12 +08:00
he 200bdaccc4 修改
continuous-integration/drone/push Build is passing Details
2025-03-10 11:38:10 +08:00
he 17a35e0fdb 修改
continuous-integration/drone/push Build is passing Details
2025-03-10 11:13:43 +08:00
he 28f2bf1629 修改
continuous-integration/drone/push Build is passing Details
2025-03-10 11:06:53 +08:00
he bec04ab795 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-10 10:56:12 +08:00
he 54cefab633 修改 2025-03-10 10:56:07 +08:00
hang 2918c0e93f 文件级别设置阅片过滤删除
continuous-integration/drone/push Build is passing Details
2025-03-07 15:54:05 +08:00
hang 92c495ed07 非dicom 预览阅片
continuous-integration/drone/push Build is passing Details
2025-03-07 15:41:46 +08:00
hang d9d807e3d1 修改dicom 只有一个序列设置删除 检查被过滤
continuous-integration/drone/push Build is passing Details
2025-03-07 10:35:18 +08:00
hang 959b49a2cc 非dicom 预览阅片影像 过滤是否阅片
continuous-integration/drone/push Build is passing Details
2025-03-06 16:46:17 +08:00
hang 17f131cf63 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-06 15:48:11 +08:00
hang 4ef67beafc 修改非dicom 过滤文件是否阅片,是否删除 2025-03-06 15:48:10 +08:00
he 826a04ef31 修改
continuous-integration/drone/push Build is passing Details
2025-03-06 14:38:12 +08:00
he 104b1208ed 修改
continuous-integration/drone/push Build is passing Details
2025-03-06 14:34:47 +08:00
he 8b3040c24d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-06 13:12:10 +08:00
he 153dbd2016 添加排序 2025-03-06 13:12:09 +08:00
hang 91d5cbce16 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-06 11:06:25 +08:00
hang 7218427ec2 用户参与项目,返回授权 和禁用时间 2025-03-06 11:06:24 +08:00
he 5d91ae8157 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-06 10:47:56 +08:00
he 0f61d746e5 修改 2025-03-06 10:47:54 +08:00
hang e931e740e6 非dicom 文件修改列表预览可以查看删除
continuous-integration/drone/push Build is passing Details
2025-03-05 15:57:03 +08:00
hang 38917e05ab Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-05 15:21:05 +08:00
hang dd33f7e086 修改忽略过滤器 2025-03-05 15:21:04 +08:00
he 43d4d679b5 Merge branch 'Uat_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-05 13:13:39 +08:00
he e02fa28cd0 修改非Dicom排序 2025-03-05 13:13:37 +08:00
he 055e085d2a 修改非Dicom排序
continuous-integration/drone/push Build is passing Details
2025-03-05 13:12:48 +08:00
he caf1fb6b32 修改
continuous-integration/drone/push Build is passing Details
2025-03-05 11:41:36 +08:00
he 6b049e68cd Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-05 11:24:53 +08:00
he 2a4360cc64 修改数据库结构 2025-03-05 11:24:50 +08:00
hang 8efc254f3c Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-05 10:43:11 +08:00
hang f89b3daf50 qc 序列层级返回更新时间
continuous-integration/drone/push Build is passing Details
2025-03-05 10:42:58 +08:00
hang 29f6196698 合并
continuous-integration/drone/push Build is passing Details
2025-03-05 09:47:41 +08:00
hang 09ff2468e9 Merge branch 'Uat_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-05 09:44:36 +08:00
hang 1867277e1b 修改非dicom 检查编号重复问题 2025-03-05 09:44:34 +08:00
he 053a09a5b2 Merge branch 'Uat_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-05 09:40:03 +08:00
he fae86f0836 修改非dicom 影像 排序 先按检查时间,再按创建时间排序 2025-03-05 09:39:45 +08:00
he 2e539dfa71 修改非dicom 影像 排序 先按检查时间,再按创建时间排序
continuous-integration/drone/push Build is passing Details
2025-03-05 09:31:37 +08:00
he a9efd85aec 修改
continuous-integration/drone/push Build is passing Details
2025-03-04 17:58:33 +08:00
he 09e70b9f21 修改
continuous-integration/drone/push Build is passing Details
2025-03-04 17:48:33 +08:00
he 2d184e0f08 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-04 16:39:44 +08:00
he 43d6c7d8db 查询条件修改 2025-03-04 16:39:42 +08:00
hang 19487acc64 Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-04 15:20:27 +08:00
hang 336e7768b8 时间拼写错误
continuous-integration/drone/push Build is passing Details
2025-03-04 15:20:06 +08:00
hang 9b49dc41c8 Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-04 11:20:51 +08:00
hang 74f896cf00 Merge branch 'Uat_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-03-04 11:20:22 +08:00
hang 10b0bde1d0 检查列表增加时间 2025-03-04 11:20:21 +08:00
he 411b5d5f8f 培训记录修改
continuous-integration/drone/push Build is passing Details
2025-03-04 10:45:29 +08:00
he b6da27ac07 修改
continuous-integration/drone/push Build is passing Details
2025-03-03 17:20:38 +08:00
he a6b81b038f 修改
continuous-integration/drone/push Build is passing Details
2025-03-03 16:49:43 +08:00
he e2c80babfa 修改
continuous-integration/drone/push Build is passing Details
2025-03-03 16:34:58 +08:00
he 01b9f28e7b 批量添加
continuous-integration/drone/push Build is passing Details
2025-03-03 16:08:50 +08:00
he 2c9fad60fb 修改
continuous-integration/drone/push Build is passing Details
2025-03-03 16:03:04 +08:00
he 398baea876 字段修改
continuous-integration/drone/push Build is passing Details
2025-03-03 13:56:01 +08:00
he aec94d0a46 数据库修改
continuous-integration/drone/push Build is passing Details
2025-03-03 13:43:34 +08:00
he 4b69e45d44 实体修改
continuous-integration/drone/push Build is passing Details
2025-03-03 13:18:11 +08:00
he 12f2c2becb 修改
continuous-integration/drone/push Build is passing Details
2025-03-03 11:06:44 +08:00
he 699f79278b 修改
continuous-integration/drone/push Build is passing Details
2025-02-28 17:55:45 +08:00
he 88e07d28fd Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-28 16:35:03 +08:00
he 226ba06bf3 修改 2025-02-28 16:35:02 +08:00
hang c1667fc48b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-28 11:29:15 +08:00
hang f900e675da 清理项目删除项目参与用户 2025-02-28 11:29:14 +08:00
he ee51b9eade 添加 ImageFormatList
continuous-integration/drone/push Build is passing Details
2025-02-27 17:19:53 +08:00
he bf62ee92dd 添加 ImageFormatList
continuous-integration/drone/push Build is passing Details
2025-02-27 17:19:35 +08:00
he 78532803bc 影像质疑超限天数修改
continuous-integration/drone/push Build is passing Details
2025-02-27 17:12:28 +08:00
he 86ea3ebc32 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-27 17:12:01 +08:00
he 01aba3f3e0 影像质疑超限天数修改 2025-02-27 17:11:59 +08:00
hang 6dc1ef5728 增加查询配置
continuous-integration/drone/push Build is passing Details
2025-02-27 16:15:11 +08:00
hang 02e5d770db 增加查询配置
continuous-integration/drone/push Build is passing Details
2025-02-27 16:14:46 +08:00
hang f8c3704c87 合并修改
continuous-integration/drone/push Build is passing Details
2025-02-27 15:39:48 +08:00
hang 4c21459e00 修改StudyName 存放位置
continuous-integration/drone/push Build is passing Details
2025-02-27 15:38:51 +08:00
he cdbbe460ab 修改实体
continuous-integration/drone/push Build is passing Details
2025-02-27 14:31:38 +08:00
he 45da1645e0 Merge branch 'Uat_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-27 14:31:02 +08:00
he 9a1f4697c2 修改实体 2025-02-27 14:31:01 +08:00
hang 217b8713ff 合并到测试环境
continuous-integration/drone/push Build is passing Details
2025-02-27 13:17:08 +08:00
hang 0998f047e4 Merge branch 'Uat_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-27 13:05:10 +08:00
hang 47755bc2aa 检查 返回配置字段 2025-02-27 13:05:09 +08:00
he 72efd36649 实体修改
continuous-integration/drone/push Build is running Details
2025-02-27 13:05:00 +08:00
he 553a8d392f 查询返回检查名称
continuous-integration/drone/push Build is passing Details
2025-02-27 11:33:31 +08:00
he f050416265 数据库文件
continuous-integration/drone/push Build is passing Details
2025-02-27 11:21:32 +08:00
he a7d1a92a01 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-27 11:17:15 +08:00
he bf9ce9b213 影像配置数据库字段添加 2025-02-27 11:17:13 +08:00
he a9c7c79fb5 影像配置数据库字段添加
continuous-integration/drone/push Build is passing Details
2025-02-27 11:16:53 +08:00
hang dc3a830909 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-27 10:49:59 +08:00
hang 171bfde031 质控删除文件 2025-02-27 10:49:58 +08:00
he f471ce1535 修改
continuous-integration/drone/push Build is passing Details
2025-02-26 13:37:30 +08:00
hang 56170b73ed 修改非dicom 阅片
continuous-integration/drone/push Build is passing Details
2025-02-26 13:25:56 +08:00
he 2a9c1ec45c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-26 09:46:28 +08:00
he 3ccb3ff4de 授权修改 2025-02-26 09:46:26 +08:00
hang 6c078806cd 修改token 过期时间
continuous-integration/drone/push Build is passing Details
2025-02-25 16:36:18 +08:00
hang c2f768bef8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-25 16:11:49 +08:00
hang 1b7bb5a4fe 修改链接过期+ 删除oss 数据ok 2025-02-25 16:11:47 +08:00
he dfe6d13182 修改
continuous-integration/drone/push Build is passing Details
2025-02-25 15:51:16 +08:00
he 4c04718db4 修改
continuous-integration/drone/push Build is passing Details
2025-02-25 15:23:42 +08:00
he 64d803cbc0 修改
continuous-integration/drone/push Build is passing Details
2025-02-25 15:01:57 +08:00
he 54ccae5762 修改
continuous-integration/drone/push Build is passing Details
2025-02-25 14:48:05 +08:00
he 8d6bf0c7b1 修改
continuous-integration/drone/push Build is passing Details
2025-02-25 14:26:21 +08:00
he 8496e6bcd7 修改
continuous-integration/drone/push Build is running Details
2025-02-25 14:24:44 +08:00
he 7770fc264b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-25 14:07:26 +08:00
he 51f21805be 非Dicom 2025-02-25 14:07:25 +08:00
hang 434e49ea85 修改用户来源为null bug
continuous-integration/drone/push Build is passing Details
2025-02-25 11:31:19 +08:00
hang 468f7c7070 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2025-02-25 11:29:52 +08:00
hang 4577db7582 修改bug 2025-02-25 11:29:51 +08:00
he cc17816dae Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-25 11:12:44 +08:00
he 172cecebe4 修改 2025-02-25 11:12:42 +08:00
hang 7913acdf70 修改运维增加字段
continuous-integration/drone/push Build is passing Details
2025-02-25 11:08:37 +08:00
hang e9f57b5001 临时注释提交,手动维护
continuous-integration/drone/push Build is passing Details
2025-02-25 11:02:52 +08:00
he b8c0bd7082 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-25 10:38:14 +08:00
he 6200ec1ba7 代码提交 2025-02-25 10:38:11 +08:00
hang 73912fd875 修改列表
continuous-integration/drone/push Build is passing Details
2025-02-25 10:26:55 +08:00
hang 812035686e 修改用户参与项目接口
continuous-integration/drone/push Build is passing Details
2025-02-25 09:57:45 +08:00
hang 1f8caa4616 合并
continuous-integration/drone/push Build is passing Details
2025-02-24 17:21:28 +08:00
hang 4a1e0a87ba 修改管理用户类型过滤 2025-02-24 17:21:09 +08:00
he 337bda45fd 修改
continuous-integration/drone/push Build is passing Details
2025-02-24 17:17:25 +08:00
he c2412bfb4b 复制系统到项目
continuous-integration/drone/push Build is passing Details
2025-02-24 16:54:05 +08:00
he cff6b87daa Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-24 16:15:00 +08:00
he 2f93a490f0 查询项目信息 2025-02-24 16:14:59 +08:00
hang 1856ef9483 修改合并
continuous-integration/drone/push Build is passing Details
2025-02-24 16:09:42 +08:00
hang b45602556c 用户创建来源维护,以及用户参与项目列表修改 2025-02-24 16:07:52 +08:00
he b5326d4928 修改
continuous-integration/drone/push Build is passing Details
2025-02-24 13:45:55 +08:00
he 8bbc8c449f 合并
continuous-integration/drone/push Build is running Details
2025-02-24 13:44:57 +08:00
he dcd6375d7d 系统配置 2025-02-24 13:43:22 +08:00
hang 8b53517f2c 角色修改
continuous-integration/drone/push Build is running Details
2025-02-24 13:43:21 +08:00
hang 1c3ddcf1cd 修改邮箱登录bug
continuous-integration/drone/push Build is passing Details
2025-02-24 13:32:54 +08:00
hang fc4ef6b939 账号初始化链接过期+初始化不允许忘记密码修改密码
continuous-integration/drone/push Build is passing Details
2025-02-24 13:24:41 +08:00
hang 6d009c4f86 增加备注
continuous-integration/drone/push Build is passing Details
2025-02-24 11:32:26 +08:00
hang f995187925 修改文件类型基础代码
continuous-integration/drone/push Build is passing Details
2025-02-24 11:25:03 +08:00
hang 67a6a5f861 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-21 17:08:35 +08:00
hang 6bfa4da72d 文档服务初步提交 2025-02-21 17:08:33 +08:00
he 9797c94aa8 修改
continuous-integration/drone/push Build is passing Details
2025-02-21 14:46:10 +08:00
hang 5dd2dfd17b 增加项目文档新表
continuous-integration/drone/push Build is passing Details
2025-02-21 14:20:39 +08:00
hang 5791aca9fd 最后一次登录时间 和ip 记录
continuous-integration/drone/push Build is passing Details
2025-02-20 15:26:36 +08:00
hang f61ce70b82 修改项目培训统计数字
continuous-integration/drone/push Build is passing Details
2025-02-20 15:05:13 +08:00
hang c8091d3215 清理签名文档的表
continuous-integration/drone/push Build is passing Details
2025-02-20 13:47:09 +08:00
hang 7153d810aa 删除用户角色表部分字段,修改统计
continuous-integration/drone/push Build is passing Details
2025-02-20 13:08:06 +08:00
hang 68053d24b6 项目创建账户的时候,没有用户名,但是目标用户Id 有值,导致查询出来有名字
continuous-integration/drone/push Build is passing Details
2025-02-19 14:20:06 +08:00
hang a49b4c8ef7 修改冲突
continuous-integration/drone/push Build is passing Details
2025-02-19 10:13:37 +08:00
hang c6c036c152 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-19 09:39:21 +08:00
hang db0d087396 修改国际化bug 2025-02-19 09:39:20 +08:00
he 263f43b1a9 项目下拉修改
continuous-integration/drone/push Build is passing Details
2025-02-18 13:35:22 +08:00
hang 21626cda9d 维护历史退出人员数据
continuous-integration/drone/push Build is passing Details
2025-02-18 13:15:05 +08:00
he 77d920a2ef Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-18 10:40:31 +08:00
he bbf7af8405 项目筛选修改 2025-02-18 10:40:29 +08:00
hang d0bbc58b20 Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-17 17:15:44 +08:00
hang fed2cbe043 修改 创建账号仅仅记录一条
continuous-integration/drone/push Build is passing Details
2025-02-17 17:15:25 +08:00
hang 4d4bb08423 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-17 15:13:02 +08:00
hang dd09c78cd2 项目退出人员维护数据 2025-02-17 15:12:59 +08:00
hang 771091a557 IR 反馈bug 重新设置状态
continuous-integration/drone/push Build is passing Details
2025-02-17 14:16:34 +08:00
he 8ce1bdf21c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-17 10:06:06 +08:00
he 679cc26225 状态修改 2025-02-17 10:06:04 +08:00
hang ff5be827d0 Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-17 09:28:02 +08:00
hang 4555997957 修改文档查询条件问题
continuous-integration/drone/push Build is passing Details
2025-02-17 09:22:58 +08:00
hang 3b43bee0f1 x
continuous-integration/drone/push Build is passing Details
2025-02-14 17:30:21 +08:00
hang 3677a30bab 修改日志角色查询
continuous-integration/drone/push Build is passing Details
2025-02-14 17:19:50 +08:00
hang 2e8b2a24ae 合并冲突
continuous-integration/drone/push Build is passing Details
2025-02-14 16:51:09 +08:00
hang 26500aa1cf 修改日志
continuous-integration/drone/push Build is passing Details
2025-02-14 16:48:52 +08:00
hang adfd6b50c1 修改登录日志
continuous-integration/drone/push Build is failing Details
2025-02-14 16:39:38 +08:00
hang b58bdc184e Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-14 16:15:37 +08:00
hang 580eea7a61 修改稽查查询条件bug
continuous-integration/drone/push Build is passing Details
2025-02-14 16:15:21 +08:00
hang da27b65e56 用户登录日志 项目参与用户修改
continuous-integration/drone/push Build is passing Details
2025-02-14 16:11:48 +08:00
hang bb493fe827 修改日志,和稽查查询 2025-02-14 16:02:49 +08:00
hang 655fe18138 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-14 16:00:48 +08:00
hang 9d70d61013 修改日志,和稽查查询 2025-02-14 16:00:46 +08:00
he 68452beba0 添加是否存在未处理反馈的状态
continuous-integration/drone/push Build is passing Details
2025-02-14 15:40:34 +08:00
he 409e9e9bc0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-14 15:18:12 +08:00
he f241f2cd2b 去除掉已经停止的项目 2025-02-14 15:18:10 +08:00
hang 2ea90a66ae Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-14 14:18:51 +08:00
hang c2c8f65aaa 修改质控问题答案排序
continuous-integration/drone/push Build is passing Details
2025-02-14 14:07:33 +08:00
hang a578be8336 Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8 2025-02-14 13:27:52 +08:00
hang 45b469682a 影像质控,质控人看到的是过滤了删除的,其他人看到的是原始的
continuous-integration/drone/push Build is passing Details
2025-02-14 13:09:26 +08:00
hang 1e9f4d890f 质控预览再次修改0214
continuous-integration/drone/push Build is passing Details
2025-02-14 10:54:00 +08:00
hang 44f74fd9e6 修改 预览根据质控状态过滤
continuous-integration/drone/push Build is passing Details
2025-02-13 18:01:17 +08:00
hang f1c8415899 修改阅片预览影像(同时标记了删除 和阅片)
continuous-integration/drone/push Build is passing Details
2025-02-13 17:11:21 +08:00
hang 823ada5673 合并
continuous-integration/drone/push Build is passing Details
2025-02-13 16:53:27 +08:00
hang 55f146a44a 修改序列上的Instance 数量
continuous-integration/drone/push Build is passing Details
2025-02-13 16:52:13 +08:00
hang 5fe972bd99 修改质控预览影像 uat 修改
continuous-integration/drone/push Build is passing Details
2025-02-13 16:43:59 +08:00
hang 0578263e10 修改质控预览影像 uat 修改
continuous-integration/drone/push Build is passing Details
2025-02-13 16:40:34 +08:00
hang 9316c0814f 合并
continuous-integration/drone/push Build is passing Details
2025-02-13 16:16:18 +08:00
hang 8bdd9e29ab 修改阅片看到得instance 序列
continuous-integration/drone/push Build is failing Details
2025-02-13 16:13:52 +08:00
hang ae14a8a530 修改预览不阅片影像数字
continuous-integration/drone/push Build is passing Details
2025-02-13 15:53:02 +08:00
hang 2a170cc97e 修改预览不阅片影像数字
continuous-integration/drone/push Build is passing Details
2025-02-13 15:52:44 +08:00
hang c109e14a93 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-13 14:01:02 +08:00
hang 240d406a1a Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8 2025-02-13 14:00:53 +08:00
hang b6cf988058 导表 裁判选择原因bug
continuous-integration/drone/push Build is passing Details
2025-02-13 14:00:34 +08:00
he c16153fa19 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-13 13:12:11 +08:00
he a0797a99ff 修改 2025-02-13 13:12:09 +08:00
hang 376cfa3167 合并bug
continuous-integration/drone/push Build is passing Details
2025-02-13 11:06:32 +08:00
hang 14690dc3cc 合并修改
continuous-integration/drone/push Build is passing Details
2025-02-13 10:59:23 +08:00
hang 6dd0831a66 质控预览 增加是否阅片 是否删除 第二次提交
continuous-integration/drone/push Build is passing Details
2025-02-13 10:40:18 +08:00
hang a150156810 修改配置文件
continuous-integration/drone/push Build is passing Details
2025-02-13 10:21:57 +08:00
hang d61fba9d95 Uat 影像阅片初步修改 2025-02-13 10:21:49 +08:00
hang 7cb8d04ca9 Uat 影像阅片初步修改
continuous-integration/drone/push Build is passing Details
2025-02-13 10:17:01 +08:00
he a2fc2c5075 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-12 16:52:43 +08:00
he 1ed8788c83 修改邮箱 2025-02-12 16:52:39 +08:00
hang 14e95fd303 修改配置文件
continuous-integration/drone/push Build is passing Details
2025-02-12 14:01:53 +08:00
hang 3dca5aa06f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-11 15:45:54 +08:00
hang faea3a4f86 肿瘤学阅片结果导出 2025-02-11 15:45:50 +08:00
he a5dcad1767 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-11 14:38:09 +08:00
he 6754121b17 肿瘤学修改 2025-02-11 14:38:07 +08:00
hang 131425774a 修改MFA 日志
continuous-integration/drone/push Build is passing Details
2025-02-10 15:08:14 +08:00
hang 585e4cdc1b 修改一致性核查对话判断
continuous-integration/drone/push Build is passing Details
2025-02-10 14:54:04 +08:00
hang 12ddeba2a3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-10 09:25:38 +08:00
hang ab0c256e0b 修改国际化返回更多信息 2025-02-10 09:25:37 +08:00
hang 8a24b33757 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-08 15:58:17 +08:00
hang 8f6e2e342a 肿瘤评估标准-Id匹配合并去重bug 2025-02-08 15:58:12 +08:00
he 4dfeb653b1 修改逻辑
continuous-integration/drone/push Build is passing Details
2025-02-08 15:43:11 +08:00
he 670a754eb2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-08 11:06:54 +08:00
he 3f46103dc3 修改 2025-02-08 11:06:53 +08:00
hang 6c2901daca Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-02-08 10:54:45 +08:00
hang a73e5d4133 增加一致性核查排序 以及一致性核查国际化调整填充公司简称 2025-02-08 10:54:44 +08:00
he b067cb66f3 接口修改
continuous-integration/drone/push Build is running Details
2025-02-08 10:54:06 +08:00
he f1185758d6 修改领取规则
continuous-integration/drone/push Build is passing Details
2025-02-08 10:48:00 +08:00
he 0d4a0adf00 添加IsPACSConnect
continuous-integration/drone/push Build is passing Details
2025-02-08 10:23:22 +08:00
he 20f6f95b89 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2025-02-08 10:20:18 +08:00
he 7e7c186784 临床数据修改 2025-02-08 10:20:15 +08:00
hang 70e0a1325a HIR 推送影像bug 修改到IRC 测试
continuous-integration/drone/push Build is passing Details
2025-02-08 09:33:29 +08:00
he 91471dee13 修改配置
continuous-integration/drone/push Build is passing Details
2025-02-07 15:03:14 +08:00
hang a80dc14dcc 修改一致性核查测试
continuous-integration/drone/push Build is passing Details
2025-01-24 16:26:57 +08:00
hang e1cd187f4b 修改部位排序
continuous-integration/drone/push Build is passing Details
2025-01-24 15:55:33 +08:00
hang 35fb7533db x
continuous-integration/drone/push Build is passing Details
2025-01-24 14:30:47 +08:00
hang bdd9b69dfd Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-24 13:43:49 +08:00
hang 82a043a233 修改配置文件 2025-01-24 13:43:48 +08:00
he 66819a1e89 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-24 12:28:56 +08:00
he 9089376e5e 添加美国正式环境 2025-01-24 12:28:54 +08:00
hang 8d3f654fe5 修改生产配置文件
continuous-integration/drone/push Build is passing Details
2025-01-24 10:30:08 +08:00
hang c607af9736 搜素条件修改
continuous-integration/drone/push Build is passing Details
2025-01-24 09:52:08 +08:00
hang 0b45c30d0b 修改配置
continuous-integration/drone/push Build is passing Details
2025-01-23 18:22:51 +08:00
hang 1b7de79209 修改统计数字过滤删除的
continuous-integration/drone/push Build is running Details
2025-01-23 18:19:50 +08:00
hang 4ffedb4052 修改参与人员退出限制
continuous-integration/drone/push Build is passing Details
2025-01-23 17:40:05 +08:00
hang d8eb7acf2e 修改登录设置自动退出时间
continuous-integration/drone/push Build is passing Details
2025-01-23 16:53:18 +08:00
hang 6f3a4d723c 修改配置文件
continuous-integration/drone/push Build is passing Details
2025-01-23 16:47:42 +08:00
hang 0b2305ae65 修改登录挤账号登录
continuous-integration/drone/push Build is passing Details
2025-01-23 16:35:02 +08:00
hang e86c255186 修改配置文件
continuous-integration/drone/push Build is passing Details
2025-01-23 15:40:38 +08:00
hang d8658dca2a 修改美国生产配置文件
continuous-integration/drone/push Build is passing Details
2025-01-23 14:51:33 +08:00
hang 4372202a5b 修改中心导入数据
continuous-integration/drone/push Build is passing Details
2025-01-23 14:42:26 +08:00
hang affdc3e229 修改导入数据空格问题
continuous-integration/drone/push Build is passing Details
2025-01-23 14:37:30 +08:00
hang cfa384d02a 修改文档签署统计数字
continuous-integration/drone/push Build is passing Details
2025-01-23 12:54:09 +08:00
hang a33b7d606b 修改过滤
continuous-integration/drone/push Build is passing Details
2025-01-23 11:19:27 +08:00
hang da9ea70e5e Merge branch 'Test_IRC_Net8' into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-23 11:15:22 +08:00
hang 6f254ca958 增加MIM
continuous-integration/drone/push Build is passing Details
2025-01-23 10:42:29 +08:00
hang da3bd07607 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-23 10:38:41 +08:00
hang 1569010d69 修改内外部筛选 2025-01-23 10:38:39 +08:00
he ea7b3f4f7a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-23 09:33:35 +08:00
he fc041e810c 修改KeyFramesList 2025-01-23 09:33:33 +08:00
hang ebc00e3e6d 修改文档过滤
continuous-integration/drone/push Build is passing Details
2025-01-22 16:29:46 +08:00
hang 612c0b127c 修改取账号排序
continuous-integration/drone/push Build is passing Details
2025-01-22 14:56:00 +08:00
hang a67df04da6 Merge branch 'Test_IRC_Net8' into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-22 10:42:14 +08:00
hang 43ae270eb7 修改邮件配置
continuous-integration/drone/push Build is passing Details
2025-01-22 10:40:43 +08:00
he d41c88beeb 修改配置
continuous-integration/drone/push Build is passing Details
2025-01-22 10:25:12 +08:00
he 92486d8320 修改导出配置 2025-01-22 10:25:09 +08:00
hang 0d2d3408b5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-22 10:14:41 +08:00
hang f76b66c35d 修改内外部 2025-01-22 10:14:38 +08:00
he 48a98de7cc 修改配置
continuous-integration/drone/push Build is passing Details
2025-01-22 09:27:24 +08:00
he 23ba634a42 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2025-01-22 09:25:51 +08:00
he 23d7598722 修改导出配置 2025-01-22 09:25:49 +08:00
hang 7885cd151a 优化逻辑
continuous-integration/drone/push Build is passing Details
2025-01-21 22:54:23 +08:00
hang fb478aa5f2 修改导表填充测试
continuous-integration/drone/push Build is passing Details
2025-01-21 22:23:45 +08:00
hang 31f56a39a5 导表临时修改
continuous-integration/drone/push Build is passing Details
2025-01-21 19:00:01 +08:00
hang 6860f9437b 修改裁判重阅问题
continuous-integration/drone/push Build is passing Details
2025-01-21 18:29:36 +08:00
hang a06e7a9a2c 维护密码历史日志
continuous-integration/drone/push Build is passing Details
2025-01-21 15:16:40 +08:00
hang ac8875acdf 修改验证码
continuous-integration/drone/push Build is passing Details
2025-01-21 11:40:18 +08:00
hang f79c12165e 修改用户密码增加记录
continuous-integration/drone/push Build is passing Details
2025-01-21 09:16:44 +08:00
hang 91b358e674 修改 前三次密码验证
continuous-integration/drone/push Build is passing Details
2025-01-20 20:14:44 +08:00
hang 7ec274fb72 修改密码逻辑
continuous-integration/drone/push Build is passing Details
2025-01-20 19:53:54 +08:00
hang 7d419595ca 修改添加pacs 影像bug
continuous-integration/drone/push Build is passing Details
2025-01-20 19:39:08 +08:00
hang a6e260dce1 签名文档bug
continuous-integration/drone/push Build is passing Details
2025-01-20 17:36:37 +08:00
hang 2e9a75279d 修改邮箱修改邮箱验证码错误
continuous-integration/drone/push Build is running Details
2025-01-20 17:35:25 +08:00
hang 68a57594ff 修改时间
continuous-integration/drone/push Build is passing Details
2025-01-20 17:23:21 +08:00
hang bd4d6c8c5f 修改退回bug
continuous-integration/drone/push Build is passing Details
2025-01-20 16:01:05 +08:00
hang a36a0513fe 修改scp 服务地址
continuous-integration/drone/push Build is passing Details
2025-01-20 15:51:52 +08:00
hang 02e418f660 修改账号日志
continuous-integration/drone/push Build is passing Details
2025-01-20 15:17:53 +08:00
hang 199f7060fa Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-20 14:53:23 +08:00
hang 9bdb782b8d 修改查看日志 和项目列表过滤
continuous-integration/drone/push Build is passing Details
2025-01-20 14:52:43 +08:00
he 9b9bbfbd5d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-20 14:24:50 +08:00
he a9a034923f 删除OSS脏文件夹 2025-01-20 14:24:49 +08:00
hang 07b63077d1 Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-20 11:34:35 +08:00
hang 013b9720b3 添加中心增加验证
continuous-integration/drone/push Build is passing Details
2025-01-20 11:33:48 +08:00
hang f924b4985a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-20 11:27:40 +08:00
hang 40b986e310 修改默认值 和账号已过期 2025-01-20 11:27:39 +08:00
he 146b0635c8 修改默认值
continuous-integration/drone/push Build is passing Details
2025-01-20 11:22:53 +08:00
he e76a5d189e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-20 11:17:26 +08:00
he 6f81c39c62 全局阅片 默认值改为false 2025-01-20 11:17:24 +08:00
hang 036565ec81 Merge branch 'Test_IRC_Net8' into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-20 11:12:09 +08:00
hang a2225d7cba 修改发放token
continuous-integration/drone/push Build is passing Details
2025-01-20 11:09:55 +08:00
hang 3463b69b78 修改邮件 多了IR
continuous-integration/drone/push Build is passing Details
2025-01-20 10:44:27 +08:00
he bf61a05e45 修改查询问题
continuous-integration/drone/push Build is passing Details
2025-01-18 23:03:58 +08:00
he d930d51d0d 修改查询问题
continuous-integration/drone/push Build is passing Details
2025-01-18 22:55:22 +08:00
hang 629fbfb037 修改邮件
continuous-integration/drone/push Build is passing Details
2025-01-17 15:23:46 +08:00
hang 2255ee1b03 维护数据不要权限
continuous-integration/drone/push Build is passing Details
2025-01-17 14:10:19 +08:00
hang 5d269b699c Merge branch 'Test_IRC_Net8' into Uat_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-17 13:58:42 +08:00
hang 7b7723426b 修改统计数字
continuous-integration/drone/push Build is passing Details
2025-01-17 10:17:15 +08:00
hang 07f1511bb9 修改导入表
continuous-integration/drone/push Build is passing Details
2025-01-16 17:48:39 +08:00
hang 36f0e20340 修改备注
continuous-integration/drone/push Build is passing Details
2025-01-16 16:51:58 +08:00
hang 63919c8f6b 修改维护方法
continuous-integration/drone/push Build is passing Details
2025-01-16 15:13:58 +08:00
he 77798e929e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-16 15:06:52 +08:00
he f407c5f514 稽查修改 2025-01-16 15:06:50 +08:00
hang e66df9bbc9 修改登录记录异地登录
continuous-integration/drone/push Build is passing Details
2025-01-16 13:31:14 +08:00
hang 38fe5aea25 修改枚举值
continuous-integration/drone/push Build is passing Details
2025-01-16 13:19:36 +08:00
hang 2d792b4557 修改用户登录
continuous-integration/drone/push Build is passing Details
2025-01-16 12:26:26 +08:00
hang 5222cdb8f1 屏幕解锁+ 密码错误 也异地登录
continuous-integration/drone/push Build is passing Details
2025-01-16 11:47:24 +08:00
hang 453d3f7653 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-16 11:22:40 +08:00
hang dca0dfb003 修改裁判阅片明细表过滤 2025-01-16 11:22:39 +08:00
he 2d1e2f53ee Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-16 11:12:57 +08:00
he 82167463e4 修改登录状态 2025-01-16 11:12:55 +08:00
hang e46f204204 非肿瘤评估标准,多表格 和单表格处理
continuous-integration/drone/push Build is passing Details
2025-01-16 08:59:21 +08:00
hang 9d6cdd5711 修改导表配置完成
continuous-integration/drone/push Build is passing Details
2025-01-15 22:48:54 +08:00
hang fc70ec7ad0 修改导表bug
continuous-integration/drone/push Build is passing Details
2025-01-15 22:39:20 +08:00
hang 68845ae44b 临时提交
continuous-integration/drone/push Build is passing Details
2025-01-15 21:09:06 +08:00
hang 5570c56b1e 修改导表 Excel 列名处理
continuous-integration/drone/push Build is passing Details
2025-01-15 12:54:58 +08:00
hang 2fdd7bf464 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-15 11:13:26 +08:00
hang 24c259a38b 修改导表 2025-01-15 11:13:24 +08:00
he f4a97b940a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-15 10:57:03 +08:00
he 0f74444b22 修改 2025-01-15 10:57:02 +08:00
hang cf9d42dc49 修改翻译字典名
continuous-integration/drone/push Build is passing Details
2025-01-15 10:15:36 +08:00
hang f518b44007 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-14 15:50:13 +08:00
hang 95a203881e 修改1.1 导表配置 2025-01-14 15:50:12 +08:00
he b86361bf0e 修改
continuous-integration/drone/push Build is passing Details
2025-01-14 14:55:24 +08:00
he 5c97f37a75 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-14 13:20:54 +08:00
he 307d982fcb 删除项目 2025-01-14 13:20:52 +08:00
hang 3d791d2e41 修改阅片结果导出
continuous-integration/drone/push Build is passing Details
2025-01-14 10:45:12 +08:00
hang 538cfa279a 修改维护数据
continuous-integration/drone/push Build is passing Details
2025-01-13 16:55:04 +08:00
hang 3f2315c96d 异地登录修改
continuous-integration/drone/push Build is passing Details
2025-01-13 16:07:12 +08:00
he 293933ec7d 修改
continuous-integration/drone/push Build is passing Details
2025-01-13 15:35:53 +08:00
he 97d3b986de Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-13 15:22:55 +08:00
he f8fea6561d 修改 2025-01-13 15:22:54 +08:00
hang dfa8474a6e 修改导表
continuous-integration/drone/push Build is passing Details
2025-01-13 15:20:53 +08:00
he e022eb058b 修改
continuous-integration/drone/push Build is passing Details
2025-01-13 15:15:36 +08:00
he d04b425d62 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-13 14:56:16 +08:00
he c1fdf67d39 修改 2025-01-13 14:56:14 +08:00
hang dd902c1355 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-13 14:28:03 +08:00
hang b21b122d24 修改导表 2025-01-13 14:28:02 +08:00
he 7544bc81a3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-13 13:51:38 +08:00
he aab998d5c6 修改 2025-01-13 13:51:37 +08:00
hang 3dc5507b6b 参与人员导表
continuous-integration/drone/push Build is passing Details
2025-01-13 13:08:28 +08:00
hang 12fbc2643c 修改角色停用,签名文档问题
continuous-integration/drone/push Build is passing Details
2025-01-13 11:46:26 +08:00
hang b14e712126 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-13 11:39:40 +08:00
hang c303f6677b 修改国际化和导表 2025-01-13 11:39:31 +08:00
he 1976cd8cdd 去掉ExportIdentification
continuous-integration/drone/push Build is passing Details
2025-01-13 11:25:14 +08:00
he cc6d5d2b4f 修改
continuous-integration/drone/push Build is passing Details
2025-01-10 15:41:32 +08:00
he b72edbf326 修改稽查
continuous-integration/drone/push Build is passing Details
2025-01-10 15:03:53 +08:00
he b0b23593f6 代码修改
continuous-integration/drone/push Build is passing Details
2025-01-10 14:54:31 +08:00
he 941eee9857 修改
continuous-integration/drone/push Build is passing Details
2025-01-10 14:38:48 +08:00
he 8f8751103e 修改
continuous-integration/drone/push Build is passing Details
2025-01-10 14:31:57 +08:00
he c575e15c55 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-10 14:17:50 +08:00
he 56afa2bf8d 修改 2025-01-10 14:17:48 +08:00
hang 2e993149a9 修改默认配置文件
continuous-integration/drone/push Build is passing Details
2025-01-10 14:06:51 +08:00
hang 89421ee731 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2025-01-10 14:05:10 +08:00
hang 2509e26aae 修改角色禁用 2025-01-10 14:05:05 +08:00
he db7e9b90ec 添加 SplitAndConcatenate 方法处理 IP 地址字符串 2025-01-10 10:29:56 +08:00
he 9827b22b6f 修改验证
continuous-integration/drone/push Build is passing Details
2025-01-10 10:09:53 +08:00
he 9636efcb56 修改标记
continuous-integration/drone/push Build is passing Details
2025-01-10 09:14:18 +08:00
he 06d8e4bea8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-09 17:12:05 +08:00
he 5111372972 修改 2025-01-09 17:12:03 +08:00
hang 4cdf94d29c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-09 16:20:40 +08:00
hang 5bacf2667f 修改最晚拍片日期 2025-01-09 16:20:39 +08:00
he 81cb833d57 修改
continuous-integration/drone/push Build is passing Details
2025-01-09 15:47:49 +08:00
he 53e96811ce 修改
continuous-integration/drone/push Build is running Details
2025-01-09 15:46:27 +08:00
he 7b52c0b785 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-09 15:34:54 +08:00
he 9362d29fae 添加重复验证 2025-01-09 15:34:53 +08:00
hang 212268cfa5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-09 15:23:31 +08:00
hang 862da87a0c 修改用户日志 2025-01-09 15:23:28 +08:00
he 0dae3c000c 首次添加病灶
continuous-integration/drone/push Build is passing Details
2025-01-09 15:06:54 +08:00
he 55ea791387 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2025-01-09 15:05:11 +08:00
he 3a62189503 稽查修改 2025-01-09 15:05:10 +08:00
hang d3396d9683 修改导表错位
continuous-integration/drone/push Build is passing Details
2025-01-09 13:59:23 +08:00
hang 7672c9ab85 修改导表
continuous-integration/drone/push Build is passing Details
2025-01-09 13:19:18 +08:00
he afbc43b83f 修改
continuous-integration/drone/push Build is passing Details
2025-01-09 11:22:53 +08:00
he 4613f98154 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-09 11:11:33 +08:00
he 52f34d70b7 提交 2025-01-09 11:11:33 +08:00
hang 02d378e0e6 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-09 11:06:47 +08:00
hang c29bb8e1a3 发布版本 2025-01-09 11:06:46 +08:00
he 1eaa56bb2a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-09 11:01:28 +08:00
he 54cdd14889 稽查修改 2025-01-09 11:01:26 +08:00
hang 01c253952b 修改医生bug
continuous-integration/drone/push Build is passing Details
2025-01-09 09:47:28 +08:00
hang 060be72143 打出日志
continuous-integration/drone/push Build is passing Details
2025-01-09 09:41:34 +08:00
hang f5032b95ce Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-09 09:27:35 +08:00
hang 8fce9f4bf2 修改阅片人 产生用户名 2025-01-09 09:27:34 +08:00
he 857e7c5523 修改
continuous-integration/drone/push Build is passing Details
2025-01-08 17:49:40 +08:00
he 67dbf7c701 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-08 17:09:18 +08:00
he 17fd46c2dc 计算修改 2025-01-08 17:09:17 +08:00
hang 75b3a60ca6 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-08 16:09:54 +08:00
hang f499a9b803 修改培训导表 2025-01-08 16:09:52 +08:00
he c87c724685 修改计算
continuous-integration/drone/push Build is passing Details
2025-01-08 16:02:45 +08:00
he 36ea9f526e 修改
continuous-integration/drone/push Build is passing Details
2025-01-08 14:43:10 +08:00
he e5bf8c4c8c 修改
continuous-integration/drone/push Build is passing Details
2025-01-08 13:49:28 +08:00
he 60a5cc4602 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-08 13:39:41 +08:00
he c376fe1d22 计算修改 2025-01-08 13:39:39 +08:00
hang 8111b60d4f 修改参与人员导表
continuous-integration/drone/push Build is passing Details
2025-01-08 13:22:24 +08:00
hang 86c871bc9f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-08 11:32:25 +08:00
hang a21cca53f8 修改文档返回状态 2025-01-08 11:32:24 +08:00
he 4a03467968 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-08 10:48:37 +08:00
he f6151b7ce1 计算修改 2025-01-08 10:48:37 +08:00
hang cbfc2f9538 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-08 10:37:06 +08:00
hang 35ca08ee04 CMM SMM 阅片人筛选 2025-01-08 10:37:04 +08:00
he 0781496c69 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2025-01-08 10:36:47 +08:00
he 0cca369eaa 修改 2025-01-08 10:36:46 +08:00
hang 62fafeb7d2 添加用户 重新发送邮件
continuous-integration/drone/push Build is passing Details
2025-01-08 09:50:25 +08:00
hang f513829c94 修改统计数字
continuous-integration/drone/push Build is passing Details
2025-01-07 18:04:14 +08:00
hang bbb3a41293 中心人员添加
continuous-integration/drone/push Build is passing Details
2025-01-07 15:26:30 +08:00
hang e966779cc8 修改中心调研发现的bug
continuous-integration/drone/push Build is passing Details
2025-01-07 14:25:50 +08:00
hang bcc576dfd1 修改映射
continuous-integration/drone/push Build is passing Details
2025-01-07 11:40:26 +08:00
hang dac9453048 修改查询
continuous-integration/drone/push Build is passing Details
2025-01-07 11:31:31 +08:00
hang faf5430248 修改返回真实名字
continuous-integration/drone/push Build is passing Details
2025-01-07 10:51:52 +08:00
hang 561e1748d6 修改部位
continuous-integration/drone/push Build is running Details
2025-01-07 10:49:40 +08:00
hang 83749e15cb CDISC_Reading_Export
continuous-integration/drone/push Build is passing Details
2025-01-07 10:34:19 +08:00
hang 1a64c07c8e 导表准备
continuous-integration/drone/push Build is passing Details
2025-01-06 17:58:17 +08:00
hang 6ead8ffd53 修改配置临时提交
continuous-integration/drone/push Build is passing Details
2025-01-06 17:29:53 +08:00
hang 1676516441 修改返回的配置
continuous-integration/drone/push Build is passing Details
2025-01-06 16:41:33 +08:00
hang c97186a557 修改废除文档签署数字
continuous-integration/drone/push Build is passing Details
2025-01-06 16:05:02 +08:00
he 59f88175b4 修改枚举
continuous-integration/drone/push Build is passing Details
2025-01-06 15:40:07 +08:00
he 77b45e80fe 合并
continuous-integration/drone/push Build is passing Details
2025-01-06 15:17:55 +08:00
he 2b9272c495 修改 2025-01-06 14:28:23 +08:00
hang 5dae08d9c0 修改列表过滤
continuous-integration/drone/push Build is passing Details
2025-01-06 13:59:04 +08:00
hang 653533020f 修改文档签署
continuous-integration/drone/push Build is passing Details
2025-01-06 13:23:49 +08:00
hang 5a12879182 修改签名
continuous-integration/drone/push Build is passing Details
2025-01-06 13:14:38 +08:00
hang 8132f9a2ea x
continuous-integration/drone/push Build is passing Details
2025-01-06 13:07:33 +08:00
hang 293865fc3f 修改稽查
continuous-integration/drone/push Build is passing Details
2025-01-06 11:41:54 +08:00
hang cfbe3d2589 检查部位智能处理
continuous-integration/drone/push Build is passing Details
2025-01-06 10:05:10 +08:00
hang 69151bbddb 修改查询
continuous-integration/drone/push Build is passing Details
2025-01-03 17:58:33 +08:00
hang 5faf1a5442 修改筛选忽略过滤器
continuous-integration/drone/push Build is passing Details
2025-01-03 17:42:19 +08:00
hang 25648a8a69 修改启用禁用查询
continuous-integration/drone/push Build is passing Details
2025-01-03 17:16:13 +08:00
hang 522d619ee8 xx
continuous-integration/drone/push Build is passing Details
2025-01-03 16:56:58 +08:00
hang 4a901085d8 x
continuous-integration/drone/push Build is passing Details
2025-01-03 16:49:40 +08:00
hang 49d60f6f68 修改测试
continuous-integration/drone/push Build is running Details
2025-01-03 16:47:27 +08:00
hang 73b8cfe723 修改系统角色状态
continuous-integration/drone/push Build is passing Details
2025-01-03 16:34:43 +08:00
hang 05a4de1464 项目参与用户修改
continuous-integration/drone/push Build is passing Details
2025-01-03 16:29:11 +08:00
hang 9002d850a5 遗漏了else
continuous-integration/drone/push Build is passing Details
2025-01-03 15:22:18 +08:00
hang 23cfe72d40 裁判未分配导致没有被影响到bug 修复测试
continuous-integration/drone/push Build is passing Details
2025-01-03 15:16:39 +08:00
hang 8303f9faae spm 逻辑修改
continuous-integration/drone/push Build is passing Details
2025-01-03 15:09:56 +08:00
hang 517c799e00 设置重阅
continuous-integration/drone/push Build is passing Details
2025-01-03 14:30:01 +08:00
hang 69f5b54919 修改SPM 逻辑
continuous-integration/drone/push Build is passing Details
2025-01-03 13:38:28 +08:00
hang 5c0d30d2bc 修改文档签署
continuous-integration/drone/push Build is passing Details
2025-01-03 13:32:49 +08:00
hang c62086f8e8 撤回修改
continuous-integration/drone/push Build is passing Details
2025-01-03 13:20:22 +08:00
hang 2dfcedfe3c 修改签署文档
continuous-integration/drone/push Build is passing Details
2025-01-03 13:17:49 +08:00
hang 77180ea7ba xx
continuous-integration/drone/push Build is passing Details
2025-01-03 11:50:25 +08:00
hang 8656ed09bb 修改PM 申审批
continuous-integration/drone/push Build is passing Details
2025-01-03 10:52:34 +08:00
hang 7cdfce354c xx
continuous-integration/drone/push Build is passing Details
2025-01-03 10:29:05 +08:00
hang 2ac7af44b9 修改mfa 登录
continuous-integration/drone/push Build is running Details
2025-01-03 10:27:12 +08:00
hang a0b18bbf72 修改登录mfa
continuous-integration/drone/push Build is passing Details
2025-01-03 09:50:18 +08:00
hang 6713a9c8e2 修改mfa 验证
continuous-integration/drone/push Build is passing Details
2025-01-03 09:38:24 +08:00
hang ecfc603dda 修改mfa 登录
continuous-integration/drone/push Build is passing Details
2025-01-03 09:34:59 +08:00
hang 55db1a2eab 修改发送邮件人员判断
continuous-integration/drone/push Build is passing Details
2025-01-02 17:33:42 +08:00
hang f117fbb571 邮件发送
continuous-integration/drone/push Build is passing Details
2025-01-02 17:20:13 +08:00
he 5a1687b45f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-02 16:58:51 +08:00
he d31e560a6b 接口名称修改 2025-01-02 16:58:50 +08:00
hang de4bf6951f 管理员重置密码修改
continuous-integration/drone/push Build is running Details
2025-01-02 16:55:01 +08:00
hang f034d9ca87 MFA 登录修改
continuous-integration/drone/push Build is running Details
2025-01-02 16:53:54 +08:00
hang f62e849f80 忘记密码记录日志
continuous-integration/drone/push Build is passing Details
2025-01-02 16:47:13 +08:00
hang 055537ddbb 修改账号禁用日志
continuous-integration/drone/push Build is passing Details
2025-01-02 16:28:24 +08:00
hang 13efa0f1d3 修改创建账号日志
continuous-integration/drone/push Build is passing Details
2025-01-02 16:17:09 +08:00
he 901438a4a7 修改
continuous-integration/drone/push Build is passing Details
2025-01-02 15:37:34 +08:00
he 7b26af01b1 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-02 15:32:08 +08:00
he de0534c3a1 代码修改 2025-01-02 15:32:07 +08:00
hang 1f490138a0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-02 15:23:52 +08:00
hang ed3d0421db 增加信息验证 2025-01-02 15:23:49 +08:00
he b83e42d788 代码导出配置修改
continuous-integration/drone/push Build is passing Details
2025-01-02 15:06:09 +08:00
he 141fbc2e75 代码修改
continuous-integration/drone/push Build is running Details
2025-01-02 15:03:26 +08:00
he 2e7cbbb8b0 修改
continuous-integration/drone/push Build is passing Details
2025-01-02 14:41:09 +08:00
he 461a59b678 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2025-01-02 14:18:15 +08:00
he 774680ced0 代码修改 2025-01-02 14:18:13 +08:00
hang 8a26c42857 修改批量增加到中心
continuous-integration/drone/push Build is passing Details
2025-01-02 13:20:55 +08:00
hang 25a91904b8 加人软删除逻辑有问题
continuous-integration/drone/push Build is passing Details
2025-01-02 13:09:21 +08:00
hang 1fa94b95f0 修改用户类型展示
continuous-integration/drone/push Build is passing Details
2025-01-02 11:26:18 +08:00
hang 52efdc28e4 修改映射
continuous-integration/drone/push Build is passing Details
2025-01-02 11:19:17 +08:00
hang 678599f218 修改创建角色设置id
continuous-integration/drone/push Build is passing Details
2025-01-02 10:48:07 +08:00
hang ba49164db6 修改登录中心调研表
continuous-integration/drone/push Build is passing Details
2024-12-31 17:49:45 +08:00
hang 6089fef0a8 修改邮件内容 首次登录区分用户名
continuous-integration/drone/push Build is passing Details
2024-12-31 17:27:44 +08:00
hang 8b3dd419b7 修改筛选用户角色启用
continuous-integration/drone/push Build is passing Details
2024-12-31 16:49:17 +08:00
hang 86236e865e 外部人员bug
continuous-integration/drone/push Build is passing Details
2024-12-31 16:44:31 +08:00
hang e696873025 修改状态
continuous-integration/drone/push Build is passing Details
2024-12-31 15:50:41 +08:00
hang e4c602095f 修改bug
continuous-integration/drone/push Build is passing Details
2024-12-31 15:44:09 +08:00
hang be1f8dfad9 记录日志
continuous-integration/drone/push Build is passing Details
2024-12-31 14:00:07 +08:00
hang 9571775343 修改启用项目参与人员的状态
continuous-integration/drone/push Build is passing Details
2024-12-31 13:37:22 +08:00
hang 518ed694fb 修改添加人员
continuous-integration/drone/push Build is passing Details
2024-12-31 13:28:14 +08:00
hang bf2b439ce1 修改账号角色禁用
continuous-integration/drone/push Build is passing Details
2024-12-31 13:12:39 +08:00
hang bfed24028a 修改邮件发送
continuous-integration/drone/push Build is passing Details
2024-12-31 11:18:44 +08:00
hang da570f8c5a 修改加入人员逻辑
continuous-integration/drone/push Build is passing Details
2024-12-31 10:41:12 +08:00
hang 99fa476b80 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-31 10:35:05 +08:00
hang e0ee9abd61 修改内部人员退出 2024-12-31 10:35:03 +08:00
he 4696951923 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-31 10:23:36 +08:00
he ea0209f20d 代码修改 2024-12-31 10:23:36 +08:00
hang 28a56ee298 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-31 10:19:26 +08:00
hang 2691da82ae 修改内部人员 查询列表接口 2024-12-31 10:19:25 +08:00
he c5519976ee Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-31 10:09:24 +08:00
he bc079d3586 导出修改 2024-12-31 10:09:23 +08:00
hang a8ec762a7d 修改项目参与人员列表
continuous-integration/drone/push Build is passing Details
2024-12-31 10:03:11 +08:00
hang 2b6ae95160 医生生成账号修改
continuous-integration/drone/push Build is passing Details
2024-12-31 09:42:24 +08:00
hang c9c38b5053 用户角色签名修改
continuous-integration/drone/push Build is passing Details
2024-12-31 09:26:05 +08:00
hang f97df34b65 文档列表查询修改
continuous-integration/drone/push Build is passing Details
2024-12-30 21:39:58 +08:00
hang aec6757748 修改查询
continuous-integration/drone/push Build is passing Details
2024-12-30 19:53:02 +08:00
hang 33c27cccc2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-30 18:24:24 +08:00
hang a449013c5d 项目文档修改临时提交 2024-12-30 18:24:21 +08:00
he b0b3744cb1 添加defaultValue
continuous-integration/drone/push Build is passing Details
2024-12-30 16:01:59 +08:00
he b2ba48ea90 修改
continuous-integration/drone/push Build is passing Details
2024-12-30 15:41:47 +08:00
he 8a20051436 修改计算
continuous-integration/drone/push Build is passing Details
2024-12-30 14:53:57 +08:00
he eedfa4b84d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-30 14:24:34 +08:00
he 4403a09e79 修改 2024-12-30 14:24:33 +08:00
hang 12fb19c47c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-30 14:08:11 +08:00
hang 14c62a8852 修改项目参与人员判断 2024-12-30 14:08:08 +08:00
he 2c818b9caa Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-30 13:59:56 +08:00
he db8f587e93 修改 2024-12-30 13:59:55 +08:00
hang 260be98cef 修改登录日志查询接口
continuous-integration/drone/push Build is passing Details
2024-12-30 13:26:08 +08:00
hang b42bf4e201 修改日志,以及添加项目参与人员
continuous-integration/drone/push Build is passing Details
2024-12-30 11:36:25 +08:00
hang 2a42a921c4 修改退出
continuous-integration/drone/push Build is passing Details
2024-12-27 15:01:02 +08:00
hang e84b8c25f1 修改项目增加接口
continuous-integration/drone/push Build is passing Details
2024-12-27 14:41:46 +08:00
hang 8b44900931 中心调研初步维护
continuous-integration/drone/push Build is passing Details
2024-12-27 14:29:13 +08:00
hang 918362e854 导入人员发送邮件
continuous-integration/drone/push Build is passing Details
2024-12-27 13:50:26 +08:00
hang ba2965e295 修改外部人员邀请邮件以及添加账号
continuous-integration/drone/push Build is passing Details
2024-12-27 12:33:48 +08:00
hang ecdd0fda85 增加查询条件
continuous-integration/drone/push Build is passing Details
2024-12-27 11:43:35 +08:00
hang dba356446e 登录选择角色
continuous-integration/drone/push Build is passing Details
2024-12-27 11:35:53 +08:00
hang 4e1ea21ba8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-27 11:32:18 +08:00
hang 7853614d2d 修改查询 2024-12-27 11:32:17 +08:00
he 8cabb7440a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-27 09:37:16 +08:00
he 4fc68e1f82 修改排序 2024-12-27 09:37:15 +08:00
hang c06681f379 修改账号编号问题
continuous-integration/drone/push Build is passing Details
2024-12-26 17:59:04 +08:00
hang 57539b0471 用户反馈修改查询条件
continuous-integration/drone/push Build is passing Details
2024-12-26 17:49:39 +08:00
hang 8b7c429e9f 修改日志查询条数有问题
continuous-integration/drone/push Build is passing Details
2024-12-26 17:38:42 +08:00
hang 9b94ad70ee Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-26 17:25:03 +08:00
hang 9aa8bb99dc 修改中心人员 2024-12-26 17:25:00 +08:00
he b203c891a4 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-26 17:16:25 +08:00
he 3833a1e696 登录修改 2024-12-26 17:16:24 +08:00
hang 6e83891139 修改稽查查询
continuous-integration/drone/push Build is passing Details
2024-12-26 17:10:18 +08:00
hang 39616448b8 添加内部人员修改
continuous-integration/drone/push Build is running Details
2024-12-26 17:07:31 +08:00
hang 6b9feca865 修改日志
continuous-integration/drone/push Build is passing Details
2024-12-26 16:48:20 +08:00
hang e0779ab295 修改用户发邮件
continuous-integration/drone/push Build is passing Details
2024-12-26 16:23:30 +08:00
hang 32e3153434 修改角色禁用bug
continuous-integration/drone/push Build is passing Details
2024-12-26 16:03:51 +08:00
hang b40bfe26c5 修改枚举值
continuous-integration/drone/push Build is passing Details
2024-12-26 15:53:14 +08:00
hang b8d5ed2bb7 修改密码bug
continuous-integration/drone/push Build is passing Details
2024-12-26 15:44:51 +08:00
hang 96e1f84c8c 修改映射
continuous-integration/drone/push Build is running Details
2024-12-26 15:37:48 +08:00
hang 353e03c4fe Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-26 15:23:13 +08:00
hang aa60cb4822 修改日志展示 2024-12-26 15:23:12 +08:00
he 7eaa61678b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-26 14:57:25 +08:00
he d74cf15138 修改 2024-12-26 14:57:24 +08:00
hang 6238361bd2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-12-26 14:54:14 +08:00
hang cf9248b0cc 修改用户日志 2024-12-26 14:54:13 +08:00
he 8c884b3269 删除表格标记
continuous-integration/drone/push Build is passing Details
2024-12-26 14:49:42 +08:00
he 8710edf1bd 修改计算
continuous-integration/drone/push Build is passing Details
2024-12-26 12:23:28 +08:00
he 5f9572a0ab Merge branch 'IRC_NewDev' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-26 11:12:00 +08:00
hang 21c10307b9 增加修改用户角色接口
continuous-integration/drone/push Build is running Details
2024-12-26 11:10:36 +08:00
hang 6e0dc64981 修改查询映射
continuous-integration/drone/push Build is passing Details
2024-12-26 11:00:34 +08:00
hang 66922f8e7b 修改token 名字
continuous-integration/drone/push Build is passing Details
2024-12-26 09:27:05 +08:00
hang 2aa0382376 医生加入项目修改
continuous-integration/drone/push Build is passing Details
2024-12-25 19:30:42 +08:00
hang 5cdc5400dc 修改医生生成账号
continuous-integration/drone/push Build is passing Details
2024-12-25 19:19:41 +08:00
hang 53bcdaa6ce 增加用户映射
continuous-integration/drone/push Build is passing Details
2024-12-25 17:55:49 +08:00
hang 473e218b2b 增加用户基本信息修改接口
continuous-integration/drone/push Build is passing Details
2024-12-25 17:36:04 +08:00
he 99ae6c2a14 FirstAddTaskId 值修改 2024-12-25 17:24:02 +08:00
he bf3d3be6c9 复制修改 2024-12-25 16:40:15 +08:00
he 6f775a3303 修改标记复制 2024-12-25 16:23:01 +08:00
hang 2eaf2d5c69 修改项目添加参与人员
continuous-integration/drone/push Build is passing Details
2024-12-25 16:19:57 +08:00
he 6de66c9a5e 添加映射 2024-12-25 16:16:53 +08:00
he 3ae311bd02 添加上一次 2024-12-25 16:09:10 +08:00
hang 25116a9f0e 中心调研邮件初步修改
continuous-integration/drone/push Build is passing Details
2024-12-25 16:02:49 +08:00
he 2e9afc2ce8 计算修改 2024-12-25 15:44:50 +08:00
hang 7535d49844 导入人员
continuous-integration/drone/push Build is passing Details
2024-12-25 15:43:42 +08:00
hang 340f5c580e 添加用户修改
continuous-integration/drone/push Build is passing Details
2024-12-25 14:53:19 +08:00
hang 1d4eedf5bb 修改映射
continuous-integration/drone/push Build is passing Details
2024-12-25 14:21:16 +08:00
hang 3ff0230fc1 增加更新角色接口
continuous-integration/drone/push Build is passing Details
2024-12-25 14:02:17 +08:00
hang c2166556ea 修改项目用户
continuous-integration/drone/push Build is passing Details
2024-12-25 13:53:38 +08:00
hang 4b938e6643 外部用户修改
continuous-integration/drone/push Build is passing Details
2024-12-25 13:42:05 +08:00
hang 4740e04ff1 修改映射
continuous-integration/drone/push Build is passing Details
2024-12-25 13:29:43 +08:00
hang ccdad2f4fd 修改中心命名提交
continuous-integration/drone/push Build is passing Details
2024-12-25 13:18:40 +08:00
hang 54d17f2e24 项目中心修改
continuous-integration/drone/push Build is passing Details
2024-12-25 13:07:57 +08:00
hang 0b3fe111b7 项目中心人员修改
continuous-integration/drone/push Build is passing Details
2024-12-25 12:27:48 +08:00
hang a6080b76b1 修改用户临时提交
continuous-integration/drone/push Build is passing Details
2024-12-25 11:25:45 +08:00
he 7d00b51db2 格式化修改 2024-12-25 10:51:46 +08:00
he be0d1c5c65 添加tablequestionid 2024-12-25 10:43:46 +08:00
he e1f19e9eae 阅片修改 2024-12-25 10:38:02 +08:00
hang 26cba15742 项目用户表增加初步修改
continuous-integration/drone/push Build is passing Details
2024-12-25 10:20:17 +08:00
hang 32c6d745b6 用户角色重命名初步修改
continuous-integration/drone/push Build is passing Details
2024-12-25 09:31:36 +08:00
hang 76649f264b 重置密码修改
continuous-integration/drone/push Build is passing Details
2024-12-24 17:39:44 +08:00
hang db360938fd 修改用户重置密码
continuous-integration/drone/push Build is passing Details
2024-12-24 17:32:45 +08:00
hang bd82470995 列表增加时间
continuous-integration/drone/push Build is passing Details
2024-12-24 17:26:08 +08:00
hang 87560e0602 修改用户编辑
continuous-integration/drone/push Build is passing Details
2024-12-24 17:16:14 +08:00
hang 89cd31cd03 修改提交
continuous-integration/drone/push Build is passing Details
2024-12-24 17:06:42 +08:00
hang 1badf2610e 账号管理提交
continuous-integration/drone/push Build is passing Details
2024-12-24 17:00:56 +08:00
hang 1129a2210a 修改映射
continuous-integration/drone/push Build is passing Details
2024-12-24 16:49:19 +08:00
hang a1199b44a3 修改提交
continuous-integration/drone/push Build is passing Details
2024-12-24 16:36:54 +08:00
hang dc32df27ec 添加新的用户表提交
continuous-integration/drone/push Build is pending Details
2024-12-24 16:25:04 +08:00
he 7f874eaff0 修改 2024-12-24 11:09:19 +08:00
he 21fdd4b0e4 返回表格问题的标记 2024-12-24 10:04:10 +08:00
hang f7519b2095 修改账户信息
continuous-integration/drone/push Build is passing Details
2024-12-23 18:06:26 +08:00
hang 686c7bac9b 修改账户信息
continuous-integration/drone/push Build is passing Details
2024-12-23 17:49:25 +08:00
he 3cde829319 表格问题病灶 2024-12-23 17:45:42 +08:00
hang 230852b2a9 修改获取账户信息
continuous-integration/drone/push Build is passing Details
2024-12-23 17:41:03 +08:00
hang 613957d0ac 修改传递参数
continuous-integration/drone/push Build is passing Details
2024-12-23 17:25:18 +08:00
hang 4fe61ac51a 修改传参方式
continuous-integration/drone/push Build is passing Details
2024-12-23 17:01:54 +08:00
hang e9bafe9e38 返回用户简称
continuous-integration/drone/push Build is passing Details
2024-12-23 16:45:53 +08:00
hang d1bf517aa7 修改传递的参数
continuous-integration/drone/push Build is passing Details
2024-12-23 16:34:32 +08:00
hang a2809dc15a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-23 15:47:41 +08:00
hang c1a58401eb 用户初步修改 2024-12-23 15:47:39 +08:00
he e22a015fcb 变量修改 2024-12-23 14:21:40 +08:00
he f45b0afc49 添加8 条 2024-12-23 14:14:04 +08:00
he f652c95d8c 修改 2024-12-23 11:34:27 +08:00
he bcfb91bc05 修改 2024-12-23 11:34:22 +08:00
he d1f04d5c0c 修改 2024-12-23 11:34:19 +08:00
he e0cf5f804e 修改
continuous-integration/drone/push Build is passing Details
2024-12-20 17:48:28 +08:00
he a0725e1318 修改
continuous-integration/drone/push Build is passing Details
2024-12-20 17:25:55 +08:00
he 70b7fe73ad 修改
continuous-integration/drone/push Build is passing Details
2024-12-20 17:16:30 +08:00
he 5b616026ab Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-20 17:10:51 +08:00
he a001db2da5 修改 2024-12-20 17:10:49 +08:00
hang 2e7a0fe68d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-20 14:54:15 +08:00
hang 519eeb6df1 修改账号token 2024-12-20 14:54:11 +08:00
he 3e9221b39c 修改医院
continuous-integration/drone/push Build is passing Details
2024-12-20 14:06:30 +08:00
hang d165632cc8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-20 13:42:45 +08:00
hang 65e50fec54 修改scp 配置 2024-12-20 13:42:43 +08:00
he 460575d959 修改
continuous-integration/drone/push Build is passing Details
2024-12-20 13:29:45 +08:00
he 6e34bc3c17 MRIPDFF标准
continuous-integration/drone/push Build is passing Details
2024-12-20 10:37:10 +08:00
hang 781a4a7b0b 增加配置
continuous-integration/drone/push Build is passing Details
2024-12-18 17:02:00 +08:00
hang 89d1f2f800 修改项目配置
continuous-integration/drone/push Build is passing Details
2024-12-18 16:18:10 +08:00
hang 3cd3315964 SPM 流程配置以及修改
continuous-integration/drone/push Build is passing Details
2024-12-18 15:14:23 +08:00
hang e73c775296 删除返回的机构名称
continuous-integration/drone/push Build is passing Details
2024-12-18 13:37:19 +08:00
hang 496396fa6b 删除返回的机构名称
continuous-integration/drone/push Build is passing Details
2024-12-18 13:36:52 +08:00
hang 3b28e13fd8 修改时间展示
continuous-integration/drone/push Build is passing Details
2024-12-18 11:33:21 +08:00
hang eedc9c5ab8 修改时间展示
continuous-integration/drone/push Build is passing Details
2024-12-18 11:32:58 +08:00
hang 0578168db0 修改时间
continuous-integration/drone/push Build is running Details
2024-12-18 11:31:17 +08:00
hang b12877e39b 修改时间
continuous-integration/drone/push Build is passing Details
2024-12-18 11:16:05 +08:00
hang 5694addef6 修改提交
continuous-integration/drone/push Build is passing Details
2024-12-17 16:50:58 +08:00
hang f037f0fac2 导表Excel 移除指定列修改 2024-12-17 16:49:57 +08:00
hang 55132ff36f 导表Excel 移除指定列修改
continuous-integration/drone/push Build is running Details
2024-12-17 16:49:46 +08:00
hang 33e0470f5d Merge branch 'Uat_IRC_Net8' into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-17 16:13:30 +08:00
hang 90b8bd8812 修改排序
continuous-integration/drone/push Build is passing Details
2024-12-17 16:12:53 +08:00
he 9424de56c2 修改
continuous-integration/drone/push Build is passing Details
2024-12-17 15:50:24 +08:00
hang 789e7ea2b0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-17 15:49:50 +08:00
hang 3fecac40df 修改服务器配置 2024-12-17 15:49:37 +08:00
hang 80426f5ccd 修改排序 2024-12-17 15:49:02 +08:00
he 12a4b9151c 修改
continuous-integration/drone/push Build is passing Details
2024-12-17 14:00:39 +08:00
he e3a781b950 代码修改
continuous-integration/drone/push Build is passing Details
2024-12-17 11:34:49 +08:00
hang e16f32b5b9 修改排序
continuous-integration/drone/push Build is passing Details
2024-12-17 11:28:53 +08:00
he bba3a038af 修改
continuous-integration/drone/push Build is passing Details
2024-12-13 10:59:53 +08:00
he b385dcfdc0 修改
continuous-integration/drone/push Build is passing Details
2024-12-13 10:10:55 +08:00
he 11dd4fa789 修改
continuous-integration/drone/push Build is failing Details
2024-12-13 09:56:41 +08:00
he 5576b54518 修改
continuous-integration/drone/push Build is passing Details
2024-12-13 09:34:18 +08:00
he 483c622fce 修改
continuous-integration/drone/push Build is running Details
2024-12-13 09:32:49 +08:00
he b13976d620 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is failing Details
2024-12-13 09:27:26 +08:00
he 23cb3e1278 项目问题导出配置 2024-12-13 09:27:23 +08:00
hang 67c01da64b 修改服务器配置
continuous-integration/drone/push Build is passing Details
2024-12-12 16:58:02 +08:00
hang e5592338d0 放开中心调研的权限
continuous-integration/drone/push Build is passing Details
2024-12-12 16:45:51 +08:00
hang 07df412118 放开中心调研的权限
continuous-integration/drone/push Build encountered an error Details
2024-12-12 16:35:10 +08:00
hang 4c672cd91c 修改存储路径
continuous-integration/drone/push Build is passing Details
2024-12-12 13:33:47 +08:00
hang a74b264f39 软删除配置调整
continuous-integration/drone/push Build is passing Details
2024-12-11 22:46:26 +08:00
hang 2a217c1a20 回退撤销
continuous-integration/drone/push Build is passing Details
2024-12-11 19:44:28 +08:00
hang 1f4aff2796 xx
continuous-integration/drone/push Build is passing Details
2024-12-11 19:26:31 +08:00
hang d10c936003 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-11 15:16:07 +08:00
hang 4330afd683 软删除修改--pre 2024-12-11 15:16:06 +08:00
hang 06ac8f114a 修改质控显示名字
continuous-integration/drone/push Build encountered an error Details
2024-12-11 13:57:24 +08:00
he 78bc09d71a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build encountered an error Details
2024-12-11 13:46:19 +08:00
he d2bca834ed 导出修改 2024-12-11 13:46:17 +08:00
hang 34c50858c9 关闭邮件
continuous-integration/drone/push Build is passing Details
2024-12-11 13:37:09 +08:00
hang a7441c8c78 修改导表报错
continuous-integration/drone/push Build encountered an error Details
2024-12-11 13:26:59 +08:00
hang 125846e6b2 修改导表bug
continuous-integration/drone/push Build encountered an error Details
2024-12-11 13:00:03 +08:00
hang d35b9a6f6f Merge branch 'Test_IRC_Net8' into Uat_IRC_Net8
continuous-integration/drone/push Build encountered an error Details
2024-12-11 12:19:26 +08:00
hang 6b592cbda7 针对时区转换修改
continuous-integration/drone/push Build is passing Details
2024-12-11 10:44:33 +08:00
hang f8e498b2e1 修改导表和时间处理
continuous-integration/drone/push Build is passing Details
2024-12-11 10:27:24 +08:00
hang 8ff23af18c 增加条件
continuous-integration/drone/push Build is passing Details
2024-12-11 09:44:13 +08:00
hang 828bd38eab 整理废弃
continuous-integration/drone/push Build is passing Details
2024-12-11 08:57:39 +08:00
hang a9f22897e9 修改统计完成
continuous-integration/drone/push Build is passing Details
2024-12-11 00:42:43 +08:00
hang b14f3fb251 修改统计 分步查询
continuous-integration/drone/push Build is passing Details
2024-12-11 00:01:58 +08:00
hang 91cde3f944 修改导出测试
continuous-integration/drone/push Build is passing Details
2024-12-10 21:30:36 +08:00
hang fcffa32e06 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-10 20:07:43 +08:00
hang e2e03e30ef 临时提交 2024-12-10 20:07:42 +08:00
he bdb12a7df3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-10 19:57:13 +08:00
he e456f8684c 导出修改 2024-12-10 19:57:12 +08:00
hang 81b56c03b7 修改阅片期导表
continuous-integration/drone/push Build is passing Details
2024-12-10 18:16:50 +08:00
hang a92fa86809 修改导表阅片人
continuous-integration/drone/push Build is passing Details
2024-12-10 18:00:49 +08:00
hang 745ab5cb25 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-10 17:48:28 +08:00
hang 8cee47a9f7 修改统计 2024-12-10 17:48:27 +08:00
he b174a72709 修改 计算 给默认值
continuous-integration/drone/push Build is passing Details
2024-12-10 17:32:59 +08:00
he aebc9446ba Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-10 17:29:34 +08:00
he 6e7b77af00 修改 添加默认值 2024-12-10 17:29:32 +08:00
hang e147c2a370 修改导出 患者裁判率
continuous-integration/drone/push Build is passing Details
2024-12-10 17:07:23 +08:00
hang 30f41ba270 修改测试demo
continuous-integration/drone/push Build is passing Details
2024-12-10 16:34:04 +08:00
hang 468a124841 修改裁判访视数量
continuous-integration/drone/push Build is passing Details
2024-12-10 16:16:51 +08:00
hang 33a15676b5 受试者维度统计遗留 先提交
continuous-integration/drone/push Build is passing Details
2024-12-10 16:03:43 +08:00
hang a8b614e2a5 修改临时提交
continuous-integration/drone/push Build is passing Details
2024-12-10 15:00:53 +08:00
hang 57d9a8665d 临时修改提交
continuous-integration/drone/push Build is passing Details
2024-12-10 14:32:40 +08:00
hang 2d03635ec4 优化搜索条件
continuous-integration/drone/push Build is passing Details
2024-12-10 14:11:46 +08:00
hang 5e34a41902 修改无全局bug
continuous-integration/drone/push Build is passing Details
2024-12-10 14:08:45 +08:00
hang 6b02c03f7f 阅片期维度统一 裁判 和一致率
continuous-integration/drone/push Build is passing Details
2024-12-10 13:54:33 +08:00
hang 1c0547f3ff 有阅片期无全局
continuous-integration/drone/push Build is passing Details
2024-12-10 13:30:07 +08:00
hang 4b3e1ba5c0 裁判一致率修改
continuous-integration/drone/push Build is passing Details
2024-12-10 10:48:12 +08:00
hang eb77fcfa2f 修改裁判标记设置方法
continuous-integration/drone/push Build is passing Details
2024-12-10 10:18:25 +08:00
hang 86692d220a 裁判一致率
continuous-integration/drone/push Build is passing Details
2024-12-09 15:15:19 +08:00
hang 1417277cb1 修改阅片期裁判 遗漏情况
continuous-integration/drone/push Build is passing Details
2024-12-09 11:36:50 +08:00
hang f40a48265c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-06 13:35:47 +08:00
hang 04e4b0ac34 修改导出判断逻辑 2024-12-06 13:35:45 +08:00
he 6526e03d2c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-06 11:34:12 +08:00
he 1fb09d05a3 修改 2024-12-06 11:34:11 +08:00
hang 6eefbb1745 修改配置
continuous-integration/drone/push Build is passing Details
2024-12-05 17:03:44 +08:00
hang effd6fee41 修改质控返回字段
continuous-integration/drone/push Build is passing Details
2024-12-05 16:45:33 +08:00
hang 84ba0bc4a9 修改非dicom 排序
continuous-integration/drone/push Build is passing Details
2024-12-05 16:11:27 +08:00
hang 7cf9bd4a81 修改判断
continuous-integration/drone/push Build is passing Details
2024-12-05 10:38:21 +08:00
hang ba8a457688 修改裁判设置标志
continuous-integration/drone/push Build is passing Details
2024-12-05 09:08:53 +08:00
hang 848e33edb8 修改没有产生裁判,裁判触发标志 和裁判选择标记
continuous-integration/drone/push Build is passing Details
2024-12-04 20:05:13 +08:00
hang 47eaed78ed 修改导表
continuous-integration/drone/push Build is passing Details
2024-12-04 17:45:06 +08:00
hang 137f77cdc5 修改阅片期导表
continuous-integration/drone/push Build is passing Details
2024-12-04 15:33:40 +08:00
hang a2cfec6553 修改导表排序+ 受试者无阅片期 字段设置问题
continuous-integration/drone/push Build is passing Details
2024-12-04 11:37:57 +08:00
he da2209cf95 修改
continuous-integration/drone/push Build is passing Details
2024-12-03 17:37:01 +08:00
he ce8611e138 修改
continuous-integration/drone/push Build is passing Details
2024-12-02 17:32:15 +08:00
he 948c0d32ab 修改状态
continuous-integration/drone/push Build is passing Details
2024-12-02 17:16:43 +08:00
he c2ed06061a 修改查询临床数据状态
continuous-integration/drone/push Build is passing Details
2024-12-02 17:04:16 +08:00
he b610143e33 修改
continuous-integration/drone/push Build is passing Details
2024-12-02 17:00:00 +08:00
he fa0e4f7326 修改
continuous-integration/drone/push Build is passing Details
2024-12-02 16:55:58 +08:00
he 393bce5f5c 验证是否有重复的概况
continuous-integration/drone/push Build is passing Details
2024-12-02 16:51:05 +08:00
he 004f73b24d 修改临床数据
continuous-integration/drone/push Build is passing Details
2024-12-02 16:21:09 +08:00
he e53b56f0d4 先删除
continuous-integration/drone/push Build is passing Details
2024-12-02 15:21:56 +08:00
he 7dbf99e1c8 修改适应症
continuous-integration/drone/push Build is passing Details
2024-12-02 15:16:04 +08:00
he 2f77c0ecef 代码修改
continuous-integration/drone/push Build is passing Details
2024-12-02 15:01:17 +08:00
he 2ce0306311 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-12-02 14:19:05 +08:00
he 79ff873607 修改 2024-12-02 14:19:02 +08:00
hang 9827ffa0f2 HIR 临时web
continuous-integration/drone/push Build is passing Details
2024-12-02 13:24:02 +08:00
hang f81cf9c2f2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-28 16:18:47 +08:00
hang 456e6f3035 IRC-HIR 授权码增加接口 2024-11-28 16:18:45 +08:00
he 25c3a6518d 修改
continuous-integration/drone/push Build is passing Details
2024-11-28 14:04:05 +08:00
he 53a33c956f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-28 11:42:00 +08:00
he c9daa09a0b 修改 2024-11-28 11:41:59 +08:00
hang 156db9f6c5 更新账户
continuous-integration/drone/push Build is passing Details
2024-11-27 17:39:45 +08:00
hang 1b9eeba5ba 调研表更新逻辑优化
continuous-integration/drone/push Build is passing Details
2024-11-27 17:10:23 +08:00
hang a1588273e8 导表阅片期裁判备注
continuous-integration/drone/push Build is passing Details
2024-11-27 15:59:22 +08:00
hang 38b661da01 修改定时任务 移除定时任务
continuous-integration/drone/push Build is passing Details
2024-11-27 15:01:27 +08:00
hang 017babde86 修改定时任务
continuous-integration/drone/push Build is passing Details
2024-11-27 14:53:35 +08:00
hang 74da92bc72 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-26 16:46:54 +08:00
hang 281b5d2177 修改导表 2024-11-26 16:46:53 +08:00
he a9a435ee0f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-26 16:22:01 +08:00
he 6f784a1054 修改 2024-11-26 16:22:00 +08:00
hang 90412c5817 修改导表翻译字典
continuous-integration/drone/push Build is passing Details
2024-11-26 16:09:14 +08:00
hang ecb0ab07d2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-26 16:02:32 +08:00
hang 522e056f3c 导表字段增加查询 2024-11-26 16:02:31 +08:00
he 92ca6a9a34 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-26 15:29:52 +08:00
he 93f660a2ca 修改 2024-11-26 15:29:52 +08:00
hang 7997e8c408 修改挤账号生成token bug
continuous-integration/drone/push Build is passing Details
2024-11-26 15:03:24 +08:00
he eb363fd564 修改
continuous-integration/drone/push Build is passing Details
2024-11-26 10:49:39 +08:00
he 04e4e786b0 修改
continuous-integration/drone/push Build is passing Details
2024-11-26 10:23:06 +08:00
he 12449325a9 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-25 17:50:05 +08:00
he 3b48685a07 修改符号 2024-11-25 17:50:04 +08:00
hang 1adb7e6e2a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-11-25 17:48:18 +08:00
hang 46e1da667a 导表增加验证 2024-11-25 17:48:16 +08:00
he c5aaa08326 修改
continuous-integration/drone/push Build is passing Details
2024-11-25 16:53:07 +08:00
he e7193be3d7 修改长度
continuous-integration/drone/push Build is passing Details
2024-11-25 16:37:34 +08:00
he 56f27189f1 修改
continuous-integration/drone/push Build is passing Details
2024-11-25 16:31:15 +08:00
he 69bfecca9c 修改
continuous-integration/drone/push Build is running Details
2024-11-25 16:30:56 +08:00
he bc68271a2a 修改
continuous-integration/drone/push Build is passing Details
2024-11-25 16:15:16 +08:00
he 27314a139d 问题修改
continuous-integration/drone/push Build is passing Details
2024-11-25 16:11:06 +08:00
he 8ebaface32 修改
continuous-integration/drone/push Build is passing Details
2024-11-25 15:28:12 +08:00
he 408e03d02f 修改
continuous-integration/drone/push Build is passing Details
2024-11-25 15:24:33 +08:00
he 8415d848c7 修改
continuous-integration/drone/push Build is passing Details
2024-11-25 15:15:19 +08:00
he 6ded64d830 复制标准信息
continuous-integration/drone/push Build is running Details
2024-11-25 15:14:50 +08:00
he 00f6e3dc29 获取访视临床数据
continuous-integration/drone/push Build is passing Details
2024-11-25 14:52:55 +08:00
he 7fad0345cf 简历默认值
continuous-integration/drone/push Build is passing Details
2024-11-25 11:48:25 +08:00
he 4fa9dafdd8 修改
continuous-integration/drone/push Build is passing Details
2024-11-25 11:26:35 +08:00
he 819dfe9b68 修改
continuous-integration/drone/push Build is passing Details
2024-11-25 11:21:14 +08:00
he d0828ddf0e 修改长度
continuous-integration/drone/push Build is passing Details
2024-11-22 17:59:47 +08:00
he c7d9e02b8d 修改IVUS导入的计算
continuous-integration/drone/push Build is passing Details
2024-11-22 11:33:18 +08:00
he 1bec318440 修改
continuous-integration/drone/push Build is passing Details
2024-11-22 10:34:40 +08:00
he cd6c57cec8 修改
continuous-integration/drone/push Build is running Details
2024-11-22 10:33:40 +08:00
he f3942b507c 修改
continuous-integration/drone/push Build is passing Details
2024-11-22 09:54:03 +08:00
he 888be6430a 简历修改
continuous-integration/drone/push Build is passing Details
2024-11-21 16:34:09 +08:00
he c5e5ac4e45 修改
continuous-integration/drone/push Build is passing Details
2024-11-21 15:25:57 +08:00
he ece6832bb8 修改
continuous-integration/drone/push Build is passing Details
2024-11-21 15:16:54 +08:00
he 6c434e2ace 修改
continuous-integration/drone/push Build is passing Details
2024-11-21 13:32:14 +08:00
he c08bad2fec 修改
continuous-integration/drone/push Build is passing Details
2024-11-21 11:34:41 +08:00
he 5cafbdeaca 修改
continuous-integration/drone/push Build is passing Details
2024-11-21 11:30:53 +08:00
he 70b99d56a4 修改
continuous-integration/drone/push Build is passing Details
2024-11-20 16:13:44 +08:00
he 66f91986bc Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-20 16:10:37 +08:00
he 8eff23a8f2 代码修改 2024-11-20 16:10:35 +08:00
hang 9bd0a23734 迁移修改uat环境配置文件
continuous-integration/drone/push Build is passing Details
2024-11-20 14:22:03 +08:00
hang e3622cb86f 修改导出标志2
continuous-integration/drone/push Build is passing Details
2024-11-19 15:46:43 +08:00
hang eaf3d5e3e8 修改导表设置的标志
continuous-integration/drone/push Build is passing Details
2024-11-19 15:13:08 +08:00
hang d7bce4802a 修改导表裁判选择标志
continuous-integration/drone/push Build is passing Details
2024-11-19 10:31:18 +08:00
hang 99c594acac Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-18 17:30:46 +08:00
hang 5844b28983 修改导表标志1 2024-11-18 17:30:45 +08:00
he 26c2e917d9 修改
continuous-integration/drone/push Build is passing Details
2024-11-18 17:18:52 +08:00
he 07a2f19cf5 修改
continuous-integration/drone/push Build is passing Details
2024-11-18 17:03:30 +08:00
he 085213f920 修改
continuous-integration/drone/push Build is passing Details
2024-11-18 15:57:44 +08:00
he 985250e25c 修改
continuous-integration/drone/push Build is running Details
2024-11-18 15:55:57 +08:00
he 1c6acff8d7 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-18 13:30:12 +08:00
he dd77dc43b6 修改 2024-11-18 13:30:11 +08:00
hang c7b86954fa 修改邮件发送延迟
continuous-integration/drone/push Build is passing Details
2024-11-15 17:39:13 +08:00
hang 13c55be759 修改查询配置 邮件发送延迟
continuous-integration/drone/push Build is passing Details
2024-11-15 17:26:41 +08:00
he ce8e842823 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-15 16:02:06 +08:00
he e5508e9b0c 修改 2024-11-15 16:02:05 +08:00
hang 67e526893c 修改调研表title
continuous-integration/drone/push Build is passing Details
2024-11-15 15:42:54 +08:00
hang efcb3cf168 修改国际化bug
continuous-integration/drone/push Build is passing Details
2024-11-14 15:16:28 +08:00
hang ed8f24a3ad 修改系统邮件配置
continuous-integration/drone/push Build is passing Details
2024-11-14 13:27:09 +08:00
hang 98947b0609 导表修改
continuous-integration/drone/push Build is passing Details
2024-11-13 16:27:41 +08:00
he 09d7a34c97 验证访视提交
continuous-integration/drone/push Build is passing Details
2024-11-12 17:19:44 +08:00
he 50667bddfb 修改
continuous-integration/drone/push Build is passing Details
2024-11-12 14:43:18 +08:00
he 655ef79754 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-12 14:09:27 +08:00
he 9d3e1edd61 修改 2024-11-12 14:09:26 +08:00
hang aba0101b01 导出表里的日期 把时间去掉
continuous-integration/drone/push Build is passing Details
2024-11-12 14:05:34 +08:00
hang 7ca007b6fa 移除废除代码
continuous-integration/drone/push Build is passing Details
2024-11-12 13:47:50 +08:00
hang 3603656a1c 全局过滤修改
continuous-integration/drone/push Build is passing Details
2024-11-11 18:09:18 +08:00
hang c372498251 病灶导表修改
continuous-integration/drone/push Build is passing Details
2024-11-11 16:53:24 +08:00
hang 05b5d0d264 OCT 斑块导出
continuous-integration/drone/push Build is passing Details
2024-11-11 14:51:29 +08:00
hang 45ab896bb9 修改导表日期
continuous-integration/drone/push Build is passing Details
2024-11-11 12:25:35 +08:00
hang 2326d26c0b Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-11-11 12:23:59 +08:00
hang 28587c8e91 修改导表日期处理 2024-11-11 12:23:58 +08:00
he 78c707a018 修改
continuous-integration/drone/push Build is passing Details
2024-11-11 11:34:42 +08:00
he 5e889b1529 修改
continuous-integration/drone/push Build is passing Details
2024-11-11 11:01:26 +08:00
he ec945b4b39 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-11 10:37:51 +08:00
he 4f72d97039 修改 2024-11-11 10:37:49 +08:00
hang 4d4af84716 hangfire 测试提交
continuous-integration/drone/push Build is passing Details
2024-11-11 09:26:15 +08:00
hang 47be1e52c9 项目术语配置,导表统一处理
continuous-integration/drone/push Build is passing Details
2024-11-09 17:05:34 +08:00
hang 4145421087 修改json 列
continuous-integration/drone/push Build is passing Details
2024-11-08 17:26:46 +08:00
hang f83bd75853 x
continuous-integration/drone/push Build is passing Details
2024-11-08 17:16:30 +08:00
hang 7e53c24919 修改冲突
continuous-integration/drone/push Build is running Details
2024-11-08 17:16:20 +08:00
hang 341e4321b2 json 列修改提交 2024-11-08 17:14:41 +08:00
hang c90258c49e 修改创建项目临时解决
continuous-integration/drone/push Build is passing Details
2024-11-08 16:56:41 +08:00
hang 5fdbdfec82 json 列更新需要手动设置
continuous-integration/drone/push Build is passing Details
2024-11-08 14:28:53 +08:00
hang 41a889f201 项目配置使用Json 列 测试
continuous-integration/drone/push Build is passing Details
2024-11-08 13:49:49 +08:00
hang 1f33a9fa4e efcore 8 json 列测试完毕
continuous-integration/drone/push Build is passing Details
2024-11-08 13:41:07 +08:00
hang 760321f8fa 修改模板
continuous-integration/drone/push Build is passing Details
2024-11-07 18:09:38 +08:00
hang aae8afd0c5 添加默认值
continuous-integration/drone/push Build is passing Details
2024-11-07 15:32:58 +08:00
hang 33bf0d908d 一致性分析过滤掉全局任务
continuous-integration/drone/push Build is passing Details
2024-11-07 14:35:19 +08:00
hang 4f67de2898 仅仅保留一致性分析有的任务的原始任务
continuous-integration/drone/push Build is passing Details
2024-11-07 14:18:44 +08:00
hang 79949b9bad 修改一致性分析导表arm 错误
continuous-integration/drone/push Build is passing Details
2024-11-07 14:08:55 +08:00
hang 1648cbef7b Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-07 11:03:56 +08:00
hang 4abd7c8fe2 修改一致性分析导表 2024-11-07 11:03:54 +08:00
he bdf14d8641 修改
continuous-integration/drone/push Build is passing Details
2024-11-07 10:48:59 +08:00
he d2530de925 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-07 10:45:32 +08:00
he f1a6ca24be 修改 2024-11-07 10:45:32 +08:00
hang 8d1a6c8cec Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-07 10:37:07 +08:00
hang 656b1cf252 项目顶级术语修改 2024-11-07 10:37:06 +08:00
he b89cfeb90c 修改
continuous-integration/drone/push Build is passing Details
2024-11-07 10:19:25 +08:00
he 5b3beea8fa Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-07 10:01:50 +08:00
he b7d3a365b4 修改 2024-11-07 10:01:49 +08:00
hang bf0ab3411d 用户添加触发器使用
continuous-integration/drone/push Build is passing Details
2024-11-07 08:52:12 +08:00
hang c5dacab771 修改导表标题少括号
continuous-integration/drone/push Build is passing Details
2024-11-06 17:12:27 +08:00
hang db363a7daa 修改组间一致性分析导表
continuous-integration/drone/push Build is passing Details
2024-11-06 16:56:12 +08:00
hang 4c41a5a579 导表筛选标准
continuous-integration/drone/push Build is passing Details
2024-11-06 15:29:50 +08:00
hang c48803ca0c 账户稽查修改
continuous-integration/drone/push Build is passing Details
2024-11-06 15:15:32 +08:00
hang b5e26da1ff Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-06 14:28:58 +08:00
hang 501272a2a2 修改批量添加 2024-11-06 14:28:57 +08:00
he e66475ab61 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-06 14:13:08 +08:00
he 6a54a36719 修改 2024-11-06 14:13:07 +08:00
hang b2851352f2 修改一致性分析导表
continuous-integration/drone/push Build is passing Details
2024-11-06 14:10:49 +08:00
hang 756838e106 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-06 13:51:06 +08:00
hang b83ea13aed 修改邮件配置 2024-11-06 13:51:05 +08:00
he 5202ee7bd6 修改
continuous-integration/drone/push Build is passing Details
2024-11-05 14:12:46 +08:00
he 424a05c211 简历信息修改 2024-11-05 13:07:24 +08:00
he 702e20c834 测试推送
continuous-integration/drone/push Build is passing Details
2024-11-04 18:45:04 +08:00
hang 506955ca7c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-04 18:02:28 +08:00
hang 9cbd1faf93 测试 2024-11-04 18:02:27 +08:00
he 3354aa37f4 修改
continuous-integration/drone/push Build is passing Details
2024-11-04 17:51:53 +08:00
he f17001bace Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-04 17:41:34 +08:00
he 80d99d4862 修改 2024-11-04 17:41:33 +08:00
hang d19b5da008 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-04 17:22:16 +08:00
hang 31fdedb033 增加邮件查询条件 2024-11-04 17:22:15 +08:00
he c87e268165 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-04 16:40:16 +08:00
he 93726ae28c 修改 2024-11-04 16:40:15 +08:00
hang fed21316df Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-04 16:31:47 +08:00
hang 205619071d 重置密码,清理密码错误限制 2024-11-04 16:31:47 +08:00
he 16e985b37e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-04 15:04:33 +08:00
he 590a7e7b05 修改 2024-11-04 15:04:32 +08:00
hang 239f87320b 修改导表枚举翻译
continuous-integration/drone/push Build is passing Details
2024-11-04 13:35:20 +08:00
hang d03c00d138 修改导表枚举
continuous-integration/drone/push Build is passing Details
2024-11-04 13:27:56 +08:00
hang 9778f5e943 修改统计报错
continuous-integration/drone/push Build is passing Details
2024-11-04 13:14:32 +08:00
hang 3752bc0311 修改邮件查询列表
continuous-integration/drone/push Build is passing Details
2024-11-04 11:36:07 +08:00
hang 76bdbcbfcb Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-04 10:48:13 +08:00
hang 70d321f778 系统邮件修改 2024-11-04 10:48:11 +08:00
he e666d93829 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-04 10:41:01 +08:00
he a6a8f34734 修改 2024-11-04 10:41:00 +08:00
hang 317184ba7a 修改后处理上传
continuous-integration/drone/push Build is passing Details
2024-11-04 10:14:14 +08:00
hang 68052766f8 logto 授权码模式测试
continuous-integration/drone/push Build is passing Details
2024-11-03 12:59:49 +08:00
hang dc1cea6b5a 修改加急发送邮件
continuous-integration/drone/push Build is passing Details
2024-11-01 14:18:16 +08:00
hang ebe597a575 修改加急阅片10分钟
continuous-integration/drone/push Build is passing Details
2024-11-01 11:09:23 +08:00
hang 4b4688538d 修改重复邮件问题
continuous-integration/drone/push Build is passing Details
2024-11-01 10:59:32 +08:00
hang 0111136c95 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-01 10:47:17 +08:00
hang 8a0f1d0759 修改一致性分析导表 2024-11-01 10:47:15 +08:00
he 44c1ad740c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-11-01 10:42:58 +08:00
he 664942a235 修改 2024-11-01 10:42:56 +08:00
hang 99e7079c14 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-31 18:05:11 +08:00
hang ec8e553304 增加 IdentityModel.OidcClient 测试ok 2024-10-31 18:05:10 +08:00
he 93ed4013fe 修改
continuous-integration/drone/push Build is passing Details
2024-10-31 17:59:46 +08:00
he 531e2f4a08 修改
continuous-integration/drone/push Build is passing Details
2024-10-31 17:57:30 +08:00
he 06059f15ac 修改
continuous-integration/drone/push Build is passing Details
2024-10-31 16:22:52 +08:00
he 23e6811e89 修噶
continuous-integration/drone/push Build is running Details
2024-10-31 16:22:26 +08:00
hang 6a1a7ba452 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-31 15:54:56 +08:00
hang a9c9486162 增加QC 添加质疑触发逻辑 2024-10-31 15:54:54 +08:00
he 3d6cfccbdf 修改
continuous-integration/drone/push Build is passing Details
2024-10-31 15:16:18 +08:00
he 3f5d53c2cb Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-31 14:57:17 +08:00
he e9c19d7396 修改 2024-10-31 14:57:17 +08:00
hang df04878154 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-31 13:51:46 +08:00
hang ad3dae4fcd 返回LatestReplyUserFullName 2024-10-31 13:51:43 +08:00
he 4af09e64a3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-31 10:56:14 +08:00
he 520595796b 修改 2024-10-31 10:56:12 +08:00
hang d22ef17e91 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-30 16:06:05 +08:00
hang c0de59b3aa 自身和组件一致性分析修改 2024-10-30 16:06:02 +08:00
he 4e29d4094e 修改
continuous-integration/drone/push Build is passing Details
2024-10-30 15:20:19 +08:00
he 84d4678406 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-30 10:00:39 +08:00
he 53a5800a38 修改 2024-10-30 10:00:38 +08:00
hang fcaa6339c6 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-30 09:44:27 +08:00
hang 95042fe6ba 修改项目邮件这块 2024-10-30 09:44:24 +08:00
he 7b779d4ef5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-30 09:27:18 +08:00
he 3a978b561b 添加 IndicationTypeId 2024-10-30 09:27:17 +08:00
hang 71e6099bbd 修改备注
continuous-integration/drone/push Build is passing Details
2024-10-29 23:55:42 +08:00
hang c713d0bc95 logto 客户端模式对接测试完成
continuous-integration/drone/push Build is passing Details
2024-10-29 23:11:37 +08:00
hang c6c8daaadf 临时代码提交
continuous-integration/drone/push Build is passing Details
2024-10-29 18:04:10 +08:00
hang 67667f6438 修改导表
continuous-integration/drone/push Build is passing Details
2024-10-29 17:37:20 +08:00
hang 2a1047f319 修改导表测试
continuous-integration/drone/push Build is passing Details
2024-10-29 16:36:32 +08:00
he 68b960abec Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-29 16:20:49 +08:00
he 419fef2e64 修改 2024-10-29 16:20:46 +08:00
hang d1b3256e52 修改验证bug
continuous-integration/drone/push Build is passing Details
2024-10-29 16:18:49 +08:00
hang 871990287a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-29 16:07:09 +08:00
hang 6a54b0a6c8 修改拦截 2024-10-29 16:07:08 +08:00
he bec9af414f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-10-29 16:06:19 +08:00
he 94293830d6 修改 2024-10-29 16:06:18 +08:00
hang 4fb018eaa6 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-29 15:57:29 +08:00
hang c65d6c4aa2 x 2024-10-29 15:57:27 +08:00
he cc4d879def Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-10-29 15:56:06 +08:00
he ba588e3e14 修改 2024-10-29 15:56:05 +08:00
hang fc392e869c 修改裁判一致率
continuous-integration/drone/push Build is running Details
2024-10-29 15:55:59 +08:00
hang 052bff9247 国际化导表修改
continuous-integration/drone/push Build is passing Details
2024-10-29 15:45:22 +08:00
hang d00f81b09a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-29 15:23:38 +08:00
hang 6cde1b4405 修改一致性核查导表 2024-10-29 15:23:36 +08:00
he 3ef765e767 修改
continuous-integration/drone/push Build is passing Details
2024-10-29 14:11:50 +08:00
he 8f7e229513 修改请求方式
continuous-integration/drone/push Build is passing Details
2024-10-29 14:09:16 +08:00
he 0fdfeca3ec 数据库执行
continuous-integration/drone/push Build is passing Details
2024-10-29 14:01:18 +08:00
he 77bcdf79e8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-29 13:56:38 +08:00
he 20cc430132 项目医生简历 2024-10-29 13:56:35 +08:00
hang 969d22fdae 修改裁判总数
continuous-integration/drone/push Build is passing Details
2024-10-29 11:42:17 +08:00
hang 9f95dc90bb 修改最大裁判导表
continuous-integration/drone/push Build is passing Details
2024-10-29 09:42:06 +08:00
hang 0b1c4f2c09 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-28 17:36:59 +08:00
hang 14d9d8e7a5 修改触发裁判逻辑 2024-10-28 17:36:57 +08:00
he 0cc2e2c7ee 修改字段
continuous-integration/drone/push Build is passing Details
2024-10-28 16:59:40 +08:00
he 0dfd33ced6 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-28 16:52:19 +08:00
he a96c5eefc3 修改 2024-10-28 16:52:18 +08:00
hang 6d628727bb 修改裁判一致率统计
continuous-integration/drone/push Build is passing Details
2024-10-28 16:40:32 +08:00
hang ae83489c74 修改阅片期统计
continuous-integration/drone/push Build is passing Details
2024-10-28 16:32:55 +08:00
hang 253a401c95 修改导表标志
continuous-integration/drone/push Build is passing Details
2024-10-28 15:32:29 +08:00
hang 1209b07c03 修改文档和导表修改
continuous-integration/drone/push Build is passing Details
2024-10-28 14:33:43 +08:00
hang 44f3b58bad 裁判任务标记
continuous-integration/drone/push Build is passing Details
2024-10-28 11:49:06 +08:00
hang 31e2e03536 修改导表动态处理
continuous-integration/drone/push Build is passing Details
2024-10-28 10:40:52 +08:00
hang 2a172acb15 修改合并bug
continuous-integration/drone/push Build is passing Details
2024-10-25 18:01:28 +08:00
hang 792a4235d2 修改导表bug 动态title
continuous-integration/drone/push Build is passing Details
2024-10-25 17:43:48 +08:00
hang 6003bf291a 修改iresist 导表
continuous-integration/drone/push Build is passing Details
2024-10-25 17:34:49 +08:00
hang 42ab61d0a2 修改导表测试
continuous-integration/drone/push Build is passing Details
2024-10-25 17:03:14 +08:00
hang 08158a58d6 导表修改
continuous-integration/drone/push Build is passing Details
2024-10-25 16:50:49 +08:00
hang b4269c4ed0 访视裁判统计数字错误
continuous-integration/drone/push Build is passing Details
2024-10-25 16:01:48 +08:00
hang 7f0e998eba 系统文档修改
continuous-integration/drone/push Build is passing Details
2024-10-25 15:12:33 +08:00
hang a3c0bacff2 修改filter bug
continuous-integration/drone/push Build is passing Details
2024-10-25 14:59:15 +08:00
hang 5c898ec6c8 临时解决问题
continuous-integration/drone/push Build is passing Details
2024-10-25 14:48:44 +08:00
hang 68353b9e7b x
continuous-integration/drone/push Build is passing Details
2024-10-25 14:36:09 +08:00
hang f9089a9700 增加日志测试
continuous-integration/drone/push Build is running Details
2024-10-25 14:35:27 +08:00
hang 57aedd7dd4 调试状态
continuous-integration/drone/push Build is passing Details
2024-10-25 14:26:14 +08:00
hang 8329362c33 导表查询问题解决
continuous-integration/drone/push Build is passing Details
2024-10-25 13:34:11 +08:00
hang 787081a485 废弃 TrialResourceFilter 使用ActionFilter
continuous-integration/drone/push Build is passing Details
2024-10-25 13:13:45 +08:00
hang 94aa943410 账号最有一次登录时间增加查询条件
continuous-integration/drone/push Build is passing Details
2024-10-25 11:07:27 +08:00
hang 08a916d699 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-25 11:02:12 +08:00
hang 77a11cacc2 利用中间件+特性解决minimal api 项目拦截功能 2024-10-25 11:02:10 +08:00
he a28f2e3bb2 修改
continuous-integration/drone/push Build is passing Details
2024-10-25 10:57:51 +08:00
he f060380735 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-25 10:44:10 +08:00
he 57737b0d04 校验去掉分组 2024-10-25 10:44:09 +08:00
hang 5023f5ed31 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-24 18:05:43 +08:00
hang cf6a7d9166 修改枚举展示 2024-10-24 18:05:41 +08:00
he a4c12dcbeb 修改
continuous-integration/drone/push Build is passing Details
2024-10-24 17:35:27 +08:00
he 70240da5c5 修改
continuous-integration/drone/push Build is passing Details
2024-10-24 16:10:14 +08:00
he 0b2c707ec7 修改
continuous-integration/drone/push Build is passing Details
2024-10-24 15:48:58 +08:00
hang aa1ecaf1fe Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-24 15:10:23 +08:00
hang 39435b0068 修改访视裁判导表 2024-10-24 15:10:21 +08:00
he 9fc6ee267e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-24 14:57:38 +08:00
he 1364031439 修改 2024-10-24 14:57:37 +08:00
hang 9c95d22b6a 修改导表bug
continuous-integration/drone/push Build is passing Details
2024-10-24 14:48:11 +08:00
hang f8108da641 修改裁判选择标记
continuous-integration/drone/push Build is passing Details
2024-10-24 14:24:01 +08:00
hang 39bb3bf56b Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-24 14:12:01 +08:00
hang 2c37765969 修改 外部人员系统文档签署问题解决 2024-10-24 14:11:56 +08:00
he 3bb02ccb24 修改
continuous-integration/drone/push Build is passing Details
2024-10-24 13:54:53 +08:00
he 23ac7a73a7 修改
continuous-integration/drone/push Build is passing Details
2024-10-24 13:43:44 +08:00
he dacbe132a6 修改
continuous-integration/drone/push Build is passing Details
2024-10-24 13:36:00 +08:00
he 5f6d8b921f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-24 13:26:03 +08:00
he fcb603abc6 邮件修改 2024-10-24 13:26:02 +08:00
hang 5ceb5e790a 编译错误修改
continuous-integration/drone/push Build is passing Details
2024-10-24 10:37:32 +08:00
hang 2b1b5dce52 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-24 10:29:43 +08:00
hang 293a8bce31 处理邮件延迟发送配置 2024-10-24 10:29:41 +08:00
he a7cfc1714a 修改
continuous-integration/drone/push Build is passing Details
2024-10-24 10:22:51 +08:00
he ad01628e48 代码修改
continuous-integration/drone/push Build is passing Details
2024-10-24 09:40:14 +08:00
he 558258fd89 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-24 09:24:48 +08:00
he 2a853e49f6 修改 2024-10-24 09:24:45 +08:00
hang acf9709d3a 修改病灶明细表显示标准
continuous-integration/drone/push Build is passing Details
2024-10-23 18:09:31 +08:00
hang 6c4ead5ab4 修改枚举
continuous-integration/drone/push Build is passing Details
2024-10-23 17:58:03 +08:00
hang 2ac995bf39 修改导出类别
continuous-integration/drone/push Build is passing Details
2024-10-23 17:52:45 +08:00
hang 3ee175f091 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-23 17:44:12 +08:00
hang a701c082d9 修改动态导表 2024-10-23 17:44:09 +08:00
he 9385e22c58 修改
continuous-integration/drone/push Build is passing Details
2024-10-23 17:29:08 +08:00
he 61278375ba 修改
continuous-integration/drone/push Build is passing Details
2024-10-23 17:05:27 +08:00
he 9a74b81e93 修改
continuous-integration/drone/push Build is passing Details
2024-10-23 14:21:36 +08:00
he 981c029492 修改
continuous-integration/drone/push Build is passing Details
2024-10-23 14:17:45 +08:00
he 2fd6f70995 修改
continuous-integration/drone/push Build is passing Details
2024-10-23 11:52:02 +08:00
he b809a3b102 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-23 11:47:23 +08:00
he 2d90ecd90f 修改 2024-10-23 11:47:21 +08:00
hang 5ee5bac4ad Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-23 10:34:47 +08:00
hang 8e764e5707 清理历史文件 2024-10-23 10:34:45 +08:00
he c4501321ed 修改
continuous-integration/drone/push Build is passing Details
2024-10-22 18:01:55 +08:00
he b0ece8bcfe 修改
continuous-integration/drone/push Build is passing Details
2024-10-22 17:46:13 +08:00
he cce4872341 修改
continuous-integration/drone/push Build is running Details
2024-10-22 17:45:33 +08:00
he 3c49192360 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-22 16:47:49 +08:00
he c610c3bac0 修改 2024-10-22 16:47:48 +08:00
hang 09405dea8b Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-22 15:30:40 +08:00
hang 06cb92b7e0 整理文件夹 2024-10-22 15:30:38 +08:00
he f7a3e87ba8 数据库修改
continuous-integration/drone/push Build is passing Details
2024-10-22 15:27:44 +08:00
he 2bad8065a5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-22 15:25:08 +08:00
he 22998ccb71 修改 2024-10-22 15:25:07 +08:00
hang 38b4268c67 合并
continuous-integration/drone/push Build is passing Details
2024-10-22 15:11:51 +08:00
hang fb3228e18a 修改导表bug 2024-10-22 15:11:16 +08:00
he 056feade12 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-22 14:55:40 +08:00
he 6d98b140e1 修改 2024-10-22 14:55:39 +08:00
hang 698ce08d30 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-10-22 14:38:18 +08:00
hang 6eddf7e2a1 修改导表备注 2024-10-22 14:38:18 +08:00
he e26c9b6c1a 修改
continuous-integration/drone/push Build is passing Details
2024-10-22 13:55:35 +08:00
he 62d3b69bd5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-10-22 13:55:10 +08:00
he ab4e1f8649 修改 2024-10-22 13:55:09 +08:00
hang 773c657b67 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-22 13:45:17 +08:00
hang a90bb18154 提交阅片导表逻辑 2024-10-22 13:45:16 +08:00
he 3dcf94f637 代码修改
continuous-integration/drone/push Build is passing Details
2024-10-22 13:09:54 +08:00
he 5e384db795 修改
continuous-integration/drone/push Build is passing Details
2024-10-22 11:20:23 +08:00
he abd1562179 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-22 11:15:29 +08:00
he 2f1a9af5bd 修改 2024-10-22 11:15:26 +08:00
hang 78c90734b2 Excel 导表初步测试提交
continuous-integration/drone/push Build is passing Details
2024-10-22 10:54:26 +08:00
hang 7c246dcecd 修改导表展示列表
continuous-integration/drone/push Build is passing Details
2024-10-22 10:15:24 +08:00
hang f6252f62c4 serilog 增加环境发生错误发送邮件
continuous-integration/drone/push Build is passing Details
2024-10-22 09:57:25 +08:00
hang 9b91472186 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 21:03:23 +08:00
hang 3ff092fbda 测试 2024-10-21 21:03:22 +08:00
hang d0b73977a6 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 18:02:37 +08:00
hang 823f082396 修改日志输出测试 2024-10-21 18:02:35 +08:00
he 15701ef073 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 17:58:30 +08:00
he 51c4bcc10b 修改 2024-10-21 17:58:30 +08:00
hang 48ff2a347e 修改日志记录测试
continuous-integration/drone/push Build is passing Details
2024-10-21 17:27:20 +08:00
hang 922e61a636 修改scp 服务缩略图
continuous-integration/drone/push Build is passing Details
2024-10-21 17:06:01 +08:00
hang de0b95a22b 修改json 日志展示
continuous-integration/drone/push Build is passing Details
2024-10-21 16:19:14 +08:00
hang 47fe825aa7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 15:39:58 +08:00
hang f7e47293dd 测试修改serilog 日志 2024-10-21 15:39:57 +08:00
he 80f05c2b74 修改
continuous-integration/drone/push Build is passing Details
2024-10-21 15:28:46 +08:00
he 8ec37f4337 修改
continuous-integration/drone/push Build is passing Details
2024-10-21 14:49:30 +08:00
he 2881d9e787 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 14:35:26 +08:00
he b5f12cd3b4 代码修改 2024-10-21 14:35:25 +08:00
hang 8bd82ed409 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 14:20:10 +08:00
hang ff589abd2c 整理NetonsoftJson 代码 2024-10-21 14:20:09 +08:00
he 121671e381 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 13:34:35 +08:00
he a87e73d221 修改 2024-10-21 13:34:34 +08:00
hang 19ebd117bc Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 13:23:25 +08:00
hang b03ab1aa35 整理api 代码 2024-10-21 13:23:24 +08:00
he 7cb177cb7c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-21 11:49:38 +08:00
he fb3aa3d793 x修改 2024-10-21 11:49:37 +08:00
hang 5e79baa232 修改发布方式
continuous-integration/drone/push Build is passing Details
2024-10-21 11:46:35 +08:00
hang 391bf568cb 修改中心调研
continuous-integration/drone/push Build is passing Details
2024-10-21 11:44:23 +08:00
hang ebc35741c9 修改CRC提交触发逻辑
continuous-integration/drone/push Build is passing Details
2024-10-21 11:20:41 +08:00
hang 7859ad9895 修改中心调研名字重复问题
continuous-integration/drone/push Build is passing Details
2024-10-21 11:06:30 +08:00
hang 0ac17ac27f 转pdf minimal api 完成
continuous-integration/drone/push Build is passing Details
2024-10-19 18:22:58 +08:00
hang 41444bb292 升级nuget包,移除autofac
continuous-integration/drone/push Build is passing Details
2024-10-19 16:39:29 +08:00
hang 4ab4fbd599 利用第三方服务转pdf
continuous-integration/drone/push Build is passing Details
2024-10-19 16:31:27 +08:00
he f97cfd58c0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-18 15:39:56 +08:00
he f0672f5dec 邮件修改 2024-10-18 15:39:54 +08:00
hang 2a0d01c161 修改中心调研表逻辑
continuous-integration/drone/push Build is passing Details
2024-10-18 15:08:28 +08:00
hang a7277be2ba 调研表spm 提交模板用错
continuous-integration/drone/push Build is passing Details
2024-10-18 13:55:23 +08:00
hang 7c0c9b986d 修改排序
continuous-integration/drone/push Build is passing Details
2024-10-18 13:43:52 +08:00
hang 98acb5ea70 增加抄送人
continuous-integration/drone/push Build is passing Details
2024-10-18 11:19:30 +08:00
hang d65f944312 修改枚举
continuous-integration/drone/push Build is passing Details
2024-10-18 11:09:38 +08:00
hang ec6fe109f4 中心调研邮件发件人遗漏
continuous-integration/drone/push Build is passing Details
2024-10-18 11:05:10 +08:00
hang 03d735a287 修改事件发布
continuous-integration/drone/push Build is passing Details
2024-10-18 11:01:57 +08:00
hang d578feec18 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-18 09:03:22 +08:00
hang 13db4fc9e1 IR 周期任务临时提交 2024-10-18 09:03:22 +08:00
hang 8760ad3904 IRecurringMessageScheduler 测试使用,以及bug发现
continuous-integration/drone/push Build is passing Details
2024-10-17 21:43:39 +08:00
hang 81b9c57de7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-17 16:30:23 +08:00
hang 652cad9726 历史邮件整理 2024-10-17 16:30:22 +08:00
he b031b4e971 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-17 15:45:48 +08:00
he eed4a584e3 邮件修改 2024-10-17 15:45:47 +08:00
hang 05693d090d 处理延时的任务
continuous-integration/drone/push Build is passing Details
2024-10-17 14:32:46 +08:00
hang b0d17b0466 修改合并
continuous-integration/drone/push Build is passing Details
2024-10-17 13:39:14 +08:00
hang f1acb787f5 配合hangfire 周期任务暂时有问题 --待解决 2024-10-17 13:37:57 +08:00
he 289811e0e6 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-17 10:38:29 +08:00
he a258d3c4ae 代码修改 2024-10-17 10:38:28 +08:00
hang a03c11ae9d Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-17 10:35:57 +08:00
hang 9e057ff815 修改国际化配置提前 2024-10-17 10:35:56 +08:00
he 5745161142 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-10-17 10:14:52 +08:00
he 553fa097b4 修改 2024-10-17 10:14:50 +08:00
hang 8a3eb61a34 修改国际化异常 2024-10-17 10:03:47 +08:00
hang 41e8164c2e 测试打包
continuous-integration/drone/push Build is passing Details
2024-10-17 09:23:28 +08:00
hang 26652160df 计划任务修改临时提交1
continuous-integration/drone/push Build is passing Details
2024-10-17 09:01:52 +08:00
hang ece98887da 精简国际化代码
continuous-integration/drone/push Build is passing Details
2024-10-16 15:27:57 +08:00
hang 7d07e18853 修改静态文件国际化方式
continuous-integration/drone/push Build is passing Details
2024-10-16 11:06:17 +08:00
hang 663a6c7f5c 设置静态国际化+测试ok
continuous-integration/drone/push Build is passing Details
2024-10-16 10:40:38 +08:00
hang 8be3cc9e78 minimal api 模型验证+ 方法级别的过滤器暂时未有解决方案
continuous-integration/drone/push Build is passing Details
2024-10-16 09:03:12 +08:00
hang 74a0c8923c minimal api 踢用户下线 实现
continuous-integration/drone/push Build is passing Details
2024-10-15 15:42:08 +08:00
hang 947d6dc6d1 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-15 15:08:10 +08:00
hang 288dacf613 增加管道异常处理 IExceptionHandler 2024-10-15 15:08:09 +08:00
he 546d65ab16 修改
continuous-integration/drone/push Build is passing Details
2024-10-15 14:54:54 +08:00
he 1b70807824 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-15 14:40:29 +08:00
he 48da4994b9 修改 2024-10-15 14:40:27 +08:00
hang 5d51ac562a minimal api 测试
continuous-integration/drone/push Build is passing Details
2024-10-15 14:19:39 +08:00
hang 8e1ae18de0 增加codefirst 说明
continuous-integration/drone/push Build is passing Details
2024-10-15 13:41:17 +08:00
hang d723c64d5b 修改冲突
continuous-integration/drone/push Build is passing Details
2024-10-15 13:16:42 +08:00
hang 67e09bbf66 minimal api 测试准备 2024-10-15 13:16:09 +08:00
he 5f898ed93a 修改
continuous-integration/drone/push Build is passing Details
2024-10-15 11:29:42 +08:00
he 4621ed9e67 修改
continuous-integration/drone/push Build is passing Details
2024-10-15 10:37:59 +08:00
he ce32d7eea8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-15 10:29:31 +08:00
he cb4296396f 修改 2024-10-15 10:29:31 +08:00
hang a3ec9618ed Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-15 10:17:01 +08:00
hang 155d24fafb swagger 兼容minimal api 调整 2024-10-15 10:17:00 +08:00
he 2208e1dbe5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-15 10:03:49 +08:00
he ffd29eb268 代码提交 2024-10-15 10:03:47 +08:00
hang 08f4a0877b 清理swagger配置
continuous-integration/drone/push Build is passing Details
2024-10-15 09:22:15 +08:00
hang 827615f272 swagger 整理
continuous-integration/drone/push Build is passing Details
2024-10-15 09:13:32 +08:00
hang a81f05dcc7 swagger 预备修改调整
continuous-integration/drone/push Build is passing Details
2024-10-15 00:14:34 +08:00
hang 8e2904c541 修改uat配置文件
continuous-integration/drone/push Build is passing Details
2024-10-14 18:03:11 +08:00
hang 1346d565c4 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-14 17:08:56 +08:00
hang ab61372e33 修改导表 2024-10-14 17:08:55 +08:00
he 6709f0c653 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-14 15:31:14 +08:00
he a88ef53104 修改 2024-10-14 15:31:13 +08:00
hang fad9428656 引入minimal api 测试
continuous-integration/drone/push Build is passing Details
2024-10-14 14:48:18 +08:00
hang c9a6f8b99b 删除废弃的组件
continuous-integration/drone/push Build is passing Details
2024-10-14 11:11:16 +08:00
hang c1c03a3f05 修改masstransit 测试代码
continuous-integration/drone/push Build is passing Details
2024-10-13 21:40:05 +08:00
hang e65227c7bf 清理多余引用
continuous-integration/drone/push Build is passing Details
2024-10-13 16:31:09 +08:00
hang 0206947202 移除属性注入改为构造函数注入
continuous-integration/drone/push Build is passing Details
2024-10-13 13:31:25 +08:00
hang f1be4eaf5f 动态移动表格+动态删除指定列
continuous-integration/drone/push Build is passing Details
2024-10-13 02:38:43 +08:00
hang fd3fc0ea03 修改导出
continuous-integration/drone/push Build is passing Details
2024-10-12 18:08:07 +08:00
hang ad7463c2c9 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-12 17:03:10 +08:00
hang 1008ed9f95 中心调研修改 2024-10-12 17:03:10 +08:00
he d7379e897b 合并
continuous-integration/drone/push Build is passing Details
2024-10-12 16:57:01 +08:00
he 20e546e5d3 代码修改 2024-10-12 16:56:34 +08:00
hang d6ff81bf87 中心调研邮件 和枚举增加
continuous-integration/drone/push Build is passing Details
2024-10-12 16:23:32 +08:00
hang 8eecabb897 增加备注
continuous-integration/drone/push Build is passing Details
2024-10-12 13:48:48 +08:00
hang c940976f7f 修改申请重阅事件
continuous-integration/drone/push Build is passing Details
2024-10-12 11:02:12 +08:00
hang 2f1f266ea3 清理模型
continuous-integration/drone/push Build is passing Details
2024-10-12 10:48:43 +08:00
hang 650f4706a8 增加事件类型简单名称,方便配置枚举,知道是什么事件
continuous-integration/drone/push Build is passing Details
2024-10-12 10:29:03 +08:00
hang f41bf281fe 下载增加TrialSiteCode
continuous-integration/drone/push Build is passing Details
2024-10-12 09:13:48 +08:00
hang f7fd880388 修改触发事件
continuous-integration/drone/push Build is passing Details
2024-10-11 22:07:14 +08:00
hang f67ebce739 消费者cultureInfo 自动处理,消费成功自动设置事件状态
continuous-integration/drone/push Build is passing Details
2024-10-11 19:43:15 +08:00
hang 79fd83449a 测试 CultureInfoFilter
continuous-integration/drone/push Build is passing Details
2024-10-11 18:00:45 +08:00
hang ed61419a6a 事件增加文化属性
continuous-integration/drone/push Build is passing Details
2024-10-11 17:03:02 +08:00
hang 971c4dcf9e 修改发布的事件记录信息
continuous-integration/drone/push Build is passing Details
2024-10-11 16:25:52 +08:00
hang 2ee34b8e7c 领域事件修改
continuous-integration/drone/push Build is passing Details
2024-10-11 14:35:53 +08:00
hang 464f70f501 暂时屏蔽事件存储
continuous-integration/drone/push Build is passing Details
2024-10-11 13:53:29 +08:00
hang a6fd6a5e69 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-11 11:38:11 +08:00
hang d3958dab42 下载导出bug 2024-10-11 11:38:11 +08:00
hang 5f7f0e4456 下载导出bug
continuous-integration/drone/push Build is passing Details
2024-10-11 11:35:02 +08:00
hang 54ee6cf0c0 遗漏await
continuous-integration/drone/push Build is passing Details
2024-10-11 11:19:51 +08:00
hang 6a8b01425d 查询返回TrialSiteCode
continuous-integration/drone/push Build is passing Details
2024-10-11 11:15:35 +08:00
hang 751c976f95 下载记录表 增加SubjectId字段
continuous-integration/drone/push Build is passing Details
2024-10-11 11:04:19 +08:00
hang 854f1e5109 修改hangfire 配置,任务调度更精准
continuous-integration/drone/push Build is passing Details
2024-10-11 09:37:59 +08:00
hang 1e99374de0 masstransit 集成hangfire
continuous-integration/drone/push Build is passing Details
2024-10-10 23:58:12 +08:00
hang a700658132 事件触发修改
continuous-integration/drone/push Build is passing Details
2024-10-10 16:57:49 +08:00
hang 84b2fc32b2 修改触发逻辑
continuous-integration/drone/push Build is passing Details
2024-10-10 16:50:51 +08:00
hang b4c7ecbf9e 删除多余的定义
continuous-integration/drone/push Build is passing Details
2024-10-10 16:22:40 +08:00
hang 9ad11b16d1 入组或者PD 增加触发和消费者
continuous-integration/drone/push Build is passing Details
2024-10-10 16:07:58 +08:00
hang 2d1785f513 增加访视触发事件
continuous-integration/drone/push Build is passing Details
2024-10-10 14:41:29 +08:00
hang ea67a69351 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-10-10 14:24:59 +08:00
hang 2c1300acb4 事件存储准备 2024-10-10 14:24:56 +08:00
he 0c2aa9ca5e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-10-10 13:38:24 +08:00
he 6a6e449e49 读取下一个阅片 2024-10-10 13:38:21 +08:00
hang 2527d709fa 返回后台文件测试
continuous-integration/drone/push Build is passing Details
2024-10-10 12:37:19 +08:00
hang 1bb62fd134 阅片导出初步提交 2024-10-10 09:55:09 +08:00
he 431d2e7a97 修改密码验证
continuous-integration/drone/push Build is passing Details
2024-10-09 15:12:06 +08:00
he 007f8eddc9 修改密码验证
continuous-integration/drone/push Build is passing Details
2024-10-09 15:11:50 +08:00
he 7caac94d97 验证密码
continuous-integration/drone/push Build is passing Details
2024-10-09 15:02:22 +08:00
he b94bc8eff1 验证密码
continuous-integration/drone/push Build is failing Details
2024-10-09 15:01:37 +08:00
hang ceedafb6b9 修改映射配置
continuous-integration/drone/push Build is passing Details
2024-10-09 13:29:11 +08:00
hang 04e7cd5463 屏蔽mssql连接
continuous-integration/drone/push Build is failing Details
2024-10-09 13:01:30 +08:00
hang ba37700812 去掉aws 获取token
continuous-integration/drone/push Build is failing Details
2024-10-09 12:57:45 +08:00
he cdadad9ec5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is failing Details
2024-10-09 10:27:19 +08:00
he 795e128ef9 代码修改 2024-10-09 10:27:17 +08:00
hang 658f9c7c40 1、阅片跟踪表
continuous-integration/drone/push Build is passing Details
2、接收记录表
3、接收影像检查表
4、下载记录表
2024-10-08 11:38:37 +08:00
hang 5bce1cafa3 修改lili 配置文件
continuous-integration/drone/push Build is passing Details
2024-10-08 10:46:10 +08:00
hang f539496f9f 切换nuget包所在 项目
continuous-integration/drone/push Build is passing Details
2024-10-08 08:55:24 +08:00
hang fac077d2b7 增加备注
continuous-integration/drone/push Build is passing Details
2024-10-07 21:27:44 +08:00
hang 874c8718b1 TestMasstransitMeditor
continuous-integration/drone/push Build is passing Details
2024-10-04 17:54:55 +08:00
he fea009bf0c 修改
continuous-integration/drone/push Build is passing Details
2024-09-30 13:30:48 +08:00
he 5ae837ac19 修改验证
continuous-integration/drone/push Build is passing Details
2024-09-30 12:47:43 +08:00
he eb55fafbc3 修改
continuous-integration/drone/push Build is failing Details
2024-09-30 11:55:44 +08:00
he 88893c9825 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-30 11:52:50 +08:00
he c6a18aa18a 修改 2024-09-30 11:52:47 +08:00
hang 8829723c19 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-30 10:21:36 +08:00
hang 8768fe0437 上传列表 返回阅片任务状态,已阅片的不允许删除 2024-09-30 10:21:36 +08:00
he cb7098830c 修改
continuous-integration/drone/push Build is passing Details
2024-09-29 18:12:46 +08:00
he c69c139e00 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-29 17:44:59 +08:00
he acb7e798e0 修改 2024-09-29 17:44:58 +08:00
hang 63d7bd5607 修改后处理影像筛选
continuous-integration/drone/push Build is passing Details
2024-09-29 16:39:34 +08:00
hang 99e3610be6 scp 增加注册 AddMediator
continuous-integration/drone/push Build is passing Details
2024-09-29 15:39:10 +08:00
hang 50712aefc6 修改bm 导航属性配置遗漏
continuous-integration/drone/push Build is passing Details
2024-09-29 15:00:10 +08:00
hang d5d728fea6 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-29 14:19:56 +08:00
hang 9e71732061 修改scp 2024-09-29 14:19:54 +08:00
he c24adcd09c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-29 13:59:21 +08:00
he 0da842871c 修改 2024-09-29 13:59:20 +08:00
hang 03702477d6 修改发布版本
continuous-integration/drone/push Build is running Details
2024-09-29 13:57:41 +08:00
hang e4a36f4689 修改codefirst 迁移文件名 2024-09-29 10:45:09 +08:00
hang cb6271daef Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-29 10:38:42 +08:00
hang 11fa028cd4 修改字段 2024-09-29 10:38:40 +08:00
he 5a1a710d5a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-29 10:21:29 +08:00
he e9e4b45823 修改 2024-09-29 10:21:28 +08:00
hang 7693c72802 MasstransitMeditor 不在efcore 同一个事务
continuous-integration/drone/push Build is passing Details
2024-09-28 21:21:52 +08:00
hang 1bacc222be 增加返回项目modality
continuous-integration/drone/push Build is passing Details
2024-09-27 18:06:05 +08:00
hang c5355e976f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-27 17:42:38 +08:00
hang 95a84bb330 更新后处理上传的检查modality 2024-09-27 17:42:37 +08:00
he 6a60e4696b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-27 17:23:11 +08:00
he 7ff77554ff 修改 2024-09-27 17:23:10 +08:00
hang ba23950cd5 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-09-27 17:22:52 +08:00
hang 8ec2c676f1 构造函数去掉获取token 2024-09-27 17:22:51 +08:00
he b183622e13 修改
continuous-integration/drone/push Build is passing Details
2024-09-27 17:14:48 +08:00
he cd9f7f8812 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-09-27 17:12:34 +08:00
he 513d773be3 修改 2024-09-27 17:12:34 +08:00
hang cf24583974 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-09-27 17:11:54 +08:00
hang f5fbf96772 oss 获取token方法改为同步测试 2024-09-27 17:11:53 +08:00
he 8dc2301184 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-09-27 17:11:08 +08:00
he 7e135367b2 修改 2024-09-27 17:11:07 +08:00
hang 8626a6b453 修改触发
continuous-integration/drone/push Build is passing Details
2024-09-27 16:53:28 +08:00
hang 870dda49dd Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-27 16:16:09 +08:00
hang 171b8bac34 原始影像检查过滤 2024-09-27 16:16:09 +08:00
he 7c19ecc3f4 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-27 15:16:05 +08:00
he 3e375ea6d1 修改 2024-09-27 15:16:04 +08:00
hang 416a94e302 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-27 15:11:50 +08:00
hang 7760b0736e Trigger 修改分类整理 2024-09-27 15:11:49 +08:00
he aba7dfdec9 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-27 14:45:56 +08:00
he 1dabadfba4 修改 2024-09-27 14:45:55 +08:00
hang b8f5f32596 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-27 13:58:34 +08:00
hang b6459d2f9f 整理trigger 到不同的文件夹 2024-09-27 13:58:33 +08:00
he dded4f2d7c 代码修改
continuous-integration/drone/push Build is passing Details
2024-09-27 13:24:34 +08:00
he fadb7a9d0e 修改
continuous-integration/drone/push Build is passing Details
2024-09-27 13:08:04 +08:00
he 55f261b080 修改
continuous-integration/drone/push Build is passing Details
2024-09-27 13:06:16 +08:00
he ccf154e5e5 修改
continuous-integration/drone/push Build is passing Details
2024-09-27 11:43:37 +08:00
he 069ee25d18 修改
continuous-integration/drone/push Build is passing Details
2024-09-27 10:59:29 +08:00
he 64fd39ceb4 修改
continuous-integration/drone/push Build is passing Details
2024-09-27 10:52:21 +08:00
he 19cf8c7559 修改
continuous-integration/drone/push Build is passing Details
2024-09-27 10:42:25 +08:00
he 3c0199cebd Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-27 10:37:45 +08:00
he 62965e5aa5 修改 2024-09-27 10:37:44 +08:00
hang 654fb7116b 修改bug
continuous-integration/drone/push Build is passing Details
2024-09-27 10:24:54 +08:00
hang da6746beea 影响筛选过滤
continuous-integration/drone/push Build is passing Details
2024-09-27 10:12:29 +08:00
hang 2461646d5f MassTransit Command 测试预备代码
continuous-integration/drone/push Build is passing Details
2024-09-27 09:54:16 +08:00
hang 02db483119 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-26 17:34:22 +08:00
hang b5e756ffa3 领域事件预备测试 2024-09-26 17:34:21 +08:00
he f3c29d3530 修改
continuous-integration/drone/push Build is passing Details
2024-09-26 17:29:01 +08:00
he f2d9c6fe38 修改
continuous-integration/drone/push Build is passing Details
2024-09-26 17:22:04 +08:00
he 0d4d984135 修改
continuous-integration/drone/push Build is passing Details
2024-09-26 17:13:27 +08:00
he f9c155a378 修改
continuous-integration/drone/push Build is passing Details
2024-09-26 15:05:32 +08:00
he a9a67c1db2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-26 15:03:01 +08:00
he 3d6d64175b 修改 2024-09-26 15:03:01 +08:00
hang 45c74694f2 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-26 14:22:05 +08:00
hang 033c47435f DateOnly 的使用,以及解耦数据库 2024-09-26 14:22:04 +08:00
he ea48967492 修改
continuous-integration/drone/push Build is passing Details
2024-09-26 13:57:34 +08:00
he 8ec35d90fb 修改
continuous-integration/drone/push Build is passing Details
2024-09-26 13:49:39 +08:00
he 53f3bb5d6d 修改
continuous-integration/drone/push Build is passing Details
2024-09-26 13:31:47 +08:00
he e6628e952f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-26 13:27:48 +08:00
he 1b26ed1b65 修改 2024-09-26 13:27:47 +08:00
hang d0018a3ec3 处理SeqId 是主键,但是Id是虚拟主键,显示配置导航属性,解决codefirst 迁移问题
continuous-integration/drone/push Build is passing Details
2024-09-26 13:22:11 +08:00
hang a423c7c73a 增加显示导航属性
continuous-integration/drone/push Build is passing Details
2024-09-26 11:41:31 +08:00
hang 8eacc969ed Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-26 11:29:12 +08:00
hang 33b02be6ed 增加dicom 显示文件大小,以及修改影像下载列表适配 随机阅片 2024-09-26 11:29:11 +08:00
he 9834335767 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-26 10:47:03 +08:00
he d4d5ed0d9a 修改 2024-09-26 10:47:02 +08:00
hang 3fc7b72a45 显示标注seqId 导致后处理上传问题
continuous-integration/drone/push Build is passing Details
2024-09-26 10:39:47 +08:00
hang e525965d89 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-26 10:26:35 +08:00
hang af988e7276 修改影像key 显示标注 2024-09-26 10:26:34 +08:00
he 627f3bf4a9 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-26 10:20:20 +08:00
he aca261ace2 导入修改 2024-09-26 10:20:18 +08:00
hang 328a8549c6 同步长度
continuous-integration/drone/push Build is passing Details
2024-09-26 00:15:08 +08:00
hang ff71e925ca 修改查询参数
continuous-integration/drone/push Build is passing Details
2024-09-25 17:34:57 +08:00
hang f46bbea98e 受试者随机随机排序修改
continuous-integration/drone/push Build is passing Details
2024-09-25 17:10:01 +08:00
hang 1d5c274e38 修改参数必传与否
continuous-integration/drone/push Build is passing Details
2024-09-25 16:47:50 +08:00
hang e32195c322 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-25 15:49:45 +08:00
hang 935b498ab5 修改上传验证 2024-09-25 15:49:43 +08:00
he 21925f6d88 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-25 15:39:33 +08:00
he 54b75dd3d5 修改 2024-09-25 15:39:33 +08:00
hang 7ed54e3be3 修改上传列表限制
continuous-integration/drone/push Build is passing Details
2024-09-25 15:17:49 +08:00
hang 3a3184a5ac Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-25 15:06:26 +08:00
hang 41153e42d6 本地swagger 拦截排除 2024-09-25 15:06:26 +08:00
he 3ca9be0a29 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-25 14:48:21 +08:00
he 6c5f669ab6 修改 2024-09-25 14:48:20 +08:00
hang 282ba96c61 修改冲突
continuous-integration/drone/push Build is running Details
2024-09-25 14:47:20 +08:00
hang fe80604331 修改长度 2024-09-25 14:45:11 +08:00
he 19fdd02429 修改
continuous-integration/drone/push Build is passing Details
2024-09-25 14:11:01 +08:00
he c2f72d677f 修改
continuous-integration/drone/push Build is passing Details
2024-09-25 14:06:29 +08:00
he 6713fff0e7 修改
continuous-integration/drone/push Build is passing Details
2024-09-25 13:44:41 +08:00
he ff8fa94341 修改
continuous-integration/drone/push Build is running Details
2024-09-25 13:44:16 +08:00
he 82f2185825 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-25 13:12:24 +08:00
he 5fdf9e0606 导入修改 2024-09-25 13:12:22 +08:00
hang cf9823c682 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-25 10:59:42 +08:00
hang 73e7ed11b1 整理字段长度,迁移准备工作完毕 2024-09-25 10:59:40 +08:00
he 9adab8cef1 修改
continuous-integration/drone/push Build is passing Details
2024-09-25 10:44:40 +08:00
he 3d382635cc 代码修改
continuous-integration/drone/push Build is passing Details
2024-09-25 10:34:20 +08:00
he e389c1e581 计算修改
continuous-integration/drone/push Build is passing Details
2024-09-25 10:19:34 +08:00
he 1a3ebe1fc4 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-25 09:44:20 +08:00
he fb6f12903e 代码修改 2024-09-25 09:44:19 +08:00
hang 1da4fbe23b 实体标注,修改默认长度
continuous-integration/drone/push Build is passing Details
2024-09-24 17:57:45 +08:00
hang 4d206ebf9d Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-24 16:42:29 +08:00
hang 9c4ada3e66 修改报错 2024-09-24 16:42:28 +08:00
he 0bc0421ee3 修改
continuous-integration/drone/push Build is passing Details
2024-09-24 15:09:09 +08:00
he a79aebe772 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-24 14:59:06 +08:00
he d3ff114b6d 导入完成 2024-09-24 14:59:05 +08:00
hang 50a45e2260 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-24 14:31:15 +08:00
hang 8090668650 重阅任务排除 2024-09-24 14:31:13 +08:00
he d27b4af793 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-24 14:14:50 +08:00
he b097ca1db3 导入代码修改 2024-09-24 14:14:49 +08:00
hang 609742c914 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-24 14:12:27 +08:00
hang 79d76dcbaf 修改验证接口 2024-09-24 14:12:26 +08:00
he 721ab8dfd3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-24 13:39:27 +08:00
he b2d90005f8 代码修改 2024-09-24 13:39:26 +08:00
hang c58d880e28 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-24 13:14:19 +08:00
hang 183fc6143f 国际化修改 2024-09-24 13:14:18 +08:00
he 9a71e1fa0f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-24 13:08:16 +08:00
he 5977ab34e9 代码修改 2024-09-24 13:08:15 +08:00
hang c71b58e0e9 后处理访视
continuous-integration/drone/push Build is passing Details
2024-09-24 11:25:08 +08:00
hang 1fcb871de2 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-23 18:01:47 +08:00
hang d7a76bc110 移动加密方法,测试值转换器ok 2024-09-23 18:01:46 +08:00
he 78b76da7ed 修改
continuous-integration/drone/push Build is passing Details
2024-09-23 16:46:41 +08:00
he a6c04d8fbb 修改
continuous-integration/drone/push Build is running Details
2024-09-23 16:45:40 +08:00
he 303cb54e7a 导出模板
continuous-integration/drone/push Build is passing Details
2024-09-23 16:15:51 +08:00
he 92e1a3f90b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-23 15:20:08 +08:00
he 8c51ae350c IVUS计算 2024-09-23 15:20:07 +08:00
hang 91fa8e75e1 发布日志 增加lili 版本
continuous-integration/drone/push Build is passing Details
2024-09-23 13:33:30 +08:00
hang 893bdaf0f2 修改过滤器
continuous-integration/drone/push Build is passing Details
2024-09-23 11:16:46 +08:00
hang 7051e68c09 修改部分字段更新bug
continuous-integration/drone/push Build is passing Details
2024-09-23 10:50:11 +08:00
hang e9bb71f5c9 同步数据库备注到实体
continuous-integration/drone/push Build is passing Details
2024-09-20 22:45:48 +08:00
hang 3ee0c2ccc7 整理数据库实体备注
continuous-integration/drone/push Build is passing Details
2024-09-20 21:42:18 +08:00
hang 40c8a51a31 整理数据库实体备注
continuous-integration/drone/push Build is passing Details
2024-09-20 18:20:37 +08:00
hang d3e3ed79ba 退出登录,让token 过期
continuous-integration/drone/push Build is passing Details
2024-09-20 16:54:06 +08:00
hang 83d3a547d1 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-20 16:35:59 +08:00
hang 3d428af85b 监控列表 增加字段 2024-09-20 16:35:59 +08:00
he c5b8743064 修改
continuous-integration/drone/push Build is passing Details
2024-09-20 15:14:18 +08:00
he 69d390da81 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-20 14:59:46 +08:00
he ae0f601727 合并 2024-09-20 14:59:45 +08:00
hang d509bc1649 登录的bug
continuous-integration/drone/push Build is running Details
2024-09-20 14:58:08 +08:00
he 23ffe2b143 修改 2024-09-20 14:56:24 +08:00
hang 718ddefe97 批量处理实体类空行
continuous-integration/drone/push Build is passing Details
2024-09-20 14:34:32 +08:00
hang 7524d39213 清理实体类备注
continuous-integration/drone/push Build is passing Details
2024-09-20 14:18:16 +08:00
hang 7e705ccf37 pacs 确认了才能启动项目
continuous-integration/drone/push Build is passing Details
2024-09-20 14:02:16 +08:00
hang 7fc2de5eb3 清理检查字段
continuous-integration/drone/push Build is passing Details
2024-09-20 13:49:37 +08:00
hang b90f5f2d85 清理后端下载
continuous-integration/drone/push Build is passing Details
2024-09-20 11:47:02 +08:00
hang 97b28fd920 修改入组附件
continuous-integration/drone/push Build is passing Details
2024-09-20 11:07:26 +08:00
hang 3bdd5af113 修改医生实体模型
continuous-integration/drone/push Build is passing Details
2024-09-20 10:55:02 +08:00
hang 6dcfbb8717 修改时间问题
continuous-integration/drone/push Build is passing Details
2024-09-20 10:44:56 +08:00
hang 103d4b42a3 整理命名空间
continuous-integration/drone/push Build is passing Details
2024-09-20 10:35:35 +08:00
hang fc30cb39ee 增加Global Using
continuous-integration/drone/push Build is passing Details
2024-09-20 10:19:08 +08:00
hang 115017197b 删除废弃字段
continuous-integration/drone/push Build is passing Details
2024-09-20 09:32:42 +08:00
hang 32931e155c GlobalUsings 清理实体层
continuous-integration/drone/push Build is passing Details
2024-09-20 09:20:04 +08:00
hang 0a1ce59670 整理命名空间
continuous-integration/drone/push Build is passing Details
2024-09-20 00:00:13 +08:00
hang 42e4fe59ec 同步数据模型和数据库对应关系2
continuous-integration/drone/push Build is passing Details
2024-09-19 23:45:43 +08:00
hang 19f4385055 同步数据模型和数据库对应关系1
continuous-integration/drone/push Build is passing Details
2024-09-19 21:56:36 +08:00
hang d789c48004 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-19 18:01:09 +08:00
hang 32427f0f0c 修改实体模型 2024-09-19 18:01:08 +08:00
he 01ade2d62f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-19 17:48:54 +08:00
he cec038fb92 修改 2024-09-19 17:48:52 +08:00
hang b5d117f6fa 稽查实体给默认值
continuous-integration/drone/push Build is passing Details
2024-09-19 17:01:03 +08:00
hang b98df9dae8 优化数据库表
continuous-integration/drone/push Build is passing Details
2024-09-19 16:40:17 +08:00
hang 4e7ce826c8 清理邮件配置字段
continuous-integration/drone/push Build is passing Details
2024-09-19 13:59:00 +08:00
hang 7df247d5e7 删除字典废弃字段
continuous-integration/drone/push Build is passing Details
2024-09-19 13:24:56 +08:00
hang fb067534e7 加密解密测试代码完成
continuous-integration/drone/push Build is passing Details
2024-09-19 11:45:23 +08:00
hang de274e00d6 加密解密组件准备完毕
continuous-integration/drone/push Build is passing Details
2024-09-18 21:18:33 +08:00
hang 3501f2acdf 加解密预备
continuous-integration/drone/push Build is passing Details
2024-09-18 18:03:23 +08:00
hang 2dd86652f3 修改下载信息列表,返回标准信息
continuous-integration/drone/push Build is passing Details
2024-09-18 16:36:59 +08:00
hang bf39613789 登录接口返回公司信息
continuous-integration/drone/push Build is passing Details
2024-09-18 16:05:29 +08:00
hang a64cec987d codefirst 测试完毕
continuous-integration/drone/push Build is passing Details
2024-09-18 14:51:20 +08:00
hang 5b2b5fead9 修改配置文件
continuous-integration/drone/push Build is passing Details
2024-09-18 10:43:11 +08:00
hang 0216665d5b 删除数据库模型,同时清理视图模型bug
continuous-integration/drone/push Build is passing Details
2024-09-18 10:30:01 +08:00
hang f1fadebfba 修改阅片期编辑
continuous-integration/drone/push Build is passing Details
2024-09-18 10:23:40 +08:00
hang 19b647fb4a 修改迁移配置以及测试
continuous-integration/drone/push Build is passing Details
2024-09-17 23:16:11 +08:00
hang 65e47d9918 decimal 精度解决
continuous-integration/drone/push Build is passing Details
2024-09-17 18:53:56 +08:00
hang ab68a63bdd 增加codefirst迁移配置
continuous-integration/drone/push Build is passing Details
2024-09-17 14:26:12 +08:00
hang 5990477fdc guid 生成修改
continuous-integration/drone/push Build is passing Details
2024-09-17 12:26:18 +08:00
hang 961ca49f76 整理仓储
continuous-integration/drone/push Build is running Details
2024-09-17 12:24:51 +08:00
hang 581e412106 修改代码模板
continuous-integration/drone/push Build is passing Details
2024-09-17 10:13:23 +08:00
hang 3813158b00 修改oss 配置
continuous-integration/drone/push Build is passing Details
2024-09-14 17:41:15 +08:00
hang 010fdf6e2c 修改排序bug
continuous-integration/drone/push Build is passing Details
2024-09-14 16:27:16 +08:00
hang f7c669a7d7 修改scp 服务配置文件
continuous-integration/drone/push Build is failing Details
2024-09-14 14:44:56 +08:00
hang 68dc09d969 修改中心调研
continuous-integration/drone/push Build is passing Details
2024-09-14 14:38:15 +08:00
hang a6a6765d9b x
continuous-integration/drone/push Build is passing Details
2024-09-14 14:13:03 +08:00
hang 5931a67825 修改中心调研bug
continuous-integration/drone/push Build is passing Details
2024-09-14 14:10:58 +08:00
hang f26441719f 修改配置文件
continuous-integration/drone/push Build is passing Details
2024-09-14 13:51:47 +08:00
hang 67a930a208 修改配置文件
continuous-integration/drone/push Build is running Details
2024-09-14 13:50:47 +08:00
hang f189f9f361 修改s3 配置文件
continuous-integration/drone/push Build is passing Details
2024-09-14 13:46:48 +08:00
hang b6d0791f18 修改影像筛选过滤
continuous-integration/drone/push Build is passing Details
2024-09-14 13:35:10 +08:00
hang 7285a9d672 修改映射测试
continuous-integration/drone/push Build is passing Details
2024-09-14 13:16:15 +08:00
hang c3daa75e0e 修改阅片bug
continuous-integration/drone/push Build is passing Details
2024-09-14 13:13:52 +08:00
hang 564ac4d931 修改编译错误
continuous-integration/drone/push Build is passing Details
2024-09-14 12:37:47 +08:00
hang e065e44ab0 修改默认值给“”
continuous-integration/drone/push Build is passing Details
2024-09-14 12:33:37 +08:00
hang bbc737811a 解决截图不显示问题
continuous-integration/drone/push Build is passing Details
2024-09-14 11:41:53 +08:00
hang d507e625c6 字符串默认值问题
continuous-integration/drone/push Build is passing Details
2024-09-14 11:18:11 +08:00
hang e997cb2a8f 修改api bug
continuous-integration/drone/push Build is passing Details
2024-09-14 11:14:10 +08:00
hang bfa2d8afce 增加tiralSiteId
continuous-integration/drone/push Build is passing Details
2024-09-14 11:05:02 +08:00
hang 3840627ce7 修改scp 服务
continuous-integration/drone/push Build is passing Details
2024-09-14 10:49:50 +08:00
hang 8fed969bec 修改配置文件
continuous-integration/drone/push Build is passing Details
2024-09-14 10:36:17 +08:00
hang d50091ed6b 修改文档bug
continuous-integration/drone/push Build is passing Details
2024-09-14 10:24:17 +08:00
hang 86864ae575 编译错误
continuous-integration/drone/push Build is passing Details
2024-09-14 09:47:13 +08:00
hang 0fdcc7c56e 修改对接bug
continuous-integration/drone/push Build is passing Details
2024-09-14 09:45:29 +08:00
hang 849f48db25 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-14 09:19:18 +08:00
hang b31821848d 修改scp 服务配置文件 2024-09-14 09:19:16 +08:00
hang e5be375308 自定义生成实体的模型,长度200的不标注,nvarcharmax 标注 MaxLength 其他长度标注StringLength
continuous-integration/drone/push Build is passing Details
2024-09-13 21:45:42 +08:00
hang 095db5786b 增加映射
continuous-integration/drone/push Build is passing Details
2024-09-13 17:54:55 +08:00
hang dcfe28d950 修改配置文件
continuous-integration/drone/push Build is passing Details
2024-09-13 17:51:02 +08:00
hang f9f3a1422f aws bug
continuous-integration/drone/push Build is passing Details
2024-09-13 17:38:49 +08:00
hang 8dcd1f2f56 修改scp 配置
continuous-integration/drone/push Build is passing Details
2024-09-13 16:01:50 +08:00
hang 7d39bf43fe 缓存bug
continuous-integration/drone/push Build is passing Details
2024-09-13 15:10:11 +08:00
hang 8b8b52e0cc 修改配置
continuous-integration/drone/push Build is passing Details
2024-09-13 14:45:26 +08:00
hang 0cdc489278 修改配置文件
continuous-integration/drone/push Build is passing Details
2024-09-13 14:38:32 +08:00
hang d4cef1148b 修改oss 各个环境配置
continuous-integration/drone/push Build is passing Details
2024-09-13 11:47:05 +08:00
hang 40d4806f22 修改配置文件
continuous-integration/drone/push Build is passing Details
2024-09-13 11:08:46 +08:00
hang 48427f2740 修改临时凭证
continuous-integration/drone/push Build is passing Details
2024-09-13 10:44:34 +08:00
hang a3296a1ab9 清理oss 数据
continuous-integration/drone/push Build is passing Details
2024-09-13 10:06:36 +08:00
hang 7404fabcda 修改列表排序
continuous-integration/drone/push Build is passing Details
2024-09-13 09:40:24 +08:00
hang 29842f484b 修改影像上传
continuous-integration/drone/push Build is passing Details
2024-09-13 09:28:37 +08:00
hang daac69c0d1 修改组间一致性分析
continuous-integration/drone/push Build is passing Details
2024-09-13 09:16:30 +08:00
hang 603f6e095c 修改测试迁移
continuous-integration/drone/push Build is passing Details
2024-09-12 23:51:51 +08:00
he c9b1e5f92a 修改
continuous-integration/drone/push Build is passing Details
2024-09-12 17:31:33 +08:00
he 6fd9bd94df Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-12 17:07:48 +08:00
he fd6673c339 修改 2024-09-12 17:07:47 +08:00
hang 6fe4aa60d4 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-12 16:09:39 +08:00
hang df1665307a 修改上传逻辑 2024-09-12 16:09:37 +08:00
he 1ccb31fcf2 修改
continuous-integration/drone/push Build is passing Details
2024-09-12 16:04:24 +08:00
he 55f98d735e 修改
continuous-integration/drone/push Build is passing Details
2024-09-12 15:38:49 +08:00
he 4642e4e00e 修改
continuous-integration/drone/push Build is passing Details
2024-09-12 15:31:51 +08:00
he c6d74309f4 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-12 15:27:06 +08:00
he 2abada285b 签名时间 2024-09-12 15:27:05 +08:00
hang d600862fb0 修改上传监控
continuous-integration/drone/push Build is passing Details
2024-09-12 14:00:50 +08:00
hang 4048be622f 修复映射bug
continuous-integration/drone/push Build is passing Details
2024-09-12 11:12:06 +08:00
hang eec0156fe7 参数名错误
continuous-integration/drone/push Build is passing Details
2024-09-12 10:22:43 +08:00
hang 85d1930730 修改导航属性bug
continuous-integration/drone/push Build is passing Details
2024-09-12 10:13:39 +08:00
hang 7420fdeda5 返回用户类型枚举
continuous-integration/drone/push Build is passing Details
2024-09-12 09:40:51 +08:00
he 4e2eb7b0a0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-12 09:32:13 +08:00
he 68e87a6c0e 修改 2024-09-12 09:32:12 +08:00
hang 19f9af8af8 返回IP
continuous-integration/drone/push Build is running Details
2024-09-12 09:31:18 +08:00
he 34faaaf231 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-12 09:20:05 +08:00
he 136a9e54ca 修改 2024-09-12 09:20:04 +08:00
hang 5b63e58c1d 修改导入表格bug
continuous-integration/drone/push Build is passing Details
2024-09-12 09:08:05 +08:00
hang 70c381831d 测试迁移移除外键
continuous-integration/drone/push Build is passing Details
2024-09-11 23:53:58 +08:00
hang 2bf562d027 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-11 17:39:40 +08:00
hang c7e3403cae 修改dicom 上传为0 提示 2024-09-11 17:39:39 +08:00
he 2f41c21f75 修改
continuous-integration/drone/push Build is passing Details
2024-09-11 16:53:10 +08:00
he 1688392216 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-11 16:37:31 +08:00
he 6a1a56f0bc 序号修改 2024-09-11 16:37:30 +08:00
hang 0f495a4568 下载提交事务
continuous-integration/drone/push Build is passing Details
2024-09-11 16:21:36 +08:00
hang 81abcf39fc 修改查询条件
continuous-integration/drone/push Build is passing Details
2024-09-11 16:11:45 +08:00
hang 247b11cec4 修改影像监控查询条件
continuous-integration/drone/push Build is passing Details
2024-09-11 15:46:48 +08:00
hang 21ded0d466 优化导航属性
continuous-integration/drone/push Build is passing Details
2024-09-11 15:40:22 +08:00
hang 36c354c8f0 增加下载监控接口
continuous-integration/drone/push Build is passing Details
2024-09-11 14:41:04 +08:00
hang cb6f93ec0a 删除qc 废弃的字段
continuous-integration/drone/push Build is passing Details
2024-09-11 09:57:39 +08:00
hang da8812868c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-11 09:22:33 +08:00
hang 14ec78a2fd 删除历史sql 2024-09-11 09:22:32 +08:00
he eccb5dc562 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-11 09:08:08 +08:00
he c11ff02a82 受试者随机阅片问题修改 2024-09-11 09:08:06 +08:00
hang b9b095a19c 一致性分析任务,下载列表优化
continuous-integration/drone/push Build is passing Details
2024-09-11 08:58:52 +08:00
hang 8678c3602f 优化导航属性
continuous-integration/drone/push Build is passing Details
2024-09-10 23:59:18 +08:00
hang 510a35e2b4 移动自身一对多关系到同一个文件,方便理解
continuous-integration/drone/push Build is passing Details
2024-09-10 23:38:39 +08:00
hang 5e1ec1ffb2 维护导航属性,重命名字段
continuous-integration/drone/push Build is passing Details
2024-09-10 23:30:51 +08:00
hang 3f38cf25c5 发布复位
continuous-integration/drone/push Build is passing Details
2024-09-10 21:08:40 +08:00
hang b32225b8bb 修改阅片器bug
continuous-integration/drone/push Build is passing Details
2024-09-10 21:05:59 +08:00
hang ecbc27fbb8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-10 20:28:52 +08:00
hang d3f13e844d 修改备注 2024-09-10 20:28:51 +08:00
hang 405454f71f 修改一致性分析 下载影像bug
continuous-integration/drone/push Build is passing Details
2024-09-10 18:46:00 +08:00
hang f7dd5117a0 修改医学审核bug
continuous-integration/drone/push Build is passing Details
2024-09-10 18:08:23 +08:00
hang 60330fbd93 修改反馈bug
continuous-integration/drone/push Build is failing Details
2024-09-10 17:54:20 +08:00
hang 6b7542b11f 修改阅片页面非dicom 检查看后处理
continuous-integration/drone/push Build is passing Details
2024-09-10 17:44:36 +08:00
hang e012384dfa 修改参数名
continuous-integration/drone/push Build is passing Details
2024-09-10 17:27:25 +08:00
hang 2aa63a6132 修改影像后处理nonedicom 切换问题
continuous-integration/drone/push Build is passing Details
2024-09-10 17:11:43 +08:00
hang e12935d9aa Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-10 16:58:42 +08:00
hang 21cb074469 修改迁移配置 2024-09-10 16:58:41 +08:00
he 204cb19d96 修改
continuous-integration/drone/push Build is passing Details
2024-09-10 16:16:03 +08:00
he 238fde7d01 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-10 15:25:29 +08:00
he b59b46f938 还是过滤zip 2024-09-10 15:25:28 +08:00
hang 0fbfe6c0e1 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-10 15:13:02 +08:00
hang 31e2aa24b8 修改uat配置 2024-09-10 15:13:00 +08:00
he 5b52a3e67f 修改
continuous-integration/drone/push Build is running Details
2024-09-10 15:12:08 +08:00
he bb5844a8e8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-10 15:05:17 +08:00
he bc5956ed66 修改 2024-09-10 15:05:17 +08:00
hang 624d89563c 影像筛选过滤
continuous-integration/drone/push Build is passing Details
2024-09-10 14:40:48 +08:00
hang f6bcff7e13 后处理非dicom检查bug
continuous-integration/drone/push Build is passing Details
2024-09-10 14:25:25 +08:00
hang 36acbc1df8 修改参数名错误
continuous-integration/drone/push Build is passing Details
2024-09-10 13:50:35 +08:00
hang ca9ce6e4c5 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-10 13:29:42 +08:00
hang 08edc735e9 修改后处理上传验证 2024-09-10 13:29:37 +08:00
he 5b420a453b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-10 10:16:26 +08:00
he 6a6411dfb8 修改 2024-09-10 10:16:25 +08:00
hang 360bcd6bfe 字典测试生成枚举
continuous-integration/drone/push Build is passing Details
2024-09-09 18:05:59 +08:00
hang 16107dc8a9 受试者随机,重阅后,不重新编号
continuous-integration/drone/push Build is passing Details
2024-09-09 17:35:08 +08:00
hang 578281b707 修改上传缓存验证
continuous-integration/drone/push Build is passing Details
2024-09-09 17:28:21 +08:00
hang 3730d955dd 修改缓存key
continuous-integration/drone/push Build is passing Details
2024-09-09 17:06:37 +08:00
hang 3dbf329a31 修改下载过滤
continuous-integration/drone/push Build is passing Details
2024-09-09 16:36:29 +08:00
hang afa2b50951 修改筛选bug
continuous-integration/drone/push Build is passing Details
2024-09-09 15:55:08 +08:00
hang b219e4a055 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-09 15:21:09 +08:00
hang 6e38f3f3df 修改影像筛选 2024-09-09 15:21:07 +08:00
he 34370a36af Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-09 15:09:43 +08:00
he 1dfb27f08e 标准的默认值修改 2024-09-09 15:09:43 +08:00
hang 3bf616667e 修改备注
continuous-integration/drone/push Build is running Details
2024-09-09 15:08:27 +08:00
hang 15a3fd17df Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-09 14:58:55 +08:00
hang 092a9c2dc6 后端上传也用临时token 2024-09-09 14:58:54 +08:00
he 6e1bf8265f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-09 14:48:14 +08:00
he d4389e5c35 修改 2024-09-09 14:48:13 +08:00
hang d30b1853de TrialReadingCriterionName 映射修改
continuous-integration/drone/push Build is passing Details
2024-09-09 13:36:09 +08:00
hang 532d7d155b Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-09-09 13:34:23 +08:00
hang 9cff6b9c87 返回标准名字 2024-09-09 13:34:21 +08:00
he e5f8b3dc71 修改
continuous-integration/drone/push Build is passing Details
2024-09-09 13:20:14 +08:00
he 8ac2de3434 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-09 11:48:53 +08:00
he 74501c3584 修改 2024-09-09 11:48:53 +08:00
hang 757ccc3eb6 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-09-09 11:48:16 +08:00
hang 36fb3f2d53 修改下载接口 2024-09-09 11:48:14 +08:00
he 8092b0680b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-09 11:39:01 +08:00
he 42de7737cb 计算修改 2024-09-09 11:39:00 +08:00
hang 273d2a4b88 修改阅片接口默认值
continuous-integration/drone/push Build is passing Details
2024-09-09 10:51:14 +08:00
hang fe4b48f4bc 修改模板名称
continuous-integration/drone/push Build is passing Details
2024-09-09 09:31:03 +08:00
hang 444d3c3a59 删除不必要的提示
continuous-integration/drone/push Build is passing Details
2024-09-09 09:09:23 +08:00
hang c8596c6815 移除旧的模板
continuous-integration/drone/push Build is passing Details
2024-09-09 09:01:27 +08:00
hang e2dd4b2466 自动生成最终版本
continuous-integration/drone/push Build is passing Details
2024-09-09 00:37:20 +08:00
hang 429ca4dd6d 修改临时模板
continuous-integration/drone/push Build is passing Details
2024-09-09 00:07:17 +08:00
hang 55e0624dc6 模板准备完毕,剩下如何适配生成以后自动生成视图模型和service
continuous-integration/drone/push Build is passing Details
2024-09-08 21:42:13 +08:00
hang fff6ef5fe2 优化基础配置和模板
continuous-integration/drone/push Build is passing Details
2024-09-08 21:08:48 +08:00
hang 2127c47d00 T4模板生成的属性 按照顺序排序
continuous-integration/drone/push Build is passing Details
2024-09-08 18:57:36 +08:00
hang 564477b728 修改官方t4模板,适配我们自己的程序
continuous-integration/drone/push Build is passing Details
2024-09-08 17:39:47 +08:00
hang c7e80401e1 删除无用的导航属性
continuous-integration/drone/push Build is passing Details
2024-09-07 14:52:37 +08:00
hang 7fee1abdb5 字符串默认值+数据库统一维护
continuous-integration/drone/push Build is passing Details
2024-09-07 11:29:30 +08:00
hang 243fae4b19 默认值遗漏
continuous-integration/drone/push Build is passing Details
2024-09-07 00:46:08 +08:00
hang 6e2a58c3d7 给字符串增加默认值空
continuous-integration/drone/push Build is passing Details
2024-09-07 00:19:33 +08:00
hang 2d864de128 非dicom 数量问题
continuous-integration/drone/push Build is passing Details
2024-09-06 20:44:35 +08:00
hang bee09217a2 x
continuous-integration/drone/push Build is passing Details
2024-09-06 20:16:35 +08:00
hang bd0e039e7a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 20:05:56 +08:00
hang f1423fba4f 移除废弃的html模板 2024-09-06 20:05:53 +08:00
he c439e1bb42 修改
continuous-integration/drone/push Build is passing Details
2024-09-06 16:31:15 +08:00
he 6a17c2a9a8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 16:14:26 +08:00
he 0b987f937d 修改 2024-09-06 16:14:25 +08:00
hang cd62a8741a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 15:47:13 +08:00
hang 67a8f10b03 裁判任务不展示 上传下载功能 2024-09-06 15:47:13 +08:00
he 27749ec3cd Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 14:58:02 +08:00
he 19220a1cbd 加测量值枚举 2024-09-06 14:58:01 +08:00
hang f4df76cccd Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 14:13:04 +08:00
hang 6c443ca089 重置为复杂密码 2024-09-06 14:13:03 +08:00
he 68be1d8583 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 13:51:48 +08:00
he a965cf429f 修改 2024-09-06 13:51:48 +08:00
hang c1c5add001 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 13:23:46 +08:00
hang a8049f2a60 dicom 影像后处理预览接口 2024-09-06 13:23:45 +08:00
he 9d01b557ce Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 13:05:03 +08:00
he 89b3bc94a2 修改 2024-09-06 13:05:03 +08:00
hang 7a7fde5fc0 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 11:41:51 +08:00
hang 632712cfee 非dicom 任务后上传 2024-09-06 11:41:50 +08:00
he 98be30449f 修改
continuous-integration/drone/push Build is running Details
2024-09-06 11:41:27 +08:00
he a7db67adb6 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 11:31:22 +08:00
he c6fdae8879 计算修改 2024-09-06 11:31:21 +08:00
hang f925f8969a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 10:29:40 +08:00
hang f1601e7017 增加验证接口 2024-09-06 10:29:37 +08:00
he caf5946b9e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-06 09:22:08 +08:00
he 7dce99e045 关联任务修改 2024-09-06 09:22:06 +08:00
hang 0e59617691 整理模板
continuous-integration/drone/push Build is passing Details
2024-09-05 23:35:57 +08:00
hang f0f688a1a3 除了数据库实体模型,其余模板准备ok
continuous-integration/drone/push Build is passing Details
2024-09-05 23:26:23 +08:00
hang 753941204f 增加视图模板
continuous-integration/drone/push Build is passing Details
2024-09-05 18:05:26 +08:00
hang 6fd239cf70 访视bug
continuous-integration/drone/push Build is passing Details
2024-09-05 16:57:53 +08:00
hang a8f6594142 修改美国正式配置文件
continuous-integration/drone/push Build is passing Details
2024-09-05 15:51:30 +08:00
hang 0d5d5105ce Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-05 15:31:19 +08:00
hang c078d496be ir 上传后处理检查预览数据接口 2024-09-05 15:31:18 +08:00
he bceffcad6a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-05 14:34:14 +08:00
he ccbf1f0544 计算修改 2024-09-05 14:34:13 +08:00
hang e5a8a06bbb Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-09-05 14:32:34 +08:00
hang af1d85e65c 修改登录mfa nonedicom 、dbcontext 2024-09-05 14:32:33 +08:00
he 7ace6c3593 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-05 14:28:25 +08:00
he b3e0cf8ec1 修改 2024-09-05 14:28:21 +08:00
hang 4f77d1bfb3 MFA 第二种情况
continuous-integration/drone/push Build is passing Details
2024-09-05 13:26:10 +08:00
hang 72e54fe0d9 非dicom 检查列表返回任务Id
continuous-integration/drone/push Build is passing Details
2024-09-05 11:27:29 +08:00
hang 735083999e 非dicom 检查列表返回文件信息,同时增加IR 上传文件绑定
continuous-integration/drone/push Build is passing Details
2024-09-05 11:05:49 +08:00
hang 006a5729d6 发布美国环境修改配置文件
continuous-integration/drone/push Build is passing Details
2024-09-05 09:58:25 +08:00
hang e4c3521b04 mfa 登录逻辑遗漏
continuous-integration/drone/push Build is passing Details
2024-09-05 09:27:04 +08:00
hang dd13eddfe3 测试数据库上下文
continuous-integration/drone/push Build is passing Details
2024-09-05 00:04:41 +08:00
hang 706cb888c8 模板增加放入的目录
continuous-integration/drone/push Build is passing Details
2024-09-04 23:36:19 +08:00
hang bfe5379206 新的生成模板引擎引入
continuous-integration/drone/push Build is passing Details
2024-09-04 23:21:22 +08:00
hang 2ffd1a2520 修改序列化报错
continuous-integration/drone/push Build is passing Details
2024-09-04 16:05:13 +08:00
hang 784e453eaa Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 15:58:29 +08:00
hang 084b3d8822 修改模板 2024-09-04 15:58:28 +08:00
he c03fd57c25 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 15:35:08 +08:00
he 34d5f809ee 修改 2024-09-04 15:35:07 +08:00
hang fd0d91faa4 修改模板
continuous-integration/drone/push Build is passing Details
2024-09-04 14:53:18 +08:00
hang 2450602227 删除T4模板废弃的
continuous-integration/drone/push Build is passing Details
2024-09-04 14:44:47 +08:00
hang 48ea90ce97 修改统计过滤
continuous-integration/drone/push Build is passing Details
2024-09-04 14:13:29 +08:00
hang 640ebdb835 修改统计
continuous-integration/drone/push Build is passing Details
2024-09-04 14:06:31 +08:00
hang 5d59d729d7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 13:47:38 +08:00
hang afadc5e2be oss 过期时间转为服务器时间,服务器统一转为客户端时区 2024-09-04 13:47:35 +08:00
he dc3c3f7557 修改
continuous-integration/drone/push Build is passing Details
2024-09-04 13:43:16 +08:00
he 61cbfe231d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 11:45:15 +08:00
he 9ee2dd477e 修改 2024-09-04 11:45:15 +08:00
hang 7a0e1eda0c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 11:41:10 +08:00
hang a14472358b 通用包升级 2024-09-04 11:41:08 +08:00
he 51f02e79c1 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 11:24:48 +08:00
he 0202a61b07 修改 2024-09-04 11:24:47 +08:00
hang 6cc4c32625 修改s3 minio 删除方法
continuous-integration/drone/push Build is passing Details
2024-09-04 11:14:52 +08:00
hang 3d304961d3 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 11:04:40 +08:00
hang f4426dd280 s3 增加region 2024-09-04 11:04:39 +08:00
he 457544adc3 修改
continuous-integration/drone/push Build is passing Details
2024-09-04 10:44:58 +08:00
he f426df9d7f 修改
continuous-integration/drone/push Build is passing Details
2024-09-04 10:36:24 +08:00
he 61780a3fe8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 09:50:54 +08:00
he 35d7202fc3 代码修改 2024-09-04 09:50:51 +08:00
hang cec6174bb6 方便前端对接返回token
continuous-integration/drone/push Build is passing Details
2024-09-04 09:41:12 +08:00
hang 52ba183846 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-04 09:33:36 +08:00
hang b08a0aa4f1 aws 临时凭证授权增加 2024-09-04 09:33:32 +08:00
he 327874d396 修改
continuous-integration/drone/push Build is passing Details
2024-09-03 17:58:21 +08:00
he eae6be5fb4 修改
continuous-integration/drone/push Build is passing Details
2024-09-03 17:52:48 +08:00
he d49350a8cd Reapply "修改"
continuous-integration/drone/push Build is passing Details
This reverts commit 72f0fd3193.
2024-09-03 17:24:17 +08:00
he 72f0fd3193 Revert "修改"
continuous-integration/drone/push Build is passing Details
This reverts commit 0a581db6d1.
2024-09-03 17:18:41 +08:00
he 0a581db6d1 修改
continuous-integration/drone/push Build is passing Details
2024-09-03 17:07:31 +08:00
he a2dd550a72 添加配置
continuous-integration/drone/push Build is passing Details
2024-09-03 16:17:13 +08:00
he 1e91c08ae3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-03 15:52:01 +08:00
he 96462aa4ba 提示语国际化修改 2024-09-03 15:51:59 +08:00
hang dfba116268 修改驼峰自定义
continuous-integration/drone/push Build is running Details
2024-09-03 15:51:51 +08:00
hang 1072049741 修改bug
continuous-integration/drone/push Build is passing Details
2024-09-03 14:20:54 +08:00
hang 16bf3e9cd8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-03 14:14:18 +08:00
hang 1861374c31 上传下载修改 2024-09-03 14:14:17 +08:00
he 320ede4d7b 清空国际化json
continuous-integration/drone/push Build is passing Details
2024-09-03 13:39:08 +08:00
he 15414365ec 修改
continuous-integration/drone/push Build is passing Details
2024-09-03 13:29:47 +08:00
hang a5ef0fc902 修改oss 配置
continuous-integration/drone/push Build is passing Details
2024-09-03 13:02:40 +08:00
hang 01ee530e38 npgsql 适配临时提交
continuous-integration/drone/push Build is passing Details
2024-09-02 23:35:42 +08:00
hang e8db8a892c 清理包,移动扩展方法
continuous-integration/drone/push Build is passing Details
2024-09-02 18:00:34 +08:00
hang 1e0af11110 清理缓存
continuous-integration/drone/push Build is passing Details
2024-09-02 17:45:16 +08:00
he 5f6b174dd9 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-02 17:30:57 +08:00
he 4d2589c112 缓存修改 2024-09-02 17:30:56 +08:00
hang 47706913ca Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-02 17:27:04 +08:00
hang 1bbd11bbcd 调休计算 2024-09-02 17:27:03 +08:00
he 5d946d820e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-09-02 17:13:14 +08:00
he 1e67d97169 代码提交 2024-09-02 17:13:13 +08:00
hang 84f4343791 修改影响归档 seqId 自动生成,不是数据库自动生成
continuous-integration/drone/push Build is passing Details
2024-09-02 11:05:33 +08:00
hang bd4e4e0072 阅片期替代
continuous-integration/drone/push Build is passing Details
2024-09-02 10:27:01 +08:00
hang 5afe0be277 增加视图查询
continuous-integration/drone/push Build is passing Details
2024-09-01 23:38:27 +08:00
hang 71fad05411 升级nuget包
continuous-integration/drone/push Build is passing Details
2024-08-30 23:47:58 +08:00
hang 8afd215957 视图调整修复
continuous-integration/drone/push Build is passing Details
2024-08-30 22:40:52 +08:00
hang 42e3b0df45 阅片期视图 改为ef 访视查询ok
continuous-integration/drone/push Build is passing Details
2024-08-30 18:01:51 +08:00
hang facdb3264d 视图替代初步提交
continuous-integration/drone/push Build is passing Details
2024-08-30 17:36:23 +08:00
hang 9732b65017 清理dbcontext 用户注入
continuous-integration/drone/push Build is passing Details
2024-08-30 15:20:59 +08:00
hang 80a60dff38 清理dbcontext 记录稽查代码位置
continuous-integration/drone/push Build is passing Details
2024-08-30 15:16:50 +08:00
hang 6276e0611a 删除、优化之前的表名、表字段名 调用数据库函数代码
continuous-integration/drone/push Build is passing Details
2024-08-30 09:15:26 +08:00
hang 5ccfe70f97 预备优化掉存储过程
continuous-integration/drone/push Build is passing Details
2024-08-29 23:32:21 +08:00
hang 7dc40fbc5c 清理、整理代码
continuous-integration/drone/push Build is passing Details
2024-08-29 22:32:08 +08:00
hang a340167bfb 合并代码
continuous-integration/drone/push Build is passing Details
2024-08-29 22:02:12 +08:00
hang 0b7b96dff1 pgsql 测试 2024-08-29 22:01:28 +08:00
he 7b7286c2b3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-29 11:01:11 +08:00
he 5598385a5c 修改 2024-08-29 11:01:10 +08:00
hang d5023c412f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-08-29 10:59:21 +08:00
hang b1d6d20800 增加影像检查下载 2024-08-29 10:59:18 +08:00
he 4f5006560e 修改
continuous-integration/drone/push Build is passing Details
2024-08-28 15:25:05 +08:00
he 43b302b727 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-28 14:53:33 +08:00
he d3611ef310 修改 2024-08-28 14:53:32 +08:00
hang 0e0cf881be Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-28 14:40:26 +08:00
hang a6ccd959fc 增加oss 删除方法 2024-08-28 14:40:25 +08:00
he 4fb7f6818d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-28 13:33:56 +08:00
he f902e44303 修改 2024-08-28 13:33:55 +08:00
hang 2939290915 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-28 13:22:15 +08:00
hang a55ba549eb oss增加endpoint 2024-08-28 13:22:14 +08:00
he cdd8250a0c 修改
continuous-integration/drone/push Build is passing Details
2024-08-28 11:22:51 +08:00
he d56d1142cd Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-28 10:54:07 +08:00
he e4b0210981 代码修改 2024-08-28 10:54:06 +08:00
hang 4026a34fcf 修改oss 返回小写 +增加pgsql 测试文件
continuous-integration/drone/push Build is passing Details
2024-08-28 10:29:59 +08:00
hang 7001639125 参数增加提醒前端不要漏传
continuous-integration/drone/push Build is passing Details
2024-08-28 10:16:34 +08:00
hang 8fae551cc0 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-28 10:05:45 +08:00
hang cd00efe96f 清理阿里云之前代码和包 2024-08-28 10:05:44 +08:00
hang 176f50e836 导表质疑时长 优化
continuous-integration/drone/push Build is passing Details
2024-08-27 17:04:39 +08:00
hang 2cd78ab94e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-27 16:57:57 +08:00
hang 9f4e43e20a 影像下载和上传入口增加 2024-08-27 16:57:56 +08:00
he 2caa7933ee 修改
continuous-integration/drone/push Build is passing Details
2024-08-27 16:45:47 +08:00
he 3b6da279f8 修改
continuous-integration/drone/push Build is passing Details
2024-08-27 16:20:15 +08:00
he e87185a906 修改
continuous-integration/drone/push Build is passing Details
2024-08-27 16:17:11 +08:00
he 7a496e114b 代码修改
continuous-integration/drone/push Build is passing Details
2024-08-27 16:09:55 +08:00
he fa2a0e7482 代码修改
continuous-integration/drone/push Build is passing Details
2024-08-27 15:36:19 +08:00
he 3f88a9df46 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-27 15:18:02 +08:00
he 049b14ae97 代码修改 2024-08-27 15:18:01 +08:00
hang f14d4bf373 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-27 15:05:48 +08:00
hang a9afb684c9 修改对象存储返回临时toekn 2024-08-27 15:05:46 +08:00
he 9c447dbd68 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-27 15:02:04 +08:00
he 0d446e6fcd 代码提交 2024-08-27 15:02:03 +08:00
hang c8f04a878a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-27 14:47:23 +08:00
hang 633abdf0f4 修改时间国际化 2024-08-27 14:47:20 +08:00
he 8bd9f9a772 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-27 09:46:24 +08:00
he 7164a53267 稽查加配置 2024-08-27 09:46:20 +08:00
hang f52b09e5e8 修改排序bug
continuous-integration/drone/push Build is passing Details
2024-08-26 16:24:46 +08:00
hang 0acb7ca987 影像上传增加文件大小
continuous-integration/drone/push Build is passing Details
2024-08-26 15:35:02 +08:00
hang 1778d45481 修改对话里面时间时区问题
continuous-integration/drone/push Build is passing Details
2024-08-26 14:05:16 +08:00
hang 952655bf84 修改数据库配置
continuous-integration/drone/push Build is passing Details
2024-08-26 12:48:03 +08:00
hang c0921942ec Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-26 12:43:56 +08:00
hang 7e67f4c7cf 修改生产ae 配置 2024-08-26 12:39:41 +08:00
hang 4d14b31fb5 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-26 12:33:42 +08:00
hang 003064429d 统一记录日志增加判断 2024-08-26 12:33:41 +08:00
hang 34934762f0 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-26 12:26:22 +08:00
hang d1f542f03d 修改正式环境配置文件 2024-08-26 12:26:21 +08:00
hang fbc7513f19 解决中英文环境时间格式化问题
continuous-integration/drone/push Build is passing Details
2024-08-26 12:28:09 +09:00
hang e42c7407e3 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-23 17:34:15 +08:00
hang cbfae4126c 修改缓存判断逻辑 2024-08-23 17:34:15 +08:00
hang c712bee677 修改导表提示
continuous-integration/drone/push Build is passing Details
2024-08-23 17:22:06 +08:00
hang f732edfc6f 修改上传缓存判断
continuous-integration/drone/push Build is passing Details
2024-08-23 15:54:53 +08:00
hang 2898c0380f 清理仓储完成3
continuous-integration/drone/push Build is passing Details
2024-08-23 15:10:28 +08:00
hang a43ef376c4 整理仓储2
continuous-integration/drone/push Build is passing Details
2024-08-23 14:54:01 +08:00
hang 7867a82e6e 整理仓储
continuous-integration/drone/push Build is passing Details
2024-08-23 13:51:58 +08:00
hang e81e270d69 修改仓储
continuous-integration/drone/push Build is passing Details
2024-08-23 11:19:24 +08:00
hang 45b14abe63 修改注入bug
continuous-integration/drone/push Build is passing Details
2024-08-23 09:27:36 +08:00
hang 22b1a839ba 构造函数优化
continuous-integration/drone/push Build is passing Details
2024-08-22 21:37:56 +08:00
hang 47ec4a5e7e 导航属性优化整理
continuous-integration/drone/push Build is passing Details
2024-08-22 20:10:59 +08:00
hang 4319982be9 精简实体修改
continuous-integration/drone/push Build is passing Details
2024-08-22 18:10:29 +08:00
hang f0943ca9a4 整理实体
continuous-integration/drone/push Build is passing Details
2024-08-22 17:05:02 +08:00
hang 8a42ed74bc 修改排序
continuous-integration/drone/push Build is passing Details
2024-08-22 16:39:07 +08:00
hang d9f60ded4a 增加排序方法说明
continuous-integration/drone/push Build is passing Details
2024-08-22 16:01:43 +08:00
hang 15fe8db248 维护历史分页列表传递参数
continuous-integration/drone/push Build is passing Details
2024-08-22 15:57:02 +08:00
hang 7db339d876 增加邮件模板验证
continuous-integration/drone/push Build is passing Details
2024-08-22 11:40:21 +08:00
hang dd07057ca5 字典和邮件添加增加验证
continuous-integration/drone/push Build is passing Details
2024-08-22 11:00:43 +08:00
hang a43abebc6e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-22 10:23:00 +08:00
hang 6a535e72d4 构造函数优化 2024-08-22 10:23:00 +08:00
hang 1535f1096f 编译错误
continuous-integration/drone/push Build is passing Details
2024-08-22 10:03:34 +08:00
hang 88fcddfd8b 发送邮件+pacs接口
continuous-integration/drone/push Build is running Details
2024-08-22 10:02:46 +08:00
hang d58cd79d28 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-22 09:30:58 +08:00
hang e5c35f7fab 既往缓存代码修改,缓存key 整理 2024-08-22 09:30:57 +08:00
he 0f45729c94 修改
continuous-integration/drone/push Build is passing Details
2024-08-21 17:48:22 +08:00
he a78c4de654 修改
continuous-integration/drone/push Build is passing Details
2024-08-21 17:39:19 +08:00
he 4dfe5a1dce 参数调整
continuous-integration/drone/push Build is passing Details
2024-08-21 17:35:32 +08:00
he ecaa72c12b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-21 17:30:41 +08:00
he 95728c668c 修改字段 2024-08-21 17:30:41 +08:00
hang 9356e6ed7e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is failing Details
2024-08-21 17:26:18 +08:00
hang 7a6cfc8978 影像预览调用接口错误,增加接口 2024-08-21 17:26:15 +08:00
he f744124f17 添加字段
continuous-integration/drone/push Build is passing Details
2024-08-21 17:23:31 +08:00
he 30e71b11e8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is failing Details
2024-08-21 17:15:01 +08:00
he 2de504005e 一致性分析完全随机自动生效 2024-08-21 17:15:01 +08:00
hang 6a41c33d34 pacs 验证写反了
continuous-integration/drone/push Build is passing Details
2024-08-21 14:51:57 +08:00
hang 3b48dfae31 项目缓存状态逻辑,全局修改
continuous-integration/drone/push Build is passing Details
2024-08-21 14:37:33 +08:00
hang c7fd9a6bcb Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-21 13:38:21 +08:00
hang 169ef180ff 修改pacs 反馈提示+中心调研bug 2024-08-21 13:38:20 +08:00
he f33d3d474b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-21 13:26:46 +08:00
he 63e1331bd1 验证签名信息 2024-08-21 13:26:43 +08:00
hang 418cc9b4b9 修改pacs 验证
continuous-integration/drone/push Build is passing Details
2024-08-21 12:24:30 +08:00
hang 71fb1eac6b Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-21 12:18:36 +08:00
hang 0804a05925 准备新缓存临时工作 2024-08-21 12:18:36 +08:00
hang de6098013d 导表签名bug
continuous-integration/drone/push Build is passing Details
2024-08-21 10:46:33 +08:00
hang f8cd361415 添加FusionCache
continuous-integration/drone/push Build is passing Details
2024-08-21 00:06:36 +08:00
hang 0b1a640c3e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-20 17:58:24 +08:00
hang aa9df5838c 修改添加pacs 影像 2024-08-20 17:58:24 +08:00
he 2edacc9ff5 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-20 16:03:18 +08:00
he a9a0a9d307 修改 2024-08-20 16:03:17 +08:00
hang 1937804e47 修改scp bug
continuous-integration/drone/push Build is passing Details
2024-08-20 15:08:03 +08:00
hang 8e8b55fa46 修改分页列表bug
continuous-integration/drone/push Build is passing Details
2024-08-20 14:58:35 +08:00
hang 3096671595 数组给默认参数
continuous-integration/drone/push Build is passing Details
2024-08-20 14:09:01 +08:00
hang a6102490c8 修改项目导表-指定项目导出
continuous-integration/drone/push Build is passing Details
2024-08-20 14:03:42 +08:00
hang 9e1cc1521f 修改分页参数
continuous-integration/drone/push Build is passing Details
2024-08-20 13:59:52 +08:00
he a579c26ada Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-20 13:50:04 +08:00
he 754da2c7fc 代码修改 2024-08-20 13:50:03 +08:00
hang 995bdee1f6 领域事件添加到测试环境-测试
continuous-integration/drone/push Build is passing Details
2024-08-20 13:14:06 +08:00
hang a70f661e86 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-20 11:17:50 +08:00
hang 8312bfb78b 修改scp 配置文件 2024-08-20 11:17:50 +08:00
he 7194796841 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-20 10:56:00 +08:00
he c6918cca46 代码修改 2024-08-20 10:56:00 +08:00
hang be7b38c6ce Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-20 10:42:16 +08:00
hang a7ebd50536 修改引用包 2024-08-20 10:42:16 +08:00
he 05f9b81e04 测试发布
continuous-integration/drone/push Build is failing Details
2024-08-20 10:37:58 +08:00
he 1f9eb9e36b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is failing Details
2024-08-20 10:35:39 +08:00
he af46eb2d65 修改 2024-08-20 10:35:37 +08:00
hang d1e54629e7 x
continuous-integration/drone/push Build is failing Details
2024-08-20 10:25:45 +08:00
hang 78dbe23d0e 修改实体
continuous-integration/drone/push Build is running Details
2024-08-20 10:25:06 +08:00
hang 4bf93d10b0 暂时屏蔽事件分发
continuous-integration/drone/push Build is failing Details
2024-08-20 09:39:44 +08:00
hang 00827e9975 增加领域事件定义,增加MassTransit 发布事件
continuous-integration/drone/push Build is failing Details
2024-08-19 23:32:53 +08:00
hang 021b32587a 修改模板
continuous-integration/drone/push Build is passing Details
2024-08-19 21:18:28 +08:00
hang 5ffe1675db Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-19 17:49:11 +08:00
hang d34eca2cb8 增加 MassTransit 移除 MediatR 2024-08-19 17:49:08 +08:00
hang 12ac7af11e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-19 17:36:45 +08:00
hang a19eb2abca 修改uat scp 数据库配置 2024-08-19 17:36:33 +08:00
hang 4c9a8aadab Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-19 16:00:10 +08:00
hang 034058999d 清理后端医生下载接口 2024-08-19 16:00:08 +08:00
he 34ea39e764 修改
continuous-integration/drone/push Build is passing Details
2024-08-19 15:33:52 +08:00
he 7caf00bd75 修改
continuous-integration/drone/push Build is passing Details
2024-08-19 15:27:51 +08:00
he aabe604e18 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-19 15:22:20 +08:00
he f2bc281e2b 修改 2024-08-19 15:22:19 +08:00
hang 4187a568f8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-19 15:14:38 +08:00
hang 1611554c00 生成全局任务,没有设置VisitTaskNum 2024-08-19 15:14:36 +08:00
he 60fc8f9bce 修改
continuous-integration/drone/push Build is running Details
2024-08-19 15:14:23 +08:00
he 48eb20fa66 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-19 14:22:19 +08:00
he 9e7bc09f84 修改 2024-08-19 14:22:18 +08:00
hang ec9e35180b crc 上传控制pacs
continuous-integration/drone/push Build is passing Details
2024-08-19 14:03:16 +08:00
hang c757212c07 修改上传配置文件 2024-08-19 14:03:11 +08:00
hang 8415dd2be1 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-08-19 13:56:02 +08:00
he 17d734ba11 修改
continuous-integration/drone/push Build is passing Details
2024-08-19 13:24:41 +08:00
he 476387b468 修改
continuous-integration/drone/push Build is passing Details
2024-08-19 13:19:54 +08:00
he 3a2cb138ab 修改
continuous-integration/drone/push Build is passing Details
2024-08-19 13:12:04 +08:00
he fa763e6341 修改
continuous-integration/drone/push Build is passing Details
2024-08-19 11:32:41 +08:00
he c988ca0bca Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-19 11:28:05 +08:00
he c257dd4171 字典修改 2024-08-19 11:28:02 +08:00
hang ff026f45fc 优化分页排序和生成模板
continuous-integration/drone/push Build is passing Details
2024-08-17 20:33:21 +08:00
hang cd2166f11b 数据记录审计方法调整
continuous-integration/drone/push Build is passing Details
2024-08-17 16:06:35 +08:00
hang 33cfacec84 发布文件 2024-08-16 16:19:58 +08:00
hang 5c2bebf96c 修改验证scp 配置文件
continuous-integration/drone/push Build is passing Details
2024-08-16 15:56:12 +08:00
hang ef5ae76907 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-16 15:42:13 +08:00
hang 7546ba412c dicom ae 提示修改 2024-08-16 15:42:12 +08:00
he 6b536f4a4f 修改IP
continuous-integration/drone/push Build is passing Details
2024-08-16 15:38:15 +08:00
he a540326031 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-16 11:27:52 +08:00
he 45dd2e90c5 修改ip不一样提醒 2024-08-16 11:27:52 +08:00
hang e3188c0419 清理没用的存储代码
continuous-integration/drone/push Build is passing Details
2024-08-16 10:15:50 +08:00
hang 423fa4001b 修改T4模板
continuous-integration/drone/push Build is passing Details
2024-08-16 09:54:06 +08:00
hang 3701d8bcd9 精简实体准备
continuous-integration/drone/push Build is passing Details
2024-08-15 23:53:25 +08:00
hang 0689f731b7 测试修改配置文件拷贝是否生效
continuous-integration/drone/push Build is passing Details
2024-08-15 17:41:38 +08:00
hang d97025aeca 项目AE修改
continuous-integration/drone/push Build is passing Details
2024-08-15 17:08:03 +08:00
hang fa929ebde4 邮件配置5s超时
continuous-integration/drone/push Build is passing Details
2024-08-15 15:29:25 +08:00
hang 32c4d634ed 内部人员 直接pm 可以加pm
continuous-integration/drone/push Build is passing Details
2024-08-15 14:37:04 +08:00
hang 8d4a791a1c 修改一致性分析增加首次截止全局访视名字
continuous-integration/drone/push Build is passing Details
2024-08-15 14:02:09 +08:00
hang 59f376e720 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-15 11:36:21 +08:00
hang a5017c1571 修改导表文件名处理 2024-08-15 11:36:20 +08:00
he 8767911a16 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-15 09:39:27 +08:00
he f1170244da 修改 2024-08-15 09:39:25 +08:00
hang 921c66140f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-15 09:26:49 +08:00
hang 0f2a73cb3c 修改临床数据签名bug 2024-08-15 09:26:46 +08:00
he a16f567ade 修改
continuous-integration/drone/push Build is passing Details
2024-08-14 17:38:44 +08:00
hang 5e8b5eed9f 取字典的值的时候进行判断
continuous-integration/drone/push Build is passing Details
2024-08-14 16:52:03 +08:00
hang 682e40febd Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-14 16:36:29 +08:00
hang 568ef07438 修改提示错误 2024-08-14 16:36:29 +08:00
he cafdbaac57 修改
continuous-integration/drone/push Build is passing Details
2024-08-14 16:06:00 +08:00
he 505184b200 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-14 15:12:21 +08:00
he 1d7e1be641 修改 2024-08-14 15:12:20 +08:00
hang 8ba22a343a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-14 14:43:51 +08:00
hang ab34c947ca 后端国际化支持,日志记录的信息和返回前端的国际化不一致 2024-08-14 14:43:48 +08:00
he 062387e6a8 修改
continuous-integration/drone/push Build is running Details
2024-08-14 14:43:25 +08:00
he 161213f2af 修改
continuous-integration/drone/push Build is passing Details
2024-08-14 13:58:50 +08:00
he c1fcb4f6e3 修改
continuous-integration/drone/push Build is passing Details
2024-08-14 13:37:22 +08:00
he a9d81f5af5 修改
continuous-integration/drone/push Build is passing Details
2024-08-14 13:05:35 +08:00
he 2900f2fa7f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-14 11:21:35 +08:00
he 4e44d163f3 修改 2024-08-14 11:21:33 +08:00
hang ffa6d62d3d Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-13 17:44:29 +08:00
hang d9ba6a7a89 一致性分析原阅片人修改 2024-08-13 17:44:27 +08:00
he 8e0105b71f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-13 15:26:23 +08:00
he c45461937d 修改 2024-08-13 15:26:23 +08:00
hang b9c9088de2 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-13 15:24:18 +08:00
hang a6cfe19139 修改用户类型过滤 2024-08-13 15:24:17 +08:00
he 1f11de4a20 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-13 14:53:11 +08:00
he 871333b9e9 修改 2024-08-13 14:53:10 +08:00
hang 47d8ec7576 清理一致性分析任务和配置
continuous-integration/drone/push Build is passing Details
2024-08-13 09:08:04 +08:00
hang 46a304b5a6 用户 性别可为空
continuous-integration/drone/push Build is passing Details
2024-08-12 17:42:54 +08:00
hang 098ade3c8a subject 软删除,导致任务列表统计数字问题
continuous-integration/drone/push Build is passing Details
2024-08-12 16:40:20 +08:00
hang 86489b2117 前端国际化状态修改
continuous-integration/drone/push Build is passing Details
2024-08-12 15:40:13 +08:00
hang 64b5206f86 项目邮件列表修改
continuous-integration/drone/push Build is passing Details
2024-08-12 13:35:38 +08:00
hang ea0b7f1eca Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-12 13:21:54 +08:00
hang 7e8dd1c6a7 影像质控备注 2024-08-12 13:21:53 +08:00
he d3b8716a66 代码修改
continuous-integration/drone/push Build is passing Details
2024-08-12 13:01:45 +08:00
hang af77baba60 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-09 17:53:40 +08:00
hang 2f1cfc3e67 修改导出逻辑 2024-08-09 17:53:40 +08:00
he 37d15736e2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-09 17:13:07 +08:00
he 5f8045c611 修改全局阅片 2024-08-09 17:13:06 +08:00
hang d62562149c 修改dicomAE 测试状态
continuous-integration/drone/push Build is passing Details
2024-08-09 15:24:40 +08:00
hang 63e2ca07b5 修改dicomAE 测试
continuous-integration/drone/push Build is passing Details
2024-08-09 15:01:22 +08:00
he ed94423f32 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-09 14:07:57 +08:00
he e705e12656 代码修改 2024-08-09 14:07:56 +08:00
hang 035ce2ae4e 修改邮件
continuous-integration/drone/push Build is pending Details
2024-08-09 14:07:29 +08:00
hang a1778d836b 设置连接超时时间
continuous-integration/drone/push Build is pending Details
2024-08-09 13:46:08 +08:00
hang cebcf908f9 修改裁判标价判定
continuous-integration/drone/push Build is passing Details
2024-08-09 13:12:05 +08:00
hang 202a3c26d1 修改取消分配验证生效的是否开始阅片
continuous-integration/drone/push Build is passing Details
2024-08-08 14:53:29 +08:00
hang fbbda8c0d1 是否可以取消分配bug
continuous-integration/drone/push Build is passing Details
2024-08-08 14:49:06 +08:00
hang 7954bdeca8 脑转移 未分配的退回也失效
continuous-integration/drone/push Build is passing Details
2024-08-08 14:39:53 +08:00
hang d8a0c80ca4 修改模板删除,导表显示名称国际哈
continuous-integration/drone/push Build is passing Details
2024-08-08 13:49:10 +08:00
hang 100faa3b9f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-08 13:24:18 +08:00
hang 7894a4991c 修改全局导表 2024-08-08 13:24:17 +08:00
he 0405ba4b13 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-08 10:31:15 +08:00
he ca6e96929f 修改开始阅片时间 2024-08-08 10:31:14 +08:00
hang b832a66abf Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-08 10:14:36 +08:00
hang 168c7447bb 修改bug 2024-08-08 10:14:36 +08:00
he 891c442da4 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-07 17:26:03 +08:00
he 74098641f6 休息时间改到配置文件 2024-08-07 17:25:58 +08:00
hang eedfa2add8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-07 16:35:53 +08:00
hang 2838f09268 导表修改 2024-08-07 16:35:52 +08:00
hang ab800d09ca Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-07 15:37:52 +08:00
hang 44e4fe3a29 修改中心调研bug 2024-08-07 15:02:20 +08:00
hang d279bad2d0 用户反馈增加查询条件
continuous-integration/drone/push Build is passing Details
2024-08-07 13:23:50 +08:00
hang a5737073c4 邮件反馈类型错误
continuous-integration/drone/push Build is passing Details
2024-08-07 10:41:46 +08:00
hang 4a82812b4e 修改导表
continuous-integration/drone/push Build is passing Details
2024-08-07 10:37:06 +08:00
hang 8ec67d72f1 打开系统反馈
continuous-integration/drone/push Build is passing Details
2024-08-06 18:04:14 +08:00
hang 405db77dea 修改邮件查询
continuous-integration/drone/push Build is passing Details
2024-08-06 17:41:40 +08:00
hang 8b8ed1fee3 系统邮件配置修改
continuous-integration/drone/push Build is passing Details
2024-08-06 16:39:11 +08:00
hang c1e496530d excel 增加英文名字字段
continuous-integration/drone/push Build is passing Details
2024-08-06 16:07:47 +08:00
hang a43ba04bf3 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-06 14:38:31 +08:00
hang 7b78e4b399 20240806 导表修改代码 2024-08-06 14:38:30 +08:00
hang e92ea3ea0c lili 生成任务bug
continuous-integration/drone/push Build is passing Details
2024-08-06 12:24:19 +08:00
hang 2bb4630351 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-05 17:59:27 +08:00
hang ef63c19c93 完成邮件基本逻辑 2024-08-05 17:59:26 +08:00
he cda134e92c 修改
continuous-integration/drone/push Build is passing Details
2024-08-05 17:09:05 +08:00
he 75d162b353 修改
continuous-integration/drone/push Build is running Details
2024-08-05 17:08:39 +08:00
he 9cbfb2c7e4 修改
continuous-integration/drone/push Build is running Details
2024-08-05 17:08:06 +08:00
he a47e20ff74 修改
continuous-integration/drone/push Build is passing Details
2024-08-05 16:54:59 +08:00
he 36a63d7628 修改
continuous-integration/drone/push Build is passing Details
2024-08-05 16:20:30 +08:00
he 2217ae0353 修改
continuous-integration/drone/push Build is passing Details
2024-08-05 15:41:39 +08:00
he 31a444508b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-05 15:35:03 +08:00
he 37c898ea0c 修改 2024-08-05 15:35:02 +08:00
hang 03c2a67fe4 一致性分析任务生成bug
continuous-integration/drone/push Build is passing Details
2024-08-05 14:55:13 +08:00
hang 795caf19e7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-05 14:41:30 +08:00
hang 99ef28be99 加密方法准备测试 2024-08-05 14:41:30 +08:00
he 97a5eda8f8 一致性分析修改
continuous-integration/drone/push Build is passing Details
2024-08-05 13:51:20 +08:00
he 2d8cb0c818 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-05 13:32:17 +08:00
he 2d1325ca52 代码修改 2024-08-05 13:32:13 +08:00
hang 9f5b8e9858 响应压缩修改压缩级别
continuous-integration/drone/push Build is passing Details
2024-08-05 10:41:42 +08:00
hang 4eaf070243 撤回 dbcontext 连接池
continuous-integration/drone/push Build is passing Details
2024-08-02 17:44:45 +08:00
hang c353ae645b dbcontext 上下文池,提高性能测试
continuous-integration/drone/push Build is passing Details
2024-08-02 17:03:23 +08:00
hang e1038c27f6 修改审核时间修改 2024-08-02 15:41:58 +08:00
hang 994a770fef 用户反馈增加项目过滤
continuous-integration/drone/push Build is passing Details
2024-08-02 13:58:54 +08:00
hang 1875b56b37 修改用户反馈
continuous-integration/drone/push Build is passing Details
2024-08-02 13:50:16 +08:00
hang 99eef31202 用户反馈增加数字
continuous-integration/drone/push Build is passing Details
2024-08-02 13:31:57 +08:00
hang 826f8a670d 邮件模板修改调整
continuous-integration/drone/push Build is passing Details
2024-08-02 13:25:44 +08:00
hang cb53dbefcf CRC 上传导表
continuous-integration/drone/push Build is passing Details
2024-08-02 11:48:34 +08:00
hang 9b4e29a812 x
continuous-integration/drone/push Build is passing Details
2024-08-02 11:28:58 +08:00
hang fa9c9de12c 质控增加字段
continuous-integration/drone/push Build is running Details
2024-08-02 11:27:51 +08:00
hang c98db93ecb 一致性分析 全局任务 SouceReadModuleId 处理
continuous-integration/drone/push Build is passing Details
2024-08-02 10:30:33 +08:00
hang eb1dcc9f0a 增加反馈字段
continuous-integration/drone/push Build is passing Details
2024-08-02 09:54:31 +08:00
hang 63c6c2f67b QCAgreeUpload 才允许修改 2024-08-01 17:24:18 +08:00
hang 62f37a4bb4 crc 重传允许修改部位编辑
continuous-integration/drone/push Build is passing Details
2024-08-01 17:05:28 +08:00
hang 02a8289ad4 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-01 16:57:27 +08:00
hang 7c5f3323de 增加下载信息的接口 2024-08-01 16:57:25 +08:00
he 2149bfa782 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-01 16:12:49 +08:00
he 3561df7574 代码修改 2024-08-01 16:12:48 +08:00
hang 9cd4e272c7 遗漏await
continuous-integration/drone/push Build is passing Details
2024-08-01 13:36:46 +08:00
hang 7069a17d8e 修改参数必传
continuous-integration/drone/push Build is passing Details
2024-08-01 13:31:53 +08:00
hang 3e5d0b650d 截图给默认值
continuous-integration/drone/push Build is passing Details
2024-08-01 13:17:23 +08:00
hang a6b8db30c3 scp 传输增加备注
continuous-integration/drone/push Build is passing Details
2024-08-01 11:48:24 +08:00
hang 613f2d8c6c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-01 10:50:12 +08:00
hang b8e0c74d45 用户反馈增加字段 2024-08-01 10:50:11 +08:00
he 13acd950ad 代码修改
continuous-integration/drone/push Build is failing Details
2024-08-01 10:39:21 +08:00
he 8ec86017f0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-08-01 10:35:59 +08:00
he ee43a5dc9d 代码修改 2024-08-01 10:35:57 +08:00
hang e3ee1a42fb 修改dicom 获取tag值 patientId为空
continuous-integration/drone/push Build is passing Details
2024-08-01 10:12:09 +08:00
hang 9fa24a35ef 记录传输日志
continuous-integration/drone/push Build is passing Details
2024-07-31 17:42:40 +08:00
hang 0e631e6f29 传递logger
continuous-integration/drone/push Build is passing Details
2024-07-31 17:36:46 +08:00
hang 622d598392 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-31 17:35:03 +08:00
hang 3ab411578e 日志写入到文件 2024-07-31 17:35:03 +08:00
he d1e21a9f4b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-31 16:49:24 +08:00
he cd2ebe700b 代码修改 2024-07-31 16:49:23 +08:00
hang 7f5a3bffd1 完成机构名称默认值
continuous-integration/drone/push Build is passing Details
2024-07-31 16:11:55 +08:00
hang cdbe74f1d9 根据配置设置用户的机构名称
continuous-integration/drone/push Build is passing Details
2024-07-31 15:51:38 +08:00
hang de01da975e CalledAE 名字错误
continuous-integration/drone/push Build is passing Details
2024-07-31 15:13:00 +08:00
hang aae243e36e 项目dicom ae 修改
continuous-integration/drone/push Build is passing Details
2024-07-31 15:08:28 +08:00
hang d3f7c199c7 防止前端重复上传
continuous-integration/drone/push Build is passing Details
2024-07-31 14:05:38 +08:00
hang ca41fac53d 有问题,撤回修改
continuous-integration/drone/push Build is passing Details
2024-07-31 13:44:50 +08:00
hang 6ccbfc466f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-07-31 13:42:50 +08:00
hang 81aa7fb8ef 上传再次增加判断 2024-07-31 13:42:49 +08:00
he da102dfed2 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-31 10:40:44 +08:00
he 63c225fb9b 代码修改 2024-07-31 10:40:40 +08:00
hang f0f6f0bd23 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-31 10:01:48 +08:00
hang 52b60338c3 修改隐藏邮箱的算法 2024-07-31 10:01:48 +08:00
hang d3e7b3a8d8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-31 09:35:34 +08:00
hang 48cba94995 邮件称呼修改 2024-07-31 09:35:33 +08:00
hang a2ca3a8245 修改邮件
continuous-integration/drone/push Build is passing Details
2024-07-31 09:25:54 +08:00
hang d602238f82 hangfire 任务调度隐患排除
continuous-integration/drone/push Build is passing Details
2024-07-30 16:03:35 +08:00
hang 5f141212f4 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-30 15:12:12 +08:00
hang 8b05c01e42 通过配置api 接口,自动将Result 进行加密返回,同时code返回12标注 目前使用base64 2024-07-30 15:12:11 +08:00
he 307ed2ca7f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-30 14:15:51 +08:00
he e9a90a4c3a 修改 2024-07-30 14:15:50 +08:00
hang a9407c3290 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-30 11:50:34 +08:00
hang f9fc79d3aa 用户反馈接口初步完成 2024-07-30 11:50:33 +08:00
he ee4b4a62ac 修改
continuous-integration/drone/push Build is passing Details
2024-07-30 11:30:16 +08:00
he 7d7027a753 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-30 11:19:19 +08:00
he e36dd04d3e 修改 2024-07-30 11:19:17 +08:00
hang fd9af47606 验证码修改
continuous-integration/drone/push Build is passing Details
2024-07-30 09:51:48 +08:00
hang 633507d4cd k8s docker 挂载配置文件热更新问题解决
continuous-integration/drone/push Build is passing Details
2024-07-29 17:59:01 +08:00
hang 8c94e17c14 删除提示语
continuous-integration/drone/push Build is passing Details
2024-07-29 16:33:35 +08:00
hang 942f3adfe0 修改scp 上传bug
continuous-integration/drone/push Build is running Details
2024-07-29 16:33:00 +08:00
hang 3b92aaf61c 修改国际化 和 scp 缩略图日志
continuous-integration/drone/push Build is passing Details
2024-07-29 16:24:34 +08:00
he 4f5d89732d 代码提交
continuous-integration/drone/push Build is passing Details
2024-07-29 15:13:15 +08:00
he 55bb70179c 代码修改
continuous-integration/drone/push Build is passing Details
2024-07-29 14:19:03 +08:00
he 6c9c8ee5dc 修改
continuous-integration/drone/push Build is passing Details
2024-07-29 14:00:40 +08:00
hang 73e9e3239a 修改us配置文件
continuous-integration/drone/push Build is passing Details
2024-07-29 11:47:32 +08:00
he 8d67a3be5f Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-29 10:43:26 +08:00
he 5175c857ec 代码提交 2024-07-29 10:43:24 +08:00
hang d2a9f478e4 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-26 15:26:29 +08:00
hang 9f32b92af3 邮件上线到系统配置 2024-07-26 15:26:28 +08:00
he 880525b015 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-26 10:16:11 +08:00
he 0536a57075 代码修改 2024-07-26 10:16:08 +08:00
hang abb3b02e74 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-26 09:04:34 +08:00
hang cad7132b0a 通过相对路径获取授权签名 2024-07-26 09:04:34 +08:00
hang c6e5d31244 重阅自动失效,错误消息位置改变
continuous-integration/drone/push Build is passing Details
2024-07-25 17:05:52 +08:00
hang b0302d0e6d 同意重阅,成功,但是给出自动失效的提示 2024-07-25 17:05:49 +08:00
hang 9a958276db 修改项目部位bug
continuous-integration/drone/push Build is passing Details
2024-07-25 16:41:42 +08:00
hang 44bcdf7973 系统邮件上线到配置预修改
continuous-integration/drone/push Build is passing Details
2024-07-25 14:46:13 +08:00
hang 6311884a5c dicom AE 浏览器推荐 发布记录 国际化
continuous-integration/drone/push Build is passing Details
2024-07-25 12:22:56 +08:00
hang de5fc7c277 修改,无序重阅 和审批
continuous-integration/drone/push Build is passing Details
2024-07-25 10:12:09 +08:00
he 3414c50975 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-24 16:05:29 +08:00
he 39736c3ce4 修改 2024-07-24 16:05:27 +08:00
hang 14fb158e13 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-24 15:05:09 +08:00
hang 81f55a9e07 医学审核列表,查询优化 2024-07-24 15:05:07 +08:00
he 94e942e344 代码修改
continuous-integration/drone/push Build is passing Details
2024-07-24 14:46:49 +08:00
he 95fbe6085a Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-24 13:33:49 +08:00
he 4f4dda7a09 格式化 2024-07-24 13:33:48 +08:00
hang 8021d6a860 防止生成sql生成GETDATE() 时区导致的问题
continuous-integration/drone/push Build is passing Details
2024-07-24 09:54:43 +08:00
hang 3cdfd3a771 修改dicom ae 接口
continuous-integration/drone/push Build is passing Details
2024-07-23 15:35:49 +08:00
hang 76792a127f 整体肿瘤评估导表修改
continuous-integration/drone/push Build is passing Details
2024-07-23 14:58:40 +08:00
hang fc36cbcb75 修改Dicom 推送
continuous-integration/drone/push Build is passing Details
2024-07-23 10:35:38 +08:00
hang 3fab377454 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-22 15:41:17 +08:00
hang 5246c10e32 处理检查删除、添加、维护绑定关系 2024-07-22 15:41:16 +08:00
he 63530b7847 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-22 15:20:21 +08:00
he 99be08dc20 修改 2024-07-22 15:20:18 +08:00
hang 9898673dbf 修改study查询bug
continuous-integration/drone/push Build is passing Details
2024-07-22 14:04:56 +08:00
hang d7f0fdd0e7 oss 下载走内网地址
continuous-integration/drone/push Build is passing Details
2024-07-19 16:12:59 +08:00
hang 795cb0aba2 修改非dicom 监控上传 2024-07-19 13:17:54 +08:00
hang 32ba46206b 增加ACC number
continuous-integration/drone/push Build is passing Details
2024-07-18 15:18:40 +08:00
hang 22c9386101 修改测试AE
continuous-integration/drone/push Build is passing Details
2024-07-18 10:55:47 +08:00
hang ff4136e02d 修改AE 配置文件
continuous-integration/drone/push Build is passing Details
2024-07-18 10:32:27 +08:00
hang 04cccf1174 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-07-18 10:10:13 +08:00
he ab9203eef0 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-18 10:05:29 +08:00
he 924ba90384 添加高亮 2024-07-18 10:05:26 +08:00
hang 353b2c99cb url 解码下载修改 2024-07-17 18:00:39 +08:00
hang 0b3542e9c3 自动计算患者年龄
continuous-integration/drone/push Build is passing Details
2024-07-17 14:52:53 +08:00
hang 425bd7bf9a 修改查询列表
continuous-integration/drone/push Build is passing Details
2024-07-17 14:44:37 +08:00
hang e0aa9fb1d9 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-17 14:20:38 +08:00
hang c65a484b13 增加患者信息查询,和Modality查询 2024-07-17 14:20:36 +08:00
he d9fc5e3646 添加上一次任务的答案
continuous-integration/drone/push Build is passing Details
2024-07-17 13:37:01 +08:00
he d72f3e89a2 代码修改
continuous-integration/drone/push Build is passing Details
2024-07-17 11:06:47 +08:00
he 85a303171c 修改
continuous-integration/drone/push Build is passing Details
2024-07-17 10:52:54 +08:00
he 4026eca656 修改 2024-07-17 10:52:20 +08:00
he 74aec46a94 返回值修改 2024-07-17 10:52:02 +08:00
he 49e21a6342 加返回参数 2024-07-17 10:51:58 +08:00
he 0e0dd0c7d3 跳过阅片修改 2024-07-17 10:51:26 +08:00
hang 8fedcdaf00 检查列表增加查询 区分是否来自Pacs
continuous-integration/drone/push Build is passing Details
2024-07-16 17:30:01 +08:00
hang 9924375f82 下拉框增加参数
continuous-integration/drone/push Build is passing Details
2024-07-16 16:13:57 +08:00
hang a60661aaa5 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-16 16:09:23 +08:00
hang 5041ebd58b 增加项目Id 查询条件 2024-07-16 16:09:22 +08:00
he 594574c846 添加基线的长径短径
continuous-integration/drone/push Build is passing Details
2024-07-16 15:43:04 +08:00
hang 6e7545be65 返回配置字段
continuous-integration/drone/push Build is passing Details
2024-07-16 15:28:04 +08:00
hang b77d2d9160 减少压缩包访视层级,同时处理单个非dicom 特殊情况压缩包处理
continuous-integration/drone/push Build is passing Details
2024-07-15 17:12:01 +08:00
hang 0c94ef86b0 增加打包下载验证
continuous-integration/drone/push Build is passing Details
2024-07-15 16:27:06 +08:00
hang e0c6e9aabf 修改ivus影像下载功能
continuous-integration/drone/push Build is passing Details
2024-07-15 15:52:52 +08:00
hang 814f1e576a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-12 13:52:46 +08:00
hang d62d2770f4 修改scp 配置文件 2024-07-12 13:52:45 +08:00
he cec678a24b 提示语修改
continuous-integration/drone/push Build is failing Details
2024-07-12 10:31:53 +08:00
he 7baf301785 配置文件修改 2024-07-12 10:31:51 +08:00
he ded0dbaa2d 阅片时间修改到配置文件 2024-07-12 10:31:47 +08:00
hang 8c16bc2ac5 修改管道名字
continuous-integration/drone/push Build is passing Details
2024-07-11 17:01:50 +08:00
hang 0827ede4b6 增加irc-scp发布配置 2024-07-11 16:59:58 +08:00
hang 239e0b84c2 study net8 自动打包配置 2024-07-11 16:12:19 +08:00
hang 73b77a477a 修改发布文件 2024-07-11 15:29:40 +08:00
hang c032c42321 增加用户机构默认值修改
continuous-integration/drone/push Build is passing Details
2024-07-11 10:16:02 +08:00
hang cb7140ad38 修改国际化查询
continuous-integration/drone/push Build is passing Details
2024-07-11 09:20:15 +08:00
hang 29ea2a0ef1 增加国际化
continuous-integration/drone/push Build is passing Details
2024-07-10 17:42:39 +08:00
hang 46af71e3df 增加uat irc 自动打包成镜像
continuous-integration/drone/push Build is passing Details
2024-07-10 16:47:25 +08:00
hang 67819fc85d 组件一致性分析筛选条件修改
continuous-integration/drone/push Build is passing Details
2024-07-10 14:00:04 +08:00
hang 4b15bcdc55 打开后端正式环境验证
continuous-integration/drone/push Build is passing Details
2024-07-10 10:48:20 +08:00
hang 0ba439e5bd 修改发件箱配置
continuous-integration/drone/push Build is passing Details
2024-07-10 09:10:10 +08:00
hang c25c855b46 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is running Details
2024-07-10 09:08:42 +08:00
hang 003b227f7d 修改发送邮件提示 2024-07-10 09:08:41 +08:00
he 461976f6d3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-09 17:21:17 +08:00
he 7636c82b11 代码修改 2024-07-09 17:21:16 +08:00
hang d1e4863e01 修改签名bug
continuous-integration/drone/push Build is passing Details
2024-07-09 17:03:20 +08:00
hang d483aca73b 增加映射
continuous-integration/drone/push Build is passing Details
2024-07-09 16:27:07 +08:00
hang cf45169de2 修改返回
continuous-integration/drone/push Build is passing Details
2024-07-09 16:16:10 +08:00
hang 0075c18cd8 修改返回的信息
continuous-integration/drone/push Build is passing Details
2024-07-09 14:56:47 +08:00
hang e55bc5fe7a 增加查询映射
continuous-integration/drone/push Build is passing Details
2024-07-09 14:25:34 +08:00
hang e6bd7ad0ea 修改pacs 配置
continuous-integration/drone/push Build is passing Details
2024-07-09 14:20:00 +08:00
hang a98bc37045 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-09 13:14:13 +08:00
hang 06209a945d 修改发送邮件配置 2024-07-09 13:13:50 +08:00
hang d5c628d916 修改发件箱 2024-07-09 13:13:46 +08:00
hang 905fdd9861 修改美国irc uat 数据库名称 2024-07-09 13:13:41 +08:00
he 3ff95ede2c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-08 16:21:59 +08:00
he f9734dc5cc 修改 2024-07-08 16:21:58 +08:00
hang c32ec2f132 美国验证增加配置文件
continuous-integration/drone/push Build is passing Details
2024-07-08 11:38:47 +08:00
hang 28c3adaf64 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-05 10:24:11 +08:00
hang 6435746660 修改配置文件 2024-07-05 10:24:11 +08:00
he c6531e9249 代码修改
continuous-integration/drone/push Build is passing Details
2024-07-05 10:00:35 +08:00
hang b1be0e2a98 修改配置文件 2024-07-05 09:19:00 +08:00
hang 31d22e2b4f 增加美国生产环境配置文件 2024-07-05 09:18:56 +08:00
he 1e5f01fdeb Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-05 09:09:08 +08:00
he 213787bbcf 代码修改 2024-07-05 09:08:54 +08:00
hang 933a43f4ea 返回推荐的版本
continuous-integration/drone/push Build is passing Details
2024-07-04 17:24:29 +08:00
hang 6264d105ab 浏览器推荐修改
continuous-integration/drone/push Build is passing Details
2024-07-04 17:22:54 +08:00
hang 0c7495870b pacs 直连 增加修改
continuous-integration/drone/push Build is passing Details
2024-07-04 13:12:10 +08:00
hang a615b5cefd site dicomAE 提交
continuous-integration/drone/push Build is passing Details
2024-07-03 14:45:24 +08:00
hang 9f66a932fc 增加pacs 直连 scp项目
continuous-integration/drone/push Build is passing Details
2024-07-03 14:00:29 +08:00
hang d094f22ab2 pacs 直连修改
continuous-integration/drone/push Build is passing Details
2024-07-02 17:20:32 +08:00
hang 5cc41b3b0f 修改一致性核查颜色 2024-07-02 17:20:05 +08:00
hang 27b99eb3be 增加接口返回路径信息
continuous-integration/drone/push Build is passing Details
2024-07-02 11:08:11 +08:00
hang e324850811 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-02 09:45:19 +08:00
hang 7c3b0e9e72 浏览器版本推荐 --迁移 2024-07-02 09:45:18 +08:00
he 709529da87 关键序列修改
continuous-integration/drone/push Build is passing Details
2024-07-02 09:36:15 +08:00
hang 2354ee9174 修改一致性分析和临床数据
continuous-integration/drone/push Build is passing Details
2024-07-01 15:40:13 +08:00
hang f158f092ce 修改一致性分析 以及项目部位编辑
continuous-integration/drone/push Build is passing Details
2024-07-01 14:54:15 +08:00
he f446d400a1 修改
continuous-integration/drone/push Build is passing Details
2024-07-01 13:46:54 +08:00
he 5b0026f30f 修改
continuous-integration/drone/push Build is passing Details
2024-07-01 13:41:55 +08:00
he 1efd41e7ac Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-07-01 11:50:24 +08:00
he 76c6e8442a 修改 2024-07-01 11:50:23 +08:00
hang f92ace1894 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-06-28 11:30:22 +08:00
hang 4585b7b732 一致性分析筛选+ 退回和重阅增加APM角色 2024-06-28 11:30:20 +08:00
he ae2907ad5d 修改
continuous-integration/drone/push Build is passing Details
2024-06-28 10:19:34 +08:00
he 1a3ad4f602 修改
continuous-integration/drone/push Build is passing Details
2024-06-28 09:35:54 +08:00
he 9c95928add Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-06-27 16:02:31 +08:00
he 10380994a4 修改 2024-06-27 16:02:29 +08:00
hang 49993edb37 修改国际化查询
continuous-integration/drone/push Build is passing Details
2024-06-27 15:38:00 +08:00
hang 3efc40e9ae 修改发布版本降序排
continuous-integration/drone/push Build is passing Details
2024-06-27 15:33:18 +08:00
hang 4922ffa5c3 国际化增加 版本字段展示
continuous-integration/drone/push Build is passing Details
2024-06-27 15:31:03 +08:00
hang c7935ee90f 修改限制当前版本
continuous-integration/drone/push Build is passing Details
2024-06-27 15:25:48 +08:00
hang a91a706e0b 修改数据库模型
continuous-integration/drone/push Build is passing Details
2024-06-27 15:17:32 +08:00
hang a16fbc187a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-06-27 14:34:09 +08:00
hang 4a314f2070 修改BM 统计 2024-06-27 14:34:09 +08:00
he 27d9104607 修改
continuous-integration/drone/push Build is passing Details
2024-06-27 14:25:20 +08:00
he acad258319 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-06-27 14:21:33 +08:00
he ba8f22f260 修改 2024-06-27 14:21:32 +08:00
hang f524aa5e57 发布测试环境对接
continuous-integration/drone/push Build is passing Details
2024-06-27 13:18:41 +08:00
he 5c9664ec7d Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing Details
2024-06-26 09:10:21 +08:00
he be27376dde 添加 Lugano 2014 Without PET 2024-06-26 09:10:20 +08:00
hang 452535b561 中心调研修改
continuous-integration/drone/push Build is passing Details
2024-06-25 10:52:16 +08:00
hang 9048963ea5 修改字段名
continuous-integration/drone/push Build is passing Details
2024-06-25 10:28:18 +08:00
hang d3ab051a39 spm cpm 返回增加字段
continuous-integration/drone/push Build is passing Details
2024-06-25 10:26:30 +08:00
hang 73edbe8fd3 删掉邮件日志组件
continuous-integration/drone/push Build is passing Details
2024-06-25 09:17:48 +08:00
hang de70f68640 发送邮件版本退回
continuous-integration/drone/push Build is passing Details
2024-06-24 17:46:37 +08:00
hang 97b97a164d 修改发送邮件版本
continuous-integration/drone/push Build is passing Details
2024-06-24 17:37:35 +08:00
hang fb87f4d06a 版本退回
continuous-integration/drone/push Build is passing Details
2024-06-24 17:26:20 +08:00
hang 20092d6757 升级邮件发送包
continuous-integration/drone/push Build is passing Details
2024-06-24 17:21:15 +08:00
hang 96c4165cda 修改 界面控制bug
continuous-integration/drone/push Build is passing Details
2024-06-24 16:54:11 +08:00
hang a4226d4e2f 修改筛选条件
continuous-integration/drone/push Build is passing Details
2024-06-24 16:28:20 +08:00
hang f97565d9d8 医生入组,没有spm修改逻辑
continuous-integration/drone/push Build is passing Details
2024-06-24 16:07:41 +08:00
hang ab84e66fe4 国际化修改,增加批量更新接口
continuous-integration/drone/push Build is passing Details
2024-06-24 10:51:23 +08:00
hang 1f9d29e005 版本历史功能增加
continuous-integration/drone/push Build is passing Details
2024-06-24 10:13:03 +08:00
977 changed files with 519656 additions and 50825 deletions

4
Dockerfile Normal file
View File

@ -0,0 +1,4 @@
FROM registry.cn-shanghai.aliyuncs.com/extimaging/aspnetcore:v8.2
WORKDIR /app
COPY publish .
ENTRYPOINT ["dotnet", "IRaCIS.Core.API.dll"]

View File

@ -5,7 +5,7 @@ using Microsoft.Extensions.Localization;
using Newtonsoft.Json;
namespace IRaCIS.Core.Application.Filter
namespace IRaCIS.Core.SCP.Filter
{

View File

@ -5,7 +5,7 @@ using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
namespace IRaCIS.Core.Application.Filter
namespace IRaCIS.Core.SCP.Filter
{
public class ProjectExceptionFilter : Attribute, IExceptionFilter
{
@ -32,10 +32,10 @@ namespace IRaCIS.Core.Application.Filter
if (context.Exception.GetType() == typeof(BusinessValidationFailedException))
{
var error = context.Exception as BusinessValidationFailedException;
var error = context.Exception as BusinessValidationFailedException;
context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message, error!.Code));
}
}
else if(context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException))
{
context.Result = new JsonResult(ResponseOutput.NotOk( context.Exception.Message, ApiResponseCodeEnum.DataNotExist));

View File

@ -1,8 +1,9 @@
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
namespace IRaCIS.Application.Services.BusinessFilter
namespace IRaCIS.Core.Application.Service.BusinessFilter
{
/// <summary>
/// 统一返回前端数据包装之前在控制器包装现在修改为动态Api 在ResultFilter这里包装减少重复冗余代码
@ -50,7 +51,7 @@ namespace IRaCIS.Application.Services.BusinessFilter
//OK
var tuple = (dynamic)objectResult.Value;
var apiResponse = ResponseOutput.Ok(tuple!.Item1, tuple!.Item2);
var apiResponse = ResponseOutput.Ok(tuple.Item1, tuple.Item2);
objectResult.Value = apiResponse;
@ -76,7 +77,7 @@ namespace IRaCIS.Application.Services.BusinessFilter
else if(statusCode != 200&&!(objectResult.Value is IResponseOutput))
{
//---程序错误,请联系开发人员。
var apiResponse = ResponseOutput.NotOk(StaticData.International("UnifiedAPI_ProgramError"));
var apiResponse = ResponseOutput.NotOk(I18n.T("UnifiedAPI_ProgramError"));
objectResult.Value = apiResponse;
objectResult.DeclaredType = apiResponse.GetType();

View File

@ -1,7 +1,4 @@
using Autofac;
using Autofac.Extras.DynamicProxy;
using IRaCIS.Core.Application;
using IRaCIS.Core.Application.BackGroundJob;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Http;
using Panda.DynamicWebApi;
@ -10,12 +7,11 @@ using System.Linq;
using System.Reflection;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using MediatR;
using IRaCIS.Application.Services;
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.Service;
using AutoMapper;
using IRaCIS.Core.SCP.Service;
namespace IRaCIS.Core.API
namespace IRaCIS.Core.SCP
{
// ReSharper disable once IdentifierTypo
public class AutofacModuleSetup : Autofac.Module
@ -40,27 +36,18 @@ namespace IRaCIS.Core.API
.Where(type => typeof(IDynamicWebApi).IsAssignableFrom(type))
.PropertiesAutowired();
#endregion
Assembly application = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "IRaCIS.Core.Application.dll");
Assembly application = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + typeof(BaseService).Assembly.GetName().Name+".dll");
containerBuilder.RegisterAssemblyTypes(application).Where(t => t.FullName.Contains("Service"))
.PropertiesAutowired().AsImplementedInterfaces().EnableClassInterceptors();
.PropertiesAutowired().AsImplementedInterfaces();
//containerBuilder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
//containerBuilder.RegisterType<UserInfo>().As<IUserInfo>().InstancePerLifetimeScope();
containerBuilder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
containerBuilder.RegisterType<UserInfo>().As<IUserInfo>().InstancePerLifetimeScope();
//注册hangfire任务 依赖注入
containerBuilder.RegisterType<ObtainTaskAutoCancelJob>().As<IObtainTaskAutoCancelJob>().InstancePerDependency();

View File

@ -0,0 +1,64 @@
using EntityFramework.Exceptions.SqlServer;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using Medallion.Threading;
using Medallion.Threading.SqlServer;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.SCP
{
public static class EFSetup
{
public static void AddEFSetup( this IServiceCollection services, IConfiguration configuration)
{
services.AddHttpContextAccessor();
services.AddScoped<IUserInfo, UserInfo>();
services.AddScoped<ISaveChangesInterceptor, AuditEntityInterceptor>();
//这个注入没有成功--注入是没问题的构造函数也只是支持参数就好错在注入的地方不能写DbContext
//Web程序中通过重用池中DbContext实例可提高高并发场景下的吞吐量 这在概念上类似于ADO.NET Provider原生的连接池操作方式具有节省DbContext实例化成本的优点
services.AddDbContext<IRaCISDBContext>((sp, options) =>
{
// 在控制台
//public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); });
var logFactory = LoggerFactory.Create(builder => { builder.AddDebug(); });
options.UseSqlServer(configuration.GetSection("ConnectionStrings:RemoteNew").Value,
contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure());
options.UseLoggerFactory(logFactory);
options.UseExceptionProcessor();
options.EnableSensitiveDataLogging();
options.AddInterceptors(new QueryWithNoLockDbCommandInterceptor());
options.AddInterceptors(sp.GetServices<ISaveChangesInterceptor>());
options.UseProjectables();
});
//// Register an additional context factory as a Scoped service, which gets a pooled context from the Singleton factory we registered above,
//services.AddScoped<IRaCISDBScopedFactory>();
//// Finally, arrange for a context to get injected from our Scoped factory:
//services.AddScoped(sp => sp.GetRequiredService<IRaCISDBScopedFactory>().CreateDbContext());
//注意区分 easy caching 也有 IDistributedLockProvider
services.AddSingleton<IDistributedLockProvider>(sp =>
{
//var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
return new SqlDistributedSynchronizationProvider(configuration.GetSection("ConnectionStrings:RemoteNew").Value);
});
}
}
}

View File

@ -0,0 +1,59 @@

using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
namespace IRaCIS.Core.SCP
{
public static class NewtonsoftJsonSetup
{
public static void AddNewtonsoftJsonSetup(this IMvcBuilder builder, IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddScoped<IOSSService,OSSService>();
builder.AddNewtonsoftJson(options =>
{
//options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
// 忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//options.SerializerSettings.TypeNameHandling = TypeNameHandling.All;
//处理返回给前端 可空类型 给出默认值 比如in? 为null 设置 默认值0
options.SerializerSettings.ContractResolver = new NullToEmptyStringResolver(); //new DefaultContractResolver();// new NullToEmptyStringResolver();
// 设置时间格式
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
//options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ;
//options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONTimeZoneConverter>());
})
.AddControllersAsServices()//动态webApi属性注入需要
.ConfigureApiBehaviorOptions(o =>
{
o.SuppressModelStateInvalidFilter = true; //自己写验证
});
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//日期类型默认格式化处理
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
return setting;
});
}
}
}

View File

@ -0,0 +1,36 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IRaCIS.Core.SCP
{
public class NullToEmptyStringResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
var list= type.GetProperties()
.Select(p =>
{
var jp = base.CreateProperty(p, memberSerialization);
jp.ValueProvider = new NullToEmptyStringValueProvider(p);
return jp;
}).ToList();
var uu = list.Select(t => t.PropertyName).ToList();
//获取复杂对象属性
properties = properties.TakeWhile(t => !uu.Contains(t.PropertyName)).ToList();
list.AddRange(properties);
return list;
}
}
}

View File

@ -2,7 +2,7 @@
using System.Reflection;
using Newtonsoft.Json.Serialization;
namespace IRaCIS.Core.API
namespace IRaCIS.Core.SCP
{
public class NullToEmptyStringValueProvider : IValueProvider
@ -28,7 +28,7 @@ namespace IRaCIS.Core.API
if(_MemberInfo.PropertyType == typeof(string))
{
//去掉前后空格
_MemberInfo.SetValue(target, value==null?string.Empty: value.ToString()==string.Empty? value:value/*.ToString().Trim()*/);
_MemberInfo.SetValue(target, value==null?string.Empty: value.ToString()==string.Empty? value:value.ToString().Trim());
}
else

View File

@ -0,0 +1,45 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.11" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.5" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" />
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
<PackageReference Include="AWSSDK.S3" Version="3.7.416.8" />
<PackageReference Include="AWSSDK.SecurityToken" Version="3.7.401.81" />
<PackageReference Include="DistributedLock.Core" Version="1.0.8" />
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.6" />
<PackageReference Include="fo-dicom" Version="5.2.1" />
<PackageReference Include="fo-dicom.Codecs" Version="5.16.1" />
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="Minio" Version="6.0.4" />
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
<TreatAsUsed>true</TreatAsUsed>
</PackageReference>
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="2.1.2" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj" />
<ProjectReference Include="..\IRaCIS.Core.Infrastructure\IRaCIS.Core.Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Helper\" />
</ItemGroup>
</Project>

186
IRC.Core.Dicom/Program.cs Normal file
View File

@ -0,0 +1,186 @@
using Autofac;
using Autofac.Extensions.DependencyInjection;
using AutoMapper.EquivalencyExpression;
using FellowOakDicom;
using FellowOakDicom.Imaging;
using FellowOakDicom.Imaging.NativeCodec;
using FellowOakDicom.Network;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.SCP;
using IRaCIS.Core.SCP.Filter;
using IRaCIS.Core.SCP.Service;
using MassTransit;
using MassTransit.NewIdProviders;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.Extensions.DependencyInjection;
using Panda.DynamicWebApi;
using Serilog;
using Serilog.Events;
using System.Runtime.InteropServices;
//以配置文件为准,否则 从url中取环境值(服务以命令行传递参数启动,配置文件配置了就不需要传递环境参数)
var config = new ConfigurationBuilder()
.AddEnvironmentVariables()
.Build();
var enviromentName = config["ASPNETCORE_ENVIRONMENT"];
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
EnvironmentName = enviromentName
});
#region 主机配置
NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
builder.Configuration.AddJsonFile("appsettings.json", false, true)
.AddJsonFile($"appsettings.{enviromentName}.json", false, true);
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterModule<AutofacModuleSetup>();
})
.UseSerilog();
#endregion
#region 配置服务
var _configuration = builder.Configuration;
//健康检查
builder.Services.AddHealthChecks();
//本地化
builder.Services.AddJsonLocalization(options => options.ResourcesPath = "Resources");
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
builder.Services.AddControllers(options =>
{
options.Filters.Add<ModelActionFilter>();
options.Filters.Add<ProjectExceptionFilter>();
options.Filters.Add<UnitOfWorkFilter>();
})
.AddNewtonsoftJsonSetup(builder.Services); // NewtonsoftJson 序列化 处理
builder.Services.AddOptions().Configure<AliyunOSSOptions>(_configuration.GetSection("AliyunOSS"));
builder.Services.AddOptions().Configure<ObjectStoreServiceOptions>(_configuration.GetSection("ObjectStoreService"));
builder.Services.AddOptions().Configure<DicomSCPServiceOption>(_configuration.GetSection("DicomSCPServiceConfig"));
//动态WebApi + UnifiedApiResultFilter 省掉控制器代码
//动态webApi 目前存在的唯一小坑是生成api上服务上的动态代理AOP失效 间接掉用不影响
builder.Services
.AddDynamicWebApi(dynamicWebApiOption =>
{
//默认是 api
dynamicWebApiOption.DefaultApiPrefix = "";
//首字母小写
dynamicWebApiOption.GetRestFulActionName = (actionName) => char.ToLower(actionName[0]) + actionName.Substring(1);
//删除 Service后缀
dynamicWebApiOption.RemoveControllerPostfixes.Add("Service");
});
//AutoMapper
builder.Services.AddAutoMapper(automapper =>
{
automapper.AddCollectionMappers();
}, typeof(BaseService).Assembly);
//EF ORM QueryWithNoLock
builder.Services.AddEFSetup(_configuration);
builder.Services.AddMediator(cfg =>
{
});
//转发头设置 获取真实IP
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
builder.Services.AddFellowOakDicom().AddTranscoderManager<NativeTranscoderManager>()
//.AddTranscoderManager<FellowOakDicom.Imaging.NativeCodec.NativeTranscoderManager>()
.AddImageManager<ImageSharpImageManager>();
#endregion
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
app.UseSwagger();
app.UseSwaggerUI();
//}
app.UseAuthorization();
app.MapControllers();
#region 日志
Log.Logger = new LoggerConfiguration()
//.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.WriteTo.Console()
.WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day)
.CreateLogger();
#endregion
#region 运行环境 部署平台
Log.Logger.Warning($"当前环境:{enviromentName}");
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Log.Logger.Warning($"当前部署平台环境windows");
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Log.Logger.Warning($"当前部署平台环境linux");
}
else
{
Log.Logger.Warning($"当前部署平台环境OSX or FreeBSD");
}
#endregion
DicomSetupBuilder.UseServiceProvider(app.Services);
var logger = app.Services.GetService<Microsoft.Extensions.Logging.ILogger<Program>>();
var server = DicomServerFactory.Create<CStoreSCPService>(_configuration.GetSection("DicomSCPServiceConfig").GetValue<int>("ServerPort"), userState: app.Services, logger: logger);
app.Run();

View File

@ -0,0 +1,31 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:11224",
"sslPort": 0
}
},
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:5127",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"launchUrl": "swagger",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@ -0,0 +1,111 @@
using AutoMapper;
using IRaCIS.Core.Application.Service.BusinessFilter;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Localization;
using Panda.DynamicWebApi;
using Panda.DynamicWebApi.Attributes;
using System.Diagnostics.CodeAnalysis;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
using IRaCIS.Core.Domain.Models;
namespace IRaCIS.Core.SCP.Service
{
#pragma warning disable CS8618
#region 非泛型版本
[Authorize, DynamicWebApi, UnifiedApiResultFilter]
public class BaseService : IBaseService, IDynamicWebApi
{
public IMapper _mapper { get; set; }
public IUserInfo _userInfo { get; set; }
public IStringLocalizer _localizer { get; set; }
public IWebHostEnvironment _hostEnvironment { get; set; }
public static IResponseOutput Null404NotFound<TEntity>(TEntity? businessObject) where TEntity : class
{
return new ResponseOutput<string>()
.NotOk($"The query object {typeof(TEntity).Name} does not exist , or was deleted by someone else, or an incorrect parameter query caused", code: ApiResponseCodeEnum.DataNotExist);
}
}
public interface IBaseService
{
[MemberNotNull(nameof(_mapper))]
public IMapper _mapper { get; set; }
[MemberNotNull(nameof(_userInfo))]
public IUserInfo _userInfo { get; set; }
[MemberNotNull(nameof(_localizer))]
public IStringLocalizer _localizer { get; set; }
[MemberNotNull(nameof(_hostEnvironment))]
public IWebHostEnvironment _hostEnvironment { get; set; }
}
#endregion
#region 泛型版本测试
public interface IBaseServiceTest<T> where T : Entity
{
[MemberNotNull(nameof(_mapper))]
public IMapper _mapper { get; set; }
[MemberNotNull(nameof(_userInfo))]
public IUserInfo _userInfo { get; set; }
[MemberNotNull(nameof(_localizer))]
public IStringLocalizer _localizer { get; set; }
}
[Authorize, DynamicWebApi, UnifiedApiResultFilter]
public class BaseServiceTest<T> : IBaseServiceTest<T>, IDynamicWebApi where T : Entity
{
public IMapper _mapper { get; set; }
public IUserInfo _userInfo { get; set; }
public IStringLocalizer _localizer { get; set; }
public static IResponseOutput Null404NotFound<TEntity>(TEntity? businessObject) where TEntity : class
{
return new ResponseOutput<string>()
.NotOk($"The query object {typeof(TEntity).Name} does not exist , or was deleted by someone else, or an incorrect parameter query caused", code: ApiResponseCodeEnum.DataNotExist);
}
}
#endregion
}

View File

@ -0,0 +1,376 @@
using FellowOakDicom.Network;
using FellowOakDicom;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using IRaCIS.Core.SCP.Service;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infra.EFCore;
using Medallion.Threading;
using IRaCIS.Core.Domain.Share;
using Serilog;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
using Microsoft.Extensions.Options;
using System.Data;
using FellowOakDicom.Imaging;
using SharpCompress.Common;
using SixLabors.ImageSharp.Formats.Jpeg;
using IRaCIS.Core.Infrastructure;
namespace IRaCIS.Core.SCP.Service
{
public class DicomSCPServiceOption
{
public List<string> CalledAEList { get; set; }
public string ServerPort { get; set; }
}
public class CStoreSCPService : DicomService, IDicomServiceProvider, IDicomCStoreProvider, IDicomCEchoProvider
{
private IServiceProvider _serviceProvider { get; set; }
private List<Guid> _SCPStudyIdList { get; set; } = new List<Guid>();
private SCPImageUpload _upload { get; set; }
private Guid _trialId { get; set; }
private Guid _trialSiteId { get; set; }
private static readonly DicomTransferSyntax[] _acceptedTransferSyntaxes = new DicomTransferSyntax[]
{
DicomTransferSyntax.ExplicitVRLittleEndian,
DicomTransferSyntax.ExplicitVRBigEndian,
DicomTransferSyntax.ImplicitVRLittleEndian
};
private static readonly DicomTransferSyntax[] _acceptedImageTransferSyntaxes = new DicomTransferSyntax[]
{
// Lossless
DicomTransferSyntax.JPEGLSLossless, //1.2.840.10008.1.2.4.80
DicomTransferSyntax.JPEG2000Lossless, //1.2.840.10008.1.2.4.90
DicomTransferSyntax.JPEGProcess14SV1, //1.2.840.10008.1.2.4.70
DicomTransferSyntax.JPEGProcess14, //1.2.840.10008.1.2.4.57 JPEG Lossless, Non-Hierarchical (Process 14)
DicomTransferSyntax.RLELossless, //1.2.840.10008.1.2.5
// Lossy
DicomTransferSyntax.JPEGLSNearLossless,//1.2.840.10008.1.2.4.81"
DicomTransferSyntax.JPEG2000Lossy, //1.2.840.10008.1.2.4.91
DicomTransferSyntax.JPEGProcess1, //1.2.840.10008.1.2.4.50
DicomTransferSyntax.JPEGProcess2_4, //1.2.840.10008.1.2.4.51
// Uncompressed
DicomTransferSyntax.ExplicitVRLittleEndian, //1.2.840.10008.1.2.1
DicomTransferSyntax.ExplicitVRBigEndian, //1.2.840.10008.1.2.2
DicomTransferSyntax.ImplicitVRLittleEndian //1.2.840.10008.1.2
};
public CStoreSCPService(INetworkStream stream, Encoding fallbackEncoding, Microsoft.Extensions.Logging.ILogger log, DicomServiceDependencies dependencies, IServiceProvider injectServiceProvider)
: base(stream, fallbackEncoding, log, dependencies)
{
_serviceProvider = injectServiceProvider.CreateScope().ServiceProvider;
}
public Task OnReceiveAssociationRequestAsync(DicomAssociation association)
{
_upload = new SCPImageUpload() { StartTime = DateTime.Now, CallingAE = association.CallingAE, CalledAE = association.CalledAE, CallingAEIP = association.RemoteHost };
Log.Logger.Warning($"接收到来自{association.CallingAE}的连接");
//_serviceProvider = (IServiceProvider)this.UserState;
var _trialDicomAERepository = _serviceProvider.GetService<IRepository<TrialDicomAE>>();
var trialDicomAEList = _trialDicomAERepository.Select(t => new { t.CalledAE, t.TrialId }).ToList();
var trialCalledAEList = trialDicomAEList.Select(t => t.CalledAE).ToList();
Log.Logger.Information("当前系统配置:", string.Join('|', trialDicomAEList));
var findCalledAE = trialDicomAEList.Where(t => t.CalledAE == association.CalledAE).FirstOrDefault();
var isCanReceiveIamge = false;
if (findCalledAE != null)
{
_trialId = findCalledAE.TrialId;
var _trialSiteDicomAERepository = _serviceProvider.GetService<IRepository<TrialSiteDicomAE>>();
var findTrialSiteAE = _trialSiteDicomAERepository.Where(t => t.CallingAE == association.CallingAE && t.TrialId==_trialId).FirstOrDefault();
if (findTrialSiteAE != null)
{
_trialSiteId = findTrialSiteAE.TrialSiteId;
isCanReceiveIamge = true;
}
}
if (association.CallingAE == "test-callingAE")
{
isCanReceiveIamge = true;
}
if (!trialCalledAEList.Contains(association.CalledAE) || isCanReceiveIamge == false)
{
Log.Logger.Warning($"拒绝CallingAE:{association.CallingAE} CalledAE:{association.CalledAE}的连接");
return SendAssociationRejectAsync(
DicomRejectResult.Permanent,
DicomRejectSource.ServiceUser,
DicomRejectReason.CalledAENotRecognized);
}
foreach (var pc in association.PresentationContexts)
{
if (pc.AbstractSyntax == DicomUID.Verification)
{
pc.AcceptTransferSyntaxes(_acceptedTransferSyntaxes);
}
else if (pc.AbstractSyntax.StorageCategory != DicomStorageCategory.None)
{
pc.AcceptTransferSyntaxes(_acceptedImageTransferSyntaxes);
}
}
return SendAssociationAcceptAsync(association);
}
public async Task OnReceiveAssociationReleaseRequestAsync()
{
await DataMaintenanceAsaync();
//记录监控
var _SCPImageUploadRepository = _serviceProvider.GetService<IRepository<SCPImageUpload>>();
_upload.EndTime = DateTime.Now;
_upload.StudyCount = _SCPStudyIdList.Count;
_upload.TrialId = _trialId;
_upload.TrialSiteId = _trialSiteId;
await _SCPImageUploadRepository.AddAsync(_upload, true);
var _studyRepository = _serviceProvider.GetService<IRepository<SCPStudy>>();
//将检查设置为传输结束
await _studyRepository.BatchUpdateNoTrackingAsync(t => _SCPStudyIdList.Contains(t.Id), u => new SCPStudy() { IsUploadFinished = true });
await _studyRepository.SaveChangesAndClearAllTrackingAsync();
await SendAssociationReleaseResponseAsync();
}
private async Task DataMaintenanceAsaync()
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE}传输结束开始维护数据处理检查Modality");
//处理检查Modality
var _dictionaryRepository = _serviceProvider.GetService<IRepository<Dictionary>>();
var _seriesRepository = _serviceProvider.GetService<IRepository<SCPSeries>>();
var _studyRepository = _serviceProvider.GetService<IRepository<SCPStudy>>();
var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList();
var seriesModalityList = _seriesRepository.Where(t => _SCPStudyIdList.Contains(t.StudyId)).Select(t => new { SCPStudyId = t.StudyId, t.Modality }).ToList();
foreach (var g in seriesModalityList.GroupBy(t => t.SCPStudyId))
{
var modality = string.Join('、', g.Select(t => t.Modality).Distinct().ToList());
//特殊逻辑
var modalityForEdit = dicModalityList.Contains(modality) ? modality : String.Empty;
if (modality == "MR")
{
modalityForEdit = "MRI";
}
if (modality == "PT")
{
modalityForEdit = "PET";
}
if (modality == "PT、CT" || modality == "CT、PT")
{
modalityForEdit = "PET-CT";
}
await _studyRepository.BatchUpdateNoTrackingAsync(t => t.Id == g.Key, u => new SCPStudy() { Modalities = modality, ModalityForEdit = modalityForEdit });
}
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE}维护数据结束");
}
public void OnReceiveAbort(DicomAbortSource source, DicomAbortReason reason)
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE}接收中断,中断原因:{source.ToString() + reason.ToString()}");
/* nothing to do here */
}
public async void OnConnectionClosed(Exception exception)
{
/* nothing to do here */
//奇怪的bug 上传的时候用王捷修改的影像会关闭重新连接导致检查id 丢失,然后状态不一致
if (exception == null)
{
//var _studyRepository = _serviceProvider.GetService<IRepository<SCPStudy>>();
////将检查设置为传输结束
//await _studyRepository.BatchUpdateNoTrackingAsync(t => _SCPStudyIdList.Contains(t.Id), u => new SCPStudy() { IsUploadFinished = true });
//await _studyRepository.SaveChangesAndClearAllTrackingAsync();
}
Log.Logger.Warning($"连接关闭 {exception?.Message} {exception?.InnerException?.Message}");
}
public async Task<DicomCStoreResponse> OnCStoreRequestAsync(DicomCStoreRequest request)
{
string studyInstanceUid = request.Dataset.GetString(DicomTag.StudyInstanceUID);
string seriesInstanceUid = request.Dataset.GetString(DicomTag.SeriesInstanceUID);
string sopInstanceUid = request.Dataset.GetString(DicomTag.SOPInstanceUID);
//Guid studyId = IdentifierHelper.CreateGuid(studyInstanceUid, trialId.ToString());
Guid seriesId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, _trialId.ToString());
Guid instanceId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, sopInstanceUid, _trialId.ToString());
var ossService = _serviceProvider.GetService<IOSSService>();
var dicomArchiveService = _serviceProvider.GetService<IDicomArchiveService>();
var _seriesRepository = _serviceProvider.GetService<IRepository<SCPSeries>>();
var _distributedLockProvider = _serviceProvider.GetService<IDistributedLockProvider>();
var storeRelativePath = string.Empty;
var ossFolderPath = $"{_trialId}/Image/PACS/{_trialSiteId}/{studyInstanceUid}";
long fileSize = 0;
try
{
using (MemoryStream ms = new MemoryStream())
{
await request.File.SaveAsync(ms);
//irc 从路径最后一截取Guid
storeRelativePath = await ossService.UploadToOSSAsync(ms, ossFolderPath, instanceId.ToString(), false);
fileSize = ms.Length;
}
Log.Logger.Information($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} {request.SOPInstanceUID} 上传完成 ");
}
catch (Exception ec)
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 上传异常 {ec.Message}");
}
var @lock = _distributedLockProvider.CreateLock($"{studyInstanceUid}");
using (await @lock.AcquireAsync())
{
try
{
var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(request.Dataset, _trialId, _trialSiteId, storeRelativePath, Association.CallingAE, Association.CalledAE,fileSize);
if (!_SCPStudyIdList.Contains(scpStudyId))
{
_SCPStudyIdList.Add(scpStudyId);
}
var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
//没有缩略图
if (series != null && string.IsNullOrEmpty(series.ImageResizePath))
{
// 生成缩略图
using (var memoryStream = new MemoryStream())
{
DicomImage image = new DicomImage(request.Dataset);
var sharpimage = image.RenderImage().AsSharpImage();
sharpimage.Save(memoryStream, new JpegEncoder());
// 上传缩略图到 OSS
var seriesPath = await ossService.UploadToOSSAsync(memoryStream, ossFolderPath, seriesId.ToString() + ".preview.jpg", false);
Console.WriteLine(seriesPath + " Id: " + seriesId);
series.ImageResizePath = seriesPath;
}
}
await _seriesRepository.SaveChangesAsync();
}
catch (Exception ex)
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 传输处理异常:{ex.ToString()}");
}
}
//监控信息设置
_upload.FileCount++;
_upload.FileSize = _upload.FileSize + fileSize;
return new DicomCStoreResponse(request, DicomStatus.Success);
}
public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e)
{
// let library handle logging and error response
return Task.CompletedTask;
}
public Task<DicomCEchoResponse> OnCEchoRequestAsync(DicomCEchoRequest request)
{
return Task.FromResult(new DicomCEchoResponse(request, DicomStatus.Success));
}
}
}

View File

@ -0,0 +1,356 @@
using IRaCIS.Core.Domain.Share;
using System.Text;
using Microsoft.AspNetCore.Hosting;
using IRaCIS.Core.Infrastructure;
using Medallion.Threading;
using FellowOakDicom;
using FellowOakDicom.Imaging.Codec;
using System.Data;
using IRaCIS.Core.Domain.Models;
using FellowOakDicom.Network;
using IRaCIS.Core.SCP.Service;
using IRaCIS.Core.Infra.EFCore;
using MassTransit;
using System.Runtime.Intrinsics.X86;
using Serilog.Sinks.File;
namespace IRaCIS.Core.SCP.Service
{
public class DicomArchiveService : BaseService, IDicomArchiveService
{
private readonly IRepository<SCPPatient> _patientRepository;
private readonly IRepository<SCPStudy> _studyRepository;
private readonly IRepository<SCPSeries> _seriesRepository;
private readonly IRepository<SCPInstance> _instanceRepository;
private readonly IRepository<Dictionary> _dictionaryRepository;
private readonly IDistributedLockProvider _distributedLockProvider;
private List<Guid> _instanceIdList = new List<Guid>();
public DicomArchiveService(IRepository<SCPPatient> patientRepository, IRepository<SCPStudy> studyRepository,
IRepository<SCPSeries> seriesRepository,
IRepository<SCPInstance> instanceRepository,
IRepository<Dictionary> dictionaryRepository,
IDistributedLockProvider distributedLockProvider)
{
_distributedLockProvider = distributedLockProvider;
_studyRepository = studyRepository;
_patientRepository = patientRepository;
_seriesRepository = seriesRepository;
_instanceRepository = instanceRepository;
_dictionaryRepository = dictionaryRepository;
}
/// <summary>
/// 单个文件接收 归档
/// </summary>
/// <param name="dataset"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<Guid> ArchiveDicomFileAsync(DicomDataset dataset, Guid trialId, Guid trialSiteId, string fileRelativePath, string callingAE, string calledAE,long fileSize)
{
string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID);
string seriesInstanceUid = dataset.GetString(DicomTag.SeriesInstanceUID);
string sopInstanceUid = dataset.GetString(DicomTag.SOPInstanceUID);
string patientIdStr = dataset.GetSingleValueOrDefault(DicomTag.PatientID,string.Empty);
//Guid patientId= IdentifierHelper.CreateGuid(patientIdStr);
Guid studyId = IdentifierHelper.CreateGuid(studyInstanceUid,trialId.ToString());
Guid seriesId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, trialId.ToString());
Guid instanceId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, sopInstanceUid, trialId.ToString());
var isStudyNeedAdd = false;
var isSeriesNeedAdd = false;
var isInstanceNeedAdd = false;
var isPatientNeedAdd = false;
//var @lock = _distributedLockProvider.CreateLock($"{studyInstanceUid}");
//using (@lock.Acquire())
{
var findPatient = await _patientRepository.FirstOrDefaultAsync(t => t.PatientIdStr == patientIdStr && t.TrialSiteId==trialSiteId );
var findStudy = await _studyRepository.FirstOrDefaultAsync(t=>t.Id== studyId);
var findSerice = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
var findInstance = await _instanceRepository.FirstOrDefaultAsync(t => t.Id == instanceId);
DateTime? studyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.StudyDate).Add(dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.StudyTime).TimeOfDay);
//先传输了修改了患者编号的又传输了没有修改患者编号的导致后传输的没有修改患者编号的下面的检查为0
if (findPatient == null && findStudy==null)
{
isPatientNeedAdd = true;
findPatient = new SCPPatient()
{
Id = NewId.NextSequentialGuid(),
TrialId=trialId,
TrialSiteId=trialSiteId,
PatientIdStr = dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty),
PatientName = dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty),
PatientAge = dataset.GetSingleValueOrDefault(DicomTag.PatientAge, string.Empty),
PatientSex = dataset.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty),
PatientBirthDate = dataset.GetSingleValueOrDefault(DicomTag.PatientBirthDate, string.Empty),
EarliestStudyTime = studyTime,
LatestStudyTime = studyTime,
LatestPushTime = DateTime.Now,
};
if (findPatient.PatientBirthDate.Length == 8)
{
var birthDateStr = $"{findPatient.PatientBirthDate[0]}{findPatient.PatientBirthDate[1]}{findPatient.PatientBirthDate[2]}{findPatient.PatientBirthDate[3]}-{findPatient.PatientBirthDate[4]}{findPatient.PatientBirthDate[5]}-{findPatient.PatientBirthDate[6]}{findPatient.PatientBirthDate[7]}";
var yearStr = $"{findPatient.PatientBirthDate[0]}{findPatient.PatientBirthDate[1]}{findPatient.PatientBirthDate[2]}{findPatient.PatientBirthDate[3]}";
int year = 0;
var canParse = int.TryParse(yearStr, out year);
if (canParse && year > 1900)
{
findPatient.PatientBirthDate = birthDateStr;
DateTime birthDate;
if (findPatient.PatientAge == string.Empty && studyTime.HasValue && DateTime.TryParse(findPatient.PatientBirthDate,out birthDate))
{
var patientAge = studyTime.Value.Year - birthDate.Year;
// 如果生日还未到,年龄减去一岁
if (studyTime.Value < birthDate.AddYears(patientAge))
{
patientAge--;
}
findPatient.PatientAge = patientAge.ToString();
}
}
else
{
findPatient.PatientBirthDate = string.Empty;
}
}
}
else
{
if (studyTime < findPatient.EarliestStudyTime)
{
findPatient.EarliestStudyTime = studyTime;
}
if (studyTime > findPatient.LatestStudyTime)
{
findPatient.LatestStudyTime = studyTime;
}
findPatient.LatestPushTime = DateTime.Now;
}
if (findStudy == null)
{
isStudyNeedAdd = true;
findStudy = new SCPStudy
{
CalledAE = calledAE,
CallingAE = callingAE,
PatientId = findPatient.Id,
Id = studyId,
TrialId = trialId,
TrialSiteId = trialSiteId,
StudyInstanceUid = studyInstanceUid,
StudyTime = studyTime,
Modalities = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty),
//ModalityForEdit = modalityForEdit,
Description = dataset.GetSingleValueOrDefault(DicomTag.StudyDescription, string.Empty),
InstitutionName = dataset.GetSingleValueOrDefault(DicomTag.InstitutionName, string.Empty),
PatientIdStr = dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty),
PatientName = dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty),
PatientAge = dataset.GetSingleValueOrDefault(DicomTag.PatientAge, string.Empty),
PatientSex = dataset.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty),
BodyPartExamined = dataset.GetSingleValueOrDefault(DicomTag.BodyPartExamined, string.Empty),
StudyId = dataset.GetSingleValueOrDefault(DicomTag.StudyID, string.Empty),
AccessionNumber = dataset.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty),
//需要特殊处理
PatientBirthDate = dataset.GetSingleValueOrDefault(DicomTag.PatientBirthDate, string.Empty),
AcquisitionTime = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionTime, string.Empty),
AcquisitionNumber = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionNumber, string.Empty),
TriggerTime = dataset.GetSingleValueOrDefault(DicomTag.TriggerTime, string.Empty),
//IsDoubleReview = addtionalInfo.IsDoubleReview,
SeriesCount = 0,
InstanceCount = 0
};
if (findStudy.PatientBirthDate.Length == 8)
{
findStudy.PatientBirthDate = $"{findStudy.PatientBirthDate[0]}{findStudy.PatientBirthDate[1]}{findStudy.PatientBirthDate[2]}{findStudy.PatientBirthDate[3]}-{findStudy.PatientBirthDate[4]}{findStudy.PatientBirthDate[5]}-{findStudy.PatientBirthDate[6]}{findStudy.PatientBirthDate[7]}";
}
}
if (findSerice == null)
{
isSeriesNeedAdd = true;
findSerice = new SCPSeries
{
Id = seriesId,
StudyId = findStudy.Id,
StudyInstanceUid = findStudy.StudyInstanceUid,
SeriesInstanceUid = seriesInstanceUid,
SeriesNumber = dataset.GetSingleValueOrDefault(DicomTag.SeriesNumber, 1),
//SeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, DateTime.Now).Add(dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, DateTime.Now).TimeOfDay),
//SeriesTime = DateTime.TryParse(dataset.GetSingleValue<string>(DicomTag.SeriesDate) + dataset.GetSingleValue<string>(DicomTag.SeriesTime), out DateTime dt) ? dt : null,
SeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.SeriesDate).Add(dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.SeriesTime).TimeOfDay),
Modality = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty),
Description = dataset.GetSingleValueOrDefault(DicomTag.SeriesDescription, string.Empty),
SliceThickness = dataset.GetSingleValueOrDefault(DicomTag.SliceThickness, string.Empty),
ImagePositionPatient = dataset.GetSingleValueOrDefault(DicomTag.ImagePositionPatient, string.Empty),
ImageOrientationPatient = dataset.GetSingleValueOrDefault(DicomTag.ImageOrientationPatient, string.Empty),
BodyPartExamined = dataset.GetSingleValueOrDefault(DicomTag.BodyPartExamined, string.Empty),
SequenceName = dataset.GetSingleValueOrDefault(DicomTag.SequenceName, string.Empty),
ProtocolName = dataset.GetSingleValueOrDefault(DicomTag.ProtocolName, string.Empty),
ImagerPixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty),
AcquisitionTime = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionTime, string.Empty),
AcquisitionNumber = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionNumber, string.Empty),
TriggerTime = dataset.GetSingleValueOrDefault(DicomTag.TriggerTime, string.Empty),
InstanceCount = 0
};
++findStudy.SeriesCount;
}
if (findInstance == null)
{
isInstanceNeedAdd = true;
findInstance = new SCPInstance
{
Id = instanceId,
StudyId = findStudy.Id,
SeriesId = findSerice.Id,
StudyInstanceUid = findStudy.StudyInstanceUid,
SeriesInstanceUid = findSerice.SeriesInstanceUid,
SopInstanceUid = sopInstanceUid,
InstanceNumber = dataset.GetSingleValueOrDefault(DicomTag.InstanceNumber, 1),
InstanceTime = dataset.GetSingleValueOrDefault(DicomTag.ContentDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.ContentDate).Add(dataset.GetSingleValueOrDefault(DicomTag.ContentTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.ContentTime).TimeOfDay),
//InstanceTime = DateTime.TryParse(dataset.GetSingleValue<string>(DicomTag.ContentDate) + dataset.GetSingleValue<string>(DicomTag.ContentTime), out DateTime dt) ? dt : null,
//InstanceTime = dataset.GetSingleValueOrDefault(DicomTag.ContentDate,(DateTime?)null)?.Add(dataset.GetSingleValueOrDefault(DicomTag.ContentTime, TimeSpan.Zero)),
//dataset.GetSingleValueOrDefault(DicomTag.ContentDate,DateTime.Now);//, DicomTag.ContentTime)
CPIStatus = false,
ImageRows = dataset.GetSingleValueOrDefault(DicomTag.Rows, 0),
ImageColumns = dataset.GetSingleValueOrDefault(DicomTag.Columns, 0),
SliceLocation = dataset.GetSingleValueOrDefault(DicomTag.SliceLocation, 0),
SliceThickness = dataset.GetSingleValueOrDefault(DicomTag.SliceThickness, string.Empty),
NumberOfFrames = dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 0),
PixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.PixelSpacing, string.Empty),
ImagerPixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty),
FrameOfReferenceUID = dataset.GetSingleValueOrDefault(DicomTag.FrameOfReferenceUID, string.Empty),
WindowCenter = dataset.GetSingleValueOrDefault(DicomTag.WindowCenter, string.Empty),
WindowWidth = dataset.GetSingleValueOrDefault(DicomTag.WindowWidth, string.Empty),
Path = fileRelativePath,
FileSize= fileSize,
};
++findStudy.InstanceCount;
++findSerice.InstanceCount;
}
if (isPatientNeedAdd)
{
var ss = await _patientRepository.AddAsync(findPatient);
}
if (isStudyNeedAdd)
{
var dd = await _studyRepository.AddAsync(findStudy);
}
else
{
await _studyRepository.BatchUpdateNoTrackingAsync(t => t.Id == findStudy.Id, t => new SCPStudy() { IsUploadFinished = false });
}
if (isSeriesNeedAdd)
{
await _seriesRepository.AddAsync(findSerice);
}
if (isInstanceNeedAdd)
{
await _instanceRepository.AddAsync(findInstance);
}
else
{
await _instanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == instanceId, u => new SCPInstance() { Path = fileRelativePath,FileSize=fileSize });
}
await _studyRepository.SaveChangesAsync();
return findStudy.Id;
}
}
// 从DICOM文件中获取使用的字符集
private string GetEncodingVaulueFromDicomFile(DicomDataset dataset, DicomTag dicomTag)
{
// 获取DICOM文件的特定元素通常用于指示使用的字符集
var charset = dataset.GetSingleValueOrDefault(DicomTag.SpecificCharacterSet, string.Empty);
var dicomEncoding = DicomEncoding.GetEncoding(charset);
var dicomStringElement = dataset.GetDicomItem<DicomStringElement>(dicomTag);
var bytes = dicomStringElement.Buffer.Data;
return dicomEncoding.GetString(bytes);
//// 从DICOM文件中获取使用的字符集
//string filePath = "C:\\Users\\hang\\Documents\\WeChat Files\\wxid_r2imdzb7j3q922\\FileStorage\\File\\2024-05\\1.2.840.113619.2.80.169103990.5390.1271401378.4.dcm";
//DicomFile dicomFile = DicomFile.Open(filePath);
//// 获取DICOM文件的特定元素通常用于指示使用的字符集
//var charset = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.SpecificCharacterSet, string.Empty);
//var dicomEncoding = DicomEncoding.GetEncoding(charset);
//var value = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
//var dicomStringElement = dicomFile.Dataset.GetDicomItem<DicomStringElement>(DicomTag.PatientName);
//var bytes = dicomStringElement.Buffer.Data;
//var aa= dicomEncoding.GetString(bytes);
}
}
}

View File

@ -0,0 +1,11 @@
using FellowOakDicom;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
namespace IRaCIS.Core.SCP.Service
{
public interface IDicomArchiveService
{
Task<Guid> ArchiveDicomFileAsync(DicomDataset dicomDataset,Guid trialId,Guid trialSiteId, string fileRelativePath,string callingAE,string calledAE,long fileSize);
}
}

View File

@ -0,0 +1,770 @@
using AlibabaCloud.SDK.Sts20150401;
using Aliyun.OSS;
using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.SecurityToken;
using Amazon.SecurityToken.Model;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.NewtonsoftJson;
using MassTransit;
using Microsoft.Extensions.Options;
using Minio;
using Minio.DataModel.Args;
using System.Reactive.Linq;
using System.Runtime.InteropServices;
namespace IRaCIS.Core.SCP;
#region 绑定和返回模型
[LowerCamelCaseJson]
public class MinIOOptions : AWSOptions
{
public int Port { get; set; }
}
public class AWSOptions
{
public string EndPoint { get; set; }
public bool UseSSL { get; set; }
public string AccessKeyId { get; set; }
public string RoleArn { get; set; }
public string SecretAccessKey { get; set; }
public string BucketName { get; set; }
public string ViewEndpoint { get; set; }
public int DurationSeconds { get; set; }
public string Region { get; set; }
}
public class AliyunOSSOptions
{
public string RegionId { get; set; }
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string InternalEndpoint { get; set; }
public string EndPoint { get; set; }
public string BucketName { get; set; }
public string RoleArn { get; set; }
public string Region { get; set; }
public string ViewEndpoint { get; set; }
public int DurationSeconds { get; set; }
}
public class ObjectStoreServiceOptions
{
public string ObjectStoreUse { get; set; }
public AliyunOSSOptions AliyunOSS { get; set; }
public MinIOOptions MinIO { get; set; }
public AWSOptions AWS { get; set; }
}
public class ObjectStoreDTO
{
public string ObjectStoreUse { get; set; }
public AliyunOSSTempToken AliyunOSS { get; set; }
public MinIOOptions MinIO { get; set; }
public AWSTempToken AWS { get; set; }
}
[LowerCamelCaseJson]
public class AliyunOSSTempToken
{
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string EndPoint { get; set; }
public string BucketName { get; set; }
public string Region { get; set; }
public string ViewEndpoint { get; set; }
public string SecurityToken { get; set; }
public DateTime Expiration { get; set; }
}
[LowerCamelCaseJson]
public class AWSTempToken
{
public string Region { get; set; }
public string SessionToken { get; set; }
public string EndPoint { get; set; }
public string AccessKeyId { get; set; }
public string SecretAccessKey { get; set; }
public string BucketName { get; set; }
public string ViewEndpoint { get; set; }
public DateTime Expiration { get; set; }
}
public enum ObjectStoreUse
{
AliyunOSS = 0,
MinIO = 1,
AWS = 2,
}
#endregion
// aws 参考链接 https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/S3/S3_Basics
public interface IOSSService
{
public Task<string> UploadToOSSAsync(Stream fileStream, string oosFolderPath, string fileRealName, bool isFileNameAddGuid = true);
public Task<string> UploadToOSSAsync(string localFilePath, string oosFolderPath, bool isFileNameAddGuid = true);
public Task DownLoadFromOSSAsync(string ossRelativePath, string localFilePath);
public ObjectStoreServiceOptions ObjectStoreServiceOptions { get; set; }
public Task<string> GetSignedUrl(string ossRelativePath);
public Task DeleteFromPrefix(string prefix);
public ObjectStoreDTO GetObjectStoreTempToken();
}
public class OSSService : IOSSService
{
public ObjectStoreServiceOptions ObjectStoreServiceOptions { get; set; }
private AliyunOSSTempToken AliyunOSSTempToken { get; set; }
private AWSTempToken AWSTempToken { get; set; }
public OSSService(IOptionsMonitor<ObjectStoreServiceOptions> options)
{
ObjectStoreServiceOptions = options.CurrentValue;
}
/// <summary>
/// oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder
/// </summary>
/// <param name="fileStream"></param>
/// <param name="oosFolderPath"></param>
/// <param name="fileRealName"></param>
/// <param name="isFileNameAddGuid"></param>
/// <returns></returns>
public async Task<string> UploadToOSSAsync(Stream fileStream, string oosFolderPath, string fileRealName, bool isFileNameAddGuid = true)
{
GetObjectStoreTempToken();
var ossRelativePath = isFileNameAddGuid ? $"{oosFolderPath}/{Guid.NewGuid()}_{fileRealName}" : $"{oosFolderPath}/{fileRealName}";
try
{
using (var memoryStream = new MemoryStream())
{
fileStream.Seek(0, SeekOrigin.Begin);
fileStream.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// 上传文件
var result = _ossClient.PutObject(aliConfig.BucketName, ossRelativePath, memoryStream);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var putObjectArgs = new PutObjectArgs()
.WithBucket(minIOConfig.BucketName)
.WithObject(ossRelativePath)
.WithStreamData(memoryStream)
.WithObjectSize(memoryStream.Length);
await minioClient.PutObjectAsync(putObjectArgs);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
var putObjectRequest = new Amazon.S3.Model.PutObjectRequest()
{
BucketName = awsConfig.BucketName,
InputStream = memoryStream,
Key = ossRelativePath,
};
await amazonS3Client.PutObjectAsync(putObjectRequest);
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
}
catch (Exception ex)
{
throw new BusinessValidationFailedException($"上传发生异常:{ex.Message}");
}
return "/" + ossRelativePath;
}
/// <summary>
/// oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder
/// </summary>
/// <param name="localFilePath"></param>
/// <param name="oosFolderPath"></param>
/// <param name="isFileNameAddGuid"></param>
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
public async Task<string> UploadToOSSAsync(string localFilePath, string oosFolderPath, bool isFileNameAddGuid = true)
{
GetObjectStoreTempToken();
var localFileName = Path.GetFileName(localFilePath);
var ossRelativePath = isFileNameAddGuid ? $"{oosFolderPath}/{Guid.NewGuid()}_{localFileName}" : $"{oosFolderPath}/{localFileName}";
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// 上传文件
var result = _ossClient.PutObject(aliConfig.BucketName, ossRelativePath, localFilePath);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var putObjectArgs = new PutObjectArgs()
.WithBucket(minIOConfig.BucketName)
.WithObject(ossRelativePath)
.WithFileName(localFilePath);
await minioClient.PutObjectAsync(putObjectArgs);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
// 提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
var putObjectRequest = new Amazon.S3.Model.PutObjectRequest()
{
BucketName = awsConfig.BucketName,
FilePath = localFilePath,
Key = ossRelativePath,
};
await amazonS3Client.PutObjectAsync(putObjectRequest);
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
return "/" + ossRelativePath;
}
public async Task DownLoadFromOSSAsync(string ossRelativePath, string localFilePath)
{
GetObjectStoreTempToken();
ossRelativePath = ossRelativePath.TrimStart('/');
try
{
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// 上传文件
var result = _ossClient.GetObject(aliConfig.BucketName, ossRelativePath);
// 将下载的文件流保存到本地文件
using (var fs = File.OpenWrite(localFilePath))
{
result.Content.CopyTo(fs);
fs.Close();
}
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var getObjectArgs = new GetObjectArgs()
.WithBucket(minIOConfig.BucketName)
.WithObject(ossRelativePath)
.WithFile(localFilePath);
await minioClient.GetObjectAsync(getObjectArgs);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
// 提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
var getObjectArgs = new Amazon.S3.Model.GetObjectRequest()
{
BucketName = awsConfig.BucketName,
Key = ossRelativePath,
};
await (await amazonS3Client.GetObjectAsync(getObjectArgs)).WriteResponseStreamToFileAsync(localFilePath, true, CancellationToken.None);
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
catch (Exception ex)
{
throw new BusinessValidationFailedException("oss下载失败!" + ex.Message);
}
}
public async Task<string> GetSignedUrl(string ossRelativePath)
{
GetObjectStoreTempToken();
ossRelativePath = ossRelativePath.TrimStart('/');
try
{
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// 生成签名URL。
var req = new GeneratePresignedUriRequest(aliConfig.BucketName, ossRelativePath, SignHttpMethod.Get)
{
// 设置签名URL过期时间默认值为3600秒。
Expiration = DateTime.Now.AddHours(1),
};
var uri = _ossClient.GeneratePresignedUri(req);
return uri.PathAndQuery;
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var args = new PresignedGetObjectArgs()
.WithBucket(minIOConfig.BucketName)
.WithObject(ossRelativePath)
.WithExpiry(3600)
/*.WithHeaders(reqParams)*/;
var presignedUrl = await minioClient.PresignedGetObjectAsync(args);
Uri uri = new Uri(presignedUrl);
string relativePath = uri.PathAndQuery;
return relativePath;
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
// 提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
var presignedUrl = await amazonS3Client.GetPreSignedURLAsync(new GetPreSignedUrlRequest()
{
BucketName = awsConfig.BucketName,
Key = ossRelativePath,
Expires = DateTime.UtcNow.AddMinutes(120)
});
Uri uri = new Uri(presignedUrl);
string relativePath = uri.PathAndQuery;
return relativePath;
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
catch (Exception ex)
{
throw new BusinessValidationFailedException("oss授权url失败!" + ex.Message);
}
}
/// <summary>
/// 删除某个目录的文件
/// </summary>
/// <param name="prefix"></param>
/// <returns></returns>
public async Task DeleteFromPrefix(string prefix)
{
GetObjectStoreTempToken();
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
try
{
ObjectListing objectListing = null;
string nextMarker = null;
do
{
// 使用 prefix 模拟目录结构,设置 MaxKeys 和 NextMarker
objectListing = _ossClient.ListObjects(new Aliyun.OSS.ListObjectsRequest(aliConfig.BucketName)
{
Prefix = prefix,
MaxKeys = 1000,
Marker = nextMarker
});
List<string> keys = objectListing.ObjectSummaries.Select(t => t.Key).ToList();
// 删除获取到的文件
if (keys.Count > 0)
{
_ossClient.DeleteObjects(new Aliyun.OSS.DeleteObjectsRequest(aliConfig.BucketName, keys, false));
}
// 设置 NextMarker 以获取下一页的数据
nextMarker = objectListing.NextMarker;
} while (objectListing.IsTruncated);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var listArgs = new ListObjectsArgs().WithBucket(minIOConfig.BucketName).WithPrefix(prefix).WithRecursive(true);
// 创建一个空列表用于存储对象键
var objects = new List<string>();
// 使用 await foreach 来异步迭代对象列表
await foreach (var item in minioClient.ListObjectsEnumAsync(listArgs))
{
objects.Add(item.Key);
}
if (objects.Count > 0)
{
var objArgs = new RemoveObjectsArgs()
.WithBucket(minIOConfig.BucketName)
.WithObjects(objects);
// 删除对象
await minioClient.RemoveObjectsAsync(objArgs);
}
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
// 提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
// 列出指定前缀下的所有对象
var listObjectsRequest = new ListObjectsV2Request
{
BucketName = awsConfig.BucketName,
Prefix = prefix
};
var listObjectsResponse = await amazonS3Client.ListObjectsV2Async(listObjectsRequest);
if (listObjectsResponse.S3Objects.Count > 0)
{
// 准备删除请求
var deleteObjectsRequest = new Amazon.S3.Model.DeleteObjectsRequest
{
BucketName = awsConfig.BucketName,
Objects = new List<KeyVersion>()
};
foreach (var s3Object in listObjectsResponse.S3Objects)
{
deleteObjectsRequest.Objects.Add(new KeyVersion
{
Key = s3Object.Key
});
}
// 批量删除对象
var deleteObjectsResponse = await amazonS3Client.DeleteObjectsAsync(deleteObjectsRequest);
}
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
public ObjectStoreDTO GetObjectStoreTempToken()
{
var ossOptions = ObjectStoreServiceOptions.AliyunOSS;
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var client = new Client(new AlibabaCloud.OpenApiClient.Models.Config()
{
AccessKeyId = ossOptions.AccessKeyId,
AccessKeySecret = ossOptions.AccessKeySecret,
//AccessKeyId = "LTAI5tJV76pYX5yPg1N9QVE8",
//AccessKeySecret = "roRNLa9YG1of4pYruJGCNKBXEWTAWa",
Endpoint = "sts.cn-hangzhou.aliyuncs.com"
});
var assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest();
// 将<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称例如oss-role-session。
assumeRoleRequest.RoleSessionName = $"session-name-{NewId.NextGuid()}";
// 将<YOUR_ROLE_ARN>替换为拥有上传文件到指定OSS Bucket权限的RAM角色的ARN。
assumeRoleRequest.RoleArn = ossOptions.RoleArn;
//assumeRoleRequest.RoleArn = "acs:ram::1899121822495495:role/webdirect";
assumeRoleRequest.DurationSeconds = ossOptions.DurationSeconds;
var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
var response = client.AssumeRoleWithOptions(assumeRoleRequest, runtime);
var credentials = response.Body.Credentials;
var tempToken = new AliyunOSSTempToken()
{
AccessKeyId = credentials.AccessKeyId,
AccessKeySecret = credentials.AccessKeySecret,
//转为服务器时区,最后统一转为客户端时区
Expiration = TimeZoneInfo.ConvertTimeFromUtc(DateTime.Parse(credentials.Expiration), TimeZoneInfo.Local),
SecurityToken = credentials.SecurityToken,
Region = ossOptions.Region,
BucketName = ossOptions.BucketName,
EndPoint = ossOptions.EndPoint,
ViewEndpoint = ossOptions.ViewEndpoint,
};
AliyunOSSTempToken = tempToken;
return new ObjectStoreDTO() { ObjectStoreUse = ObjectStoreServiceOptions.ObjectStoreUse, AliyunOSS = tempToken };
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
return new ObjectStoreDTO() { ObjectStoreUse = ObjectStoreServiceOptions.ObjectStoreUse, MinIO = ObjectStoreServiceOptions.MinIO };
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsOptions = ObjectStoreServiceOptions.AWS;
//aws 临时凭证
// 创建 STS 客户端
var stsClient = new AmazonSecurityTokenServiceClient(awsOptions.AccessKeyId, awsOptions.SecretAccessKey);
// 使用 AssumeRole 请求临时凭证
var assumeRoleRequest = new AssumeRoleRequest
{
RoleArn = awsOptions.RoleArn, // 角色 ARN
RoleSessionName = $"session-name-{NewId.NextGuid()}",
DurationSeconds = awsOptions.DurationSeconds // 临时凭证有效期
};
var assumeRoleResponse = stsClient.AssumeRoleAsync(assumeRoleRequest).Result;
var credentials = assumeRoleResponse.Credentials;
var tempToken = new AWSTempToken()
{
AccessKeyId = credentials.AccessKeyId,
SecretAccessKey = credentials.SecretAccessKey,
SessionToken = credentials.SessionToken,
Expiration = credentials.Expiration,
Region = awsOptions.Region,
BucketName = awsOptions.BucketName,
EndPoint = awsOptions.EndPoint,
ViewEndpoint = awsOptions.ViewEndpoint,
};
AWSTempToken = tempToken;
return new ObjectStoreDTO() { ObjectStoreUse = ObjectStoreServiceOptions.ObjectStoreUse, AWS = tempToken };
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
}

View File

@ -0,0 +1,8 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}

View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -0,0 +1,37 @@
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Localization;
using Newtonsoft.Json;
namespace IRaCIS.Core.SCP.Filter
{
public class ModelActionFilter : ActionFilterAttribute, IActionFilter
{
public IStringLocalizer _localizer;
public ModelActionFilter(IStringLocalizer localizer)
{
_localizer = localizer;
}
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
var validationErrors = context.ModelState
.Keys
.SelectMany(k => context.ModelState[k]!.Errors)
.Select(e => e.ErrorMessage)
.ToArray();
//---提供给接口的参数无效。
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["ModelAction_InvalidAPIParameter"] + JsonConvert.SerializeObject( validationErrors)));
}
}
}
}

View File

@ -3,7 +3,7 @@ using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace IRaCIS.Core.Application.Filter
namespace IRaCIS.Core.SCP.Filter
{
#region snippet_DisableFormValueModelBindingAttribute
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]

View File

@ -0,0 +1,61 @@
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging;
namespace IRaCIS.Core.SCP.Filter
{
public class ProjectExceptionFilter : Attribute, IExceptionFilter
{
private readonly ILogger<ProjectExceptionFilter> _logger;
public IStringLocalizer _localizer;
public ProjectExceptionFilter(IStringLocalizer localizer, ILogger<ProjectExceptionFilter> logger)
{
_logger = logger;
_localizer = localizer;
}
public void OnException(ExceptionContext context)
{
//context.ExceptionHandled;//记录当前这个异常是否已经被处理过了
if (!context.ExceptionHandled)
{
if (context.Exception.GetType().Name == "DbUpdateConcurrencyException")
{
//---并发更新,当前不允许该操作
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["ProjectException_ConcurrentUpdateNotAllowed"] + context.Exception.Message));
}
if (context.Exception.GetType() == typeof(BusinessValidationFailedException))
{
var error = context.Exception as BusinessValidationFailedException;
context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message, error!.Code));
}
else if(context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException))
{
context.Result = new JsonResult(ResponseOutput.NotOk( context.Exception.Message, ApiResponseCodeEnum.DataNotExist));
}
else
{
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["Project_ExceptionContactDeveloper"] + (context.Exception.InnerException is null ? (context.Exception.Message /*+ context.Exception.StackTrace*/)
: (context.Exception.InnerException?.Message /*+ context.Exception.InnerException?.StackTrace*/)), ApiResponseCodeEnum.ProgramException));
}
_logger.LogError(context.Exception.InnerException is null ? (context.Exception.Message + context.Exception.StackTrace) : (context.Exception.InnerException?.Message + context.Exception.InnerException?.StackTrace));
}
else
{
//继续
}
context.ExceptionHandled = true;//标记当前异常已经被处理过了
}
}
}

View File

@ -0,0 +1,120 @@
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
namespace IRaCIS.Core.Application.Service.BusinessFilter
{
/// <summary>
/// 统一返回前端数据包装之前在控制器包装现在修改为动态Api 在ResultFilter这里包装减少重复冗余代码
/// by zhouhang 2021.09.12 周末
/// </summary>
public class UnifiedApiResultFilter : Attribute, IAsyncResultFilter
{
/// <summary>
/// 异步版本
/// </summary>
/// <param name="context"></param>
/// <param name="next"></param>
/// <returns></returns>
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
if (context.Result is ObjectResult objectResult)
{
var statusCode = objectResult.StatusCode ?? context.HttpContext.Response.StatusCode;
//是200 并且没有包装 那么包装结果
if (statusCode == 200 && !(objectResult.Value is IResponseOutput))
{
//if (objectResult.Value == null)
//{
// var apiResponse = ResponseOutput.DBNotExist();
// objectResult.Value = apiResponse;
// objectResult.DeclaredType = apiResponse.GetType();
//}
//else
//{
var type = objectResult.Value?.GetType();
if ( type!=null&& type.IsGenericType&&(type.GetGenericTypeDefinition()==typeof(ValueTuple<,>)|| type.GetGenericTypeDefinition()==typeof(Tuple<,>)))
{
//报错
//var tuple = (object, object))objectResult.Value;
//var (val1, val2) = ((dynamic, dynamic))objectResult.Value;
//var apiResponse = ResponseOutput.Ok(val1, val2);
//OK
var tuple = (dynamic)objectResult.Value;
var apiResponse = ResponseOutput.Ok(tuple.Item1, tuple.Item2);
objectResult.Value = apiResponse;
objectResult.DeclaredType = apiResponse.GetType();
}
else
{
var apiResponse = ResponseOutput.Ok(objectResult.Value);
objectResult.Value = apiResponse;
objectResult.DeclaredType = apiResponse.GetType();
}
//}
}
//如果不是200 是IResponseOutput 不处理
else if (statusCode != 200 && (objectResult.Value is IResponseOutput))
{
}
else if(statusCode != 200&&!(objectResult.Value is IResponseOutput))
{
//---程序错误,请联系开发人员。
var apiResponse = ResponseOutput.NotOk(I18n.T("UnifiedAPI_ProgramError"));
objectResult.Value = apiResponse;
objectResult.DeclaredType = apiResponse.GetType();
}
}
await next.Invoke();
}
public static bool IsTupleType(Type type, bool checkBaseTypes = false)
{
if (type == null)
throw new ArgumentNullException(nameof(type));
if (type == typeof(Tuple))
return true;
while (type != null)
{
if (type.IsGenericType)
{
var genType = type.GetGenericTypeDefinition();
if (genType == typeof(Tuple<>)
|| genType == typeof(Tuple<,>)
|| genType == typeof(Tuple<,>))
return true;
}
if (!checkBaseTypes)
break;
type = type.BaseType;
}
return false;
}
}
}

View File

@ -0,0 +1,57 @@
using Autofac;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Http;
using Panda.DynamicWebApi;
using System;
using System.Linq;
using System.Reflection;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.Service;
using AutoMapper;
using IRaCIS.Core.SCP.Service;
namespace IRaCIS.Core.SCP
{
// ReSharper disable once IdentifierTypo
public class AutofacModuleSetup : Autofac.Module
{
protected override void Load(ContainerBuilder containerBuilder)
{
#region byzhouhang 20210917 此处注册泛型仓储 可以减少Domain层 和Infra.EFcore 两层 空的仓储接口定义和 仓储文件定义
containerBuilder.RegisterGeneric(typeof(Repository<>))
.As(typeof(IRepository<>)).InstancePerLifetimeScope();//注册泛型仓储
containerBuilder.RegisterType<Repository>().As<IRepository>().InstancePerLifetimeScope();
#endregion
#region 指定控制器也由autofac 来进行实例获取 https://www.cnblogs.com/xwhqwer/p/15320838.html
//获取所有控制器类型并使用属性注入
containerBuilder.RegisterAssemblyTypes(typeof(BaseService).Assembly)
.Where(type => typeof(IDynamicWebApi).IsAssignableFrom(type))
.PropertiesAutowired();
#endregion
Assembly application = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + typeof(BaseService).Assembly.GetName().Name+".dll");
containerBuilder.RegisterAssemblyTypes(application).Where(t => t.FullName.Contains("Service"))
.PropertiesAutowired().AsImplementedInterfaces();
//containerBuilder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
//containerBuilder.RegisterType<UserInfo>().As<IUserInfo>().InstancePerLifetimeScope();
}
}
}

View File

@ -0,0 +1,64 @@
using EntityFramework.Exceptions.SqlServer;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using Medallion.Threading;
using Medallion.Threading.SqlServer;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.SCP
{
public static class EFSetup
{
public static void AddEFSetup( this IServiceCollection services, IConfiguration configuration)
{
services.AddHttpContextAccessor();
services.AddScoped<IUserInfo, UserInfo>();
services.AddScoped<ISaveChangesInterceptor, AuditEntityInterceptor>();
//这个注入没有成功--注入是没问题的构造函数也只是支持参数就好错在注入的地方不能写DbContext
//Web程序中通过重用池中DbContext实例可提高高并发场景下的吞吐量 这在概念上类似于ADO.NET Provider原生的连接池操作方式具有节省DbContext实例化成本的优点
services.AddDbContext<IRaCISDBContext>((sp, options) =>
{
// 在控制台
//public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); });
var logFactory = LoggerFactory.Create(builder => { builder.AddDebug(); });
options.UseSqlServer(configuration.GetSection("ConnectionStrings:RemoteNew").Value,
contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure());
options.UseLoggerFactory(logFactory);
options.UseExceptionProcessor();
options.EnableSensitiveDataLogging();
options.AddInterceptors(new QueryWithNoLockDbCommandInterceptor());
options.AddInterceptors(sp.GetServices<ISaveChangesInterceptor>());
options.UseProjectables();
});
//// Register an additional context factory as a Scoped service, which gets a pooled context from the Singleton factory we registered above,
//services.AddScoped<IRaCISDBScopedFactory>();
//// Finally, arrange for a context to get injected from our Scoped factory:
//services.AddScoped(sp => sp.GetRequiredService<IRaCISDBScopedFactory>().CreateDbContext());
//注意区分 easy caching 也有 IDistributedLockProvider
services.AddSingleton<IDistributedLockProvider>(sp =>
{
//var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]!);
return new SqlDistributedSynchronizationProvider(configuration.GetSection("ConnectionStrings:RemoteNew").Value);
});
}
}
}

View File

@ -0,0 +1,59 @@

using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
namespace IRaCIS.Core.SCP
{
public static class NewtonsoftJsonSetup
{
public static void AddNewtonsoftJsonSetup(this IMvcBuilder builder, IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddScoped<IOSSService,OSSService>();
builder.AddNewtonsoftJson(options =>
{
//options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
// 忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//options.SerializerSettings.TypeNameHandling = TypeNameHandling.All;
//处理返回给前端 可空类型 给出默认值 比如in? 为null 设置 默认值0
options.SerializerSettings.ContractResolver = new NullToEmptyStringResolver(); //new DefaultContractResolver();// new NullToEmptyStringResolver();
// 设置时间格式
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
//options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ;
//options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONTimeZoneConverter>());
})
.AddControllersAsServices()//动态webApi属性注入需要
.ConfigureApiBehaviorOptions(o =>
{
o.SuppressModelStateInvalidFilter = true; //自己写验证
});
Newtonsoft.Json.JsonSerializerSettings setting = new Newtonsoft.Json.JsonSerializerSettings();
JsonConvert.DefaultSettings = new Func<JsonSerializerSettings>(() =>
{
//日期类型默认格式化处理
setting.DateFormatString = "yyyy-MM-dd HH:mm:ss";
setting.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
return setting;
});
}
}
}

View File

@ -0,0 +1,36 @@
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IRaCIS.Core.SCP
{
public class NullToEmptyStringResolver : DefaultContractResolver
{
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
var list= type.GetProperties()
.Select(p =>
{
var jp = base.CreateProperty(p, memberSerialization);
jp.ValueProvider = new NullToEmptyStringValueProvider(p);
return jp;
}).ToList();
var uu = list.Select(t => t.PropertyName).ToList();
//获取复杂对象属性
properties = properties.TakeWhile(t => !uu.Contains(t.PropertyName)).ToList();
list.AddRange(properties);
return list;
}
}
}

View File

@ -0,0 +1,42 @@
using System;
using System.Reflection;
using Newtonsoft.Json.Serialization;
namespace IRaCIS.Core.SCP
{
public class NullToEmptyStringValueProvider : IValueProvider
{
PropertyInfo _MemberInfo;
public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
{
_MemberInfo = memberInfo;
}
public object GetValue(object target)
{
object result = _MemberInfo.GetValue(target);
if (_MemberInfo.PropertyType == typeof(string) && result == null) result = "";
else if (_MemberInfo.PropertyType == typeof(String[]) && result == null) result = new string[] { };
//else if (_MemberInfo.PropertyType == typeof(Nullable<Int32>) && result == null) result = 0;
else if (_MemberInfo.PropertyType == typeof(Nullable<Decimal>) && result == null) result = 0.00M;
return result;
}
public void SetValue(object target, object value)
{
if(_MemberInfo.PropertyType == typeof(string))
{
//去掉前后空格
_MemberInfo.SetValue(target, value==null?string.Empty: value.ToString()==string.Empty? value:value.ToString().Trim());
}
else
{
_MemberInfo.SetValue(target, value);
}
}
}
}

View File

@ -0,0 +1,39 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="AlibabaCloud.SDK.Sts20150401" Version="1.1.5" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="10.0.0" />
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.14.1" />
<PackageReference Include="AWSSDK.S3" Version="3.7.416.8" />
<PackageReference Include="AWSSDK.SecurityToken" Version="3.7.401.81" />
<PackageReference Include="DistributedLock.Core" Version="1.0.8" />
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.6" />
<PackageReference Include="fo-dicom" Version="5.2.1" />
<PackageReference Include="fo-dicom.Codecs" Version="5.16.1" />
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.2.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="Minio" Version="6.0.4" />
<PackageReference Include="My.Extensions.Localization.Json" Version="3.3.0">
<TreatAsUsed>true</TreatAsUsed>
</PackageReference>
<PackageReference Include="Panda.DynamicWebApi" Version="1.2.2" />
<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="2.1.2" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\IRaCIS.Core.Domain\IRaCIS.Core.Domain.csproj" />
<ProjectReference Include="..\IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj" />
</ItemGroup>
</Project>

227
IRC.Core.SCP/Program.cs Normal file
View File

@ -0,0 +1,227 @@
using Autofac;
using Autofac.Extensions.DependencyInjection;
using AutoMapper.EquivalencyExpression;
using FellowOakDicom;
using FellowOakDicom.Imaging;
using FellowOakDicom.Imaging.NativeCodec;
using FellowOakDicom.Network;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.SCP;
using IRaCIS.Core.SCP.Filter;
using IRaCIS.Core.SCP.Service;
using MassTransit;
using MassTransit.NewIdProviders;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.Extensions.DependencyInjection;
using Panda.DynamicWebApi;
using Serilog;
using Serilog.Events;
using System.Runtime.InteropServices;
//以配置文件为准,否则 从url中取环境值(服务以命令行传递参数启动,配置文件配置了就不需要传递环境参数)
var config = new ConfigurationBuilder()
.AddEnvironmentVariables()
.Build();
var enviromentName = config["ASPNETCORE_ENVIRONMENT"];
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
EnvironmentName = enviromentName
});
#region 兼容windows 服务命令行的方式
int urlsIndex = Array.FindIndex(args, arg => arg != null && arg.StartsWith("--port"));
if (urlsIndex > -1)
{
var port = args[urlsIndex].Substring("--port=".Length);
Console.WriteLine(port);
builder.WebHost.UseUrls($"http://0.0.0.0:{port}");
}
#endregion
#region 主机配置
NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
builder.Configuration.AddJsonFile("appsettings.json", false, true)
.AddJsonFile($"appsettings.{enviromentName}.json", false, true);
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterModule<AutofacModuleSetup>();
})
.UseSerilog();
#endregion
#region 配置服务
var _configuration = builder.Configuration;
//健康检查
builder.Services.AddHealthChecks();
//本地化
builder.Services.AddJsonLocalization(options => options.ResourcesPath = "Resources");
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
builder.Services.AddControllers(options =>
{
options.Filters.Add<ModelActionFilter>();
options.Filters.Add<ProjectExceptionFilter>();
options.Filters.Add<UnitOfWorkFilter>();
})
.AddNewtonsoftJsonSetup(builder.Services); // NewtonsoftJson 序列化 处理
builder.Services.AddOptions().Configure<AliyunOSSOptions>(_configuration.GetSection("AliyunOSS"));
builder.Services.AddOptions().Configure<ObjectStoreServiceOptions>(_configuration.GetSection("ObjectStoreService"));
builder.Services.AddOptions().Configure<DicomSCPServiceOption>(_configuration.GetSection("DicomSCPServiceConfig"));
//动态WebApi + UnifiedApiResultFilter 省掉控制器代码
//动态webApi 目前存在的唯一小坑是生成api上服务上的动态代理AOP失效 间接掉用不影响
builder.Services
.AddDynamicWebApi(dynamicWebApiOption =>
{
//默认是 api
dynamicWebApiOption.DefaultApiPrefix = "";
//首字母小写
dynamicWebApiOption.GetRestFulActionName = (actionName) => char.ToLower(actionName[0]) + actionName.Substring(1);
//删除 Service后缀
dynamicWebApiOption.RemoveControllerPostfixes.Add("Service");
});
//AutoMapper
builder.Services.AddAutoMapper(automapper =>
{
automapper.AddCollectionMappers();
}, typeof(BaseService).Assembly);
//EF ORM QueryWithNoLock
builder.Services.AddEFSetup(_configuration);
builder.Services.AddMediator(cfg =>
{
});
//转发头设置 获取真实IP
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
builder.Services.AddFellowOakDicom().AddTranscoderManager<NativeTranscoderManager>()
//.AddTranscoderManager<FellowOakDicom.Imaging.NativeCodec.NativeTranscoderManager>()
.AddImageManager<ImageSharpImageManager>();
//Dicom影像渲染图片 跨平台
//builder.Services.AddDicomSetup();
//new DicomSetupBuilder()
// .RegisterServices(s =>
// s.AddFellowOakDicom()
// .AddTranscoderManager<NativeTranscoderManager>()
// //.AddTranscoderManager<FellowOakDicom.Imaging.NativeCodec.NativeTranscoderManager>()
// .AddImageManager<ImageSharpImageManager>())
// .SkipValidation()
// .Build();
#endregion
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Configure the HTTP request pipeline.
//if (app.Environment.IsDevelopment())
//{
app.UseSwagger();
app.UseSwaggerUI();
//}
app.UseAuthorization();
app.MapControllers();
#region 日志
//Log.Logger = new LoggerConfiguration()
// .MinimumLevel.Information()
// .MinimumLevel.Override("Microsoft", LogEventLevel.Information)
// // Filter out ASP.NET Core infrastructre logs that are Information and below 日志太多了 一个请求 记录好几条
// .MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
// .MinimumLevel.Override("Hangfire", LogEventLevel.Warning)
// .MinimumLevel.Override("System.Net.Http.HttpClient.HttpReports", LogEventLevel.Warning)
// .Enrich.WithClientIp()
// .Enrich.FromLogContext()
// //控制台 方便调试 问题 我们显示记录日志 时 获取上下文的ip 和用户名 用户类型
// .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning,
// outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine}")
// .WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day,
// outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine}")
// .CreateLogger();
Log.Logger = new LoggerConfiguration()
//.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Warning)
.WriteTo.Console()
.WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day)
.CreateLogger();
#endregion
#region 运行环境 部署平台
Log.Logger.Warning($"当前环境:{enviromentName}");
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
Log.Logger.Warning($"当前部署平台环境windows");
}
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
{
Log.Logger.Warning($"当前部署平台环境linux");
}
else
{
Log.Logger.Warning($"当前部署平台环境OSX or FreeBSD");
}
#endregion
DicomSetupBuilder.UseServiceProvider(app.Services);
var logger = app.Services.GetService<Microsoft.Extensions.Logging.ILogger<Program>>();
var server = DicomServerFactory.Create<CStoreSCPService>(_configuration.GetSection("DicomSCPServiceConfig").GetValue<int>("ServerPort"), userState: app.Services,logger: logger);
app.Run();

View File

@ -0,0 +1,35 @@
{
"$schema": "http://json.schemastore.org/launchsettings.json",
"profiles": {
"Test_IRC_SCP": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:6200",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Test_IRC_SCP"
}
},
"Uat_IRC_SCP": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:6200",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Uat_IRC_SCP"
}
},
"US_Prod_IRC_SCP": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"launchUrl": "swagger",
"applicationUrl": "http://localhost:6200",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "US_Prod_SCP"
}
}
}
}

View File

@ -0,0 +1,111 @@
using AutoMapper;
using IRaCIS.Core.Application.Service.BusinessFilter;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Localization;
using Panda.DynamicWebApi;
using Panda.DynamicWebApi.Attributes;
using System.Diagnostics.CodeAnalysis;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
using IRaCIS.Core.Domain.Models;
namespace IRaCIS.Core.SCP.Service
{
#pragma warning disable CS8618
#region 非泛型版本
[Authorize, DynamicWebApi, UnifiedApiResultFilter]
public class BaseService : IBaseService, IDynamicWebApi
{
public IMapper _mapper { get; set; }
public IUserInfo _userInfo { get; set; }
public IStringLocalizer _localizer { get; set; }
public IWebHostEnvironment _hostEnvironment { get; set; }
public static IResponseOutput Null404NotFound<TEntity>(TEntity? businessObject) where TEntity : class
{
return new ResponseOutput<string>()
.NotOk($"The query object {typeof(TEntity).Name} does not exist , or was deleted by someone else, or an incorrect parameter query caused", code: ApiResponseCodeEnum.DataNotExist);
}
}
public interface IBaseService
{
[MemberNotNull(nameof(_mapper))]
public IMapper _mapper { get; set; }
[MemberNotNull(nameof(_userInfo))]
public IUserInfo _userInfo { get; set; }
[MemberNotNull(nameof(_localizer))]
public IStringLocalizer _localizer { get; set; }
[MemberNotNull(nameof(_hostEnvironment))]
public IWebHostEnvironment _hostEnvironment { get; set; }
}
#endregion
#region 泛型版本测试
public interface IBaseServiceTest<T> where T : Entity
{
[MemberNotNull(nameof(_mapper))]
public IMapper _mapper { get; set; }
[MemberNotNull(nameof(_userInfo))]
public IUserInfo _userInfo { get; set; }
[MemberNotNull(nameof(_localizer))]
public IStringLocalizer _localizer { get; set; }
}
[Authorize, DynamicWebApi, UnifiedApiResultFilter]
public class BaseServiceTest<T> : IBaseServiceTest<T>, IDynamicWebApi where T : Entity
{
public IMapper _mapper { get; set; }
public IUserInfo _userInfo { get; set; }
public IStringLocalizer _localizer { get; set; }
public static IResponseOutput Null404NotFound<TEntity>(TEntity? businessObject) where TEntity : class
{
return new ResponseOutput<string>()
.NotOk($"The query object {typeof(TEntity).Name} does not exist , or was deleted by someone else, or an incorrect parameter query caused", code: ApiResponseCodeEnum.DataNotExist);
}
}
#endregion
}

View File

@ -0,0 +1,376 @@
using FellowOakDicom.Network;
using FellowOakDicom;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using IRaCIS.Core.SCP.Service;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infra.EFCore;
using Medallion.Threading;
using IRaCIS.Core.Domain.Share;
using Serilog;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
using Microsoft.Extensions.Options;
using System.Data;
using FellowOakDicom.Imaging;
using SharpCompress.Common;
using SixLabors.ImageSharp.Formats.Jpeg;
using IRaCIS.Core.Infrastructure;
namespace IRaCIS.Core.SCP.Service
{
public class DicomSCPServiceOption
{
public List<string> CalledAEList { get; set; }
public string ServerPort { get; set; }
}
public class CStoreSCPService : DicomService, IDicomServiceProvider, IDicomCStoreProvider, IDicomCEchoProvider
{
private IServiceProvider _serviceProvider { get; set; }
private List<Guid> _SCPStudyIdList { get; set; } = new List<Guid>();
private SCPImageUpload _upload { get; set; }
private Guid _trialId { get; set; }
private Guid _trialSiteId { get; set; }
private static readonly DicomTransferSyntax[] _acceptedTransferSyntaxes = new DicomTransferSyntax[]
{
DicomTransferSyntax.ExplicitVRLittleEndian,
DicomTransferSyntax.ExplicitVRBigEndian,
DicomTransferSyntax.ImplicitVRLittleEndian
};
private static readonly DicomTransferSyntax[] _acceptedImageTransferSyntaxes = new DicomTransferSyntax[]
{
// Lossless
DicomTransferSyntax.JPEGLSLossless, //1.2.840.10008.1.2.4.80
DicomTransferSyntax.JPEG2000Lossless, //1.2.840.10008.1.2.4.90
DicomTransferSyntax.JPEGProcess14SV1, //1.2.840.10008.1.2.4.70
DicomTransferSyntax.JPEGProcess14, //1.2.840.10008.1.2.4.57 JPEG Lossless, Non-Hierarchical (Process 14)
DicomTransferSyntax.RLELossless, //1.2.840.10008.1.2.5
// Lossy
DicomTransferSyntax.JPEGLSNearLossless,//1.2.840.10008.1.2.4.81"
DicomTransferSyntax.JPEG2000Lossy, //1.2.840.10008.1.2.4.91
DicomTransferSyntax.JPEGProcess1, //1.2.840.10008.1.2.4.50
DicomTransferSyntax.JPEGProcess2_4, //1.2.840.10008.1.2.4.51
// Uncompressed
DicomTransferSyntax.ExplicitVRLittleEndian, //1.2.840.10008.1.2.1
DicomTransferSyntax.ExplicitVRBigEndian, //1.2.840.10008.1.2.2
DicomTransferSyntax.ImplicitVRLittleEndian //1.2.840.10008.1.2
};
public CStoreSCPService(INetworkStream stream, Encoding fallbackEncoding, Microsoft.Extensions.Logging.ILogger log, DicomServiceDependencies dependencies, IServiceProvider injectServiceProvider)
: base(stream, fallbackEncoding, log, dependencies)
{
_serviceProvider = injectServiceProvider.CreateScope().ServiceProvider;
}
public Task OnReceiveAssociationRequestAsync(DicomAssociation association)
{
_upload = new SCPImageUpload() { StartTime = DateTime.Now, CallingAE = association.CallingAE, CalledAE = association.CalledAE, CallingAEIP = association.RemoteHost };
Log.Logger.Warning($"接收到来自{association.CallingAE}的连接");
//_serviceProvider = (IServiceProvider)this.UserState;
var _trialDicomAERepository = _serviceProvider.GetService<IRepository<TrialDicomAE>>();
var trialDicomAEList = _trialDicomAERepository.Select(t => new { t.CalledAE, t.TrialId }).ToList();
var trialCalledAEList = trialDicomAEList.Select(t => t.CalledAE).ToList();
Log.Logger.Information("当前系统配置:", string.Join('|', trialDicomAEList));
var findCalledAE = trialDicomAEList.Where(t => t.CalledAE == association.CalledAE).FirstOrDefault();
var isCanReceiveIamge = false;
if (findCalledAE != null)
{
_trialId = findCalledAE.TrialId;
var _trialSiteDicomAERepository = _serviceProvider.GetService<IRepository<TrialSiteDicomAE>>();
var findTrialSiteAE = _trialSiteDicomAERepository.Where(t => t.CallingAE == association.CallingAE && t.TrialId==_trialId).FirstOrDefault();
if (findTrialSiteAE != null)
{
_trialSiteId = findTrialSiteAE.TrialSiteId;
isCanReceiveIamge = true;
}
}
if (association.CallingAE == "test-callingAE")
{
isCanReceiveIamge = true;
}
if (!trialCalledAEList.Contains(association.CalledAE) || isCanReceiveIamge == false)
{
Log.Logger.Warning($"拒绝CallingAE:{association.CallingAE} CalledAE:{association.CalledAE}的连接");
return SendAssociationRejectAsync(
DicomRejectResult.Permanent,
DicomRejectSource.ServiceUser,
DicomRejectReason.CalledAENotRecognized);
}
foreach (var pc in association.PresentationContexts)
{
if (pc.AbstractSyntax == DicomUID.Verification)
{
pc.AcceptTransferSyntaxes(_acceptedTransferSyntaxes);
}
else if (pc.AbstractSyntax.StorageCategory != DicomStorageCategory.None)
{
pc.AcceptTransferSyntaxes(_acceptedImageTransferSyntaxes);
}
}
return SendAssociationAcceptAsync(association);
}
public async Task OnReceiveAssociationReleaseRequestAsync()
{
await DataMaintenanceAsaync();
//记录监控
var _SCPImageUploadRepository = _serviceProvider.GetService<IRepository<SCPImageUpload>>();
_upload.EndTime = DateTime.Now;
_upload.StudyCount = _SCPStudyIdList.Count;
_upload.TrialId = _trialId;
_upload.TrialSiteId = _trialSiteId;
await _SCPImageUploadRepository.AddAsync(_upload, true);
var _studyRepository = _serviceProvider.GetService<IRepository<SCPStudy>>();
//将检查设置为传输结束
await _studyRepository.BatchUpdateNoTrackingAsync(t => _SCPStudyIdList.Contains(t.Id), u => new SCPStudy() { IsUploadFinished = true });
await _studyRepository.SaveChangesAndClearAllTrackingAsync();
await SendAssociationReleaseResponseAsync();
}
private async Task DataMaintenanceAsaync()
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE}传输结束开始维护数据处理检查Modality");
//处理检查Modality
var _dictionaryRepository = _serviceProvider.GetService<IRepository<Dictionary>>();
var _seriesRepository = _serviceProvider.GetService<IRepository<SCPSeries>>();
var _studyRepository = _serviceProvider.GetService<IRepository<SCPStudy>>();
var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList();
var seriesModalityList = _seriesRepository.Where(t => _SCPStudyIdList.Contains(t.StudyId)).Select(t => new { SCPStudyId = t.StudyId, t.Modality }).ToList();
foreach (var g in seriesModalityList.GroupBy(t => t.SCPStudyId))
{
var modality = string.Join('、', g.Select(t => t.Modality).Distinct().ToList());
//特殊逻辑
var modalityForEdit = dicModalityList.Contains(modality) ? modality : String.Empty;
if (modality == "MR")
{
modalityForEdit = "MRI";
}
if (modality == "PT")
{
modalityForEdit = "PET";
}
if (modality == "PT、CT" || modality == "CT、PT")
{
modalityForEdit = "PET-CT";
}
await _studyRepository.BatchUpdateNoTrackingAsync(t => t.Id == g.Key, u => new SCPStudy() { Modalities = modality, ModalityForEdit = modalityForEdit });
}
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE}维护数据结束");
}
public void OnReceiveAbort(DicomAbortSource source, DicomAbortReason reason)
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE}接收中断,中断原因:{source.ToString() + reason.ToString()}");
/* nothing to do here */
}
public async void OnConnectionClosed(Exception exception)
{
/* nothing to do here */
//奇怪的bug 上传的时候用王捷修改的影像会关闭重新连接导致检查id 丢失,然后状态不一致
if (exception == null)
{
//var _studyRepository = _serviceProvider.GetService<IRepository<SCPStudy>>();
////将检查设置为传输结束
//await _studyRepository.BatchUpdateNoTrackingAsync(t => _SCPStudyIdList.Contains(t.Id), u => new SCPStudy() { IsUploadFinished = true });
//await _studyRepository.SaveChangesAndClearAllTrackingAsync();
}
Log.Logger.Warning($"连接关闭 {exception?.Message} {exception?.InnerException?.Message}");
}
public async Task<DicomCStoreResponse> OnCStoreRequestAsync(DicomCStoreRequest request)
{
string studyInstanceUid = request.Dataset.GetString(DicomTag.StudyInstanceUID);
string seriesInstanceUid = request.Dataset.GetString(DicomTag.SeriesInstanceUID);
string sopInstanceUid = request.Dataset.GetString(DicomTag.SOPInstanceUID);
//Guid studyId = IdentifierHelper.CreateGuid(studyInstanceUid, trialId.ToString());
Guid seriesId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, _trialId.ToString());
Guid instanceId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, sopInstanceUid, _trialId.ToString());
var ossService = _serviceProvider.GetService<IOSSService>();
var dicomArchiveService = _serviceProvider.GetService<IDicomArchiveService>();
var _seriesRepository = _serviceProvider.GetService<IRepository<SCPSeries>>();
var _distributedLockProvider = _serviceProvider.GetService<IDistributedLockProvider>();
var storeRelativePath = string.Empty;
var ossFolderPath = $"{_trialId}/Image/PACS/{_trialSiteId}/{studyInstanceUid}";
long fileSize = 0;
try
{
using (MemoryStream ms = new MemoryStream())
{
await request.File.SaveAsync(ms);
//irc 从路径最后一截取Guid
storeRelativePath = await ossService.UploadToOSSAsync(ms, ossFolderPath, instanceId.ToString(), false);
fileSize = ms.Length;
}
Log.Logger.Information($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} {request.SOPInstanceUID} 上传完成 ");
}
catch (Exception ec)
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 上传异常 {ec.Message}");
}
var @lock = _distributedLockProvider.CreateLock($"{studyInstanceUid}");
using (await @lock.AcquireAsync())
{
try
{
var scpStudyId = await dicomArchiveService.ArchiveDicomFileAsync(request.Dataset, _trialId, _trialSiteId, storeRelativePath, Association.CallingAE, Association.CalledAE,fileSize);
if (!_SCPStudyIdList.Contains(scpStudyId))
{
_SCPStudyIdList.Add(scpStudyId);
}
var series = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
//没有缩略图
if (series != null && string.IsNullOrEmpty(series.ImageResizePath))
{
// 生成缩略图
using (var memoryStream = new MemoryStream())
{
DicomImage image = new DicomImage(request.Dataset);
var sharpimage = image.RenderImage().AsSharpImage();
sharpimage.Save(memoryStream, new JpegEncoder());
// 上传缩略图到 OSS
var seriesPath = await ossService.UploadToOSSAsync(memoryStream, ossFolderPath, seriesId.ToString() + ".preview.jpg", false);
Console.WriteLine(seriesPath + " Id: " + seriesId);
series.ImageResizePath = seriesPath;
}
}
await _seriesRepository.SaveChangesAsync();
}
catch (Exception ex)
{
Log.Logger.Warning($"CallingAE:{Association.CallingAE} CalledAE:{Association.CalledAE} 传输处理异常:{ex.ToString()}");
}
}
//监控信息设置
_upload.FileCount++;
_upload.FileSize = _upload.FileSize + fileSize;
return new DicomCStoreResponse(request, DicomStatus.Success);
}
public Task OnCStoreRequestExceptionAsync(string tempFileName, Exception e)
{
// let library handle logging and error response
return Task.CompletedTask;
}
public Task<DicomCEchoResponse> OnCEchoRequestAsync(DicomCEchoRequest request)
{
return Task.FromResult(new DicomCEchoResponse(request, DicomStatus.Success));
}
}
}

View File

@ -0,0 +1,356 @@
using IRaCIS.Core.Domain.Share;
using System.Text;
using Microsoft.AspNetCore.Hosting;
using IRaCIS.Core.Infrastructure;
using Medallion.Threading;
using FellowOakDicom;
using FellowOakDicom.Imaging.Codec;
using System.Data;
using IRaCIS.Core.Domain.Models;
using FellowOakDicom.Network;
using IRaCIS.Core.SCP.Service;
using IRaCIS.Core.Infra.EFCore;
using MassTransit;
using System.Runtime.Intrinsics.X86;
using Serilog.Sinks.File;
namespace IRaCIS.Core.SCP.Service
{
public class DicomArchiveService : BaseService, IDicomArchiveService
{
private readonly IRepository<SCPPatient> _patientRepository;
private readonly IRepository<SCPStudy> _studyRepository;
private readonly IRepository<SCPSeries> _seriesRepository;
private readonly IRepository<SCPInstance> _instanceRepository;
private readonly IRepository<Dictionary> _dictionaryRepository;
private readonly IDistributedLockProvider _distributedLockProvider;
private List<Guid> _instanceIdList = new List<Guid>();
public DicomArchiveService(IRepository<SCPPatient> patientRepository, IRepository<SCPStudy> studyRepository,
IRepository<SCPSeries> seriesRepository,
IRepository<SCPInstance> instanceRepository,
IRepository<Dictionary> dictionaryRepository,
IDistributedLockProvider distributedLockProvider)
{
_distributedLockProvider = distributedLockProvider;
_studyRepository = studyRepository;
_patientRepository = patientRepository;
_seriesRepository = seriesRepository;
_instanceRepository = instanceRepository;
_dictionaryRepository = dictionaryRepository;
}
/// <summary>
/// 单个文件接收 归档
/// </summary>
/// <param name="dataset"></param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public async Task<Guid> ArchiveDicomFileAsync(DicomDataset dataset, Guid trialId, Guid trialSiteId, string fileRelativePath, string callingAE, string calledAE,long fileSize)
{
string studyInstanceUid = dataset.GetString(DicomTag.StudyInstanceUID);
string seriesInstanceUid = dataset.GetString(DicomTag.SeriesInstanceUID);
string sopInstanceUid = dataset.GetString(DicomTag.SOPInstanceUID);
string patientIdStr = dataset.GetSingleValueOrDefault(DicomTag.PatientID,string.Empty);
//Guid patientId= IdentifierHelper.CreateGuid(patientIdStr);
Guid studyId = IdentifierHelper.CreateGuid(studyInstanceUid,trialId.ToString());
Guid seriesId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, trialId.ToString());
Guid instanceId = IdentifierHelper.CreateGuid(studyInstanceUid, seriesInstanceUid, sopInstanceUid, trialId.ToString());
var isStudyNeedAdd = false;
var isSeriesNeedAdd = false;
var isInstanceNeedAdd = false;
var isPatientNeedAdd = false;
//var @lock = _distributedLockProvider.CreateLock($"{studyInstanceUid}");
//using (@lock.Acquire())
{
var findPatient = await _patientRepository.FirstOrDefaultAsync(t => t.PatientIdStr == patientIdStr && t.TrialSiteId==trialSiteId );
var findStudy = await _studyRepository.FirstOrDefaultAsync(t=>t.Id== studyId);
var findSerice = await _seriesRepository.FirstOrDefaultAsync(t => t.Id == seriesId);
var findInstance = await _instanceRepository.FirstOrDefaultAsync(t => t.Id == instanceId);
DateTime? studyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.StudyDate).Add(dataset.GetSingleValueOrDefault(DicomTag.StudyTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.StudyTime).TimeOfDay);
//先传输了修改了患者编号的又传输了没有修改患者编号的导致后传输的没有修改患者编号的下面的检查为0
if (findPatient == null && findStudy==null)
{
isPatientNeedAdd = true;
findPatient = new SCPPatient()
{
Id = NewId.NextSequentialGuid(),
TrialId=trialId,
TrialSiteId=trialSiteId,
PatientIdStr = dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty),
PatientName = dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty),
PatientAge = dataset.GetSingleValueOrDefault(DicomTag.PatientAge, string.Empty),
PatientSex = dataset.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty),
PatientBirthDate = dataset.GetSingleValueOrDefault(DicomTag.PatientBirthDate, string.Empty),
EarliestStudyTime = studyTime,
LatestStudyTime = studyTime,
LatestPushTime = DateTime.Now,
};
if (findPatient.PatientBirthDate.Length == 8)
{
var birthDateStr = $"{findPatient.PatientBirthDate[0]}{findPatient.PatientBirthDate[1]}{findPatient.PatientBirthDate[2]}{findPatient.PatientBirthDate[3]}-{findPatient.PatientBirthDate[4]}{findPatient.PatientBirthDate[5]}-{findPatient.PatientBirthDate[6]}{findPatient.PatientBirthDate[7]}";
var yearStr = $"{findPatient.PatientBirthDate[0]}{findPatient.PatientBirthDate[1]}{findPatient.PatientBirthDate[2]}{findPatient.PatientBirthDate[3]}";
int year = 0;
var canParse = int.TryParse(yearStr, out year);
if (canParse && year > 1900)
{
findPatient.PatientBirthDate = birthDateStr;
DateTime birthDate;
if (findPatient.PatientAge == string.Empty && studyTime.HasValue && DateTime.TryParse(findPatient.PatientBirthDate,out birthDate))
{
var patientAge = studyTime.Value.Year - birthDate.Year;
// 如果生日还未到,年龄减去一岁
if (studyTime.Value < birthDate.AddYears(patientAge))
{
patientAge--;
}
findPatient.PatientAge = patientAge.ToString();
}
}
else
{
findPatient.PatientBirthDate = string.Empty;
}
}
}
else
{
if (studyTime < findPatient.EarliestStudyTime)
{
findPatient.EarliestStudyTime = studyTime;
}
if (studyTime > findPatient.LatestStudyTime)
{
findPatient.LatestStudyTime = studyTime;
}
findPatient.LatestPushTime = DateTime.Now;
}
if (findStudy == null)
{
isStudyNeedAdd = true;
findStudy = new SCPStudy
{
CalledAE = calledAE,
CallingAE = callingAE,
PatientId = findPatient.Id,
Id = studyId,
TrialId = trialId,
TrialSiteId = trialSiteId,
StudyInstanceUid = studyInstanceUid,
StudyTime = studyTime,
Modalities = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty),
//ModalityForEdit = modalityForEdit,
Description = dataset.GetSingleValueOrDefault(DicomTag.StudyDescription, string.Empty),
InstitutionName = dataset.GetSingleValueOrDefault(DicomTag.InstitutionName, string.Empty),
PatientIdStr = dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty),
PatientName = dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty),
PatientAge = dataset.GetSingleValueOrDefault(DicomTag.PatientAge, string.Empty),
PatientSex = dataset.GetSingleValueOrDefault(DicomTag.PatientSex, string.Empty),
BodyPartExamined = dataset.GetSingleValueOrDefault(DicomTag.BodyPartExamined, string.Empty),
StudyId = dataset.GetSingleValueOrDefault(DicomTag.StudyID, string.Empty),
AccessionNumber = dataset.GetSingleValueOrDefault(DicomTag.AccessionNumber, string.Empty),
//需要特殊处理
PatientBirthDate = dataset.GetSingleValueOrDefault(DicomTag.PatientBirthDate, string.Empty),
AcquisitionTime = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionTime, string.Empty),
AcquisitionNumber = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionNumber, string.Empty),
TriggerTime = dataset.GetSingleValueOrDefault(DicomTag.TriggerTime, string.Empty),
//IsDoubleReview = addtionalInfo.IsDoubleReview,
SeriesCount = 0,
InstanceCount = 0
};
if (findStudy.PatientBirthDate.Length == 8)
{
findStudy.PatientBirthDate = $"{findStudy.PatientBirthDate[0]}{findStudy.PatientBirthDate[1]}{findStudy.PatientBirthDate[2]}{findStudy.PatientBirthDate[3]}-{findStudy.PatientBirthDate[4]}{findStudy.PatientBirthDate[5]}-{findStudy.PatientBirthDate[6]}{findStudy.PatientBirthDate[7]}";
}
}
if (findSerice == null)
{
isSeriesNeedAdd = true;
findSerice = new SCPSeries
{
Id = seriesId,
StudyId = findStudy.Id,
StudyInstanceUid = findStudy.StudyInstanceUid,
SeriesInstanceUid = seriesInstanceUid,
SeriesNumber = dataset.GetSingleValueOrDefault(DicomTag.SeriesNumber, 1),
//SeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, DateTime.Now).Add(dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, DateTime.Now).TimeOfDay),
//SeriesTime = DateTime.TryParse(dataset.GetSingleValue<string>(DicomTag.SeriesDate) + dataset.GetSingleValue<string>(DicomTag.SeriesTime), out DateTime dt) ? dt : null,
SeriesTime = dataset.GetSingleValueOrDefault(DicomTag.SeriesDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.SeriesDate).Add(dataset.GetSingleValueOrDefault(DicomTag.SeriesTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.SeriesTime).TimeOfDay),
Modality = dataset.GetSingleValueOrDefault(DicomTag.Modality, string.Empty),
Description = dataset.GetSingleValueOrDefault(DicomTag.SeriesDescription, string.Empty),
SliceThickness = dataset.GetSingleValueOrDefault(DicomTag.SliceThickness, string.Empty),
ImagePositionPatient = dataset.GetSingleValueOrDefault(DicomTag.ImagePositionPatient, string.Empty),
ImageOrientationPatient = dataset.GetSingleValueOrDefault(DicomTag.ImageOrientationPatient, string.Empty),
BodyPartExamined = dataset.GetSingleValueOrDefault(DicomTag.BodyPartExamined, string.Empty),
SequenceName = dataset.GetSingleValueOrDefault(DicomTag.SequenceName, string.Empty),
ProtocolName = dataset.GetSingleValueOrDefault(DicomTag.ProtocolName, string.Empty),
ImagerPixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty),
AcquisitionTime = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionTime, string.Empty),
AcquisitionNumber = dataset.GetSingleValueOrDefault(DicomTag.AcquisitionNumber, string.Empty),
TriggerTime = dataset.GetSingleValueOrDefault(DicomTag.TriggerTime, string.Empty),
InstanceCount = 0
};
++findStudy.SeriesCount;
}
if (findInstance == null)
{
isInstanceNeedAdd = true;
findInstance = new SCPInstance
{
Id = instanceId,
StudyId = findStudy.Id,
SeriesId = findSerice.Id,
StudyInstanceUid = findStudy.StudyInstanceUid,
SeriesInstanceUid = findSerice.SeriesInstanceUid,
SopInstanceUid = sopInstanceUid,
InstanceNumber = dataset.GetSingleValueOrDefault(DicomTag.InstanceNumber, 1),
InstanceTime = dataset.GetSingleValueOrDefault(DicomTag.ContentDate, string.Empty) == string.Empty ? null : dataset.GetSingleValue<DateTime>(DicomTag.ContentDate).Add(dataset.GetSingleValueOrDefault(DicomTag.ContentTime, string.Empty) == string.Empty ? TimeSpan.Zero : dataset.GetSingleValue<DateTime>(DicomTag.ContentTime).TimeOfDay),
//InstanceTime = DateTime.TryParse(dataset.GetSingleValue<string>(DicomTag.ContentDate) + dataset.GetSingleValue<string>(DicomTag.ContentTime), out DateTime dt) ? dt : null,
//InstanceTime = dataset.GetSingleValueOrDefault(DicomTag.ContentDate,(DateTime?)null)?.Add(dataset.GetSingleValueOrDefault(DicomTag.ContentTime, TimeSpan.Zero)),
//dataset.GetSingleValueOrDefault(DicomTag.ContentDate,DateTime.Now);//, DicomTag.ContentTime)
CPIStatus = false,
ImageRows = dataset.GetSingleValueOrDefault(DicomTag.Rows, 0),
ImageColumns = dataset.GetSingleValueOrDefault(DicomTag.Columns, 0),
SliceLocation = dataset.GetSingleValueOrDefault(DicomTag.SliceLocation, 0),
SliceThickness = dataset.GetSingleValueOrDefault(DicomTag.SliceThickness, string.Empty),
NumberOfFrames = dataset.GetSingleValueOrDefault(DicomTag.NumberOfFrames, 0),
PixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.PixelSpacing, string.Empty),
ImagerPixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty),
FrameOfReferenceUID = dataset.GetSingleValueOrDefault(DicomTag.FrameOfReferenceUID, string.Empty),
WindowCenter = dataset.GetSingleValueOrDefault(DicomTag.WindowCenter, string.Empty),
WindowWidth = dataset.GetSingleValueOrDefault(DicomTag.WindowWidth, string.Empty),
Path = fileRelativePath,
FileSize= fileSize,
};
++findStudy.InstanceCount;
++findSerice.InstanceCount;
}
if (isPatientNeedAdd)
{
var ss = await _patientRepository.AddAsync(findPatient);
}
if (isStudyNeedAdd)
{
var dd = await _studyRepository.AddAsync(findStudy);
}
else
{
await _studyRepository.BatchUpdateNoTrackingAsync(t => t.Id == findStudy.Id, t => new SCPStudy() { IsUploadFinished = false });
}
if (isSeriesNeedAdd)
{
await _seriesRepository.AddAsync(findSerice);
}
if (isInstanceNeedAdd)
{
await _instanceRepository.AddAsync(findInstance);
}
else
{
await _instanceRepository.BatchUpdateNoTrackingAsync(t => t.Id == instanceId, u => new SCPInstance() { Path = fileRelativePath,FileSize=fileSize });
}
await _studyRepository.SaveChangesAsync();
return findStudy.Id;
}
}
// 从DICOM文件中获取使用的字符集
private string GetEncodingVaulueFromDicomFile(DicomDataset dataset, DicomTag dicomTag)
{
// 获取DICOM文件的特定元素通常用于指示使用的字符集
var charset = dataset.GetSingleValueOrDefault(DicomTag.SpecificCharacterSet, string.Empty);
var dicomEncoding = DicomEncoding.GetEncoding(charset);
var dicomStringElement = dataset.GetDicomItem<DicomStringElement>(dicomTag);
var bytes = dicomStringElement.Buffer.Data;
return dicomEncoding.GetString(bytes);
//// 从DICOM文件中获取使用的字符集
//string filePath = "C:\\Users\\hang\\Documents\\WeChat Files\\wxid_r2imdzb7j3q922\\FileStorage\\File\\2024-05\\1.2.840.113619.2.80.169103990.5390.1271401378.4.dcm";
//DicomFile dicomFile = DicomFile.Open(filePath);
//// 获取DICOM文件的特定元素通常用于指示使用的字符集
//var charset = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.SpecificCharacterSet, string.Empty);
//var dicomEncoding = DicomEncoding.GetEncoding(charset);
//var value = dicomFile.Dataset.GetSingleValueOrDefault(DicomTag.PatientName, string.Empty);
//var dicomStringElement = dicomFile.Dataset.GetDicomItem<DicomStringElement>(DicomTag.PatientName);
//var bytes = dicomStringElement.Buffer.Data;
//var aa= dicomEncoding.GetString(bytes);
}
}
}

View File

@ -0,0 +1,11 @@
using FellowOakDicom;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion.Internal;
namespace IRaCIS.Core.SCP.Service
{
public interface IDicomArchiveService
{
Task<Guid> ArchiveDicomFileAsync(DicomDataset dicomDataset,Guid trialId,Guid trialSiteId, string fileRelativePath,string callingAE,string calledAE,long fileSize);
}
}

View File

@ -0,0 +1,770 @@
using AlibabaCloud.SDK.Sts20150401;
using Aliyun.OSS;
using Amazon;
using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.SecurityToken;
using Amazon.SecurityToken.Model;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.NewtonsoftJson;
using MassTransit;
using Microsoft.Extensions.Options;
using Minio;
using Minio.DataModel.Args;
using System.Reactive.Linq;
using System.Runtime.InteropServices;
namespace IRaCIS.Core.SCP;
#region 绑定和返回模型
[LowerCamelCaseJson]
public class MinIOOptions : AWSOptions
{
public int Port { get; set; }
}
public class AWSOptions
{
public string EndPoint { get; set; }
public bool UseSSL { get; set; }
public string AccessKeyId { get; set; }
public string RoleArn { get; set; }
public string SecretAccessKey { get; set; }
public string BucketName { get; set; }
public string ViewEndpoint { get; set; }
public int DurationSeconds { get; set; }
public string Region { get; set; }
}
public class AliyunOSSOptions
{
public string RegionId { get; set; }
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string InternalEndpoint { get; set; }
public string EndPoint { get; set; }
public string BucketName { get; set; }
public string RoleArn { get; set; }
public string Region { get; set; }
public string ViewEndpoint { get; set; }
public int DurationSeconds { get; set; }
}
public class ObjectStoreServiceOptions
{
public string ObjectStoreUse { get; set; }
public AliyunOSSOptions AliyunOSS { get; set; }
public MinIOOptions MinIO { get; set; }
public AWSOptions AWS { get; set; }
}
public class ObjectStoreDTO
{
public string ObjectStoreUse { get; set; }
public AliyunOSSTempToken AliyunOSS { get; set; }
public MinIOOptions MinIO { get; set; }
public AWSTempToken AWS { get; set; }
}
[LowerCamelCaseJson]
public class AliyunOSSTempToken
{
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string EndPoint { get; set; }
public string BucketName { get; set; }
public string Region { get; set; }
public string ViewEndpoint { get; set; }
public string SecurityToken { get; set; }
public DateTime Expiration { get; set; }
}
[LowerCamelCaseJson]
public class AWSTempToken
{
public string Region { get; set; }
public string SessionToken { get; set; }
public string EndPoint { get; set; }
public string AccessKeyId { get; set; }
public string SecretAccessKey { get; set; }
public string BucketName { get; set; }
public string ViewEndpoint { get; set; }
public DateTime Expiration { get; set; }
}
public enum ObjectStoreUse
{
AliyunOSS = 0,
MinIO = 1,
AWS = 2,
}
#endregion
// aws 参考链接 https://github.com/awsdocs/aws-doc-sdk-examples/tree/main/dotnetv3/S3/S3_Basics
public interface IOSSService
{
public Task<string> UploadToOSSAsync(Stream fileStream, string oosFolderPath, string fileRealName, bool isFileNameAddGuid = true);
public Task<string> UploadToOSSAsync(string localFilePath, string oosFolderPath, bool isFileNameAddGuid = true);
public Task DownLoadFromOSSAsync(string ossRelativePath, string localFilePath);
public ObjectStoreServiceOptions ObjectStoreServiceOptions { get; set; }
public Task<string> GetSignedUrl(string ossRelativePath);
public Task DeleteFromPrefix(string prefix);
public ObjectStoreDTO GetObjectStoreTempToken();
}
public class OSSService : IOSSService
{
public ObjectStoreServiceOptions ObjectStoreServiceOptions { get; set; }
private AliyunOSSTempToken AliyunOSSTempToken { get; set; }
private AWSTempToken AWSTempToken { get; set; }
public OSSService(IOptionsMonitor<ObjectStoreServiceOptions> options)
{
ObjectStoreServiceOptions = options.CurrentValue;
}
/// <summary>
/// oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder
/// </summary>
/// <param name="fileStream"></param>
/// <param name="oosFolderPath"></param>
/// <param name="fileRealName"></param>
/// <param name="isFileNameAddGuid"></param>
/// <returns></returns>
public async Task<string> UploadToOSSAsync(Stream fileStream, string oosFolderPath, string fileRealName, bool isFileNameAddGuid = true)
{
GetObjectStoreTempToken();
var ossRelativePath = isFileNameAddGuid ? $"{oosFolderPath}/{Guid.NewGuid()}_{fileRealName}" : $"{oosFolderPath}/{fileRealName}";
try
{
using (var memoryStream = new MemoryStream())
{
fileStream.Seek(0, SeekOrigin.Begin);
fileStream.CopyTo(memoryStream);
memoryStream.Seek(0, SeekOrigin.Begin);
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// 上传文件
var result = _ossClient.PutObject(aliConfig.BucketName, ossRelativePath, memoryStream);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var putObjectArgs = new PutObjectArgs()
.WithBucket(minIOConfig.BucketName)
.WithObject(ossRelativePath)
.WithStreamData(memoryStream)
.WithObjectSize(memoryStream.Length);
await minioClient.PutObjectAsync(putObjectArgs);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
var putObjectRequest = new Amazon.S3.Model.PutObjectRequest()
{
BucketName = awsConfig.BucketName,
InputStream = memoryStream,
Key = ossRelativePath,
};
await amazonS3Client.PutObjectAsync(putObjectRequest);
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
}
catch (Exception ex)
{
throw new BusinessValidationFailedException($"上传发生异常:{ex.Message}");
}
return "/" + ossRelativePath;
}
/// <summary>
/// oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder
/// </summary>
/// <param name="localFilePath"></param>
/// <param name="oosFolderPath"></param>
/// <param name="isFileNameAddGuid"></param>
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
public async Task<string> UploadToOSSAsync(string localFilePath, string oosFolderPath, bool isFileNameAddGuid = true)
{
GetObjectStoreTempToken();
var localFileName = Path.GetFileName(localFilePath);
var ossRelativePath = isFileNameAddGuid ? $"{oosFolderPath}/{Guid.NewGuid()}_{localFileName}" : $"{oosFolderPath}/{localFileName}";
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// 上传文件
var result = _ossClient.PutObject(aliConfig.BucketName, ossRelativePath, localFilePath);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var putObjectArgs = new PutObjectArgs()
.WithBucket(minIOConfig.BucketName)
.WithObject(ossRelativePath)
.WithFileName(localFilePath);
await minioClient.PutObjectAsync(putObjectArgs);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
// 提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
var putObjectRequest = new Amazon.S3.Model.PutObjectRequest()
{
BucketName = awsConfig.BucketName,
FilePath = localFilePath,
Key = ossRelativePath,
};
await amazonS3Client.PutObjectAsync(putObjectRequest);
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
return "/" + ossRelativePath;
}
public async Task DownLoadFromOSSAsync(string ossRelativePath, string localFilePath)
{
GetObjectStoreTempToken();
ossRelativePath = ossRelativePath.TrimStart('/');
try
{
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// 上传文件
var result = _ossClient.GetObject(aliConfig.BucketName, ossRelativePath);
// 将下载的文件流保存到本地文件
using (var fs = File.OpenWrite(localFilePath))
{
result.Content.CopyTo(fs);
fs.Close();
}
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var getObjectArgs = new GetObjectArgs()
.WithBucket(minIOConfig.BucketName)
.WithObject(ossRelativePath)
.WithFile(localFilePath);
await minioClient.GetObjectAsync(getObjectArgs);
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
// 提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
var getObjectArgs = new Amazon.S3.Model.GetObjectRequest()
{
BucketName = awsConfig.BucketName,
Key = ossRelativePath,
};
await (await amazonS3Client.GetObjectAsync(getObjectArgs)).WriteResponseStreamToFileAsync(localFilePath, true, CancellationToken.None);
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
catch (Exception ex)
{
throw new BusinessValidationFailedException("oss下载失败!" + ex.Message);
}
}
public async Task<string> GetSignedUrl(string ossRelativePath)
{
GetObjectStoreTempToken();
ossRelativePath = ossRelativePath.TrimStart('/');
try
{
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
// 生成签名URL。
var req = new GeneratePresignedUriRequest(aliConfig.BucketName, ossRelativePath, SignHttpMethod.Get)
{
// 设置签名URL过期时间默认值为3600秒。
Expiration = DateTime.Now.AddHours(1),
};
var uri = _ossClient.GeneratePresignedUri(req);
return uri.PathAndQuery;
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var args = new PresignedGetObjectArgs()
.WithBucket(minIOConfig.BucketName)
.WithObject(ossRelativePath)
.WithExpiry(3600)
/*.WithHeaders(reqParams)*/;
var presignedUrl = await minioClient.PresignedGetObjectAsync(args);
Uri uri = new Uri(presignedUrl);
string relativePath = uri.PathAndQuery;
return relativePath;
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
// 提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
var presignedUrl = await amazonS3Client.GetPreSignedURLAsync(new GetPreSignedUrlRequest()
{
BucketName = awsConfig.BucketName,
Key = ossRelativePath,
Expires = DateTime.UtcNow.AddMinutes(120)
});
Uri uri = new Uri(presignedUrl);
string relativePath = uri.PathAndQuery;
return relativePath;
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
catch (Exception ex)
{
throw new BusinessValidationFailedException("oss授权url失败!" + ex.Message);
}
}
/// <summary>
/// 删除某个目录的文件
/// </summary>
/// <param name="prefix"></param>
/// <returns></returns>
public async Task DeleteFromPrefix(string prefix)
{
GetObjectStoreTempToken();
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.EndPoint : aliConfig.InternalEndpoint, AliyunOSSTempToken.AccessKeyId, AliyunOSSTempToken.AccessKeySecret, AliyunOSSTempToken.SecurityToken);
try
{
ObjectListing objectListing = null;
string nextMarker = null;
do
{
// 使用 prefix 模拟目录结构,设置 MaxKeys 和 NextMarker
objectListing = _ossClient.ListObjects(new Aliyun.OSS.ListObjectsRequest(aliConfig.BucketName)
{
Prefix = prefix,
MaxKeys = 1000,
Marker = nextMarker
});
List<string> keys = objectListing.ObjectSummaries.Select(t => t.Key).ToList();
// 删除获取到的文件
if (keys.Count > 0)
{
_ossClient.DeleteObjects(new Aliyun.OSS.DeleteObjectsRequest(aliConfig.BucketName, keys, false));
}
// 设置 NextMarker 以获取下一页的数据
nextMarker = objectListing.NextMarker;
} while (objectListing.IsTruncated);
}
catch (Exception ex)
{
Console.WriteLine($"Error: {ex.Message}");
}
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
var minIOConfig = ObjectStoreServiceOptions.MinIO;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.EndPoint}:{minIOConfig.Port}")
.WithCredentials(minIOConfig.AccessKeyId, minIOConfig.SecretAccessKey).WithSSL(minIOConfig.UseSSL)
.Build();
var listArgs = new ListObjectsArgs().WithBucket(minIOConfig.BucketName).WithPrefix(prefix).WithRecursive(true);
// 创建一个空列表用于存储对象键
var objects = new List<string>();
// 使用 await foreach 来异步迭代对象列表
await foreach (var item in minioClient.ListObjectsEnumAsync(listArgs))
{
objects.Add(item.Key);
}
if (objects.Count > 0)
{
var objArgs = new RemoveObjectsArgs()
.WithBucket(minIOConfig.BucketName)
.WithObjects(objects);
// 删除对象
await minioClient.RemoveObjectsAsync(objArgs);
}
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsConfig = ObjectStoreServiceOptions.AWS;
// 提供awsAccessKeyId和awsSecretAccessKey构造凭证
var credentials = new SessionAWSCredentials(AWSTempToken.AccessKeyId, AWSTempToken.SecretAccessKey, AWSTempToken.SessionToken);
//提供awsEndPoint域名进行访问配置
var clientConfig = new AmazonS3Config
{
RegionEndpoint = RegionEndpoint.USEast1,
UseHttp = true,
};
var amazonS3Client = new AmazonS3Client(credentials, clientConfig);
// 列出指定前缀下的所有对象
var listObjectsRequest = new ListObjectsV2Request
{
BucketName = awsConfig.BucketName,
Prefix = prefix
};
var listObjectsResponse = await amazonS3Client.ListObjectsV2Async(listObjectsRequest);
if (listObjectsResponse.S3Objects.Count > 0)
{
// 准备删除请求
var deleteObjectsRequest = new Amazon.S3.Model.DeleteObjectsRequest
{
BucketName = awsConfig.BucketName,
Objects = new List<KeyVersion>()
};
foreach (var s3Object in listObjectsResponse.S3Objects)
{
deleteObjectsRequest.Objects.Add(new KeyVersion
{
Key = s3Object.Key
});
}
// 批量删除对象
var deleteObjectsResponse = await amazonS3Client.DeleteObjectsAsync(deleteObjectsRequest);
}
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
public ObjectStoreDTO GetObjectStoreTempToken()
{
var ossOptions = ObjectStoreServiceOptions.AliyunOSS;
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var client = new Client(new AlibabaCloud.OpenApiClient.Models.Config()
{
AccessKeyId = ossOptions.AccessKeyId,
AccessKeySecret = ossOptions.AccessKeySecret,
//AccessKeyId = "LTAI5tJV76pYX5yPg1N9QVE8",
//AccessKeySecret = "roRNLa9YG1of4pYruJGCNKBXEWTAWa",
Endpoint = "sts.cn-hangzhou.aliyuncs.com"
});
var assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest();
// 将<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称例如oss-role-session。
assumeRoleRequest.RoleSessionName = $"session-name-{NewId.NextGuid()}";
// 将<YOUR_ROLE_ARN>替换为拥有上传文件到指定OSS Bucket权限的RAM角色的ARN。
assumeRoleRequest.RoleArn = ossOptions.RoleArn;
//assumeRoleRequest.RoleArn = "acs:ram::1899121822495495:role/webdirect";
assumeRoleRequest.DurationSeconds = ossOptions.DurationSeconds;
var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
var response = client.AssumeRoleWithOptions(assumeRoleRequest, runtime);
var credentials = response.Body.Credentials;
var tempToken = new AliyunOSSTempToken()
{
AccessKeyId = credentials.AccessKeyId,
AccessKeySecret = credentials.AccessKeySecret,
//转为服务器时区,最后统一转为客户端时区
Expiration = TimeZoneInfo.ConvertTimeFromUtc(DateTime.Parse(credentials.Expiration), TimeZoneInfo.Local),
SecurityToken = credentials.SecurityToken,
Region = ossOptions.Region,
BucketName = ossOptions.BucketName,
EndPoint = ossOptions.EndPoint,
ViewEndpoint = ossOptions.ViewEndpoint,
};
AliyunOSSTempToken = tempToken;
return new ObjectStoreDTO() { ObjectStoreUse = ObjectStoreServiceOptions.ObjectStoreUse, AliyunOSS = tempToken };
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "MinIO")
{
return new ObjectStoreDTO() { ObjectStoreUse = ObjectStoreServiceOptions.ObjectStoreUse, MinIO = ObjectStoreServiceOptions.MinIO };
}
else if (ObjectStoreServiceOptions.ObjectStoreUse == "AWS")
{
var awsOptions = ObjectStoreServiceOptions.AWS;
//aws 临时凭证
// 创建 STS 客户端
var stsClient = new AmazonSecurityTokenServiceClient(awsOptions.AccessKeyId, awsOptions.SecretAccessKey);
// 使用 AssumeRole 请求临时凭证
var assumeRoleRequest = new AssumeRoleRequest
{
RoleArn = awsOptions.RoleArn, // 角色 ARN
RoleSessionName = $"session-name-{NewId.NextGuid()}",
DurationSeconds = awsOptions.DurationSeconds // 临时凭证有效期
};
var assumeRoleResponse = stsClient.AssumeRoleAsync(assumeRoleRequest).Result;
var credentials = assumeRoleResponse.Credentials;
var tempToken = new AWSTempToken()
{
AccessKeyId = credentials.AccessKeyId,
SecretAccessKey = credentials.SecretAccessKey,
SessionToken = credentials.SessionToken,
Expiration = credentials.Expiration,
Region = awsOptions.Region,
BucketName = awsOptions.BucketName,
EndPoint = awsOptions.EndPoint,
ViewEndpoint = awsOptions.ViewEndpoint,
};
AWSTempToken = tempToken;
return new ObjectStoreDTO() { ObjectStoreUse = ObjectStoreServiceOptions.ObjectStoreUse, AWS = tempToken };
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
}

View File

@ -0,0 +1,37 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS",
"AliyunOSS": {
"RegionId": "cn-shanghai",
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
"AccessKeyId": "LTAI5tNRTsqL6aWmHkDmTwoH",
"AccessKeySecret": "7mtGz3qrYWI6JMMBZiLeC119VWicZH",
"RoleArn": "acs:ram::1899121822495495:role/irc-oss-access",
"BucketName": "zy-irc-store",
"ViewEndpoint": "https://zy-irc-cache.oss-cn-shanghai.aliyuncs.com",
"Region": "oss-cn-shanghai",
"DurationSeconds": 7200
}
},
"ConnectionStrings": {
"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
},
"DicomSCPServiceConfig": {
"CalledAEList": [
"STORESCP"
],
"ServerPort": 11112
}
}

View File

@ -0,0 +1,48 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS",
"AliyunOSS": {
"RegionId": "cn-shanghai",
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
"AccessKeyId": "LTAI5tRRZehUp2V9pyTPtAJm",
"AccessKeySecret": "FLizxkHsMm4CGYHtkV8E3PNJJZU7oV",
"RoleArn": "acs:ram::1899121822495495:role/dev-oss-access",
"BucketName": "zy-irc-test-store",
"ViewEndpoint": "https://zy-irc-test-store.oss-cn-shanghai.aliyuncs.com",
"Region": "oss-cn-shanghai",
"DurationSeconds": 7200
},
"MinIO": {
"endPoint": "106.14.89.110",
"port": "9001",
"useSSL": false,
"accessKey": "fbStsVYCIPKHQneeqMwD",
"secretKey": "TzgvyA3zGXMUnpilJNUlyMYHfosl1hBMl6lxPmjy",
"bucketName": "hir-test",
"viewEndpoint": "http://106.14.89.110:9001/hir-test/"
}
},
"ConnectionStrings": {
"RemoteNew": "Server=106.14.89.110,1435;Database=Test_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=106.14.89.110,1435;Database=Test_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"DicomSCPServiceConfig": {
"CalledAEList": [
"STORESCP"
],
"ServerPort": 11112
}
}

View File

@ -0,0 +1,34 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ObjectStoreService": {
"ObjectStoreUse": "AWS",
"AWS": {
"Region": "us-east-1",
"EndPoint": "s3.us-east-1.amazonaws.com",
"UseSSL": true,
"RoleArn": "arn:aws:iam::471112624751:role/lili_s3_access",
"AccessKeyId": "AKIAW3MEAFJXZ2TZK7GM",
"SecretAccessKey": "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",
"BucketName": "ei-med-s3-lili-store",
"ViewEndpoint": "https://ei-med-s3-lili-store.s3.amazonaws.com",
"DurationSeconds": 7200
}
},
"ConnectionStrings": {
"RemoteNew": "Server=us-mssql-prod,1433;Database=US_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=us-mssql-prod,1433;Database=US_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"DicomSCPServiceConfig": {
"CalledAEList": [
"STORESCP"
],
"ServerPort": 11112
}
}

View File

@ -0,0 +1,34 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ObjectStoreService": {
"ObjectStoreUse": "AWS",
"AWS": {
"Region": "us-east-1",
"EndPoint": "s3.us-east-1.amazonaws.com",
"UseSSL": true,
"RoleArn": "arn:aws:iam::471112624751:role/uat_s3_access",
"AccessKeyId": "AKIAW3MEAFJX7IPXISP4",
"SecretAccessKey": "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",
"BucketName": "ei-med-s3-lili-uat-store",
"ViewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com/",
"DurationSeconds": 7200
}
},
"ConnectionStrings": {
"RemoteNew": "Server=us-mssql-service,1433;Database=US_Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=us-mssql-service,1433;Database=US_Uat_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"DicomSCPServiceConfig": {
"CalledAEList": [
"STORESCP"
],
"ServerPort": 11112
}
}

View File

@ -0,0 +1,35 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS",
"AliyunOSS": {
"RegionId": "cn-shanghai",
"InternalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"EndPoint": "https://oss-cn-shanghai.aliyuncs.com",
"AccessKeyId": "LTAI5tFUCCmz5TwghZHsj45Y",
"AccessKeySecret": "8evrBy1fVfzJG25i67Jm0xqn9Xcw2T",
"RoleArn": "acs:ram::1078130221702011:role/uat-oss-access",
"BucketName": "tl-med-irc-uat-store",
"ViewEndpoint": "https://tl-med-irc-uat-store.oss-cn-shanghai.aliyuncs.com",
"Region": "oss-cn-shanghai",
"DurationSeconds": 7200
}
},
"ConnectionStrings": {
"RemoteNew": "Server=101.132.253.119,1435;Database=Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server101.132.253.119,1435;Database=Uat_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"DicomSCPServiceConfig": {
"CalledAEList": [
"STORESCP"
],
"ServerPort": 11112
}
}

View File

@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

View File

@ -17,6 +17,10 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Infra.EFCore",
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Infrastructure", "IRaCIS.Core.Infrastructure\IRaCIS.Core.Infrastructure.csproj", "{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRC.Core.SCP", "IRC.Core.SCP\IRC.Core.SCP.csproj", "{ECD08F47-DC1A-484E-BB91-6CDDC8823CC5}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IRC.Core.Dicom", "IRC.Core.Dicom\IRC.Core.Dicom.csproj", "{0545F0A5-D97B-4A47-92A6-A8A02A181322}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -51,6 +55,14 @@ Global
{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Debug|Any CPU.Build.0 = Debug|Any CPU
{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|Any CPU.ActiveCfg = Release|Any CPU
{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|Any CPU.Build.0 = Release|Any CPU
{ECD08F47-DC1A-484E-BB91-6CDDC8823CC5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{ECD08F47-DC1A-484E-BB91-6CDDC8823CC5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{ECD08F47-DC1A-484E-BB91-6CDDC8823CC5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{ECD08F47-DC1A-484E-BB91-6CDDC8823CC5}.Release|Any CPU.Build.0 = Release|Any CPU
{0545F0A5-D97B-4A47-92A6-A8A02A181322}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0545F0A5-D97B-4A47-92A6-A8A02A181322}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0545F0A5-D97B-4A47-92A6-A8A02A181322}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0545F0A5-D97B-4A47-92A6-A8A02A181322}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -1,99 +0,0 @@
using System;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using Microsoft.EntityFrameworkCore;
namespace EFSaving.Concurrency
{
public class Sample
{
public static void Run()
{
// Ensure database is created and has a person in it
using (var setupContext = new PersonContext())
{
setupContext.Database.EnsureDeleted();
setupContext.Database.EnsureCreated();
setupContext.People.Add(new Person { FirstName = "John", LastName = "Doe" });
setupContext.SaveChanges();
}
#region ConcurrencyHandlingCode
using var context = new PersonContext();
// Fetch a person from database and change phone number
var person = context.People.Single(p => p.PersonId == 1);
person.PhoneNumber = "555-555-5555";
// Change the person's name in the database to simulate a concurrency conflict
context.Database.ExecuteSqlRaw(
"UPDATE dbo.People SET FirstName = 'Jane' WHERE PersonId = 1");
var saved = false;
while (!saved)
{
try
{
// Attempt to save changes to the database
context.SaveChanges();
saved = true;
}
catch (DbUpdateConcurrencyException ex)
{
foreach (var entry in ex.Entries)
{
if (entry.Entity is Person)
{
var proposedValues = entry.CurrentValues;
var databaseValues = entry.GetDatabaseValues();
foreach (var property in proposedValues.Properties)
{
var proposedValue = proposedValues[property];
var databaseValue = databaseValues[property];
// TODO: decide which value should be written to database
// proposedValues[property] = <value to be saved>;
}
// Refresh original values to bypass next concurrency check
entry.OriginalValues.SetValues(databaseValues);
}
else
{
throw new NotSupportedException(
"Don't know how to handle concurrency conflicts for "
+ entry.Metadata.Name);
}
}
}
}
#endregion
}
public class PersonContext : DbContext
{
public DbSet<Person> People { get; set; }
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
// Requires NuGet package Microsoft.EntityFrameworkCore.SqlServer
optionsBuilder.UseSqlServer(
@"Server=(localdb)\mssqllocaldb;Database=EFSaving.Concurrency;Trusted_Connection=True");
}
}
public class Person
{
public int PersonId { get; set; }
[ConcurrencyCheck]
public string FirstName { get; set; }
[ConcurrencyCheck]
public string LastName { get; set; }
public string PhoneNumber { get; set; }
}
}
}

View File

@ -25,12 +25,12 @@ namespace EasyCaching.Demo.Interceptors.Controllers
{
ControllerContext.HttpContext.Response.StatusCode = 401;
}
return ResponseOutput.NotOk($"Client error, actual request error status code({code})");
}
else
{
return ResponseOutput.NotOk($"Server error , actual request error status code({code})");
}

View File

@ -1,37 +1,42 @@
using System;
using System.Net.Http;
using EasyCaching.Core;
using IRaCIS.Application.Interfaces;
using AlibabaCloud.SDK.Sts20150401;
using Amazon.Auth.AccessControlPolicy;
using Amazon.SecurityToken;
using AutoMapper;
using Azure.Core;
using IdentityModel.Client;
using IdentityModel.OidcClient;
using IRaCIS.Application.Contracts;
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using System.Collections.Generic;
using System.Text;
using Microsoft.AspNetCore.Http;
using IRaCIS.Core.Application.Interfaces;
using System.Threading.Tasks;
using IRaCIS.Application.Services;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infrastructure;
using System.Linq;
using Microsoft.Extensions.Logging;
using MassTransit;
using Microsoft.AspNetCore.Hosting;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Core.Auth.Sts;
using Aliyun.Acs.Core;
using IRaCIS.Core.Application.Helper;
using Microsoft.Extensions.Options;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure.Extention;
using MassTransit;
using MassTransit.Futures.Contracts;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Org.BouncyCastle.Tls;
using RestSharp;
using RestSharp.Authenticators;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;
using ZiggyCreatures.Caching.Fusion;
using AssumeRoleRequest = Amazon.SecurityToken.Model.AssumeRoleRequest;
using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO;
using DocumentFormat.OpenXml.Spreadsheet;
using AutoMapper.QueryableExtensions;
namespace IRaCIS.Api.Controllers
{
@ -39,7 +44,10 @@ namespace IRaCIS.Api.Controllers
/// 医生基本信息 、工作信息 专业信息、审核状态
/// </summary>
[ApiController, ApiExplorerSettings(GroupName = "Reviewer")]
public class ExtraController : ControllerBase
public class ExtraController([FromServices] IAttachmentService attachmentService, [FromServices] IDoctorService _doctorService,
[FromServices] IEducationService _educationService, [FromServices] ITrialExperienceService _trialExperienceService,
[FromServices] IResearchPublicationService _researchPublicationService, [FromServices] IVacationService _vacationService) : ControllerBase
{
@ -54,34 +62,40 @@ namespace IRaCIS.Api.Controllers
/// <param name="_vacationService"></param>
/// <param name="doctorId"></param>
/// <returns></returns>
[HttpGet, Route("doctor/getDetail/{doctorId:guid}")]
[HttpPost, Route("doctor/getDetail")]
public async Task<IResponseOutput<DoctorDetailDTO>> GetDoctorDetail([FromServices] IAttachmentService attachmentService, [FromServices] IDoctorService _doctorService,
[FromServices] IEducationService _educationService, [FromServices] ITrialExperienceService _trialExperienceService,
[FromServices] IResearchPublicationService _researchPublicationService, [FromServices] IVacationService _vacationService, Guid doctorId)
public async Task<IResponseOutput<DoctorDetailDTO>> GetDoctorDetail(GetDoctorDetailInDto inDto)
{
var education = await _educationService.GetEducation(doctorId);
var education = await _educationService.GetEducation(inDto.doctorId);
var sowList = _doctorService.GetDoctorSowList(doctorId);
var ackSowList = _doctorService.GetDoctorAckSowList(doctorId);
var sowList = _doctorService.GetDoctorSowList(inDto.doctorId);
var ackSowList = _doctorService.GetDoctorAckSowList(inDto.doctorId);
var doctorDetail = new DoctorDetailDTO
{
AuditView = await _doctorService.GetAuditState(doctorId),
BasicInfoView = await _doctorService.GetBasicInfo(doctorId),
EmploymentView = await _doctorService.GetEmploymentInfo(doctorId),
AttachmentList = await attachmentService.GetAttachments(doctorId),
AuditView = await _doctorService.GetAuditState(inDto.doctorId),
BasicInfoView = await _doctorService.GetBasicInfo(inDto.doctorId),
EmploymentView = await _doctorService.GetEmploymentInfo(inDto.doctorId),
AttachmentList = await attachmentService.GetAttachments(inDto.doctorId),
SummarizeInfo = await _doctorService.GetSummarizeInfo(new GetSummarizeInfoInDto()
{
DoctorId = inDto.doctorId,
TrialId = inDto.TrialId
}),
PaymentModeInfo = await _doctorService.GetPaymentMode(inDto.doctorId),
EducationList = education.EducationList,
PostgraduateList = education.PostgraduateList,
TrialExperienceView = await _trialExperienceService.GetTrialExperience(doctorId),
ResearchPublicationView = await _researchPublicationService.GetResearchPublication(doctorId),
TrialExperienceView = await _trialExperienceService.GetTrialExperience(new TrialExperienceModelIndto()
{
DoctorId = inDto.doctorId,
TrialId = inDto.TrialId
}),
ResearchPublicationView = await _researchPublicationService.GetResearchPublication(inDto.doctorId),
SpecialtyView = await _doctorService.GetSpecialtyInfo(doctorId),
InHoliday = (await _vacationService.OnVacation(doctorId)).IsSuccess,
IntoGroupInfo = _doctorService.GetDoctorIntoGroupInfo(doctorId),
SpecialtyView = await _doctorService.GetSpecialtyInfo(inDto.doctorId),
InHoliday = (await _vacationService.OnVacation(inDto.doctorId)).IsSuccess,
IntoGroupInfo = _doctorService.GetDoctorIntoGroupInfo(inDto.doctorId),
SowList = sowList,
AckSowList = ackSowList
};
@ -95,312 +109,136 @@ namespace IRaCIS.Api.Controllers
/// <summary> 系统用户登录接口[New] </summary>
[HttpPost, Route("user/login")]
[AllowAnonymous]
public async Task<IResponseOutput> Login(UserLoginDTO loginUser,
[FromServices] IEasyCachingProvider provider,
[FromServices] IUserService _userService,
[FromServices] ITokenService _tokenService,
[FromServices] IReadingImageTaskService readingImageTaskService,
IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig,
IMailVerificationService _mailVerificationService)
[HttpGet, Route("user/getPublicKey")]
public IResponseOutput GetPublicKey([FromServices] IOptionsMonitor<IRCEncreptOption> _IRCEncreptOption)
{
//var pemPublicKey = Encoding.UTF8.GetString(Convert.FromBase64String(_IRCEncreptOption.CurrentValue.Base64RSAPublicKey));
//MFA 邮箱验证 前端传递用户Id 和MFACode
if (loginUser.UserId != null && _verifyConfig.CurrentValue.OpenLoginMFA)
{
Guid userId = (Guid)loginUser.UserId;
//验证MFA 编码是否有问题 ,前端要拆开,自己调用验证的逻辑
//await _userService.VerifyMFACodeAsync(userId, loginUser.MFACode);
//var loginUser = await _userRepository.Where(u => u.UserName.Equals(userName) && u.Password == password).ProjectTo<UserBasicInfo>(_mapper.ConfigurationProvider).FirstOrDefaultAsync();
var basicInfo = await _userService.GetUserBasicInfo(userId, loginUser.Password);
var loginReturn = new LoginReturnDTO() { BasicInfo = basicInfo };
loginReturn.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(loginReturn.BasicInfo));
// 创建一个 CookieOptions 对象,用于设置 Cookie 的属性
var option = new CookieOptions
{
Expires = DateTime.Now.AddMonths(1), // 设置过期时间为 30 分钟之后
HttpOnly = false, // 确保 cookie 只能通过 HTTP 访问
SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None, // 设置 SameSite 属性
Secure = false // 确保 cookie 只能通过 HTTPS 访问
};
HttpContext.Response.Cookies.Append("access_token", loginReturn.JWTStr, option);
// 验证阅片休息时间
await readingImageTaskService.ResetReadingRestTime(userId);
await provider.SetAsync(userId.ToString(), loginReturn.JWTStr, TimeSpan.FromDays(7));
await provider.SetAsync($"{userId.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes));
return ResponseOutput.Ok(loginReturn);
}
else
{
var returnModel = await _userService.Login(loginUser.UserName, loginUser.Password);
if (returnModel.IsSuccess)
{
#region GRPC 调用鉴权中心因为服务器IIS问题 http/2 故而没法使用
////重试策略
//var defaultMethodConfig = new MethodConfig
//{
// Names = { MethodName.Default },
// RetryPolicy = new RetryPolicy
// {
// MaxAttempts = 3,
// InitialBackoff = TimeSpan.FromSeconds(1),
// MaxBackoff = TimeSpan.FromSeconds(5),
// BackoffMultiplier = 1.5,
// RetryableStatusCodes = { Grpc.Core.StatusCode.Unavailable }
// }
//};
//#region unable to trust the certificate then the gRPC client can be configured to ignore the invalid certificate
//var httpHandler = new HttpClientHandler();
//// Return `true` to allow certificates that are untrusted/invalid
//httpHandler.ServerCertificateCustomValidationCallback =
// HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;
//////这一句是让grpc支持本地 http 如果本地访问部署在服务器上,那么是访问不成功的
//AppContext.SetSwitch(
// "System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
//#endregion
//var grpcAdress = configuration.GetValue<string>("GrpcAddress");
////var grpcAdress = "http://localhost:7200";
//var channel = GrpcChannel.ForAddress(grpcAdress, new GrpcChannelOptions
//{
// HttpHandler = httpHandler,
// ServiceConfig = new ServiceConfig { MethodConfigs = { defaultMethodConfig } }
//});
////var channel = GrpcChannel.ForAddress(grpcAdress);
//var grpcClient = new TokenGrpcService.TokenGrpcServiceClient(channel);
//var userInfo = returnModel.Data.BasicInfo;
//var tokenResponse = grpcClient.GetUserToken(new GetTokenReuqest()
//{
// Id = userInfo.Id.ToString(),
// ReviewerCode = userInfo.ReviewerCode,
// IsAdmin = userInfo.IsAdmin,
// RealName = userInfo.RealName,
// UserTypeEnumInt = (int)userInfo.UserTypeEnum,
// UserTypeShortName = userInfo.UserTypeShortName,
// UserName = userInfo.UserName
//});
//returnModel.Data.JWTStr = tokenResponse.Token;
#endregion
var userId = returnModel.Data.BasicInfo.Id;
if (_verifyConfig.CurrentValue.OpenLoginMFA)
{
//发版屏蔽
//returnModel.Data.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(returnModel.Data.BasicInfo));
//MFA 发送邮件
returnModel.Data.IsMFA = true;
var email = returnModel.Data.BasicInfo.EMail;
#region 隐藏Email
// 找到 "@" 符号的位置
int atIndex = email.IndexOf('@');
// 替换 "@" 符号前的中间两位为星号
string visiblePart = email.Substring(0, atIndex);
int startIndex = (visiblePart.Length - 2) / 2;
// 替换中间两位字符为星号
string hiddenPartBeforeAt = visiblePart.Substring(0, startIndex) + "**" + visiblePart.Substring(startIndex + 2);
string afterAt = email.Substring(atIndex + 1);
// 组合隐藏和可见部分
string hiddenEmail = hiddenPartBeforeAt + "@" + afterAt;
#endregion
returnModel.Data.BasicInfo.EMail = hiddenEmail;
await _userService.SendMFAEmail(userId);
}
else
{
returnModel.Data.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(returnModel.Data.BasicInfo));
// 创建一个 CookieOptions 对象,用于设置 Cookie 的属性
var option = new CookieOptions
{
Expires = DateTime.Now.AddMonths(1), // 设置过期时间为 30 分钟之后
HttpOnly = false, // 确保 cookie 只能通过 HTTP 访问
SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None, // 设置 SameSite 属性
Secure = false // 确保 cookie 只能通过 HTTPS 访问
};
HttpContext.Response.Cookies.Append("access_token", returnModel.Data.JWTStr, option);
// 验证阅片休息时间
await readingImageTaskService.ResetReadingRestTime(returnModel.Data.BasicInfo.Id);
await provider.SetAsync(userId.ToString(), returnModel.Data.JWTStr, TimeSpan.FromDays(7));
await provider.SetAsync($"{userId.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(_verifyConfig.CurrentValue.AutoLoginOutMinutes));
}
}
return returnModel;
}
return ResponseOutput.Ok(_IRCEncreptOption.CurrentValue.Base64RSAPublicKey);
}
[HttpGet, Route("imageShare/ShareImage")]
[AllowAnonymous]
public IResponseOutput ShareImage([FromServices] ITokenService _tokenService)
{
var token = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo()
var token = _tokenService.GetToken(new UserTokenInfo()
{
Id = Guid.Empty,
IsReviewer = false,
IsAdmin = false,
RealName = "Share001",
IdentityUserId = Guid.NewGuid(),
UserName = "Share001",
Sex = 0,
//UserType = "ShareType",
UserTypeEnum = UserTypeEnum.ShareImage,
Code = "ShareCode001",
}));
});
return ResponseOutput.Ok("/showdicom?studyId=f7b67793-8155-0223-2f15-118f2642efb8&type=Share&token=" + token);
}
[HttpGet("user/GetObjectStoreToken")]
public IResponseOutput GetObjectStoreToken([FromServices] IOptionsMonitor<ObjectStoreServiceOptions> options)
public async Task<IResponseOutput> GetObjectStoreTokenAsync([FromServices] IOptionsMonitor<ObjectStoreServiceOptions> options, [FromServices] IOSSService _oSSService)
{
var serviceOption = options.CurrentValue;
if (Enum.TryParse<ObjectStoreUse>(serviceOption.ObjectStoreUse, out var parsedEnum) && parsedEnum == ObjectStoreUse.AliyunOSS)
{
var result = _oSSService.GetObjectStoreTempToken();
var ossOptions = serviceOption.AliyunOSS;
//result.AWS = await GetAWSTemToken(options.CurrentValue);
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse = serviceOption.ObjectStoreUse, MinIO = serviceOption.MinIO, AliyunOSS = serviceOption.AliyunOSS, AWS = serviceOption.AWS });
#region 临时token 屏蔽
//IClientProfile profile = DefaultProfile.GetProfile(ossOptions.RegionId, ossOptions.AccessKeyId, ossOptions.AccessKeySecret);
//DefaultAcsClient client = new DefaultAcsClient(profile);
//// 创建一个STS请求
//AssumeRoleRequest request = new AssumeRoleRequest
//{
// RoleArn = ossOptions.RoleArn, // 角色ARN需要替换为你的角色ARN
// RoleSessionName = $"session-name-{NewId.NextGuid()}", // 角色会话名称,可自定义
// DurationSeconds = 900, // 令牌有效期单位这里设置为1小时
//};
//AssumeRoleResponse response = client.GetAcsResponse(request);
//// 返回STS令牌信息给前端
//var stsToken = new ObjectStoreDTO()
//{
// ObjectStoreUse = serviceOption.ObjectStoreUse,
// AliyunOSS = new AliyunOSSTempToken()
// {
// AccessKeyId = response.Credentials.AccessKeyId,
// AccessKeySecret = response.Credentials.AccessKeySecret,
// SecurityToken = response.Credentials.SecurityToken,
// Expiration = response.Credentials.Expiration,
// Region = ossOptions.Region,
// BucketName = ossOptions.BucketName,
// ViewEndpoint = ossOptions.ViewEndpoint,
// },
// MinIO = serviceOption.MinIO
//};
//return ResponseOutput.Ok(stsToken);
#endregion
}
else if (Enum.TryParse<ObjectStoreUse>(serviceOption.ObjectStoreUse, out var parsedValue) && parsedValue == ObjectStoreUse.MinIO)
{
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse = serviceOption.ObjectStoreUse, MinIO = serviceOption.MinIO, AWS = serviceOption.AWS });
}
else
{
return ResponseOutput.Ok(new ObjectStoreDTO() { ObjectStoreUse = serviceOption.ObjectStoreUse, MinIO = serviceOption.MinIO, AWS = serviceOption.AWS });
}
return ResponseOutput.Ok(result);
}
[HttpGet("user/GenerateSTS")]
public IResponseOutput GenerateSTS([FromServices] IOptionsMonitor<AliyunOSSOptions> options)
private async Task<AWSTempToken> GetAWSTemToken(ObjectStoreServiceOptions serviceOption)
{
var ossOptions = options.CurrentValue;
var awsOptions = serviceOption.AWS;
//aws 临时凭证
// 创建 STS 客户端
var stsClient = new AmazonSecurityTokenServiceClient(awsOptions.AccessKeyId, awsOptions.SecretAccessKey);
IClientProfile profile = DefaultProfile.GetProfile(ossOptions.regionId, ossOptions.accessKeyId, ossOptions.accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
// 创建一个STS请求
AssumeRoleRequest request = new AssumeRoleRequest
// 使用 AssumeRole 请求临时凭证
var assumeRoleRequest = new AssumeRoleRequest
{
RoleArn = ossOptions.roleArn, // 角色ARN需要替换为你的角色ARN
RoleSessionName = $"session-name-{NewId.NextGuid()}", // 角色会话名称,可自定义
DurationSeconds = 900, // 令牌有效期单位这里设置为1小时
RoleArn = awsOptions.RoleArn, // 角色 ARN
RoleSessionName = $"session-name-{NewId.NextGuid()}",
DurationSeconds = awsOptions.DurationSeconds // 临时凭证有效期
};
var assumeRoleResponse = await stsClient.AssumeRoleAsync(assumeRoleRequest);
AssumeRoleResponse response = client.GetAcsResponse(request);
var credentials = assumeRoleResponse.Credentials;
var tempToken = new AWSTempToken()
{
AccessKeyId = credentials.AccessKeyId,
SecretAccessKey = credentials.SecretAccessKey,
SessionToken = credentials.SessionToken,
Expiration = credentials.Expiration,
Region = awsOptions.Region,
BucketName = awsOptions.BucketName,
EndPoint = awsOptions.EndPoint,
ViewEndpoint = awsOptions.ViewEndpoint,
};
return tempToken;
}
#region 老项目依赖
[HttpGet("user/GenerateSTS")]
public IResponseOutput GenerateSTS([FromServices] IOptionsMonitor<ObjectStoreServiceOptions> options)
{
var ossOptions = options.CurrentValue.AliyunOSS;
var client = new Client(new AlibabaCloud.OpenApiClient.Models.Config()
{
AccessKeyId = ossOptions.AccessKeyId,
AccessKeySecret = ossOptions.AccessKeySecret,
Endpoint = "sts.cn-hangzhou.aliyuncs.com"
});
var assumeRoleRequest = new AlibabaCloud.SDK.Sts20150401.Models.AssumeRoleRequest();
// 将<YOUR_ROLE_SESSION_NAME>设置为自定义的会话名称例如oss-role-session。
assumeRoleRequest.RoleSessionName = $"session-name-{NewId.NextGuid()}";
// 将<YOUR_ROLE_ARN>替换为拥有上传文件到指定OSS Bucket权限的RAM角色的ARN。
assumeRoleRequest.RoleArn = ossOptions.RoleArn;
//assumeRoleRequest.RoleArn = "acs:ram::1899121822495495:role/webdirect";
assumeRoleRequest.DurationSeconds = ossOptions.DurationSeconds;
var runtime = new AlibabaCloud.TeaUtil.Models.RuntimeOptions();
var response = client.AssumeRoleWithOptions(assumeRoleRequest, runtime);
var credentials = response.Body.Credentials;
var tempToken = new AliyunOSSTempToken()
{
AccessKeyId = credentials.AccessKeyId,
AccessKeySecret = credentials.AccessKeySecret,
//转为服务器时区,最后统一转为客户端时区
Expiration = TimeZoneInfo.ConvertTimeFromUtc(DateTime.Parse(credentials.Expiration), TimeZoneInfo.Local),
SecurityToken = credentials.SecurityToken,
Region = ossOptions.Region,
BucketName = ossOptions.BucketName,
EndPoint = ossOptions.EndPoint,
ViewEndpoint = ossOptions.ViewEndpoint,
PreviewEndpoint = ossOptions.PreviewEndpoint
};
// 返回STS令牌信息给前端
var stsToken = new
{
AccessKeyId = response.Credentials.AccessKeyId,
AccessKeySecret = response.Credentials.AccessKeySecret,
SecurityToken = response.Credentials.SecurityToken,
Expiration = response.Credentials.Expiration,
AccessKeyId = credentials.AccessKeyId,
AccessKeySecret = credentials.AccessKeySecret,
SecurityToken = credentials.SecurityToken,
Expiration = credentials.Expiration,
Region = ossOptions.region,
BucketName = ossOptions.bucketName,
ViewEndpoint = ossOptions.viewEndpoint,
Region = ossOptions.Region,
BucketName = ossOptions.BucketName,
ViewEndpoint = ossOptions.ViewEndpoint,
};
@ -408,11 +246,12 @@ namespace IRaCIS.Api.Controllers
}
#endregion
[HttpGet("User/UserRedirect")]
[AllowAnonymous]
public async Task<IActionResult> UserRedirect([FromServices] IRepository<User> _userRepository, string url, [FromServices] ILogger<ExtraController> _logger)
public async Task<IActionResult> UserRedirect([FromServices] IRepository<IdentityUser> _useRepository, string url, [FromServices] ILogger<ExtraController> _logger, [FromServices] ITokenService _tokenService)
{
var decodeUrl = System.Web.HttpUtility.UrlDecode(url);
@ -427,10 +266,22 @@ namespace IRaCIS.Api.Controllers
var errorUrl = domainStrList[0] + "//" + domainStrList[2] + "/error";
if (!await _userRepository.AnyAsync(t => t.Id == Guid.Parse(userId) && t.EmailToken == token && t.IsFirstAdd))
if (lang == "zh")
{
decodeUrl = errorUrl + $"?lang={lang}&ErrorMessage={System.Web.HttpUtility.UrlEncode(lang == "zh" ? "" : "ErrorThe initialization link has expired. Return")} ";
CultureInfo.CurrentCulture = new CultureInfo(StaticData.CultureInfo.zh_CN);
CultureInfo.CurrentUICulture = new CultureInfo(StaticData.CultureInfo.zh_CN);
}
else
{
CultureInfo.CurrentCulture = new CultureInfo(StaticData.CultureInfo.en_US);
CultureInfo.CurrentUICulture = new CultureInfo(StaticData.CultureInfo.en_US);
}
var isExpire = _tokenService.IsTokenExpired(token);
if (!await _useRepository.AnyAsync(t => t.Id == Guid.Parse(userId) && t.EmailToken == token && t.IsFirstAdd) || isExpire)
{
decodeUrl = errorUrl + $"?lang={lang}&ErrorMessage={System.Web.HttpUtility.UrlEncode(I18n.T("UserRedirect_InitializationLinkExpire"))} ";
}
return Redirect(decodeUrl);
@ -439,10 +290,50 @@ namespace IRaCIS.Api.Controllers
#region 项目支持Oauth 对接修改
/// <summary>
/// 回调到前端,前端调用后端的接口
/// 参考链接https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
/// 后端通过这个code ,带上客户端信息,和授权类型 可以向单点登录提供商获取厂商token
///
/// 但是单点登录提供商提供的token 和我们系统的token 是有区别的我们的token里面有我们业务系统的UserId涉及到很多业务操作所以在此出现了两种方案
/// 1、前端使用厂商的Token。 后端通过code 获取厂商的Token 返回前端的同时返回我们系统的UserId前段在http 请求头加上一个自定义参数带上UserId 后端取用户Id的地方变动下
/// 但是除了UserId外后端还有其他信息也是从Token取的所以在请求头也需要带上此外后端认证Token的方式也需要变化改造成本稍大如果是微服务做这种处理还是可以的
/// 2、前端还是使用我们后台自己的Token。后端通过code 获取厂商Token的同时后端做一个隐藏登录返回厂商的Token的同时也返回我们系统的Token。
/// (像我们单体,这种方式最简单,我们用单点登录,无非就是不想记多个系统的密码,自动登录而已,其他不支持的项目改造成本也是最低的)
/// </summary>
/// <param name="type">回调的厂商类型 比如github, google, 我们用的logto ,不同的厂商回调到前端的地址可以不同的,但是请求后端的接口可以是同一个 </param>
/// <param name="code">在第三方平台登录成功后回调前端的时候会返回一个code </param>
/// <returns></returns>
[HttpGet("User/OAuthCallBack")]
public async Task<IResponseOutput> OAuthCallBack(string type, string code)
{
#region 获取AccessTo
//var headerDic = new Dictionary<string, string>();
//headerDic.Add("code", code);
//headerDic.Add("grant_type", "authorization_code");
//headerDic.Add("redirect_uri", "http://localhost:6100");
//headerDic.Add("scope", "all");
#endregion
return ResponseOutput.Ok();
}
#endregion
#region 测试获取用户 ip
[HttpGet, Route("ip")]
[AllowAnonymous]
public IResponseOutput Get([FromServices] IHttpContextAccessor _context/*, [FromServices] IUserService _userService*/)
public IResponseOutput Get([FromServices] IHttpContextAccessor _context)
{
StringBuilder sb = new StringBuilder();
@ -463,7 +354,7 @@ namespace IRaCIS.Api.Controllers
[HttpGet, Route("ip2")]
[AllowAnonymous]
public IResponseOutput Get2([FromServices] IHttpContextAccessor _context, [FromServices] IRepository _userService)
public IResponseOutput Get2([FromServices] IHttpContextAccessor _context)
{
StringBuilder sb = new StringBuilder();
@ -480,6 +371,9 @@ namespace IRaCIS.Api.Controllers
}
return ResponseOutput.Ok(sb.ToString());
}
#endregion
}
}

View File

@ -1,36 +1,30 @@
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using IRaCIS.Application.Contracts;
using IRaCIS.Application.Interfaces;
using IRaCIS.Application.Contracts;
using IRaCIS.Core.Application.BusinessFilter;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.Service.Inspection.DTO;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Authorization;
using System.Threading.Tasks;
using IRaCIS.Application.Services;
using IRaCIS.Core.Application.Service.Inspection.DTO;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Application.Auth;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
namespace IRaCIS.Core.API.Controllers.Special
{
//谨慎修改 涉及到财务模块
[ApiController, Authorize, ApiExplorerSettings(GroupName = "Financial")]
public class FinancialChangeController : ControllerBase
public class FinancialChangeController(
ITrialService _trialService,
ICalculateService _calculateService,
IStringLocalizer _localizer) : ControllerBase
{
private readonly ITrialService _trialService;
private readonly ICalculateService _calculateService;
private IStringLocalizer _localizer { get; set; }
public FinancialChangeController(ITrialService trialService, ICalculateService calculateService, IStringLocalizer localizer
)
{
_localizer = localizer;
_trialService = trialService;
_calculateService = calculateService;
}
//[TrialAudit(AuditType.TrialAudit, AuditOptType.AddOrUpdateTrial)]
@ -42,8 +36,8 @@ namespace IRaCIS.Core.API.Controllers.Special
public async Task<IResponseOutput> AddOrUpdateTrialInspection(DataInspectionDto<TrialCommand> opt)
{
var fun =await AddOrUpdateTrial(opt.Data);
var fun = await AddOrUpdateTrial(opt.Data);
return fun;
}
@ -54,33 +48,33 @@ namespace IRaCIS.Core.API.Controllers.Special
[HttpPost, Route("trial/addOrUpdateTrial")]
//[Authorize(Policy = IRaCISPolicy.PM_APM)]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AddOrUpdateTrial", "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
public async Task<IResponseOutput<Trial>> AddOrUpdateTrial(TrialCommand param)
[TrialGlobalLimit( "AddOrUpdateTrial", "BeforeOngoingCantOpt", "AfterStopCannNotOpt" )]
public async Task<IResponseOutput<Trial>> AddOrUpdateTrial(TrialCommand param)
{
var userId = Guid.Parse(User.FindFirst("id").Value);
//var userId = Guid.Parse(User.FindFirst("id").Value);
var result = await _trialService.AddOrUpdateTrial(param);
if (_trialService.TrialExpeditedChange)
{
var needCalReviewerIds = await _trialService.GetTrialEnrollmentReviewerIds(param.Id.Value);
var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty);
//if (_trialService.TrialExpeditedChange)
//{
// var needCalReviewerIds = await _trialService.GetTrialEnrollmentReviewerIds(param.Id.Value);
// var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty);
calcList.ForEach(t =>
{
if (needCalReviewerIds.Contains(t.DoctorId))
{
_calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
t.DoctorId
},
CalculateMonth = DateTime.Parse(t.YearMonth)
}, User.FindFirst("id").Value);
// calcList.ForEach(t =>
// {
// if (needCalReviewerIds.Contains(t.DoctorId))
// {
// _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
// {
// NeedCalculateReviewers = new List<Guid>()
// {
// t.DoctorId
// },
// CalculateMonth = DateTime.Parse(t.YearMonth)
// }, User.FindFirst("id").Value);
}
});
}
// }
// });
//}
return result;
}
@ -92,9 +86,9 @@ namespace IRaCIS.Core.API.Controllers.Special
/// <param name="_trialWorkloadService"></param>
/// <param name="workLoadAddOrUpdateModel"></param>
/// <returns></returns>
[HttpPost, Route("doctorWorkload/workLoadAddOrUpdate")]
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
public async Task<IResponseOutput> WorkLoadAddOrUpdate([FromServices] IDoctorWorkloadService _trialWorkloadService, WorkloadCommand workLoadAddOrUpdateModel)
{
var userId = Guid.Parse(User.FindFirst("id").Value);
@ -114,9 +108,9 @@ namespace IRaCIS.Core.API.Controllers.Special
}
[HttpDelete, Route("doctorWorkload/deleteWorkLoad/{id:guid}/{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
public async Task<IResponseOutput> DeleteWorkLoad([FromServices] IDoctorWorkloadService _trialWorkloadService, Guid id)
{
//先判断该工作量的费用是否被锁定,如果被锁定,则不能删除
@ -149,7 +143,7 @@ namespace IRaCIS.Core.API.Controllers.Special
/// <summary>
/// 添加或更新汇率(会触发没有对锁定的费用计算)
/// </summary>
[HttpPost, Route("exchangeRate/addOrUpdateExchangeRate")]
public async Task<IResponseOutput> AddOrUpdateExchangeRate([FromServices] IExchangeRateService _exchangeRateService, [FromServices] IPaymentAdjustmentService _costAdjustmentService, ExchangeRateCommand addOrUpdateModel)
{
@ -159,7 +153,7 @@ namespace IRaCIS.Core.API.Controllers.Special
{
if (item != null)
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
@ -169,7 +163,7 @@ namespace IRaCIS.Core.API.Controllers.Special
}, User.FindFirst("id").Value);
}
}
await _costAdjustmentService.CalculateCNY(addOrUpdateModel.YearMonth, addOrUpdateModel.Rate);
await _costAdjustmentService.CalculateCNY(addOrUpdateModel.YearMonth, addOrUpdateModel.Rate);
return result;
}
@ -177,13 +171,13 @@ namespace IRaCIS.Core.API.Controllers.Special
/// <summary>
/// 添加或更新 职称单价[AUTH]
/// </summary>
[HttpPost, Route("rankPrice/addOrUpdateRankPrice")]
public async Task<IResponseOutput> AddOrUpdateRankPrice([FromServices] IReviewerPayInfoService _reviewerPayInfoService, [FromServices] IRankPriceService _rankPriceService, RankPriceCommand addOrUpdateModel)
{
if (addOrUpdateModel.Id != Guid.Empty && addOrUpdateModel.Id != null)
{
var needCalReviewerIds =await _reviewerPayInfoService.GetReviewerIdByRankId(Guid.Parse(addOrUpdateModel.Id.ToString()));
var needCalReviewerIds = await _reviewerPayInfoService.GetReviewerIdByRankId(Guid.Parse(addOrUpdateModel.Id.ToString()));
var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty);
foreach (var item in calcList)
@ -210,12 +204,12 @@ namespace IRaCIS.Core.API.Controllers.Special
/// <summary>
/// 添加或更新(替换)医生支付展信息[AUTH]
/// </summary>
[HttpPost, Route("reviewerPayInfo/addOrUpdateReviewerPayInfo")]
public async Task<IResponseOutput> AddOrUpdateReviewerPayInfo([FromServices] IReviewerPayInfoService _doctorPayInfoService, ReviewerPayInfoCommand addOrUpdateModel)
{
var userId = Guid.Parse(User.FindFirst("id").Value);
var result =await _doctorPayInfoService.AddOrUpdateReviewerPayInfo(addOrUpdateModel, userId);
var result = await _doctorPayInfoService.AddOrUpdateReviewerPayInfo(addOrUpdateModel, userId);
var calcList = await _calculateService.GetNeedCalculateReviewerList(addOrUpdateModel.DoctorId, string.Empty);
foreach (var item in calcList)
{
@ -239,12 +233,12 @@ namespace IRaCIS.Core.API.Controllers.Special
/// <summary>
/// 保存(替换)项目支付价格信息(会触发没有被锁定的费用计算)[AUTH]
/// </summary>
[HttpPost, Route("trialPaymentPrice/addOrUpdateTrialPaymentPrice")]
public async Task<IResponseOutput> AddOrUpdateTrialPaymentPrice([FromServices] ITrialPaymentPriceService _trialPaymentPriceService, TrialPaymentPriceCommand addOrUpdateModel)
{
var userId = Guid.Parse(User.FindFirst("id").Value);
var result =await _trialPaymentPriceService.AddOrUpdateTrialPaymentPrice(addOrUpdateModel);
var result = await _trialPaymentPriceService.AddOrUpdateTrialPaymentPrice(addOrUpdateModel);
var needCalReviewerIds = await _trialService.GetTrialEnrollmentReviewerIds(addOrUpdateModel.TrialId);
var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty);
@ -252,7 +246,7 @@ namespace IRaCIS.Core.API.Controllers.Special
{
if (item != null && needCalReviewerIds.Contains(item.DoctorId))
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
@ -268,12 +262,12 @@ namespace IRaCIS.Core.API.Controllers.Special
/// <summary>
/// 批量更新奖励费用[AUTH]
/// </summary>
[HttpPost, Route("volumeReward/addOrUpdatevolumeRewardPriceList")]
public async Task<IResponseOutput> AddOrUpdateAwardPriceList([FromServices] IVolumeRewardService _volumeRewardService, IEnumerable<AwardPriceCommand> addOrUpdateModel)
{
var result =await _volumeRewardService.AddOrUpdateVolumeRewardPriceList(addOrUpdateModel);
var result = await _volumeRewardService.AddOrUpdateVolumeRewardPriceList(addOrUpdateModel);
var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty);
foreach (var item in calcList)

View File

@ -1,24 +1,19 @@

using System.Threading.Tasks;
using AutoMapper;
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.BusinessFilter;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Image.QA;
using IRaCIS.Core.Application.Interfaces;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.Service.Inspection.DTO;
using IRaCIS.Core.Application.Service.Inspection.Interface;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Application.Service.Reading.Interface;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
namespace IRaCIS.Core.API.Controllers
@ -26,77 +21,18 @@ namespace IRaCIS.Core.API.Controllers
[ApiController, ApiExplorerSettings(GroupName = "Reviewer")]
[UnitOfWork]
public class InspectionController : ControllerBase
public class InspectionController(
ITrialDocumentService _trialDocumentService,
IReadingImageTaskService _iReadingImageTaskService,
ITrialConfigService _trialConfigService,
IClinicalAnswerService _clinicalAnswerService,
IReadingClinicalDataService _readingClinicalDataService,
IQCOperationService _qCOperationService,
IInspectionService _inspectionService,
IReadingMedicalReviewService _readingMedicalReviewService,
IReadingMedicineQuestionService _readingMedicineQuestionService
) : ControllerBase
{
private readonly IRepository _repository;
private readonly IMapper _mapper;
private readonly IUserInfo _userInfo;
private readonly ITrialDocumentService _trialDocumentService;
private readonly IQCListService _qCListService;
private readonly IReadingImageTaskService _iReadingImageTaskService;
private readonly IHttpContextAccessor _httpContext;
private readonly ITrialConfigService _trialConfigService;
private readonly INoneDicomStudyService _noneDicomStudyService;
private readonly IClinicalAnswerService _clinicalAnswerService;
private readonly ISubjectService _subjectService;
private readonly IReadingClinicalDataService _readingClinicalDataService;
private readonly ISubjectVisitService _subjectVisitService;
private readonly IQCOperationService _qCOperationService;
private readonly IClinicalDataService _clinicalDataService;
private readonly IVisitPlanService _visitPlanService;
private readonly IInspectionService _inspectionService;
private readonly IReadingMedicalReviewService _readingMedicalReviewService;
private readonly IReadingMedicineQuestionService _readingMedicineQuestionService;
private readonly IRepository<DataInspection> _dataInspectionRepository;
private delegate Task<IResponseOutput> executionFun(dynamic data);
public InspectionController(IRepository repository,
IRepository<DataInspection> _repositoryDataInspection,
IMapper mapper, IUserInfo userInfo,
ITrialDocumentService trialDocumentService,
IRepository<DataInspection> dataInspectionRepository,
IQCListService _qCListService,
IReadingImageTaskService _iReadingImageTaskService,
IHttpContextAccessor httpContext,
IInspectionService sinspectionService,
IReadingMedicalReviewService readingMedicalReviewService,
IReadingMedicineQuestionService readingMedicineQuestionService,
ITrialConfigService _trialConfigService,
INoneDicomStudyService noneDicomStudyService,
IClinicalAnswerService clinicalAnswerService,
ISubjectService _subjectService,
IReadingClinicalDataService _readingClinicalDataService,
ISubjectVisitService subjectVisitService,
IQCOperationService qCOperationService,
IClinicalDataService clinicalDataService,
IVisitPlanService visitPlanService
)
{
this._repository = repository;
this._mapper = mapper;
this._userInfo = userInfo;
this._inspectionService = sinspectionService;
this._readingMedicalReviewService = readingMedicalReviewService;
this._readingMedicineQuestionService = readingMedicineQuestionService;
this._trialDocumentService = trialDocumentService;
this._qCListService = _qCListService;
this._iReadingImageTaskService = _iReadingImageTaskService;
this._httpContext = httpContext;
this._trialConfigService = _trialConfigService;
this._noneDicomStudyService = noneDicomStudyService;
this._clinicalAnswerService = clinicalAnswerService;
this._subjectService = _subjectService;
this._readingClinicalDataService = _readingClinicalDataService;
this._subjectVisitService = subjectVisitService;
this._qCOperationService = qCOperationService;
this._clinicalDataService = clinicalDataService;
this._visitPlanService = visitPlanService;
this._dataInspectionRepository = dataInspectionRepository;
}
#region 获取稽查数据
/// <summary>
@ -116,7 +52,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingImageTask/SubmitOncologyReadingInfo")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> SetOncologyReadingInfo(DataInspectionDto<SubmitOncologyReadingInfoInDto> opt)
@ -133,7 +69,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingImageTask/SubmitDicomVisitTask")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> SubmitDicomVisitTask(DataInspectionDto<SubmitDicomVisitTaskInDto> opt)
@ -152,7 +88,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingImageTask/SubmitGlobalReadingInfo")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> SubmitGlobalReadingInfo(DataInspectionDto<SubmitGlobalReadingInfoInDto> opt)
@ -171,12 +107,12 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/configTrialBasicInfo/TrialReadingInfoSign")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> TrialReadingInfoSign(DataInspectionDto<TrialReadingInfoSignInDto> opt)
{
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _trialConfigService.TrialReadingInfoSign(opt.Data);
await _inspectionService.CompletedSign(singid, result);
@ -190,7 +126,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingMedicalReview/FinishMedicalReview")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> FinishMedicalReview(DataInspectionDto<FinishMedicalReviewInDto> opt)
@ -207,7 +143,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingMedicineQuestion/ConfirmReadingMedicineQuestion")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> ConfirmReadingMedicineQuestion(DataInspectionDto<ConfirmReadingMedicineQuestionInDto> opt)
@ -225,7 +161,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingImageTask/SubmitVisitTaskQuestions")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> SubmitVisitTaskQuestions(DataInspectionDto<SubmitVisitTaskQuestionsInDto> opt)
@ -243,7 +179,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ClinicalAnswer/CRCSignClinicalData")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> CRCSignClinicalData(DataInspectionDto<CRCSignClinicalDataInDto> opt)
@ -261,7 +197,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ClinicalAnswer/CRCConfirmClinical")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> CRCConfirmClinical(DataInspectionDto<CRCConfirmClinicalInDto> opt)
@ -278,7 +214,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ClinicalAnswer/CRCCancelConfirmClinical")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> CRCCancelConfirmClinical(DataInspectionDto<CRCCancelConfirmClinicalInDto> opt)
@ -296,7 +232,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ClinicalAnswer/PMConfirmClinical")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> PMConfirmClinical(DataInspectionDto<CRCConfirmClinicalInDto> opt)
@ -308,13 +244,30 @@ namespace IRaCIS.Core.API.Controllers
}
/// <summary>
/// 提交结构化录入并签名
/// </summary>
/// <param name="opt"></param>
/// <returns></returns>
/// <summary>
/// PM签名一致性分析临床数据
/// </summary>
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingClinicalData/SignConsistencyAnalysisReadingClinicalData")]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> SignConsistencyAnalysisReadingClinicalData(DataInspectionDto<SignConsistencyAnalysisReadingClinicalDataInDto> opt)
{
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _readingClinicalDataService.SignConsistencyAnalysisReadingClinicalData(opt.Data);
await _inspectionService.CompletedSign(singid, result);
return result;
}
/// <summary>
/// 提交结构化录入并签名
/// </summary>
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ClinicalAnswer/SubmitClinicalFormAndSign")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> SubmitClinicalFormAndSign(DataInspectionDto<SubmitClinicalFormInDto> opt)
@ -331,7 +284,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingImageTask/SubmitJudgeVisitTaskResult")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> SubmitJudgeVisitTaskResult(DataInspectionDto<SaveJudgeVisitTaskResult> opt)
@ -350,12 +303,12 @@ namespace IRaCIS.Core.API.Controllers
/// <returns></returns>
[HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialBasicInfoConfirm")]
[UnitOfWork]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt" })]
[TrialGlobalLimit( "BeforeOngoingCantOpt" )]
public async Task<IResponseOutput> ConfigTrialBasicInfoConfirm(DataInspectionDto<BasicTrialConfig> opt)
{
opt.Data.IsTrialBasicLogicConfirmed = true;
var singid= await _inspectionService.RecordSing(opt.SignInfo);
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _trialConfigService.ConfigTrialBasicInfo(opt.Data);
await _inspectionService.CompletedSign(singid, result);
return result;
@ -370,7 +323,7 @@ namespace IRaCIS.Core.API.Controllers
/// <returns></returns>
[HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialProcessInfoConfirm")]
[UnitOfWork]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt" })]
//[TrialGlobalLimit( "BeforeOngoingCantOpt" )]
public async Task<IResponseOutput> ConfigTrialProcessInfoConfirm(DataInspectionDto<TrialProcessConfig> opt)
{
opt.Data.IsTrialProcessConfirmed = true;
@ -382,7 +335,7 @@ namespace IRaCIS.Core.API.Controllers
}
/// <summary>
@ -392,12 +345,25 @@ namespace IRaCIS.Core.API.Controllers
/// <returns></returns>
[HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialUrgentInfoConfirm")]
[UnitOfWork]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt" })]
[TrialGlobalLimit( "BeforeOngoingCantOpt" )]
public async Task<IResponseOutput> ConfigTrialUrgentInfoConfirm(DataInspectionDto<TrialUrgentConfig> opt)
{
opt.Data.IsTrialUrgentConfirmed = true;
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result= await _trialConfigService.ConfigTrialUrgentInfo(opt.Data);
var result = await _trialConfigService.ConfigTrialUrgentInfo(opt.Data);
await _inspectionService.CompletedSign(singid, result);
return result;
}
[HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialPACSInfoConfirm")]
[UnitOfWork]
[TrialGlobalLimit( "BeforeOngoingCantOpt" )]
public async Task<IResponseOutput> ConfigTrialPACSInfoConfirm(DataInspectionDto<TrialPACSConfig> opt)
{
opt.Data.IsTrialPACSConfirmed = true;
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _trialConfigService.ConfigTrialPACSInfo(opt.Data);
await _inspectionService.CompletedSign(singid, result);
return result;
}
@ -408,7 +374,7 @@ namespace IRaCIS.Core.API.Controllers
/// <returns></returns>
[HttpPost, Route("Inspection/configTrialBasicInfo/TrialConfigSignatureConfirm")]
[UnitOfWork]
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
public async Task<IResponseOutput> TrialConfigSignatureConfirm(DataInspectionDto<SignConfirmDTO> opt)
{
@ -419,31 +385,31 @@ namespace IRaCIS.Core.API.Controllers
}
/// <summary>
/// 重置并同步项目阅片标准
/// </summary>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingCriterion/ResetAndAsyncCriterion")]
[UnitOfWork]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
/// <summary>
/// 重置并同步项目阅片标准
/// </summary>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingCriterion/ResetAndAsyncCriterion")]
[UnitOfWork]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
public async Task<IResponseOutput> ResetAndAsyncCriterion(DataInspectionDto<ResetAndAsyncCriterionInDto> opt)
{
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _trialConfigService.ResetAndAsyncCriterion(opt.Data);
await _inspectionService.CompletedSign(singid, result);
return result;
}
public async Task<IResponseOutput> ResetAndAsyncCriterion(DataInspectionDto<ResetAndAsyncCriterionInDto> opt)
{
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _trialConfigService.ResetAndAsyncCriterion(opt.Data);
await _inspectionService.CompletedSign(singid, result);
return result;
}
/// <summary>
/// CRC RequestToQC 批量提交
/// </summary>
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/QCOperation/CRCRequestToQC")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
/// <summary>
/// CRC RequestToQC 批量提交
/// </summary>
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/QCOperation/CRCRequestToQC")]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> CRCRequestToQC(DataInspectionDto<CRCRequestToQCCommand> opt)
{
@ -458,12 +424,12 @@ namespace IRaCIS.Core.API.Controllers
/// 设置QC 通过或者不通过 7:QC failed 8QC passed
/// </summary>
[HttpPost, Route("Inspection/QCOperation/QCPassedOrFailed")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> QCPassedOrFailed(DataInspectionDto<QCPassedOrFailedDto> opt)
{
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result= await _qCOperationService.QCPassedOrFailed(opt.Data.trialId, opt.Data.subjectVisitId, opt.Data.auditState);
var result = await _qCOperationService.QCPassedOrFailed(opt.Data.trialId, opt.Data.subjectVisitId, opt.Data.auditState);
await _inspectionService.CompletedSign(singid, result);
return result;
}
@ -472,12 +438,12 @@ namespace IRaCIS.Core.API.Controllers
/// 一致性核查 回退 对话记录不清除 只允许PM回退
/// </summary>
[HttpPost, Route("Inspection/QCOperation/CheckBack")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> CheckBack(DataInspectionDto<IDDto> opt)
{
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _qCOperationService.CheckBack(opt.Data.Id);
var result = await _qCOperationService.CheckBack(opt.Data.Id);
await _inspectionService.CompletedSign(singid, result);
return result;
}
@ -489,7 +455,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadClinicalData/ReadClinicalDataSign")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> ReadClinicalDataSign(DataInspectionDto<ReadingClinicalDataSignIndto> opt)
{
@ -504,9 +470,9 @@ namespace IRaCIS.Core.API.Controllers
/// CRC 设置已经重传完成
/// </summary>
[HttpPost, Route("Inspection/QCOperation/SetReuploadFinished")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> SetReuploadFinished(DataInspectionDto<CRCReuploadFinishedCommand> opt)
public async Task<IResponseOutput> SetReuploadFinished(DataInspectionDto<CRCReuploadFinishedCommand> opt)
{
var singid = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _qCOperationService.SetReuploadFinished(opt.Data);
@ -520,8 +486,7 @@ namespace IRaCIS.Core.API.Controllers
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/TrialConfig/updateTrialState")]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt" })]
[TrialGlobalLimit( "BeforeOngoingCantOpt")]
[UnitOfWork]
public async Task<IResponseOutput> UpdateTrialState(DataInspectionDto<UpdateTrialStateDto> opt)
{
@ -537,7 +502,7 @@ namespace IRaCIS.Core.API.Controllers
/// </summary>
/// <returns></returns>
[HttpPost, Route("Inspection/TrialDocument/userConfirm")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "SignSystemDocNoTrialId", "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "BeforeOngoingCantOpt", "SignSystemDocNoTrialId", "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> UserConfirm(DataInspectionDto<UserConfirmCommand> opt)
{
@ -554,16 +519,16 @@ namespace IRaCIS.Core.API.Controllers
/// </summary>
/// <returns></returns>
[HttpPost, Route("Inspection/VisitTask/ConfirmReReading")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit( "AfterStopCannNotOpt" )]
[UnitOfWork]
public async Task<IResponseOutput> ConfirmReReading(DataInspectionDto<ConfirmReReadingCommand> opt , [FromServices] IVisitTaskHelpeService _visitTaskCommonService,[FromServices] IVisitTaskService _visitTaskService)
public async Task<IResponseOutput> ConfirmReReading(DataInspectionDto<ConfirmReReadingCommand> opt, [FromServices] IVisitTaskService _visitTaskService)
{
var singId = await _inspectionService.RecordSing(opt.SignInfo);
var result = await _visitTaskService.ConfirmReReading(opt.Data, _visitTaskCommonService);
var result = await _visitTaskService.ConfirmReReading(opt.Data);
await _inspectionService.CompletedSign(singId, result);
return result;
}
}
}

View File

@ -1,32 +1,25 @@
using AutoMapper;
using DocumentFormat.OpenXml.Drawing;
using EasyCaching.Core;
using ExcelDataReader;
using IRaCIS.Application.Contracts;
using IRaCIS.Application.Interfaces;
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Application.BusinessFilter;
using IRaCIS.Core.Application.Contracts;
using IRaCIS.Core.Application.Contracts.Dicom;
using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.MediatR.CommandAndQueries;
using IRaCIS.Core.Application.MediatR.Handlers;
using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.Service.ImageAndDoc;
using IRaCIS.Core.Application.Service.Reading.Dto;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention;
using MassTransit;
using MediatR;
using MassTransit.Mediator;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.SignalR;
using Microsoft.AspNetCore.StaticFiles;
@ -40,8 +33,8 @@ using Newtonsoft.Json;
using SharpCompress.Archives;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Data;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
@ -52,11 +45,36 @@ namespace IRaCIS.Core.API.Controllers
{
#region 上传基类封装
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DisableFormValueModelBindingAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
var factories = context.ValueProviderFactories;
//factories.RemoveType<FormValueProviderFactory>();
factories.RemoveType<FormFileValueProviderFactory>();
factories.RemoveType<JQueryFormValueProviderFactory>();
context.HttpContext.Request.EnableBuffering();
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
}
[DisableFormValueModelBinding]
public abstract class UploadBaseController : ControllerBase
{
/// <summary> 流式上传 直接返回</summary>
[Route("base")]
[Route("SingleFileUpload")]
[ApiExplorerSettings(IgnoreApi = true)]
public virtual async Task<IResponseOutput> SingleFileUploadAsync(Func<string, (string, string)> filePathFunc)
{
var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value;
@ -91,7 +109,9 @@ namespace IRaCIS.Core.API.Controllers
/// <summary> 流式上传 通用封装 不返回任何数据,后续还有事情处理 </summary>
[Route("base")]
[Route("FileUpload")]
[ApiExplorerSettings(IgnoreApi = true)]
public virtual async Task FileUploadAsync(Func<string, Task<string>> filePathFunc)
{
var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value;
@ -134,7 +154,9 @@ namespace IRaCIS.Core.API.Controllers
}
}
[Route("base")]
[Route("FileUploadToOSS")]
[ApiExplorerSettings(IgnoreApi = true)]
public virtual async Task FileUploadToOSSAsync(Func<string, Stream, Task<string>> toMemoryStreamFunc)
{
var boundary = HeaderUtilities.RemoveQuotes(MediaTypeHeaderValue.Parse(Request.ContentType).Boundary).Value;
@ -160,10 +182,10 @@ namespace IRaCIS.Core.API.Controllers
}
/// <summary> 流式上传 Dicom上传 </summary>
[Route("base")]
[Route("DicomFileUpload")]
[ApiExplorerSettings(IgnoreApi = true)]
public virtual async Task DicomFileUploadAsync(Func<string, Stream, int, Task> filePathFunc, string boundary)
{
@ -225,82 +247,59 @@ namespace IRaCIS.Core.API.Controllers
#endregion
#region Dicom 影像上传 临床数据 非diocm
[ApiExplorerSettings(GroupName = "Image")]
[ApiController]
public class StudyController : UploadBaseController
public class UploadNoneDicomFileCommand
{
public IMapper _mapper { get; set; }
public IUserInfo _userInfo { get; set; }
private readonly IMediator _mediator;
[NotDefault]
public Guid SubjectVisitId { get; set; }
public IStringLocalizer _localizer { get; set; }
[NotDefault]
public Guid StudyMonitorId { get; set; }
private readonly IWebHostEnvironment _hostEnvironment;
public Guid? NoneDicomStudyId { get; set; }
private readonly IRepository _repository;
//IR 上传的时候跟任务绑定
public Guid? VisitTaskId { get; set; }
private readonly IEasyCachingProvider _provider;
private readonly QCCommon _qCCommon;
public StudyController(IMapper mapper, IStringLocalizer localizer, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IMediator mediator, IEasyCachingProvider provider,
QCCommon qCCommon,
IRepository repository)
public string RecordPath { get; set; }
public int FailedFileCount { get; set; }
public long FileSize { get; set; }
public List<OSSFileDTO> UploadedFileList { get; set; } = new List<OSSFileDTO>();
public class OSSFileDTO
{
_qCCommon = qCCommon;
_provider = provider;
_hostEnvironment = hostEnvironment;
_mediator = mediator;
_localizer = localizer;
_mapper = mapper;
_userInfo = userInfo;
_repository = repository;
public string FilePath { get; set; }
public string FileName { get; set; }
public int FileFize { get; set; }
public string FileType { get; set; }
}
}
[ApiController, ApiExplorerSettings(GroupName = "Image")]
public class StudyController(
IMediator _mediator,
QCCommon _qCCommon,
IUserInfo _userInfo,
IRepository<SubjectVisit> _subjectVisitRepository,
IStringLocalizer _localizer) : UploadBaseController
{
[HttpPost, Route("Study/PreArchiveStudy")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand,
[FromServices] IStudyService _studyService,
[FromServices] IRepository<StudyMonitor> _studyMonitorRepository)
{
if (_provider.Get<List<SystemAnonymization>>(StaticData.Anonymize.Anonymize_AddFixedFiled).Value == null)
{
await _mediator.Send(new AnonymizeCacheRequest());
}
var savedInfo = _studyService.GetSaveToDicomInfo(preArchiveStudyCommand.SubjectVisitId);
var studyMonitor = new StudyMonitor()
{
TrialId = savedInfo.TrialId,
SubjectId = savedInfo.SubjectId,
SubjectVisitId = savedInfo.SubjectVisitId,
IsSuccess = false,
UploadStartTime = DateTime.Now,
IsDicom = preArchiveStudyCommand.IsDicom,
IP = _userInfo.IP
};
var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
return ResponseOutput.Ok(addEntity.Id);
}
/// <summary>Dicom 归档</summary>
[HttpPost, Route("Study/ArchiveStudy")]
[DisableFormValueModelBinding]
[DisableRequestSizeLimit]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId, Guid studyMonitorId,
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> ArchiveStudyNew(Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId, Guid studyMonitorId,
[FromServices] ILogger<UploadDownLoadController> _logger,
[FromServices] IEasyCachingProvider _provider,
[FromServices] IStudyService _studyService,
[FromServices] IHubContext<UploadHub, IUploadClient> _uploadHub,
[FromServices] IDicomArchiveService _dicomArchiveService,
@ -325,22 +324,6 @@ namespace IRaCIS.Core.API.Controllers
var startTime = DateTime.Now;
if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}") && _provider.Get<Guid>($"StudyUid_{trialId}_{studyInstanceUid}").Value == _userInfo.Id)
{
_provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30));
}
//if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}"))
//{
// //---当前已有人正在上传和归档该检查!
// return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress"));
//}
//else
//{
// _provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30));
//}
//到了接口,代表上传结束了
@ -387,7 +370,7 @@ namespace IRaCIS.Core.API.Controllers
//await _uploadHub.Clients.All.ReceivProgressAsync(archiveStudyCommand.StudyInstanceUid, receivedCount);
await _uploadHub.Clients.User(_userInfo.Id.ToString()).ReceivProgressAsync(archiveStudyCommand.StudyInstanceUid, receivedCount);
await _uploadHub.Clients.User(_userInfo.UserRoleId.ToString()).ReceivProgressAsync(archiveStudyCommand.StudyInstanceUid, receivedCount);
archiveResult.ReceivedFileCount = receivedCount;
@ -406,13 +389,12 @@ namespace IRaCIS.Core.API.Controllers
}
catch (Exception)
{
_provider.Remove($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}");
//---请求异常,请重试!
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_RequestError"]);
}
studyMonitor.FileSize = (decimal)HttpContext.Request.ContentLength;
studyMonitor.FileSize = (long)HttpContext.Request.ContentLength;
studyMonitor.FileCount = archiveResult.ReceivedFileCount;
studyMonitor.FailedFileCount = archiveResult.ErrorFiles.Count;
studyMonitor.IsDicomReUpload = archiveStudyCommand.AbandonStudyId != null;
@ -445,7 +427,6 @@ namespace IRaCIS.Core.API.Controllers
}
finally
{
_provider.Remove($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}");
studyMonitor.StudyId = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.Id ?? Guid.Empty;
studyMonitor.StudyCode = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.StudyCode;
@ -463,39 +444,55 @@ namespace IRaCIS.Core.API.Controllers
}
public class UploadNoneDicomFileCommand
/// <summary>
/// 非dicom 上传预上传接口
/// </summary>
/// <param name="preArchiveStudyCommand"></param>
/// <param name="_studyService"></param>
/// <param name="_studyMonitorRepository"></param>
/// <returns></returns>
[HttpPost, Route("Study/PreArchiveStudy")]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand,
[FromServices] IStudyService _studyService,
[FromServices] IRepository<StudyMonitor> _studyMonitorRepository)
{
public Guid TrialId { get; set; }
public Guid SubjectVisitId { get; set; }
public Guid NoneDicomStudyId { get; set; }
public Guid StudyMonitorId { get; set; }
var savedInfo = _studyService.GetSaveToDicomInfo(preArchiveStudyCommand.SubjectVisitId);
public List<OSSFileDTO> UploadedFileList { get; set; } = new List<OSSFileDTO>();
public class OSSFileDTO
var studyMonitor = new StudyMonitor()
{
public string FilePath { get; set; }
public string FileName { get; set; }
public int FileFize { get; set; }
TrialId = savedInfo.TrialId,
SubjectId = savedInfo.SubjectId,
SubjectVisitId = savedInfo.SubjectVisitId,
IsSuccess = false,
UploadStartTime = DateTime.Now,
FileCount = preArchiveStudyCommand.FileCount,
IsDicom = preArchiveStudyCommand.IsDicom,
IP = _userInfo.IP
};
var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
return ResponseOutput.Ok(addEntity.Id);
public string FileType { get; set; }
}
}
/// <summary>
/// 上传非Dicom 文件 支持压缩包 多文件上传
/// </summary>
/// <param name="incommand"></param>
/// <param name="_noneDicomStudyRepository"></param>
/// <param name="_studyMonitorRepository"></param>
/// <param name="_noneDicomStudyFileRepository"></param>
/// <returns></returns>
[HttpPost("NoneDicomStudy/UploadNoneDicomFile")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> UploadNoneDicomFile(UploadNoneDicomFileCommand incommand,
[FromServices] IRepository<NoneDicomStudy> _noneDicomStudyRepository, [FromServices] IRepository<StudyMonitor> _studyMonitorRepository)
[FromServices] IRepository<NoneDicomStudy> _noneDicomStudyRepository,
[FromServices] IRepository<StudyMonitor> _studyMonitorRepository,
[FromServices] IRepository<NoneDicomStudyFile> _noneDicomStudyFileRepository)
{
var subjectVisitId = incommand.SubjectVisitId;
@ -503,9 +500,9 @@ namespace IRaCIS.Core.API.Controllers
var noneDicomStudyId = incommand.NoneDicomStudyId;
await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
await _qCCommon.VerifyIsCRCSubmmitAsync(_subjectVisitRepository, _userInfo, subjectVisitId);
var sv = (await _repository.Where<SubjectVisit>(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.TrialSiteId, t.SubjectId }).FirstOrDefaultAsync()).IfNullThrowConvertException();
var sv = (await _subjectVisitRepository.Where(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.TrialSiteId, t.SubjectId }).FirstOrDefaultAsync()).IfNullThrowConvertException();
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == studyMonitorId);
@ -513,25 +510,39 @@ namespace IRaCIS.Core.API.Controllers
foreach (var item in incommand.UploadedFileList)
{
await _repository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, NoneDicomStudyId = noneDicomStudyId,FileType=item.FileType });
//如果是跟任务绑那么NoneDicomStudyId 设置为空,不影响之前的检查,同时设置 OriginNoneDicomStudyId 保证关系
if (incommand.VisitTaskId != null && incommand.VisitTaskId != Guid.Empty)
{
await _noneDicomStudyFileRepository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, OriginNoneDicomStudyId = noneDicomStudyId.Value, VisitTaskId = incommand.VisitTaskId, FileType = item.FileType, FileSize = item.FileFize });
}
else
{
await _noneDicomStudyFileRepository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, NoneDicomStudyId = noneDicomStudyId.Value, FileType = item.FileType, FileSize = item.FileFize });
}
}
var uploadFinishedTime = DateTime.Now;
var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync((t => t.Id == noneDicomStudyId));
var noneDicomStudy = await _noneDicomStudyRepository.FirstOrDefaultAsync(t => t.Id == noneDicomStudyId,true);
noneDicomStudy.FileCount = noneDicomStudy.FileCount + incommand.UploadedFileList.Count;
noneDicomStudy.FileCount = noneDicomStudy.FileCount + (incommand.VisitTaskId != null ? 0 : incommand.UploadedFileList.Count);
studyMonitor.FileCount = incommand.UploadedFileList.Count;
studyMonitor.RecordPath = incommand.RecordPath;
studyMonitor.FailedFileCount = incommand.FailedFileCount;
studyMonitor.IsSuccess = incommand.FailedFileCount == 0;
studyMonitor.FileSize = incommand.UploadedFileList.Sum(t => t.FileFize);
studyMonitor.IsDicom = false;
studyMonitor.IsDicomReUpload = false;
studyMonitor.StudyId = noneDicomStudyId;
studyMonitor.StudyId = noneDicomStudyId.Value;
studyMonitor.StudyCode = noneDicomStudy.StudyCode;
studyMonitor.ArchiveFinishedTime = DateTime.Now;
studyMonitor.IP = _userInfo.IP;
await _repository.SaveChangesAsync();
await _noneDicomStudyRepository.SaveChangesAsync();
return ResponseOutput.Ok();
}
@ -545,12 +556,13 @@ namespace IRaCIS.Core.API.Controllers
/// </summary>
/// <param name="trialId"></param>
/// <param name="oSSService"></param>
/// <param name="_inspectionFileRepository"></param>
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
[HttpPost("QCOperation/UploadVisitCheckExcel/{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[TrialGlobalLimit("AfterStopCannNotOpt")]
public async Task<IResponseOutput> UploadVisitCheckExcel(Guid trialId, [FromServices] IOSSService oSSService)
public async Task<IResponseOutput> UploadVisitCheckExcel(Guid trialId, [FromServices] IOSSService oSSService, [FromServices] IRepository<InspectionFile> _inspectionFileRepository)
{
var fileName = string.Empty;
@ -560,9 +572,9 @@ namespace IRaCIS.Core.API.Controllers
{
fileName = realFileName;
if (!fileName.EndsWith(".xlsx") && !fileName.EndsWith(".csv") && !fileName.EndsWith(".xls"))
if (!fileName.EndsWith(".xlsx") && !fileName.EndsWith(".xls"))
{
//---支持.xlsx、.xls、.csv格式的文件上传。
//---支持.xlsx、.xls格式的文件上传。
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_SupportedFormats"]);
}
@ -572,7 +584,7 @@ namespace IRaCIS.Core.API.Controllers
var ossRelativePath = await oSSService.UploadToOSSAsync(fileStream, "InspectionUpload/Check", realFileName);
await _repository.AddAsync(new InspectionFile() { FileName = realFileName, RelativePath = ossRelativePath, TrialId = trialId });
await _inspectionFileRepository.AddAsync(new InspectionFile() { FileName = realFileName, RelativePath = ossRelativePath, TrialId = trialId });
return ossRelativePath;
@ -742,11 +754,16 @@ namespace IRaCIS.Core.API.Controllers
//---请保证上传数据符合模板文件中的样式,且存在有效数据。
return ResponseOutput.NotOk(_localizer["UploadDownLoad_InvalidData"]);
}
}
await _mediator.Send(new ConsistencyVerificationRequest() { ETCList = etcCheckList, TrialId = trialId });
// 适合获取结果的
//var client = _mediator.CreateRequestClient<ConsistenCheckCommand>();
//await client.GetResponse<ConsistenCheckResult>(new ConsistenCheckCommand() { ETCList = etcCheckList, TrialId = trialId });
//不获取结果,不用定义返回类型
await _mediator.Send(new ConsistenCheckCommand() { ETCList = etcCheckList, TrialId = trialId });
return ResponseOutput.Ok();
@ -756,229 +773,13 @@ namespace IRaCIS.Core.API.Controllers
#endregion
#region 医生文件上传下载
#region DTO
public class DoctorDownloadInfo
{
public Guid Id { get; set; }
public string Name { get; set; }
public string ReviewerCode { get; set; }
public List<DownloadFileInfo> FileList { get; set; }
}
public class DownloadFileInfo
{
public string FileName { get; set; }
public string Path { get; set; }
}
public class GetDoctorPathCommand
{
public int Language { get; set; }
public List<Guid> DoctorIdList { get; set; }
}
public class GetDoctoreAttachPathCommand
{
public Guid DoctorId { get; set; }
public List<Guid> AttachmentIdList { get; set; }
}
#endregion
/// <summary>医生文件上传下载</summary>
[ApiExplorerSettings(GroupName = "Common")]
[ApiController]
public class FileController : UploadBaseController
{
public IMapper _mapper { get; set; }
public IUserInfo _userInfo { get; set; }
private readonly IWebHostEnvironment _hostEnvironment;
private readonly IFileService _fileService;
public FileController(IMapper mapper, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IFileService fileService)
{
_fileService = fileService;
_hostEnvironment = hostEnvironment;
_mapper = mapper;
_userInfo = userInfo;
}
/// <summary>
/// New 医生首页 多选 获取多个医生信息+文件路径列表 医生压缩包名称 doctorCode + "_" + doctorName _(时间戳或者随机的Guid)
/// </summary>
/// <returns></returns>
[HttpPost, Route("file/GetOfficialResume")]
public async Task<IResponseOutput<List<DoctorDownloadInfo>>> GetOfficialResume(GetDoctorPathCommand command,
[FromServices] IRepository<Attachment> _attachmentrepository)
{
var list = await _attachmentrepository.Where(t => command.DoctorIdList.Contains(t.DoctorId) && command.Language == t.Language).GroupBy(t => new { Name = t.Doctor.FirstName + "_" + t.Doctor.LastName, ReviewerCode = t.Doctor.ReviewerCode, t.DoctorId })
.Select(g => new DoctorDownloadInfo()
{
Id = g.Key.DoctorId,
Name = g.Key.Name,
ReviewerCode = g.Key.ReviewerCode,
FileList = g.Select(t => new DownloadFileInfo() { FileName = t.FileName, Path = t.Path }).ToList()
}).ToListAsync();
return ResponseOutput.Ok(list);
}
/// <summary>
/// New 项目入组 勾选获取简历路径
/// </summary>
/// <param name="command"></param>
/// <param name="_doctorService"></param>
/// <param name="_attachmentrepository"></param>
/// <returns></returns>
[HttpPost, Route("file/GetTrialDoctorOfficialResume")]
public async Task<IResponseOutput<List<DoctorDownloadInfo>>> GetTrialDoctorOfficialResume(GetDoctorPathCommand command,
[FromServices] IDoctorService _doctorService,
[FromServices] IRepository<Attachment> _attachmentrepository)
{
var list = await _attachmentrepository.Where(t => command.DoctorIdList.Contains(t.DoctorId) && command.Language == t.Language && t.IsOfficial && t.Type.Equals("Resume")).GroupBy(t => new { Name = t.Doctor.FirstName + "_" + t.Doctor.LastName, ReviewerCode = t.Doctor.ReviewerCode, t.DoctorId })
.Select(g => new DoctorDownloadInfo()
{
Id = g.Key.DoctorId,
Name = g.Key.Name,
ReviewerCode = g.Key.ReviewerCode,
FileList = g.Select(t => new DownloadFileInfo() { FileName = t.FileName, Path = t.Path }).ToList()
}).ToListAsync();
return ResponseOutput.Ok(list);
}
/// <summary>
/// new 医生详情 勾选或者下载文件路径
/// </summary>
/// <param name="command"></param>
/// <param name="_doctorService"></param>
/// <param name="_attachmentrepository"></param>
/// <returns></returns>
[HttpPost, Route("file/GetDoctorAttachment")]
public async Task<IResponseOutput<DoctorDownloadInfo>> GetDoctorAttachment(GetDoctoreAttachPathCommand command,
[FromServices] IDoctorService _doctorService,
[FromServices] IRepository<Attachment> _attachmentrepository)
{
var find = await _attachmentrepository.Where(t => command.DoctorId == t.DoctorId && command.AttachmentIdList.Contains(t.Id)).GroupBy(t => new { Name = t.Doctor.FirstName + "_" + t.Doctor.LastName, ReviewerCode = t.Doctor.ReviewerCode, t.DoctorId })
.Select(g => new DoctorDownloadInfo()
{
Id = g.Key.DoctorId,
Name = g.Key.Name,
ReviewerCode = g.Key.ReviewerCode,
FileList = g.Select(t => new DownloadFileInfo() { FileName = t.FileName, Path = t.Path }).ToList()
}).FirstOrDefaultAsync();
return ResponseOutput.Ok(find);
}
#region 废弃
/// <summary>
/// 下载多个医生的所有附件
/// </summary>
/// <param name="doctorIds"></param>
/// <returns></returns>
[Obsolete]
[HttpPost, Route("file/downloadDoctorAttachments")]
public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadAttachment(Guid[] doctorIds)
{
var path = await _fileService.CreateDoctorsAllAttachmentZip(doctorIds);
return ResponseOutput.Ok(new UploadFileInfoDTO
{
FilePath = path,
FullFilePath = path + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7)
});
}
/// <summary>
/// 下载指定医生的指定附件
/// </summary>
/// <param name="doctorId">医生Id</param>
/// <param name="attachmentIds">要下载的附件Id</param>
/// <returns></returns>
[HttpPost, Route("file/downloadByAttachmentId/{doctorId}")]
[Obsolete]
public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadAttachmentById(Guid doctorId, Guid[] attachmentIds)
{
var path = await _fileService.CreateZipPackageByAttachment(doctorId, attachmentIds);
return ResponseOutput.Ok(new UploadFileInfoDTO
{
FilePath = await _fileService.CreateZipPackageByAttachment(doctorId, attachmentIds),
FullFilePath = path + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7)
});
}
/// <summary>
/// 下载医生官方简历 首页 区分 中文和英文
/// </summary>
/// <param name="language"></param>
/// <param name="doctorIds"></param>
/// <returns></returns>
[HttpPost, Route("file/downloadOfficialCV/{language}")]
[Obsolete]
public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadOfficialResume(int language, Guid[] doctorIds)
{
var path = await _fileService.CreateDoctorsAllAttachmentZip(doctorIds);
return ResponseOutput.Ok(new UploadFileInfoDTO
{
FilePath = await _fileService.CreateOfficialResumeZip(language, doctorIds),
FullFilePath = path + "?access_token=" + HttpContext.Request.Headers["Authorization"].ToString().Substring(7)
});
}
/// <summary>
/// 入组 项目下载简历
/// </summary>
/// <param name="language"></param>
/// <param name="trialId"></param>
/// <param name="doctorIdArray"></param>
/// <returns></returns>
[HttpPost, Route("enroll/downloadResume/{trialId:guid}/{language}")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
[AllowAnonymous]
[Obsolete]
public async Task<IResponseOutput<string>> DownloadResume(int language, Guid trialId, Guid[] doctorIdArray)
{
var zipPath = await _fileService.CreateOfficialResumeZip(language, doctorIdArray);
return ResponseOutput.Ok(zipPath);
}
#endregion
}
#endregion
#region 项目 系统 基本文件 上传 下载 预览
[ApiExplorerSettings(GroupName = "Common")]
[ApiController]
[ApiController, ApiExplorerSettings(GroupName = "Common")]
public class UploadDownLoadController : UploadBaseController
{
public IMapper _mapper { get; set; }
@ -1049,11 +850,18 @@ namespace IRaCIS.Core.API.Controllers
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_InvalidCenters"]);
}
if (excelList.GroupBy(t => new { t.TrialSiteCode, t.UserTypeStr, t.Email }).Any(g => g.Count() > 1))
foreach (var item in excelList.GroupBy(t => t.Email.Trim()))
{
// 同一邮箱,同一用户类型,只能生成一个账户,请核查Excel数据
var itemList = item.ToList();
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_CheckDuplicateAccounts"]);
var first = item.First();
if (itemList.Any(t => t.Email.Trim() != first.Email.Trim() || t.Phone.Trim() != first.Phone.Trim() || t.OrganizationName.Trim() != first.OrganizationName.Trim() || t.FirstName.Trim() != first.FirstName.Trim() || t.LastName.Trim() != first.LastName.Trim()))
{
//同一邮箱,用户信息应该保持一致!
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_CheckDuplicateAccounts"]);
}
}
if (excelList.Any(t => !t.Email.Contains("@")))
@ -1063,22 +871,22 @@ namespace IRaCIS.Core.API.Controllers
}
var generateUserTypeList = new List<string>() { "CRC", "CRA" };
if (excelList.Any(t => !generateUserTypeList.Contains(t.UserTypeStr.ToUpper())))
{
//用户类型仅能为 CRC,SR,CRA 请核查Excel数据
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_InvalidUserType"]);
}
//if (excelList.Any(t => !generateUserTypeList.Contains(t.UserTypeStr.ToUpper())))
//{
// //用户类型仅能为 CRC,SR,CRA 请核查Excel数据
// throw new BusinessValidationFailedException(_localizer["UploadDownLoad_InvalidUserType"]);
//}
if (excelList.Count == 0)
{
throw new BusinessValidationFailedException(_localizer["UploadDownLoad_NoValiddata"]);
}
//处理好 用户类型 和用户类型枚举
var sysUserTypeList = _usertypeRepository.Where(t => t.UserTypeEnum == UserTypeEnum.CRA || t.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator).Select(t => new { UserTypeId = t.Id, t.UserTypeEnum }).ToList();
var siteList = _trialSiteRepository.Where(t => t.TrialId == trialId && siteCodeList.Contains(t.TrialSiteCode)).Select(t => new { t.TrialSiteCode, TrialSiteId= t.Id }).ToList();
var siteList = _trialSiteRepository.Where(t => t.TrialId == trialId && siteCodeList.Contains(t.TrialSiteCode)).Select(t => new { t.TrialSiteCode, TrialSiteId = t.Id }).ToList();
foreach (var item in excelList)
{
switch (item.UserTypeStr.ToUpper())
switch (item.UserTypeStr.Trim().ToUpper())
{
case "CRC":
@ -1095,12 +903,12 @@ namespace IRaCIS.Core.API.Controllers
}
item.TrialSiteId = siteList.FirstOrDefault(t => t.TrialSiteCode.ToUpper() == item.TrialSiteCode.ToUpper()).TrialSiteId;
item.TrialSiteId = siteList.FirstOrDefault(t => t.TrialSiteCode.Trim().ToUpper() == item.TrialSiteCode.Trim().ToUpper()).TrialSiteId;
}
var list = excelList.Where(t => t.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator || t.UserTypeEnum == UserTypeEnum.CRA).ToList();
await _trialSiteSurveyService.ImportGenerateAccountAndJoinTrialAsync(trialId, baseUrl, routeUrl, excelList.ToList());
await _trialSiteSurveyService.ImportGenerateAccountAndJoinTrialAsync(trialId, baseUrl, routeUrl, list);
return ResponseOutput.Ok();

View File

@ -0,0 +1,84 @@
using Microsoft.Extensions.Hosting;
using System.Threading;
using System;
using System.Threading.Tasks;
using MassTransit;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.Extensions.Logging;
using Hangfire;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.MassTransit.Consumer;
using IRaCIS.Core.Domain.Share;
using MassTransit.Scheduling;
using Hangfire.Storage;
using System.Linq;
using Microsoft.EntityFrameworkCore;
using MassTransit.Mediator;
namespace IRaCIS.Core.API.HostService;
public class HangfireHostService(IRecurringMessageScheduler _recurringMessageScheduler,
IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository,
IRepository<EmailNoticeConfig> _emailNoticeConfigrepository,
IMediator _mediator,
ILogger<HangfireHostService> _logger) : IHostedService
{
public async Task StartAsync(CancellationToken cancellationToken)
{
_logger.LogInformation("项目启动 hangfire 任务初始化 执行开始~");
//创建邮件定时任务
//项目定时任务都在default 队列
var dbJobIdList = JobStorage.Current.GetConnection().GetRecurringJobs().Where(t => t.Queue == "default").Select(t => t.Id).ToList();
foreach (var jobId in dbJobIdList)
{
HangfireJobHelper.RemoveCronJob(jobId);
}
var taskInfoList = await _trialEmailNoticeConfigRepository.Where(t => t.Trial.TrialStatusStr == StaticData.TrialState.TrialOngoing && t.EmailCron != string.Empty && t.IsAutoSend)
.Select(t => new { t.Id, t.Code, TrialCode = t.Trial.TrialCode, t.EmailCron, t.BusinessScenarioEnum, t.TrialId })
.ToListAsync();
foreach (var task in taskInfoList)
{
//利用主键作为任务Id
var jobId = $"{task.TrialId}({task.TrialCode})_({task.BusinessScenarioEnum})";
var trialId = task.TrialId;
HangfireJobHelper.AddOrUpdateTrialCronJob(jobId, trialId, task.BusinessScenarioEnum, task.EmailCron);
}
// 系统邮件定时任务
var systemTaskInfoList = await _emailNoticeConfigrepository.Where(t => t.EmailCron != string.Empty && t.IsAutoSend)
.Select(t => new { t.Id, t.Code, t.EmailCron, t.BusinessScenarioEnum, })
.ToListAsync();
foreach (var task in systemTaskInfoList)
{
//利用主键作为任务Id
var jobId = $"{task.Id}_({task.BusinessScenarioEnum})";
HangfireJobHelper.AddOrUpdateTimingCronJob(jobId, task.BusinessScenarioEnum, task.EmailCron);
}
//await _recurringMessageScheduler.ScheduleRecurringPublish(new QCImageQuestionSchedule() { CronExpression = "0/3 * * * * ? " }, new MasstransiTestCommand { value = "message at " + DateTime.Now.ToString() });
_logger.LogInformation("项目启动 hangfire 任务初始化 执行结束");
}
public Task StopAsync(CancellationToken cancellationToken) => Task.CompletedTask;
}

View File

@ -0,0 +1,30 @@
using IRaCIS.Core.Application.MassTransit.Consumer;
using MassTransit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System.Threading;
using System.Threading.Tasks;
namespace IRaCIS.Core.API.HostService
{
public class RecurringJobConfigurationService :
BackgroundService
{
readonly IServiceScopeFactory _scopeFactory;
public RecurringJobConfigurationService(IServiceScopeFactory scopeFactory)
{
_scopeFactory = scopeFactory;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await using var scope = _scopeFactory.CreateAsyncScope();
var endpoint = scope.ServiceProvider.GetRequiredService<IPublishEndpoint>();
await endpoint.AddOrUpdateRecurringJob(nameof(MasstransitTestConsumer), new MasstransiTestCommand(), x => x.Every(minutes: 1),
stoppingToken);
}
}
}

View File

@ -1,107 +0,0 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net6.0</TargetFramework>
<SignAssembly>false</SignAssembly>
<UserSecretsId>354572d4-9e15-4099-807c-63a2d29ff9f2</UserSecretsId>
<LangVersion>default</LangVersion>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>.\IRaCIS.Core.API.xml</DocumentationFile>
<NoWarn>1701;1702;1591;</NoWarn>
<OutputPath>..\bin\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DocumentationFile>bin\Release\IRaCIS.Core.API.xml</DocumentationFile>
<OutputPath>bin\Release\</OutputPath>
<NoWarn>1701;1702;1591</NoWarn>
</PropertyGroup>
<ItemGroup>
<Compile Remove="Controllers\ReviewerApi\**" />
<Compile Remove="UploadFile\**" />
<Content Remove="Controllers\ReviewerApi\**" />
<Content Remove="UploadFile\**" />
<EmbeddedResource Remove="Controllers\ReviewerApi\**" />
<EmbeddedResource Remove="UploadFile\**" />
<None Remove="Controllers\ReviewerApi\**" />
<None Remove="UploadFile\**" />
</ItemGroup>
<ItemGroup>
<Content Remove="web.config" />
<Content Remove="wwwroot\swagger\ui\abp.js" />
<Content Remove="wwwroot\swagger\ui\abp.swagger.js" />
<Content Remove="wwwroot\swagger\ui\Index.html" />
</ItemGroup>
<ItemGroup>
<None Remove=".preview.jpg" />
<None Remove="GrpcToken.proto" />
<None Remove="IRaCIS.Core.API.xml" />
<None Remove="Protos\GrpcToken.proto" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="GrpcToken.proto" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="wwwroot\swagger\ui\abp.js" />
<EmbeddedResource Include="wwwroot\swagger\ui\abp.swagger.js" />
<EmbeddedResource Include="wwwroot\swagger\ui\Index.html" />
</ItemGroup>
<ItemGroup>
<Protobuf Include="Protos\GrpcToken.proto">
<GrpcServices>Client</GrpcServices>
</Protobuf>
</ItemGroup>
<ItemGroup>
<PackageReference Include="AspNetCoreRateLimit" Version="4.0.1" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="7.2.0" />
<PackageReference Include="EasyCaching.InMemory" Version="1.4.1" />
<PackageReference Include="EasyCaching.Interceptor.Castle" Version="1.4.1" />
<PackageReference Include="Google.Protobuf" Version="3.19.1" />
<PackageReference Include="Grpc.Net.Client" Version="2.41.0" />
<PackageReference Include="Grpc.Tools" Version="2.42.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Hangfire.Tags.SqlServer" Version="1.8.0" />
<PackageReference Include="Invio.Extensions.Authentication.JwtBearer" Version="2.0.1" />
<PackageReference Include="LogDashboard" Version="1.4.8" />
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.1" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="6.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.14.0" />
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="6.0.1" />
<PackageReference Include="Serilog.AspNetCore" Version="4.1.0" />
<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="1.1.4" />
<PackageReference Include="Serilog.Sinks.Email" Version="2.4.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\IRaCIS.Core.Application\IRaCIS.Core.Application.csproj" />
<ProjectReference Include="..\IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\PublishProfiles\" />
</ItemGroup>
<ItemGroup>
<Content Update="NLog.config">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties anonymizetagsetting_1json__JsonSchema="http://json.schemastore.org/jovo-language-model" /></VisualStudio></ProjectExtensions>
</Project>

View File

@ -1,160 +1,129 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<SignAssembly>false</SignAssembly>
<UserSecretsId>354572d4-9e15-4099-807c-63a2d29ff9f2</UserSecretsId>
<LangVersion>default</LangVersion>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<Version>1.0.1.001</Version>
<Company>上海展影医疗科技有限公司</Company>
<Product>IRC影像系统 (EICS)</Product>
<Copyright>上海展影医疗科技有限公司版权所有</Copyright>
</PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<SignAssembly>false</SignAssembly>
<UserSecretsId>354572d4-9e15-4099-807c-63a2d29ff9f2</UserSecretsId>
<LangVersion>default</LangVersion>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<Version>1.0.1.001</Version>
<Company>上海展影医疗科技有限公司</Company>
<Product>IRC影像系统 (EICS)</Product>
<Copyright>上海展影医疗科技有限公司版权所有</Copyright>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>.\IRaCIS.Core.API.xml</DocumentationFile>
<NoWarn>1701;1702;1591;1570;</NoWarn>
<OutputPath>..\bin\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>.\IRaCIS.Core.API.xml</DocumentationFile>
<NoWarn>1701;1702;1591;1570;</NoWarn>
<OutputPath>..\bin\</OutputPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DocumentationFile>bin\Release\IRaCIS.Core.API.xml</DocumentationFile>
<OutputPath>bin\Release\</OutputPath>
<NoWarn>1701;1702;1591</NoWarn>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DocumentationFile>bin\Release\IRaCIS.Core.API.xml</DocumentationFile>
<OutputPath>bin\Release\</OutputPath>
<NoWarn>1701;1702;1591</NoWarn>
</PropertyGroup>
<ItemGroup>
<Content Remove="web.config" />
<Content Remove="wwwroot\swagger\ui\abp.js" />
<Content Remove="wwwroot\swagger\ui\abp.swagger.js" />
<Content Remove="wwwroot\swagger\ui\Index.html" />
</ItemGroup>
<ItemGroup>
<Content Remove="web.config" />
<Content Remove="wwwroot\swagger\ui\abp.js" />
<Content Remove="wwwroot\swagger\ui\abp.swagger.js" />
<Content Remove="wwwroot\swagger\ui\Index.html" />
</ItemGroup>
<ItemGroup>
<None Remove=".preview.jpg" />
<None Remove="GrpcToken.proto" />
<None Remove="IRaCIS.Core.API.xml" />
<None Remove="Protos\GrpcToken.proto" />
</ItemGroup>
<ItemGroup>
<None Remove=".preview.jpg" />
<None Remove="GrpcToken.proto" />
<None Remove="IRaCIS.Core.API.xml" />
<None Remove="Protos\GrpcToken.proto" />
<None Remove="Resources\ip2region.xdb" />
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="GrpcToken.proto" />
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="wwwroot\swagger\ui\abp.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="wwwroot\swagger\ui\abp.swagger.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="wwwroot\swagger\ui\Index.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Protobuf Include="Protos\GrpcToken.proto">
<GrpcServices>Client</GrpcServices>
</Protobuf>
</ItemGroup>
<ItemGroup>
<ApplicationDefinition Include="GrpcToken.proto" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="aliyun-net-sdk-sts" Version="3.1.2" />
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" />
<PackageReference Include="EasyCaching.Interceptor.Castle" Version="1.9.2" />
<PackageReference Include="EasyCaching.Serialization.MessagePack" Version="1.9.2">
<TreatAsUsed>true</TreatAsUsed>
</PackageReference>
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.12" />
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
<PackageReference Include="Hangfire.SqlServer" Version="1.8.12" />
<PackageReference Include="Invio.Extensions.Authentication.JwtBearer" Version="2.0.1" />
<PackageReference Include="LogDashboard" Version="1.4.8" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.5" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="2.0.3" />
<PackageReference Include="Serilog.Sinks.Email" Version="3.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.6.2" />
</ItemGroup>
<ItemGroup>
<Content Include="Resources\ip2region.xdb">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="wwwroot\swagger\ui\abp.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="wwwroot\swagger\ui\abp.swagger.js">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
<EmbeddedResource Include="wwwroot\swagger\ui\Index.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</EmbeddedResource>
</ItemGroup>
<ItemGroup>
<Protobuf Include="Protos\GrpcToken.proto">
<GrpcServices>Client</GrpcServices>
</Protobuf>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\IRaCIS.Core.Application\IRaCIS.Core.Application.csproj" />
<ProjectReference Include="..\IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.14" />
<ItemGroup>
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.15">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="ConfigMapFileProvider" Version="2.0.1" />
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.18" />
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
<PackageReference Include="Hangfire.InMemory" Version="1.0.0" />
<PackageReference Include="Hangfire.SqlServer" Version="1.8.18" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.10" />
<PackageReference Include="Serilog.AspNetCore" Version="9.0.0" />
<PackageReference Include="Serilog.Formatting.Compact" Version="3.0.0" />
<PackageReference Include="Serilog.Sinks.Email" Version="4.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="8.1.1" />
</ItemGroup>
<ItemGroup>
<Content Update="wwwroot\EmailTemplate\AdminAddUser_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\AdminResetUser_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\AdminResetUser.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\SubjectEnrollConfirmOrPDProgress_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialDoctorExistJoin_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialDoctorFirstJoin.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialSiteSurveyReject.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialSiteSurveyReject_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialDoctorExistJoin.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialUserExistJoin_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialUserExistJoin.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\AdminAddUser.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialDoctorFirstJoin_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\SubjectEnrollConfirmOrPDProgress.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialUserFirstJoin_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\UserOptCommon_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\UserOptCommon.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\TrialUserFirstJoin.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\IRaCIS.Core.Application\IRaCIS.Core.Application.csproj" />
<ProjectReference Include="..\IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Properties\PublishProfiles\" />
</ItemGroup>
<ItemGroup>
<None Include="..\.editorconfig" Link=".editorconfig" />
</ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties properties_4launchsettings_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>
<ItemGroup>
<Folder Include="Properties\PublishProfiles\" />
</ItemGroup>
<ItemGroup>
<Content Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="Resources\en-US.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
<Content Update="Resources\zh-CN.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
<ItemGroup>
<None Update="Resources\GeoLite2-City.mmdb">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
<ProjectExtensions>
<VisualStudio>
<UserProperties properties_4launchsettings_1json__JsonSchema="" />
</VisualStudio>
</ProjectExtensions>
</Project>

View File

@ -16,7 +16,12 @@
医生基本信息 、工作信息 专业信息、审核状态
</summary>
</member>
<member name="M:IRaCIS.Api.Controllers.ExtraController.GetDoctorDetail(IRaCIS.Application.Interfaces.IAttachmentService,IRaCIS.Application.Interfaces.IDoctorService,IRaCIS.Application.Interfaces.IEducationService,IRaCIS.Application.Interfaces.ITrialExperienceService,IRaCIS.Application.Interfaces.IResearchPublicationService,IRaCIS.Application.Interfaces.IVacationService,System.Guid)">
<member name="M:IRaCIS.Api.Controllers.ExtraController.#ctor(IRaCIS.Application.Interfaces.IAttachmentService,IRaCIS.Application.Interfaces.IDoctorService,IRaCIS.Application.Interfaces.IEducationService,IRaCIS.Application.Interfaces.ITrialExperienceService,IRaCIS.Application.Interfaces.IResearchPublicationService,IRaCIS.Application.Interfaces.IVacationService)">
<summary>
医生基本信息 、工作信息 专业信息、审核状态
</summary>
</member>
<member name="M:IRaCIS.Api.Controllers.ExtraController.GetDoctorDetail(IRaCIS.Application.Contracts.GetDoctorDetailInDto)">
<summary>
获取医生详情
</summary>
@ -29,8 +34,21 @@
<param name="doctorId"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Api.Controllers.ExtraController.Login(IRaCIS.Application.Contracts.UserLoginDTO,EasyCaching.Core.IEasyCachingProvider,IRaCIS.Application.Services.IUserService,IRaCIS.Core.Application.Auth.ITokenService,IRaCIS.Core.Application.Contracts.IReadingImageTaskService,Microsoft.Extensions.Options.IOptionsMonitor{IRaCIS.Core.Domain.Share.ServiceVerifyConfigOption},IRaCIS.Application.Services.IMailVerificationService)">
<summary> 系统用户登录接口[New] </summary>
<member name="M:IRaCIS.Api.Controllers.ExtraController.OAuthCallBack(System.String,System.String)">
<summary>
回调到前端,前端调用后端的接口
参考链接https://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html
后端通过这个code ,带上客户端信息,和授权类型 可以向单点登录提供商获取厂商token
但是单点登录提供商提供的token 和我们系统的token 是有区别的我们的token里面有我们业务系统的UserId涉及到很多业务操作所以在此出现了两种方案
1、前端使用厂商的Token。 后端通过code 获取厂商的Token 返回前端的同时返回我们系统的UserId前段在http 请求头加上一个自定义参数带上UserId 后端取用户Id的地方变动下
但是除了UserId外后端还有其他信息也是从Token取的所以在请求头也需要带上此外后端认证Token的方式也需要变化改造成本稍大如果是微服务做这种处理还是可以的
2、前端还是使用我们后台自己的Token。后端通过code 获取厂商Token的同时后端做一个隐藏登录返回厂商的Token的同时也返回我们系统的Token。
(像我们单体,这种方式最简单,我们用单点登录,无非就是不想记多个系统的密码,自动登录而已,其他不支持的项目改造成本也是最低的)
</summary>
<param name="type">回调的厂商类型 比如github, google, 我们用的logto ,不同的厂商回调到前端的地址可以不同的,但是请求后端的接口可以是同一个 </param>
<param name="code">在第三方平台登录成功后回调前端的时候会返回一个code </param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateTrialInspection(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Application.Contracts.TrialCommand})">
<summary> 添加实验项目-返回新增Id[AUTH]</summary>
@ -41,7 +59,7 @@
<param name="param"></param>
<returns>新记录Id</returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.WorkLoadAddOrUpdate(IRaCIS.Application.Services.IDoctorWorkloadService,IRaCIS.Application.Contracts.WorkloadCommand)">
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.WorkLoadAddOrUpdate(IRaCIS.Core.Application.Service.IDoctorWorkloadService,IRaCIS.Application.Contracts.WorkloadCommand)">
<summary>
添加或更新工作量[AUTH]
</summary>
@ -167,6 +185,13 @@
<param name="opt"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.SignConsistencyAnalysisReadingClinicalData(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.Service.Reading.Dto.SignConsistencyAnalysisReadingClinicalDataInDto})">
<summary>
PM签名一致性分析临床数据
</summary>
<param name="opt"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.SubmitClinicalFormAndSign(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.Service.Reading.Dto.SubmitClinicalFormInDto})">
<summary>
提交结构化录入并签名
@ -256,7 +281,7 @@
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.ConfirmReReading(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.ViewModel.ConfirmReReadingCommand},IRaCIS.Core.Application.Service.IVisitTaskHelpeService,IRaCIS.Core.Application.Service.IVisitTaskService)">
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.ConfirmReReading(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.ViewModel.ConfirmReReadingCommand},IRaCIS.Core.Application.Service.IVisitTaskService)">
<summary>
重阅同意
</summary>
@ -271,86 +296,38 @@
<member name="M:IRaCIS.Core.API.Controllers.UploadBaseController.DicomFileUploadAsync(System.Func{System.String,System.IO.Stream,System.Int32,System.Threading.Tasks.Task},System.String)">
<summary> 流式上传 Dicom上传 </summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.StudyController.ArchiveStudyNew(System.Guid,System.Guid,System.String,System.Nullable{System.Guid},System.Guid,Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.API.Controllers.UploadDownLoadController},EasyCaching.Core.IEasyCachingProvider,IRaCIS.Core.Application.Contracts.IStudyService,Microsoft.AspNetCore.SignalR.IHubContext{IRaCIS.Core.API.UploadHub,IRaCIS.Core.API.IUploadClient},IRaCIS.Core.Application.Contracts.Dicom.IDicomArchiveService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
<member name="M:IRaCIS.Core.API.Controllers.StudyController.ArchiveStudyNew(System.Guid,System.Guid,System.String,System.Nullable{System.Guid},System.Guid,Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.API.Controllers.UploadDownLoadController},IRaCIS.Core.Application.Contracts.IStudyService,Microsoft.AspNetCore.SignalR.IHubContext{IRaCIS.Core.API.UploadHub,IRaCIS.Core.API.IUploadClient},IRaCIS.Core.Application.Contracts.Dicom.IDicomArchiveService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
<summary>Dicom 归档</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadNoneDicomFile(IRaCIS.Core.API.Controllers.StudyController.UploadNoneDicomFileCommand,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
<member name="M:IRaCIS.Core.API.Controllers.StudyController.PreArchiveStudy(IRaCIS.Core.Application.Contracts.PreArchiveStudyCommand,IRaCIS.Core.Application.Contracts.IStudyService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
<summary>
非dicom 上传预上传接口
</summary>
<param name="preArchiveStudyCommand"></param>
<param name="_studyService"></param>
<param name="_studyMonitorRepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadNoneDicomFile(IRaCIS.Core.API.Controllers.UploadNoneDicomFileCommand,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudyFile})">
<summary>
上传非Dicom 文件 支持压缩包 多文件上传
</summary>
<param name="incommand"></param>
<param name="_noneDicomStudyRepository"></param>
<param name="_studyMonitorRepository"></param>
<param name="_noneDicomStudyFileRepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadVisitCheckExcel(System.Guid,IRaCIS.Core.Application.Helper.IOSSService)">
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadVisitCheckExcel(System.Guid,IRaCIS.Core.Application.Helper.IOSSService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.InspectionFile})">
<summary>
一致性核查 excel上传 支持三种格式
</summary>
<param name="trialId"></param>
<param name="oSSService"></param>
<param name="_inspectionFileRepository"></param>
<returns></returns>
<exception cref="T:IRaCIS.Core.Infrastructure.BusinessValidationFailedException"></exception>
</member>
<member name="T:IRaCIS.Core.API.Controllers.FileController">
<summary>医生文件上传下载</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.GetOfficialResume(IRaCIS.Core.API.Controllers.GetDoctorPathCommand,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Attachment})">
<summary>
New 医生首页 多选 获取多个医生信息+文件路径列表 医生压缩包名称 doctorCode + "_" + doctorName _(时间戳或者随机的Guid)
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.GetTrialDoctorOfficialResume(IRaCIS.Core.API.Controllers.GetDoctorPathCommand,IRaCIS.Application.Interfaces.IDoctorService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Attachment})">
<summary>
New 项目入组 勾选获取简历路径
</summary>
<param name="command"></param>
<param name="_doctorService"></param>
<param name="_attachmentrepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.GetDoctorAttachment(IRaCIS.Core.API.Controllers.GetDoctoreAttachPathCommand,IRaCIS.Application.Interfaces.IDoctorService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.Attachment})">
<summary>
new 医生详情 勾选或者下载文件路径
</summary>
<param name="command"></param>
<param name="_doctorService"></param>
<param name="_attachmentrepository"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadAttachment(System.Guid[])">
<summary>
下载多个医生的所有附件
</summary>
<param name="doctorIds"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadAttachmentById(System.Guid,System.Guid[])">
<summary>
下载指定医生的指定附件
</summary>
<param name="doctorId">医生Id</param>
<param name="attachmentIds">要下载的附件Id</param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadOfficialResume(System.Int32,System.Guid[])">
<summary>
下载医生官方简历 首页 区分 中文和英文
</summary>
<param name="language"></param>
<param name="doctorIds"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.FileController.DownloadResume(System.Int32,System.Guid,System.Guid[])">
<summary>
入组 项目下载简历
</summary>
<param name="language"></param>
<param name="trialId"></param>
<param name="doctorIdArray"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.UploadDownLoadController.DownloadCommonFile(System.String,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument})">
<summary> 通用文件下载 </summary>
</member>
@ -376,24 +353,14 @@
序列化,反序列化的时候,处理时间 时区转换
</summary>
</member>
<member name="M:IRaCIS.Core.API.NullToEmptyStringResolver.CreateProperties(System.Type,Newtonsoft.Json.MemberSerialization)">
<member name="M:IRaCIS.Core.API.JSONTimeZoneConverter.#ctor(Microsoft.AspNetCore.Http.IHttpContextAccessor)">
<summary>
创建属性
序列化,反序列化的时候,处理时间 时区转换
</summary>
<param name="type">类型</param>
<param name="memberSerialization">序列化成员</param>
<returns></returns>
</member>
<member name="M:IRaCIS.WX.CoreApi.Auth.AuthMiddleware.Invoke(Microsoft.AspNetCore.Http.HttpContext)">
<summary>
为了前端 一段时间无操作,需要重新登陆
</summary>
<param name="httpContext"></param>
<returns></returns>
</member>
<member name="T:TimeZoneAdjustmentMiddleware">
<member name="T:IRaCIS.Core.API.NullToEmptyStringResolver">
<summary>
废弃,没用
LowerCamelCaseJsonAttribute 可以设置类小写返回给前端
</summary>
</member>
<member name="T:ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt.CustomHSJWTService">

View File

@ -1,118 +0,0 @@
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Primitives;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;
/// <summary>
/// 废弃,没用
/// </summary>
public class TimeZoneAdjustmentMiddleware
{
private readonly RequestDelegate _next;
public TimeZoneAdjustmentMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
if (string.IsNullOrEmpty(context.Request.ContentType))
{
// 请求没有内容体,可能是一个没有请求体的请求,比如 GET 请求
await _next(context);
return;
}
var timeZoneId = "Asia/Shanghai"; // 客户端默认时区
var timeZoneIdHeaderValue = context.Request.Headers["TimeZoneId"];
if (!string.IsNullOrEmpty(timeZoneIdHeaderValue))
{
timeZoneId = timeZoneIdHeaderValue;
}
var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
// 处理 JSON 请求体中的时间字段
if (context.Request.ContentType.StartsWith("application/json"))
{
var requestBody = await new StreamReader(context.Request.Body).ReadToEndAsync();
// 使用 JSON.NET 或 System.Text.Json 解析 JSON 请求体
// 假设请求体中有一个名为 "dateTime" 的时间字段
dynamic jsonData = JsonConvert.DeserializeObject(requestBody);
if (jsonData.dateTime != null)
{
if (DateTime.TryParse((string)jsonData.dateTime, out DateTime dateTime))
{
// 将 JSON 请求体中的时间字段转换为服务器时区的时间
var serverTime = TimeZoneInfo.ConvertTime(dateTime, timeZone);
jsonData.dateTime = serverTime;
}
}
// 将修改后的 JSON 请求体重新写入请求流中
var jsonBytes = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(jsonData));
context.Request.Body = new MemoryStream(jsonBytes);
context.Request.ContentLength = jsonBytes.Length;
}
// 处理 URL 表单参数
var modifiedQuery = new Dictionary<string, StringValues>();
foreach (var key in context.Request.Query.Keys)
{
if (DateTime.TryParse(context.Request.Query[key], out DateTime dateTime))
{
// 将 URL 表单参数中的时间转换为服务器时区的时间
var serverTime = TimeZoneInfo.ConvertTime(dateTime, timeZone);
modifiedQuery[key] = new StringValues(serverTime.ToString());
}
else
{
modifiedQuery[key] = context.Request.Query[key];
}
}
context.Request.Query = new QueryCollection(modifiedQuery);
// 处理Form请求体中的参数
if (context.Request.HasFormContentType)
{
var modifiedForm = new Dictionary<string, StringValues>();
foreach (var key in context.Request.Form.Keys)
{
if (DateTime.TryParse(context.Request.Form[key], out DateTime dateTime))
{
// 将请求体中的时间转换为服务器时区的时间
var serverTime = TimeZoneInfo.ConvertTime(dateTime, timeZone);
modifiedForm[key] = new StringValues(serverTime.ToString());
}
else
{
modifiedForm[key] = context.Request.Form[key];
}
}
var newFormCollection = new FormCollection(modifiedForm);
// 将新的表单集合设置回请求对象
context.Request.Form = newFormCollection;
}
await _next(context);
}
}

View File

@ -1,34 +1,32 @@
using System;
using Autofac.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration;
using Serilog;
using MediatR;
using IRaCIS.Core.Application.MediatR.Handlers;
using System.Threading.Tasks;
using IRaCIS.Core.API;
using IRaCIS.Core.API.HostService;
using IRaCIS.Core.Application.BusinessFilter;
using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.MassTransit.Consumer;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.Service.BusinessFilter;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure.Extention;
using MassTransit;
using MassTransit.NewIdProviders;
using System.IO;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Application.Helper;
using System.Runtime.InteropServices;
using Microsoft.AspNetCore.Builder;
using IRaCIS.Core.API;
using Autofac;
using Microsoft.AspNetCore.Http.Features;
using Microsoft.AspNetCore.SignalR;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using IRaCIS.Core.Application.Filter;
using Microsoft.AspNetCore.HttpOverrides;
using IRaCIS.Application.Services.BackGroundJob;
using LogDashboard;
using FellowOakDicom.Network;
using IRaCIS.Core.Application.Service.ImageAndDoc;
using IP2Region.Net.Abstractions;
using IP2Region.Net.XDB;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Localization;
using Newtonsoft.Json;
using Serilog;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
AppContext.SetSwitch("Npgsql.EnableLegacyTimestampBehavior", true);
AppContext.SetSwitch("Npgsql.DisableDateTimeInfinityConversions", true);
#region 获取环境变量
//以配置文件为准,否则 从url中取环境值(服务以命令行传递参数启动,配置文件配置了就不需要传递环境参数)
@ -38,6 +36,11 @@ var config = new ConfigurationBuilder()
var enviromentName = config["ASPNETCORE_ENVIRONMENT"];
var openSwaggerStr = config["ASPNETCORE_OpenSwagger"];
var isOpenSwagger= openSwaggerStr == null|| openSwaggerStr?.ToLower()=="true";
if (string.IsNullOrWhiteSpace(enviromentName))
{
@ -48,136 +51,107 @@ if (string.IsNullOrWhiteSpace(enviromentName))
}
#endregion
// Serilog
SerilogExtension.AddSerilogSetup(enviromentName);
var builder = WebApplication.CreateBuilder(new WebApplicationOptions
{
EnvironmentName = enviromentName
});
#region 兼容windows 服务命令行的方式
//foreach (var arg in args)
//{
// Console.WriteLine(arg);
//}
int urlsIndex = Array.FindIndex(args, arg => arg != null && arg.StartsWith("--urls"));
if (urlsIndex > -1)
{
var url = args[urlsIndex].Substring("--urls=".Length);
Console.WriteLine(url);
builder.WebHost.UseUrls(url);
}
#endregion
#region 主机配置
NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
builder.Configuration.AddJsonFile("appsettings.json", false, true)
.AddJsonFile($"appsettings.{enviromentName}.json", false, true);
builder.Configuration.AddJsonFile(ConfigMapFileProvider.FromRelativePath(""), "appsettings.json", false, true)
.AddJsonFile(ConfigMapFileProvider.FromRelativePath(""), $"appsettings.{enviromentName}.json", false, true);
builder.Host.UseSerilog();
builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterModule<AutofacModuleSetup>();
})
.UseWindowsService().UseSerilog();
#endregion
#region 配置服务
var _configuration = builder.Configuration;
//手动注册服务
builder.Services.ConfigureServices(_configuration);
builder.Services.AddHostedService<HangfireHostService>();
//minimal api 异常处理
builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
//builder.Services.AddProblemDetails();
//健康检查
builder.Services.AddHealthChecks();
builder.Services.AddSerilog();
//本地化
builder.Services.AddJsonLocalization(options => options.ResourcesPath = "Resources");
// 异常、参数统一验证过滤器、Json序列化配置、字符串参数绑型统一Trim()
builder.Services.AddControllers(options =>
{
//options.Filters.Add<LogActionFilter>();
options.Filters.Add<ModelActionFilter>();
options.Filters.Add<ProjectExceptionFilter>();
options.Filters.Add<UnitOfWorkFilter>();
if (_configuration.GetSection("BasicSystemConfig").GetValue<bool>("OpenLoginLimit"))
{
options.Filters.Add<LimitUserRequestAuthorization>();
}
options.Filters.Add<LimitUserRequestAuthorization>();
options.Filters.Add<TrialGlobalLimitActionFilter>();
})
.AddNewtonsoftJsonSetup(builder.Services); // NewtonsoftJson 序列化 处理
builder.Services.AddOptions().Configure<SystemEmailSendConfig>(_configuration.GetSection("SystemEmailSendConfig"));
builder.Services.AddOptions().Configure<ServiceVerifyConfigOption>(_configuration.GetSection("BasicSystemConfig"));
builder.Services.AddOptions().Configure<AliyunOSSOptions>(_configuration.GetSection("AliyunOSS"));
builder.Services.AddOptions().Configure<ObjectStoreServiceOptions>(_configuration.GetSection("ObjectStoreService"));
//动态WebApi + UnifiedApiResultFilter 省掉控制器代码
// Panda动态WebApi + UnifiedApiResultFilter + 省掉控制器代码
builder.Services.AddDynamicWebApiSetup();
//MinimalAPI
builder.Services.AddMasaMinimalAPiSetUp();
//AutoMapper
builder.Services.AddAutoMapperSetup();
//EF ORM QueryWithNoLock
builder.Services.AddEFSetup(_configuration);
builder.Services.AddEFSetup(_configuration, enviromentName);
//Http 响应压缩
builder.Services.AddResponseCompressionSetup();
//Swagger Api 文档
builder.Services.AddSwaggerSetup();
if (isOpenSwagger)
{
//Swagger Api 文档
builder.Services.AddSwaggerSetup();
}
//JWT Token 验证
builder.Services.AddJWTAuthSetup(_configuration);
// MediatR 进程内消息 事件解耦 从程序集中 注册命令和handler对应关系
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<ConsistencyVerificationHandler>());
// EasyCaching 缓存
builder.Services.AddEasyCachingSetup(_configuration);
//MassTransit
builder.Services.AddMassTransitSetup();
// FusionCache
builder.Services.AddFusionCache();
// hangfire 定时任务框架 有界面,更友好~
builder.Services.AddhangfireSetup(_configuration);
//Serilog 日志可视化 LogDashboard日志
builder.Services.AddLogDashboardSetup();
//builder.Services.AddLogDashboardSetup();
builder.Services.AddJsonConfigSetup(_configuration);
//转发头设置 获取真实IP
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
//Dicom影像渲染图片 跨平台
builder.Services.AddDicomSetup();
// 实时应用
builder.Services.AddSignalR();
builder.Services.AddSingleton<IUserIdProvider, IRaCISUserIdProvider>();
builder.Services.AddSingleton<ISearcher>(new Searcher(CachePolicy.Content, Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "ip2region.xdb")));
#region 历史废弃配置
//builder.Services.AddMemoryCache();
////上传限制 配置
//builder.Services.Configure<FormOptions>(options =>
//// 添加反伪造服务
//builder.Services.AddAntiforgery(options =>
//{
// options.MultipartBodyLengthLimit = int.MaxValue;
// options.ValueCountLimit = int.MaxValue;
// options.ValueLengthLimit = int.MaxValue;
// // 可选:设置自定义的头部名称以支持 AJAX 请求等
// options.HeaderName = "X-XSRF-TOKEN";
//});
//IP 限流 可设置白名单 或者黑名单
//services.AddIpPolicyRateLimitSetup(_configuration);
// 用户类型 策略授权
//services.AddAuthorizationPolicySetup(_configuration);
#endregion
//builder.Services.AddAntiforgery();
#endregion
@ -187,80 +161,105 @@ var env = app.Environment;
#region 配置中间件
// Configure the HTTP request pipeline.
app.UseMiddleware<EncryptionRequestMiddleware>();
#region 异常处理 全局业务异常已统一处理了,非业务错误会来到这里 400 -500状态码
//app.UseStatusCodePagesWithReExecute("/Error/{0}");
app.UseStatusCodePages(async context =>
{
var code = context.HttpContext.Response.StatusCode;
context.HttpContext.Response.ContentType = "application/json";
if (code < 500)
{
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk($"Client error, actual request error status code({code})")));
}
else
{
//ResultFilter 里面的异常并不会到这里
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject((ResponseOutput.NotOk($"Server error , actual request error status code({code})"))));
}
});
//app.UseExceptionHandler();
app.UseExceptionHandler(o => { });
#region 暂时废弃
//app.UseMiddleware<MultiDiskStaticFilesMiddleware>();
////限流 中间件
//app.UseIpRateLimiting();
//if (env.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//}
//else
//{
// //app.UseHsts();
//}
//app.UseIRacisHostStaticFileStore(env);
#endregion
#endregion
app.UseIRacisHostStaticFileStore(env);
//本地化
app.UseLocalization();
await app.UseLocalization(app.Services);
app.UseForwardedHeaders();
//响应压缩
app.UseResponseCompression();
//app.UseCors(t => t.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
//不需要 token 访问的静态文件 wwwroot css, JavaScript, and images don't require authentication.
app.UseStaticFiles();
app.UseMiddleware<MultiDiskStaticFilesMiddleware>();
//LogDashboard
app.UseLogDashboard("/LogDashboard");
//app.UseLogDashboard("/LogDashboard");
//hangfire
app.UseHangfireConfig(env);
// Swagger
////限流 中间件
//app.UseIpRateLimiting();
if (env.IsDevelopment())
if (isOpenSwagger)
{
app.UseDeveloperExceptionPage();
}
else
{
//app.UseHsts();
SwaggerSetup.Configure(app, env);
}
// 特殊异常处理 比如 404
app.UseStatusCodePagesWithReExecute("/Error/{0}");
SwaggerSetup.Configure(app, env);
////serilog 记录请求的用户信息
//serilog 记录请求的用户信息
app.UseSerilogConfig(env);
app.UseRouting();
app.UseCors(t => t.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
//app.UseIRacisHostStaticFileStore(env);
app.UseAuthentication();
app.UseAuthorization();
//Map MinimalAPI routes
app.MapMasaMinimalAPIs();
//// 这里添加反伪造中间件
//app.UseAntiforgery();
app.MapControllers();
app.MapHub<UploadHub>("/UploadHub");
app.MapHealthChecks("/health");
// Serilog
SerilogExtension.AddSerilogSetup(enviromentName, app.Services);
var hangfireJobService = app.Services.GetRequiredService<IIRaCISHangfireJob>();
await hangfireJobService.InitHangfireJobTaskAsync();
#endregion
try
{
#region 运行环境 部署平台
@ -280,9 +279,6 @@ try
Log.Logger.Warning($"当前部署平台环境OSX or FreeBSD");
}
#endregion
Log.Logger.Warning($"ContentRootPath{env.ContentRootPath}");
@ -293,14 +289,11 @@ try
//Log.Logger.Warning($"ContentRootPath——GetParent{Directory.GetParent(env.ContentRootPath).Parent.FullName}");
//Log.Logger.Warning($"ContentRootPath——xx{Path.GetDirectoryName(Path.GetDirectoryName(env.ContentRootPath))}");
var server = DicomServerFactory.Create<CStoreSCPService>(11112,userState: app.Services);
#endregion
app.Run();
}
catch (Exception e)
{

View File

@ -20,7 +20,16 @@
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Test_IRC"
"ASPNETCORE_ENVIRONMENT": "Test_IRC",
"ASPNETCORE_OpenSwagger": "true"
},
"applicationUrl": "http://localhost:6100"
},
"IRaCIS.Test_IRC_PGSQL": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Test_IRC_PGSQL"
},
"applicationUrl": "http://localhost:6100"
},
@ -54,11 +63,19 @@
},
"applicationUrl": "http://localhost:6100"
},
"IRaCIS.US_IRC": {
"IRaCIS.US_Uat_IRC": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "US_IRC"
"ASPNETCORE_ENVIRONMENT": "US_Uat_IRC"
},
"applicationUrl": "http://localhost:6100"
},
"IRaCIS.US_Prod_IRC": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "US_Prod_IRC"
},
"applicationUrl": "http://localhost:6100"
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 73 MiB

View File

@ -0,0 +1,2 @@
{
}

View File

@ -0,0 +1,2 @@
{
}

View File

@ -1,5 +1,4 @@
using EasyCaching.Core;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors;
using Microsoft.AspNetCore.SignalR;
@ -18,7 +17,7 @@ namespace IRaCIS.Core.API
{
public virtual string GetUserId(HubConnectionContext connection)
{
return connection.User?.FindFirst(JwtIRaCISClaimType.Id)?.Value!;
return connection.User?.FindFirst(JwtIRaCISClaimType.IdentityUserId)?.Value!;
}
}
@ -39,7 +38,7 @@ namespace IRaCIS.Core.API
public override Task OnConnectedAsync()
{
//base.Context.User.id
_logger.LogError("连接: " + Context.ConnectionId);

View File

@ -1,18 +0,0 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using System;
namespace IRaCIS.Core.API.Filter
{
public class EnableBufferingAttribute : Attribute, IResourceFilter
{
public void OnResourceExecuting(ResourceExecutingContext context)
{
context.HttpContext.Request.EnableBuffering();
}
public void OnResourceExecuted(ResourceExecutedContext context)
{
}
}
}

View File

@ -1,270 +0,0 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.ModelBinding;
using Microsoft.AspNetCore.WebUtilities;
using Microsoft.Net.Http.Headers;
namespace IRaCIS.Core.API.Utility
{
public static class FileHelpers
{
private static readonly byte[] _allowedChars = { };
// For more file signatures, see the File Signatures Database (https://www.filesignatures.net/)
// and the official specifications for the file types you wish to add.
private static readonly Dictionary<string, List<byte[]>> _fileSignature = new Dictionary<string, List<byte[]>>
{
{ ".gif", new List<byte[]> { new byte[] { 0x47, 0x49, 0x46, 0x38 } } },
{ ".png", new List<byte[]> { new byte[] { 0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A } } },
{ ".jpeg", new List<byte[]>
{
new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 },
new byte[] { 0xFF, 0xD8, 0xFF, 0xE2 },
new byte[] { 0xFF, 0xD8, 0xFF, 0xE3 },
}
},
{ ".jpg", new List<byte[]>
{
new byte[] { 0xFF, 0xD8, 0xFF, 0xE0 },
new byte[] { 0xFF, 0xD8, 0xFF, 0xE1 },
new byte[] { 0xFF, 0xD8, 0xFF, 0xE8 },
}
},
{ ".zip", new List<byte[]>
{
new byte[] { 0x50, 0x4B, 0x03, 0x04 },
new byte[] { 0x50, 0x4B, 0x4C, 0x49, 0x54, 0x45 },
new byte[] { 0x50, 0x4B, 0x53, 0x70, 0x58 },
new byte[] { 0x50, 0x4B, 0x05, 0x06 },
new byte[] { 0x50, 0x4B, 0x07, 0x08 },
new byte[] { 0x57, 0x69, 0x6E, 0x5A, 0x69, 0x70 },
}
},
};
// **WARNING!**
// In the following file processing methods, the file's content isn't scanned.
// In most production scenarios, an anti-virus/anti-malware scanner API is
// used on the file before making the file available to users or other
// systems. For more information, see the topic that accompanies this sample
// app.
public static async Task<byte[]> ProcessFormFile<T>(IFormFile formFile,
ModelStateDictionary modelState, string[] permittedExtensions,
long sizeLimit)
{
var fieldDisplayName = string.Empty;
// Use reflection to obtain the display name for the model
// property associated with this IFormFile. If a display
// name isn't found, error messages simply won't show
// a display name.
MemberInfo property =
typeof(T).GetProperty(
formFile.Name.Substring(formFile.Name.IndexOf(".",
StringComparison.Ordinal) + 1));
if (property != null)
{
if (property.GetCustomAttribute(typeof(DisplayAttribute)) is
DisplayAttribute displayAttribute)
{
fieldDisplayName = $"{displayAttribute.Name} ";
}
}
// Don't trust the file name sent by the client. To display
// the file name, HTML-encode the value.
var trustedFileNameForDisplay = WebUtility.HtmlEncode(
formFile.FileName);
// Check the file length. This check doesn't catch files that only have
// a BOM as their content.
if (formFile.Length == 0)
{
modelState.AddModelError(formFile.Name,
$"{fieldDisplayName}({trustedFileNameForDisplay}) is empty.");
return new byte[0];
}
if (formFile.Length > sizeLimit)
{
var megabyteSizeLimit = sizeLimit / 1048576;
modelState.AddModelError(formFile.Name,
$"{fieldDisplayName}({trustedFileNameForDisplay}) exceeds " +
$"{megabyteSizeLimit:N1} MB.");
return new byte[0];
}
try
{
using (var memoryStream = new MemoryStream())
{
await formFile.CopyToAsync(memoryStream);
// Check the content length in case the file's only
// content was a BOM and the content is actually
// empty after removing the BOM.
if (memoryStream.Length == 0)
{
modelState.AddModelError(formFile.Name,
$"{fieldDisplayName}({trustedFileNameForDisplay}) is empty.");
}
if (!IsValidFileExtensionAndSignature(
formFile.FileName, memoryStream, permittedExtensions))
{
modelState.AddModelError(formFile.Name,
$"{fieldDisplayName}({trustedFileNameForDisplay}) file " +
"type isn't permitted or the file's signature " +
"doesn't match the file's extension.");
}
else
{
return memoryStream.ToArray();
}
}
}
catch (Exception ex)
{
modelState.AddModelError(formFile.Name,
$"{fieldDisplayName}({trustedFileNameForDisplay}) upload failed. " +
$"Please contact the Help Desk for support. Error: {ex.HResult}");
}
return new byte[0];
}
public static async Task<byte[]> ProcessStreamedFile(
MultipartSection section, ContentDispositionHeaderValue contentDisposition,
ModelStateDictionary modelState, string[] permittedExtensions, long sizeLimit)
{
try
{
using (var memoryStream = new MemoryStream())
{
await section.Body.CopyToAsync(memoryStream);
// Check if the file is empty or exceeds the size limit.
if (memoryStream.Length == 0)
{
modelState.AddModelError("File", "The file is empty.");
}
else if (memoryStream.Length > sizeLimit)
{
var megabyteSizeLimit = sizeLimit / 1048576;
modelState.AddModelError("File",
$"The file exceeds {megabyteSizeLimit:N1} MB.");
}
else if (!IsValidFileExtensionAndSignature(
contentDisposition.FileName.Value, memoryStream,
permittedExtensions))
{
modelState.AddModelError("File",
"The file type isn't permitted or the file's " +
"signature doesn't match the file's extension.");
}
else
{
return memoryStream.ToArray();
}
}
}
catch (Exception ex)
{
modelState.AddModelError("File",
"The upload failed. Please contact the Help Desk " +
$" for support. Error: {ex.HResult}");
// Log the exception
}
return new byte[0];
}
private static bool IsValidFileExtensionAndSignature(string fileName, Stream data, string[] permittedExtensions)
{
if (string.IsNullOrEmpty(fileName) || data == null || data.Length == 0)
{
return false;
}
var ext = Path.GetExtension(fileName).ToLowerInvariant();
if (string.IsNullOrEmpty(ext) || !permittedExtensions.Contains(ext))
{
return false;
}
data.Position = 0;
using (var reader = new BinaryReader(data))
{
if (ext.Equals(".txt") || ext.Equals(".csv") || ext.Equals(".prn"))
{
if (_allowedChars.Length == 0)
{
// Limits characters to ASCII encoding.
for (var i = 0; i < data.Length; i++)
{
if (reader.ReadByte() > sbyte.MaxValue)
{
return false;
}
}
}
else
{
// Limits characters to ASCII encoding and
// values of the _allowedChars array.
for (var i = 0; i < data.Length; i++)
{
var b = reader.ReadByte();
if (b > sbyte.MaxValue ||
!_allowedChars.Contains(b))
{
return false;
}
}
}
return true;
}
// Uncomment the following code block if you must permit
// files whose signature isn't provided in the _fileSignature
// dictionary. We recommend that you add file signatures
// for files (when possible) for all file types you intend
// to allow on the system and perform the file signature
// check.
//if (!_fileSignature.ContainsKey(ext))
//{
// return true;
//}
// File signature check
// --------------------
// With the file signatures provided in the _fileSignature
// dictionary, the following code tests the input content's
// file signature.
//var signatures = _fileSignature[ext];
//var headerBytes = reader.ReadBytes(signatures.Max(m => m.Length));
//return signatures.Any(signature =>
// headerBytes.Take(signature.Length).SequenceEqual(signature));
//test
return true;
}
}
}
}

View File

@ -1,12 +1,9 @@
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.Linq;
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
namespace ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt
{

View File

@ -1,13 +1,10 @@
using Microsoft.Extensions.Options;
using Microsoft.IdentityModel.Tokens;
using System;
using System.Collections.Generic;
using System.IdentityModel.Tokens.Jwt;
using System.IO;
using System.Linq;
using System.Security.Claims;
using System.Security.Cryptography;
using System.Threading.Tasks;
namespace ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt
{

View File

@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt
namespace ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt
{
public interface ICustomJWTService
{

View File

@ -1,9 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt
namespace ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt
{
public class JWTTokenOptions
{

View File

@ -1,10 +1,6 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Threading.Tasks;
namespace ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt
{

View File

@ -1,54 +0,0 @@
using System;
using System.IO;
using Microsoft.Net.Http.Headers;
namespace IRaCIS.Core.API.Utility
{
public static class MultipartRequestHelper
{
// Content-Type: multipart/form-data; boundary="----WebKitFormBoundarymx2fSWqWSd0OxQqq"
// The spec at https://tools.ietf.org/html/rfc2046#section-5.1 states that 70 characters is a reasonable limit.
public static string GetBoundary(MediaTypeHeaderValue contentType, int lengthLimit)
{
var boundary = HeaderUtilities.RemoveQuotes(contentType.Boundary).Value;
if (string.IsNullOrWhiteSpace(boundary))
{
throw new InvalidDataException(
"Missing content-type boundary.");
}
if (boundary.Length > lengthLimit)
{
throw new InvalidDataException(
$"Multipart boundary length limit {lengthLimit} exceeded.");
}
return boundary;
}
public static bool IsMultipartContentType(string contentType)
{
return !string.IsNullOrEmpty(contentType)
&& contentType.IndexOf("multipart/", StringComparison.OrdinalIgnoreCase) >= 0;
}
public static bool HasFormDataContentDisposition(ContentDispositionHeaderValue contentDisposition)
{
// Content-Disposition: form-data; name="key";
return contentDisposition != null
&& contentDisposition.DispositionType.Equals("form-data")
&& string.IsNullOrEmpty(contentDisposition.FileName.Value)
&& string.IsNullOrEmpty(contentDisposition.FileNameStar.Value);
}
public static bool HasFileContentDisposition(ContentDispositionHeaderValue contentDisposition)
{
// Content-Disposition: form-data; name="myfile1"; filename="Misc 002.jpg"
return contentDisposition != null
&& contentDisposition.DispositionType.Equals("form-data")
&& (!string.IsNullOrEmpty(contentDisposition.FileName.Value)
|| !string.IsNullOrEmpty(contentDisposition.FileNameStar.Value));
}
}
}

View File

@ -1,66 +0,0 @@
using System;
using System.IdentityModel.Tokens.Jwt;
using System.Net;
using System.Threading.Tasks;
using EasyCaching.Core;
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Authentication;
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Http;
namespace IRaCIS.WX.CoreApi.Auth
{
public class AuthMiddleware
{
private readonly RequestDelegate _next;
private readonly IEasyCachingProvider _provider;
public AuthMiddleware(RequestDelegate next, IEasyCachingProvider provider)
{
_next = next;
_provider = provider;
}
/// <summary>
///为了前端 一段时间无操作,需要重新登陆
/// </summary>
/// <param name="httpContext"></param>
/// <returns></returns>
public async Task Invoke(HttpContext httpContext)
{
var isLogin = httpContext.Request.Path.ToString().ToLower().Contains("login");
var result = await httpContext.AuthenticateAsync(JwtBearerDefaults.AuthenticationScheme);
if (!isLogin)
{
if (!result.Succeeded)
{
httpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
await httpContext.Response.WriteAsync("Unauthorized");
}
else
{
var toekn = result.Properties.Items[".Token.access_token"];
var jwtHandler = new JwtSecurityTokenHandler();
JwtSecurityToken jwtToken = jwtHandler.ReadJwtToken(toekn);
object userId;
jwtToken.Payload.TryGetValue("id", out userId);
var cacheValueExist = await _provider.ExistsAsync(userId.ToString()); //Get<string>(userId.ToString()).ToString();
if (!cacheValueExist)
{
httpContext.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
await httpContext.Response.WriteAsync("Unauthorized");
}
else
{
await _provider.SetAsync(userId.ToString(), userId.ToString(), TimeSpan.FromMinutes(15));
httpContext.User = result.Principal;
await _next.Invoke(httpContext);
}
}
}
else await _next.Invoke(httpContext);
}
}
}

View File

@ -1,9 +1,6 @@
using Hangfire;
using Hangfire.Dashboard;
using Hangfire.Dashboard.BasicAuthorization;
using IRaCIS.Application.Services.BackGroundJob;
using IRaCIS.Core.API.Filter;
using IRaCIS.Core.Application.Helper;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
@ -39,7 +36,7 @@ namespace IRaCIS.Core.API
})
},
DashboardTitle ="后台任务管理",
DashboardTitle = "后台任务管理",
//Authorization = new BasicAuthAuthorizationFilter[] {

View File

@ -1,21 +1,12 @@
using Azure;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.FileProviders.Physical;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Hosting.Internal;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
using Microsoft.VisualBasic;
using Newtonsoft.Json;
using SharpCompress.Common;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@ -32,7 +23,7 @@ namespace IRaCIS.Core.API
private string iRaCISDefaultDataFolder = string.Empty;
public MultiDiskStaticFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, ILoggerFactory loggerFactory)
public MultiDiskStaticFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, ILoggerFactory loggerFactory)
{
_next = next;
_hostingEnv = hostingEnv;
@ -89,7 +80,7 @@ namespace IRaCIS.Core.API
if (defaultFileProvider.GetFileInfo(path).Exists)
{
var actrualPath = defaultFileProvider.GetFileInfo(path).PhysicalPath;
var actrualPath = defaultFileProvider.GetFileInfo(path).PhysicalPath;
await context.Response.SendFileAsync(new PhysicalFileInfo(new FileInfo(actrualPath)));
@ -110,7 +101,7 @@ namespace IRaCIS.Core.API
.Where(d => d.IsReady && d.DriveType == DriveType.Fixed)/*.Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))*/
.OrderBy(d => d.AvailableFreeSpace)
.Select(d => d.RootDirectory.FullName)
.ToArray().Where(t=>!t.Contains(defaultRoot));
.ToArray().Where(t => !t.Contains(defaultRoot));
foreach (var item in disks)
@ -121,10 +112,10 @@ namespace IRaCIS.Core.API
{
continue;
}
var otherFileProvider= new PhysicalFileProvider(otherFileStoreFolder);
var otherFileProvider = new PhysicalFileProvider(otherFileStoreFolder);
if (otherFileProvider.GetFileInfo(path).Exists)
{
@ -132,7 +123,7 @@ namespace IRaCIS.Core.API
var actrualPath = otherFileProvider.GetFileInfo(path).PhysicalPath;
//方式一
await context.Response.SendFileAsync( new PhysicalFileInfo(new FileInfo(actrualPath)));
await context.Response.SendFileAsync(new PhysicalFileInfo(new FileInfo(actrualPath)));
#region 方式二 报错 otherFileProvider 应该还包含/{StaticData.Folder.IRaCISDataFolder} 这一层级
//var otherStaticFileOptions = new StaticFileOptions
@ -158,7 +149,7 @@ namespace IRaCIS.Core.API
await context.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("File not found")));
}
// 如果所有磁盘都不存在所请求的文件,则将请求传递给下一个中间件组件。
await _next.Invoke(context);

View File

@ -1,19 +1,30 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Builder;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Localization;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Threading.Tasks;
namespace IRaCIS.Core.API
{
public static class LocalizationConfig
{
public static void UseLocalization(this IApplicationBuilder app)
public static async Task UseLocalization(this IApplicationBuilder app,IServiceProvider serviceProvider)
{
var supportedCultures = new List<CultureInfo>
{
new CultureInfo("en-US"),
new CultureInfo("zh-CN")
new CultureInfo(StaticData.CultureInfo.en_US),
new CultureInfo(StaticData.CultureInfo.zh_CN)
};
var options = new RequestLocalizationOptions
@ -29,6 +40,28 @@ namespace IRaCIS.Core.API
//options.RequestCultureProviders.RemoveAt(1);
app.UseRequestLocalization(options);
//设置国际化I18n
var localizer = serviceProvider.GetRequiredService<IStringLocalizer>();
I18n.SetLocalizer(localizer);
//初始化国际化
var _internationalizationRepository = serviceProvider.GetRequiredService<IRepository<Internationalization>>();
//查询数据库的数据
var toJsonList = await _internationalizationRepository.Where(t => t.InternationalizationType == 1).Select(t => new IRCGlobalInfoDTO()
{
Code = t.Code,
Value = t.Value,
ValueCN = t.ValueCN,
Description = t.Description
}).ToListAsync();
await InternationalizationHelper.BatchAddJsonKeyValueAsync(toJsonList);
}
}
}

View File

@ -1,15 +1,15 @@
using LogDashboard;
using LogDashboard.Authorization;
//using LogDashboard;
//using LogDashboard.Authorization;
namespace IRaCIS.Core.API.Filter
{
public class LogDashBoardAuthFilter : ILogDashboardAuthorizationFilter
{
//在此可以利用 本系统的UerTypeEnum 判断
public bool Authorization(LogDashboardContext context)
{
return context.HttpContext.User.Identity.IsAuthenticated;
}
}
}
//namespace IRaCIS.Core.API.Filter
//{
// public class LogDashBoardAuthFilter : ILogDashboardAuthorizationFilter
// {
// //在此可以利用 本系统的UerTypeEnum 判断
// public bool Authorization(LogDashboardContext context)
// {
// return context.HttpContext.User.Identity.IsAuthenticated;
// }
// }
//}

View File

@ -1,5 +1,4 @@
using Microsoft.AspNetCore.Http;
using Serilog;
using Serilog.Context;
using System;
using System.IO;

View File

@ -1,13 +1,14 @@
using Hangfire;
using Hangfire.Dashboard;
using IRaCIS.Core.API._PipelineExtensions.Serilog;
using IRaCIS.Core.API._PipelineExtensions.Serilog;
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Serilog;
using System.Linq;
namespace IRaCIS.Core.API
{
public static class SerilogConfig
{
@ -19,8 +20,66 @@ namespace IRaCIS.Core.API
app.UseSerilogRequestLogging(opts
=>
{
opts.MessageTemplate = "{TokenUserRealName} {TokenUserTypeShortName} {ClientIp} {LocalIP} {Host} {Protocol} {RequestMethod} {RequestPath} {RequestBody} responded {StatusCode} in {Elapsed:0.0000} ms";
opts.EnrichDiagnosticContext = SerilogHelper.EnrichFromRequest;
opts.MessageTemplate = "{FullName} {UserType} {UserIp} {Host} {RequestMethod} {RequestPath} {RequestBody} responded {StatusCode} in {Elapsed:0.0000} ms";
opts.EnrichDiagnosticContext = (diagnosticContext, httpContext) =>
{
var request = httpContext.Request;
// Set all the common properties available for every request
diagnosticContext.Set("Host", request.Host.Value);
// Only set it if available. You're not sending sensitive data in a querystring right?!
if (request.QueryString.HasValue)
{
diagnosticContext.Set("QueryString", request.QueryString.Value);
}
diagnosticContext.Set("FullName", httpContext?.User?.FindFirst(JwtIRaCISClaimType.FullName)?.Value);
diagnosticContext.Set("UserType", httpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeShortName)?.Value);
var clientIp = httpContext.Request.Headers["X-Forwarded-For"].FirstOrDefault() ??
httpContext.Connection.RemoteIpAddress?.ToString();
if (clientIp.StartsWith("::ffff:"))
{
clientIp = clientIp.Substring(7); // 移除前缀
}
diagnosticContext.Set("UserIp", clientIp);
#region 非必要不记录
//diagnosticContext.Set("Protocol", request.Protocol);
//diagnosticContext.Set("Scheme", request.Scheme);
//// Retrieve the IEndpointFeature selected for the request
//var endpoint = httpContext.GetEndpoint();
//if (endpoint is object) // endpoint != null
//{
// diagnosticContext.Set("EndpointName", endpoint.DisplayName);
//}
// Set the content-type of the Response at this point
//diagnosticContext.Set("ContentType", httpContext.Response.ContentType);
#endregion
#region old 未用
//这种获取的Ip不准 配置服务才行
//diagnosticContext.Set("RequestIP", httpContext.Connection.RemoteIpAddress.ToString());
//这种方式可以但是serilog提供了 就不用了
//diagnosticContext.Set("TestIP", httpContext.GetUserIp());
//这种方式不行 读取的body为空字符串 必须在中间件中读取
//diagnosticContext.Set("RequestBody", await ReadRequestBody(httpContext.Request));
//diagnosticContext.Set("RequestBody", RequestPayload);
#endregion
};
});

View File

@ -1,59 +0,0 @@
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Http;
using Serilog;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.API
{
public class SerilogHelper
{
//public static string RequestPayload = "";
public static void EnrichFromRequest(IDiagnosticContext diagnosticContext, HttpContext httpContext)
{
var request = httpContext.Request;
// Set all the common properties available for every request
diagnosticContext.Set("Host", request.Host);
//这种获取的Ip不准 配置服务才行
//diagnosticContext.Set("RequestIP", httpContext.Connection.RemoteIpAddress.ToString());
//这种方式可以但是serilog提供了 就不用了
//diagnosticContext.Set("TestIP", httpContext.GetUserIp());
diagnosticContext.Set("Protocol", request.Protocol);
diagnosticContext.Set("Scheme", request.Scheme);
//这种方式不行 读取的body为空字符串 必须在中间件中读取
//diagnosticContext.Set("RequestBody", await ReadRequestBody(httpContext.Request));
//diagnosticContext.Set("RequestBody", RequestPayload);
// Only set it if available. You're not sending sensitive data in a querystring right?!
if (request.QueryString.HasValue)
{
diagnosticContext.Set("QueryString", request.QueryString.Value);
}
// Set the content-type of the Response at this point
diagnosticContext.Set("ContentType", httpContext.Response.ContentType);
diagnosticContext.Set("TokenUserRealName", httpContext?.User?.FindFirst(JwtIRaCISClaimType.RealName)?.Value);
diagnosticContext.Set("TokenUserTypeShortName", httpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeShortName)?.Value);
// Retrieve the IEndpointFeature selected for the request
var endpoint = httpContext.GetEndpoint();
if (endpoint is object) // endpoint != null
{
diagnosticContext.Set("EndpointName", endpoint.DisplayName);
}
}
}
}

View File

@ -34,7 +34,7 @@ namespace IRaCIS.Core.API
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.IQC).ToString());
});
options.AddPolicy(IRaCISPolicy.PM, policyBuilder =>
{
@ -54,7 +54,7 @@ namespace IRaCIS.Core.API
options.AddPolicy(IRaCISPolicy.PM_APM_CRC_QC, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(),((int)UserTypeEnum.ClinicalResearchCoordinator).ToString(), ((int)UserTypeEnum.APM).ToString(), ((int)UserTypeEnum.IQC).ToString());
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.ClinicalResearchCoordinator).ToString(), ((int)UserTypeEnum.APM).ToString(), ((int)UserTypeEnum.IQC).ToString());
});
options.AddPolicy(IRaCISPolicy.SPM_CPM, policyBuilder =>
@ -64,23 +64,23 @@ namespace IRaCIS.Core.API
options.AddPolicy(IRaCISPolicy.PM_APM_SPM_CPM, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.APM).ToString(),((int)UserTypeEnum.SPM).ToString(), ((int)UserTypeEnum.CPM).ToString());
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.APM).ToString(), ((int)UserTypeEnum.SPM).ToString(), ((int)UserTypeEnum.CPM).ToString());
});
options.AddPolicy(IRaCISPolicy.PM_APM_SPM_CPM_SMM_CMM, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.APM).ToString(), ((int)UserTypeEnum.SPM).ToString(),
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.APM).ToString(), ((int)UserTypeEnum.SPM).ToString(),
((int)UserTypeEnum.CPM).ToString(), ((int)UserTypeEnum.SMM).ToString(), ((int)UserTypeEnum.CMM).ToString());
});
});
}
}
}

View File

@ -14,13 +14,13 @@ namespace IRaCIS.Core.API
public class ApiResponseHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
public IStringLocalizer _localizer;
public ApiResponseHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
IStringLocalizer localizer,
ILoggerFactory logger, UrlEncoder encoder) : base(options, logger, encoder)
public ApiResponseHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
IStringLocalizer localizer,
ILoggerFactory logger, UrlEncoder encoder) : base(options, logger, encoder)
{
_localizer = localizer;
}
}
protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
@ -30,7 +30,7 @@ namespace IRaCIS.Core.API
{
Response.ContentType = "application/json";
Response.StatusCode = StatusCodes.Status401Unauthorized;
//---您无权访问该接口
//---您无权访问该接口
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["ApiResponse_NoAccess"], ApiResponseCodeEnum.NoToken)));
}
@ -38,8 +38,8 @@ namespace IRaCIS.Core.API
{
Response.ContentType = "application/json";
Response.StatusCode = StatusCodes.Status403Forbidden;
//---您的权限不允许进行该操作
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["ApiResponse_Permission"],ApiResponseCodeEnum.HaveTokenNotAccess)));
//---您的权限不允许进行该操作
await Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["ApiResponse_Permission"], ApiResponseCodeEnum.HaveTokenNotAccess)));
}
}

View File

@ -45,7 +45,7 @@ namespace IRaCIS.Core.API
{
OnMessageReceived = (context) =>
{
if (context.Request.Query.TryGetValue("access_token", out StringValues values))
{
var queryToken = values.FirstOrDefault();
@ -58,10 +58,10 @@ namespace IRaCIS.Core.API
}
}
//仅仅是访问文件的时候才会去取token认证 前端对cookie设置了有效期
if (context.Request.Path.ToString().Contains("IRaCISData") || context.Request.Path.ToString().Contains("SystemData") )
if (context.Request.Path.ToString().Contains("IRaCISData") || context.Request.Path.ToString().Contains("SystemData"))
{
var cookieToken = context.Request.Cookies["access_token"];

View File

@ -1,5 +1,6 @@
using AutoMapper.EquivalencyExpression;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Domain.Models;
using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.API
@ -14,11 +15,16 @@ namespace IRaCIS.Core.API
//AutoMapper.Collection.EntityFrameworkCore
automapper.AddCollectionMappers();
// 全局忽略 DomainEvents 属性
automapper.AddGlobalIgnore(nameof(Entity.DomainEvents));
automapper.AddGlobalIgnore(nameof(Entity.DomainCommands));
#region 会使 IncludeMembers 失效 不能全局使用
//mapping an EntityFramework Core DbContext-object.
//automapper.UseEntityFrameworkCoreModel<IRaCISDBContext>(services);
//automapper.ForAllMaps((a, b) => b.ForAllMembers(opt => opt.Condition((src, dest, srcMember, desMenber) =>
//{
// //// Can test When Guid? -> Guid if source is null will change to Guid.Empty
@ -27,7 +33,7 @@ namespace IRaCIS.Core.API
// // not want to map a null Guid? value to db Guid value
//})));
#endregion
}, typeof(QCConfig).Assembly);

View File

@ -1,9 +1,14 @@
using Microsoft.Extensions.DependencyInjection;
using IRaCIS.Core.Application.BusinessFilter;
using IRaCIS.Core.Application.Service.BusinessFilter;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Panda.DynamicWebApi;
using System.Collections.Generic;
namespace IRaCIS.Core.API
{
public static class DynamicWebApiSetup
public static class WebApiSetup
{
//20210910 避免冗余的控制器层代码编写,仅仅包了一层前后台定义的格式 这里采用动态webAPi+IResultFilter 替代大部分情况
public static void AddDynamicWebApiSetup(this IServiceCollection services)
@ -20,5 +25,38 @@ namespace IRaCIS.Core.API
});
}
public static void AddMasaMinimalAPiSetUp(this IServiceCollection services)
{
services.AddMasaMinimalAPIs(options =>
{
options.Prefix = "";//自定义前缀 默认是api
options.Version = ""; //默认是V1
options.AutoAppendId = false; //路由是否自动附加参数Id 默认是true
options.PluralizeServiceName = false; //服务名称是否启用复数
//options.Assemblies = new List<Assembly>() { typeof(UserSiteSurveySubmitedEventConsumer).Assembly };
options.GetPrefixes = new List<string> { "Get", "Select", "Find" };
options.PostPrefixes = new List<string> { "Post", "Add", "Create", "List" };
options.PutPrefixes = new List<string> { "Put", "Update" };
options.DeletePrefixes = new List<string> { "Delete", "Remove" };
options.RouteHandlerBuilder = t => {
t.RequireAuthorization()
.AddEndpointFilter<LimitUserRequestAuthorizationEndpointFilter>()
.AddEndpointFilter<TrialGlobalLimitEndpointFilter>()
//.AddEndpointFilter<ModelValidationEndpointFilter>()
.AddEndpointFilter<UnifiedApiResultEndpointFilter>()
.WithGroupName("Institution").DisableAntiforgery();
};
options.MapHttpMethodsForUnmatched = new string[] { "Post" };
options.DisableTrimMethodPrefix = true; //禁用去除方法前缀
options.DisableAutoMapRoute = false;//可通过配置true禁用全局自动路由映射或者删除此配置以启用全局自动路由映射
});
}
}
}

View File

@ -1,67 +1,102 @@
using Hangfire.SqlServer;
using EntityFramework.Exceptions.SqlServer;
using IRaCIS.Core.Application.Triggers;
using IRaCIS.Core.Application.Triggers.AfterSaveTrigger;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infra.EFCore.Interceptor;
using Medallion.Threading;
using Medallion.Threading.SqlServer;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using StackExchange.Redis;
using Microsoft.Extensions.Logging;
namespace IRaCIS.Core.API
{
public static class EFSetup
{
public static void AddEFSetup( this IServiceCollection services, IConfiguration configuration)
public static void AddEFSetup(this IServiceCollection services, IConfiguration configuration, string envName)
{
//services.AddScoped<DbContext, IRaCISDBContext>();
services.AddHttpContextAccessor();
services.AddScoped<IUserInfo, UserInfo>();
services.AddScoped<ISaveChangesInterceptor, AuditEntityInterceptor>();
services.AddScoped<ISaveChangesInterceptor, DispatchDomainEventsInterceptor>();
// First, register a pooling context factory as a Singleton service, as usual:
//这个注入没有成功--注入是没问题的构造函数也只是支持参数就好错在注入的地方不能写DbContext
//Web程序中通过重用池中DbContext实例可提高高并发场景下的吞吐量 这在概念上类似于ADO.NET Provider原生的连接池操作方式具有节省DbContext实例化成本的优点
services.AddDbContext<IRaCISDBContext>(options =>
services.AddDbContext<IRaCISDBContext>((sp, options) =>
{
options.UseSqlServer(configuration.GetSection("ConnectionStrings:RemoteNew").Value,
contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure());
// 在控制台
//public static readonly ILoggerFactory MyLoggerFactory = LoggerFactory.Create(builder => { builder.AddConsole(); });
var logFactory = LoggerFactory.Create(builder => { builder.AddDebug(); });
var dbType = configuration.GetSection("ConnectionStrings:Db_Type").Value;
if (!string.IsNullOrWhiteSpace(dbType) && dbType == "pgsql")
{
options.UseNpgsql(configuration.GetSection("ConnectionStrings:RemoteNew").Value, contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure());
}
else
{
options.UseSqlServer(configuration.GetSection("ConnectionStrings:RemoteNew").Value, contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure());
}
//迁移的时候,不生成外键
options.ReplaceService<IMigrationsSqlGenerator, NoForeignKeyMigrationsSqlGenerator>();
options.UseLoggerFactory(logFactory);
options.UseExceptionProcessor();
options.EnableSensitiveDataLogging();
options.AddInterceptors(new QueryWithNoLockDbCommandInterceptor());
options.AddInterceptors(sp.GetServices<ISaveChangesInterceptor>());
options.UseProjectables();
//options.AddInterceptors(new AuditingInterceptor(configuration.GetSection("ConnectionStrings:RemoteNew").Value));
//options.UseTriggers(triggerOptions => triggerOptions.AddTrigger<SubjectVisitImageDateTrigger>());
//options.UseTriggers(triggerOptions => triggerOptions.AddAssemblyTriggers(typeof(SubjectVisitTrigger).Assembly));
options.UseTriggers(triggerOptions =>
{
triggerOptions.AddTrigger<AddSubjectTrigger>();
triggerOptions.AddTrigger<SubjectTrigger>();
triggerOptions.AddTrigger<ChallengeStateTrigger>();
triggerOptions.AddTrigger<SubjectStateTrigger>();
triggerOptions.AddTrigger<AddCRCCliniaclDataTrigger>();
triggerOptions.AddTrigger<SubjectVisitCheckPassedTrigger>();
triggerOptions.AddTrigger<SubjectVisitFinalVisitTrigger>();
triggerOptions.AddTrigger<SubjectVisitTrigger>();
triggerOptions.AddTrigger<SubjectVisitScanDateTrigger>();
triggerOptions.AddTrigger<TrialCriterionSignTrigger>();
triggerOptions.AddTrigger<TableQuestionRowTrigger>();
//triggerOptions.AddTrigger<AddlTrialUserTrigger>();
triggerOptions.AddTrigger<VisitTaskIsFrontTaskNeedSignButNotSignTrigger>();
triggerOptions.AddTrigger<VisitTaskIbeforeTrigger>();
triggerOptions.AddTrigger<JudgeVisitTaskTrigger>();
triggerOptions.AddTrigger<UserLogTrigger>();
triggerOptions.AddTrigger<UserAddTrigger>();
triggerOptions.AddTrigger<UserLogAfterTrigger>();
triggerOptions.AddTrigger<IdenttiyUserRoleInfoTrigger>();
});
});
// Register an additional context factory as a Scoped service, which gets a pooled context from the Singleton factory we registered above,
//services.AddScoped<IRaCISDBScopedFactory>();
//// Finally, arrange for a context to get injected from our Scoped factory:
//services.AddScoped(sp => sp.GetRequiredService<IRaCISDBScopedFactory>().CreateDbContext());
//注意区分 easy caching 也有 IDistributedLockProvider
services.AddSingleton<IDistributedLockProvider>(sp =>
{

View File

@ -1,27 +0,0 @@
using EasyCaching.Core;
using EasyCaching.Core.Configurations;
using EasyCaching.Interceptor.Castle;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.API
{
public static class EasyCachingSetup
{
public static void AddEasyCachingSetup(this IServiceCollection services, IConfiguration configuration)
{
services.AddEasyCaching(options =>
{
options.UseInMemory();
//options.UseRedis(configuration, EasyCachingConstValue.DefaultRedisName).WithMessagePack(EasyCachingConstValue.DefaultRedisName);
});
//services.ConfigureCastleInterceptor(options => options.CacheProviderName = EasyCachingConstValue.DefaultRedisName);
services.ConfigureCastleInterceptor(options => options.CacheProviderName = EasyCachingConstValue.DefaultInMemoryName);
}
}
}

View File

@ -1,8 +1,6 @@
using AspNetCoreRateLimit;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace IRaCIS.Core.API
{
@ -13,7 +11,7 @@ namespace IRaCIS.Core.API
{
public static void AddIpPolicyRateLimitSetup(this IServiceCollection services, IConfiguration Configuration)
{
// needed to store rate limit counters and ip rules
services.AddMemoryCache();

View File

@ -1,17 +0,0 @@
using IRaCIS.Core.Domain.Share;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.API
{
public static class JsonConfigSetup
{
public static void AddJsonConfigSetup(this IServiceCollection services, IConfiguration configuration)
{
services.Configure<ServiceVerifyConfigOption>(configuration.GetSection("BasicSystemConfig"));
}
}
}

View File

@ -1,26 +1,25 @@

using LogDashboard;
using LogDashboard.Authorization.Filters;
using Microsoft.Extensions.DependencyInjection;
//using LogDashboard;
//using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.API
{
public static class LogDashboardSetup
{
public static void AddLogDashboardSetup(this IServiceCollection services)
{
//IIS 配置虚拟路径部署会出现IIS静态文件404
services.AddLogDashboard(opt =>
{
//opt.PathMatch = "/api/LogDashboard";
opt.PathMatch = "/LogDashboard";
//namespace IRaCIS.Core.API
//{
// public static class LogDashboardSetup
// {
// public static void AddLogDashboardSetup(this IServiceCollection services)
// {
// //IIS 配置虚拟路径部署会出现IIS静态文件404
// services.AddLogDashboard(opt =>
// {
// //opt.PathMatch = "/api/LogDashboard";
// opt.PathMatch = "/LogDashboard";
//opt.AddAuthorizationFilter(new LogDashboardBasicAuthFilter("admin", "zhizhun2018"));
// //opt.AddAuthorizationFilter(new LogDashboardBasicAuthFilter("admin", "zhizhun2018"));
//opt.AddAuthorizationFilter(new LogDashBoardAuthFilter());
// //opt.AddAuthorizationFilter(new LogDashBoardAuthFilter());
});
// });
}
}
}
// }
// }
//}

View File

@ -0,0 +1,120 @@
using IRaCIS.Core.API.HostService;
using IRaCIS.Core.Application.MassTransit.Consumer;
using IRaCIS.Core.Domain.BaseModel;
using IRaCIS.Core.Infra.EFCore;
using MassTransit;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using System;
namespace IRaCIS.Core.API
{
public static class MassTransitSetup
{
public static void AddMassTransitSetup(this IServiceCollection services)
{
#region MassTransit
//masstransit组件 也支持MediatR 中介者模式但是支持分布式考虑后续所以在次替代MediatR
//参考链接https://masstransit.io/documentation/concepts/mediator#scoped-mediator
services.AddMediator(cfg =>
{
cfg.AddConsumers(typeof(UserSiteSurveySubmitedEventConsumer).Assembly);
//cfg.AddConsumer<ConsistencyCheckConsumer>();
//cfg.AddConsumer<AddSubjectTriggerConsumer>();
//cfg.AddConsumer<AddSubjectTriggerConsumer2>();
//cfg.ConfigureMediator((context, cfg) => cfg.UseHttpContextScopeFilter(context));
});
//添加 MassTransit 和 InMemory 传输
services.AddMassTransit(cfg =>
{
cfg.AddConsumers(typeof(UserSiteSurveySubmitedEventConsumer).Assembly);
cfg.AddPublishMessageScheduler();
cfg.AddHangfireConsumers();
// 使用 InMemory 作为消息传递机制
cfg.UsingInMemory((context, cfg) =>
{
cfg.UsePublishMessageScheduler();
cfg.UseConsumeFilter(typeof(ConsumeExceptionFilter<>), context,
x => x.Include(type => type.IsAssignableTo(typeof(DomainEvent))));
cfg.UseConsumeFilter(typeof(CultureInfoFilter<>), context,
x => x.Include(type => type.IsAssignableTo(typeof(DomainEvent))));
cfg.ConfigureEndpoints(context); // 自动配置所有消费者的端点
});
#region rabitmq obsolute
//cfg.UsingRabbitMq((context, cfg) =>
//{
// cfg.UsePublishMessageScheduler();
// cfg.Host(
// host: "106.14.89.110",
// port: 5672,
// virtualHost: "/",
// configure: hostConfig =>
// {
// hostConfig.Username("rabbitmq");
// hostConfig.Password("rabbitmq");
// });
// cfg.ConfigureEndpoints(context);
//});
#endregion
#region Outbox obsolute
//cfg.AddConfigureEndpointsCallback((context, name, cfg) =>
//{
// cfg.UseEntityFrameworkOutbox<IRaCISDBContext>(context);
// //cfg.UseDelayedRedelivery(r => r.Intervals(TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(15), TimeSpan.FromMinutes(30)));
// //// 全局重试策略:重试 3 次,每次延迟 5 秒
// //cfg.UseMessageRetry(retryConfig =>
// //{
// // retryConfig.Interval(3, TimeSpan.FromSeconds(10));
// //});
//});
//cfg.AddEntityFrameworkOutbox<IRaCISDBContext>(o =>
//{
// o.UseSqlServer();
// o.UseBusOutbox();
//});
#endregion
});
//services.AddOptions<MassTransitHostOptions>()
// .Configure(options =>
// {
// options.WaitUntilStarted = true;
// options.StartTimeout = TimeSpan.FromMinutes(1);
// options.StopTimeout = TimeSpan.FromMinutes(1);
// });
//services.AddOptions<HostOptions>()
// .Configure(options => options.ShutdownTimeout = TimeSpan.FromMinutes(1));
//services.AddHostedService<RecurringJobConfigurationService>();
#endregion
}
}
}

View File

@ -2,7 +2,6 @@
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using StackExchange.Redis;
using System;
using System.Globalization;
@ -11,19 +10,41 @@ namespace IRaCIS.Core.API
/// <summary>
/// 序列化,反序列化的时候,处理时间 时区转换
/// </summary>
public class JSONTimeZoneConverter : DateTimeConverterBase
public class JSONTimeZoneConverter(IHttpContextAccessor _httpContextAccessor) : DateTimeConverterBase
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly TimeZoneInfo _clientTimeZone;
public JSONTimeZoneConverter(IHttpContextAccessor httpContextAccessor)
private TimeZoneInfo _clientTimeZone;
private string _dateFormat;
public override bool CanConvert(Type objectType)
{
_httpContextAccessor = httpContextAccessor;
#region 设置语言格式化方式,放在构造函数里面做不到动态切换
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
if (!isEn_US)
{
// Chinese date format
_dateFormat = "yyyy-MM-dd HH:mm:ss";
}
else
{
// Default or English date format
//_dateFormat = "MM/dd/yyyy HH:mm:ss";
_dateFormat = "yyyy-MM-dd HH:mm:ss";
}
#endregion
#region 获取当前请求的客户端时区
//默认是UTC
//var timeZoneId = "Etc/UTC";
var timeZoneId = "Asia/Shanghai";
var timeZoneIdHeader = _httpContextAccessor?.HttpContext?.Request?.Headers["TimeZoneId"];
if (timeZoneIdHeader is not null && !string.IsNullOrEmpty(timeZoneIdHeader.Value))
@ -33,12 +54,12 @@ namespace IRaCIS.Core.API
_clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
}
#endregion
public override bool CanConvert(Type objectType)
{
// 仅支持 DateTime 类型的转换
return objectType == typeof(DateTime)|| objectType == typeof(DateTime?);
return objectType == typeof(DateTime) || objectType == typeof(DateTime?);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
@ -71,33 +92,107 @@ namespace IRaCIS.Core.API
return null;
}
}
// 将客户端时间转换为服务器时区的时间
var serverZoneTime = TimeZoneInfo.ConvertTime(dateTime, _clientTimeZone, TimeZoneInfo.Local);
return serverZoneTime;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
{
DateTime? nullableDateTime = value as DateTime?;
if (nullableDateTime != null && nullableDateTime.HasValue)
{
//第一个参数默认使用系统本地时区 也就是应用服务器的时区
DateTime clientZoneTime = TimeZoneInfo.ConvertTime(nullableDateTime.Value, _clientTimeZone);
writer.WriteValue(clientZoneTime);
//writer.WriteValue(clientZoneTime);
writer.WriteValue(clientZoneTime.ToString(_dateFormat));
}
else
{
writer.WriteNull();
}
}
}
}
#region 废弃
public class MyDateTimeConverter : JsonConverter<DateTime>
{
public override DateTime ReadJson(JsonReader reader, Type objectType, DateTime existingValue, bool hasExistingValue, JsonSerializer serializer)
{
return reader.ReadAsDateTime().Value;
}
public override void WriteJson(JsonWriter writer, DateTime value, JsonSerializer serializer)
{
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
string dateFormat;
if (!isEn_US)
{
// Chinese date format
dateFormat = "yyyy-MM-dd HH:mm:ss";
}
else
{
// Default or English date format
dateFormat = "MM/dd/yyyy HH:mm:ss";
}
writer.WriteValue(value.ToString(dateFormat));
}
}
public class MyNullableDateTimeConverter : JsonConverter<DateTime?>
{
public override DateTime? ReadJson(JsonReader reader, Type objectType, DateTime? existingValue, bool hasExistingValue, JsonSerializer serializer)
{
var val = reader.ReadAsDateTime();
return val;
}
public override void WriteJson(JsonWriter writer, DateTime? value, JsonSerializer serializer)
{
var isEn_US = CultureInfo.CurrentCulture.Name == StaticData.CultureInfo.en_US;
string dateFormat;
if (!isEn_US)
{
// Chinese date format
dateFormat = "yyyy-MM-dd HH:mm:ss";
}
else
{
// Default or English date format
dateFormat = "MM/dd/yyyy HH:mm:ss";
}
if (value.HasValue)
{
writer.WriteValue(value.Value.ToString(dateFormat));
}
else
{
writer.WriteValue(default(DateTime?));
}
}
}
#endregion
}

View File

@ -3,7 +3,6 @@ using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
using IRaCIS.Core.Application.Helper;
using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
namespace IRaCIS.Core.API
@ -12,34 +11,44 @@ namespace IRaCIS.Core.API
{
public static void AddNewtonsoftJsonSetup(this IMvcBuilder builder, IServiceCollection services)
{
services.AddHttpContextAccessor();
services.AddScoped<JSONTimeZoneConverter>();
services.AddScoped<CustomStringConverter>();
services.AddScoped<IOSSService,OSSService>();
services.AddScoped<ObjectStorePathConvert>();
services.AddScoped<IOSSService, OSSService>();
builder.AddNewtonsoftJson(options =>
{
//options.SerializerSettings.PreserveReferencesHandling = PreserveReferencesHandling.Objects;
// 忽略循环引用
options.SerializerSettings.ReferenceLoopHandling = ReferenceLoopHandling.Ignore;
//options.SerializerSettings.TypeNameHandling = TypeNameHandling.All;
//处理返回给前端 可空类型 给出默认值 比如in? 为null 设置 默认值0
options.SerializerSettings.ContractResolver = new NullToEmptyStringResolver(); //new DefaultContractResolver();// new NullToEmptyStringResolver();
// 设置时间格式
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
options.SerializerSettings.ContractResolver = new NullToEmptyStringResolver();
// 设置时间格式 isEn_US? "MM/dd/yyyy HH:mm:ss" :
//options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
//options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ;
#region 废弃
//大驼峰
//options.SerializerSettings.ContractResolver = new DefaultContractResolver();
//小驼峰
//options.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
//二者只能取其一
//options.SerializerSettings.Converters.Add(new MyDateTimeConverter());
//options.SerializerSettings.Converters.Add(new MyNullableDateTimeConverter());
#endregion
//必须放在后面
options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONTimeZoneConverter>());
//options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<CustomStringConverter>());
//IsoDateTimeConverter
//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
})
.AddControllersAsServices()//动态webApi属性注入需要
@ -47,6 +56,7 @@ namespace IRaCIS.Core.API
{
o.SuppressModelStateInvalidFilter = true; //自己写验证
#region 废弃验证
////这里是自定义验证结果和返回状态码 因为这里是在[ApiController]控制器层校验动态webApi的不会校验 所以需要单独写一个Filter
//o.InvalidModelStateResponseFactory = (context) =>
//{
@ -57,7 +67,7 @@ namespace IRaCIS.Core.API
//return new JsonResult(ResponseOutput.NotOk("The inputs supplied to the API are invalid. " + JsonConvert.SerializeObject( error)));
//};
#endregion
});

View File

@ -1,38 +1,36 @@
using Newtonsoft.Json;
using IRaCIS.Core.Infrastructure.NewtonsoftJson;
using Newtonsoft.Json;
using Newtonsoft.Json.Serialization;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace IRaCIS.Core.API
{
/// <summary>
/// LowerCamelCaseJsonAttribute 可以设置类小写返回给前端
/// </summary>
public class NullToEmptyStringResolver : DefaultContractResolver
{
/// <summary>
/// 创建属性
/// </summary>
/// <param name="type">类型</param>
/// <param name="memberSerialization">序列化成员</param>
/// <returns></returns>
//protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
//{
// IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
// foreach (var jsonProperty in properties)
// {
// jsonProperty.DefaultValue = new NullToEmptyStringValueProvider(jsonProperty);
// }
// return properties;
//}
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization)
{
// 检查类是否有 LowerCamelCaseJsonAttribute 标记 有的话,属性名小写
if (type.GetCustomAttribute<LowerCamelCaseJsonAttribute>() != null)
{
base.NamingStrategy = new LowerCamelCaseNamingStrategy();
}
else
{
base.NamingStrategy = null;
}
IList<JsonProperty> properties = base.CreateProperties(type, memberSerialization);
var list= type.GetProperties()
var list = type.GetProperties()
.Select(p =>
{
var jp = base.CreateProperty(p, memberSerialization);
@ -43,12 +41,45 @@ namespace IRaCIS.Core.API
var uu = list.Select(t => t.PropertyName).ToList();
//获取复杂对象属性
properties = properties.TakeWhile(t => !uu.Contains(t.PropertyName)).ToList();
properties = properties.TakeWhile(t => !uu.Contains(t.PropertyName)).ToList();
list.AddRange(properties);
return list;
list.AddRange(properties);
return list;
}
}
public class NullToEmptyStringValueProvider : IValueProvider
{
PropertyInfo _MemberInfo;
public NullToEmptyStringValueProvider(PropertyInfo memberInfo)
{
_MemberInfo = memberInfo;
}
public object GetValue(object target)
{
object result = _MemberInfo.GetValue(target);
if (_MemberInfo.PropertyType == typeof(string) && result == null) result = "";
else if (_MemberInfo.PropertyType == typeof(String[]) && result == null) result = new string[] { };
//else if (_MemberInfo.PropertyType == typeof(Nullable<Int32>) && result == null) result = 0;
//else if (_MemberInfo.PropertyType == typeof(Nullable<Decimal>) && result == null) result = 0.00M;
return result;
}
public void SetValue(object target, object value)
{
if (_MemberInfo.PropertyType == typeof(string))
{
//去掉前后空格
_MemberInfo.SetValue(target, value == null ? string.Empty : value.ToString() == string.Empty ? value : value/*.ToString().Trim()*/);
}
else
{
_MemberInfo.SetValue(target, value);
}
}
}
}

View File

@ -1,23 +1,18 @@
using IRaCIS.Core.Application.Helper;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Serialization;
using System;
using System.Linq;
using System.Text.RegularExpressions;
namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson
{
public class CustomStringConverter : JsonConverter<string>
public class ObjectStorePathConvert : JsonConverter<string>
{
//private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IOSSService _oSSService;
// 构造函数
public CustomStringConverter(/*IHttpContextAccessor httpContextAccessor*/ IOSSService oSSService)
public ObjectStorePathConvert(IOSSService oSSService)
{
//_httpContextAccessor = httpContextAccessor;
_oSSService = oSSService;
}
@ -43,9 +38,9 @@ namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson
Regex guidRegex = new Regex(@"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
if (propertyName.IndexOf("Path") > -1 && value.IndexOf('.')>-1 && guidRegex.IsMatch(value))
if (propertyName.IndexOf("Path") > -1 && value.IndexOf('.') > -1 && guidRegex.IsMatch(value))
{
var tt= _oSSService.GetSignedUrl(value);
var tt = _oSSService.GetSignedUrl(value);
writer.WriteValue(tt);
}
else
@ -53,13 +48,13 @@ namespace IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson
// 将处理后的字符串写入到 JsonWriter 中
writer.WriteValue(value);
}
}
else
{
writer.WriteNull();
}
}
}
}

View File

@ -1,18 +1,30 @@
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Extensions.DependencyInjection;
using System.IO.Compression;
namespace IRaCIS.Core.API
{
public static class ResponseCompressionSetup
public static class ResponseCompressionSetup
{
public static void AddResponseCompressionSetup(this IServiceCollection services)
{
services.AddResponseCompression(options =>
{
options.EnableForHttps = true;
options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>();
});
services.Configure<BrotliCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;
});
services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;
});
}
}
}

View File

@ -1,29 +0,0 @@
using Microsoft.AspNetCore.Http;
using Serilog;
using Serilog.Configuration;
using Serilog.Core;
using Serilog.Events;
using System;
namespace IRaCIS.Core.API
{
public static class EnricherExtensions
{
public static LoggerConfiguration WithHttpContextInfo(this LoggerEnrichmentConfiguration enrich, IServiceProvider serviceProvider)
{
if (enrich == null)
throw new ArgumentNullException(nameof(enrich));
return enrich.With(new HttpContextEnricher(serviceProvider));
}
public static LoggerConfiguration WithHttpContextInfo(this LoggerEnrichmentConfiguration enrich, IServiceProvider serviceProvider, Action<LogEvent, ILogEventPropertyFactory, HttpContext> enrichAction)
{
if (enrich == null)
throw new ArgumentNullException(nameof(enrich));
return enrich.With(new HttpContextEnricher(serviceProvider, enrichAction));
}
}
}

View File

@ -1,89 +0,0 @@
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using Serilog.Core;
using Serilog.Events;
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.API
{
public class HttpContextEnricher : ILogEventEnricher
{
private readonly IServiceProvider _serviceProvider;
private readonly Action<LogEvent, ILogEventPropertyFactory, HttpContext> _enrichAction;
public HttpContextEnricher(IServiceProvider serviceProvider) : this(serviceProvider, null)
{ }
public HttpContextEnricher(IServiceProvider serviceProvider, Action<LogEvent, ILogEventPropertyFactory, HttpContext> enrichAction)
{
_serviceProvider = serviceProvider;
if (enrichAction == null)
{
_enrichAction = (logEvent, propertyFactory, httpContext) =>
{
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", httpContext.Connection.RemoteIpAddress.ToString()));
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("LocalIP", httpContext.Connection.LocalIpAddress.MapToIPv4().ToString()));
//这样读取没用
//logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestBody", await ReadRequestBody(httpContext.Request)));
//logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("RequestIP", IPHelper.GetIP(httpContext.Request) ));
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserRealName", httpContext?.User?.FindFirst(ClaimAttributes.RealName)?.Value));
logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("TokenUserType", httpContext?.User?.FindFirst(JwtIRaCISClaimType.UserTypeShortName)?.Value));
//logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("Referer", httpContext.Request.Headers["Referer"].ToString()));
//logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("request_path", httpContext.Request.Path));
//logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("request_method", httpContext.Request.Method));
//if (httpContext.Response.HasStarted)
//{
// logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty("response_status", httpContext.Response.StatusCode));
//}
};
}
else
{
_enrichAction = enrichAction;
}
}
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory)
{
var httpContext = _serviceProvider.GetService<IHttpContextAccessor>()?.HttpContext;
if (null != httpContext)
{
_enrichAction.Invoke(logEvent, propertyFactory, httpContext);
}
}
private async Task<string> ReadRequestBody(HttpRequest request)
{
// Ensure the request's body can be read multiple times (for the next middlewares in the pipeline).
request.EnableBuffering();
using var streamReader = new StreamReader(request.Body, leaveOpen: true);
var requestBody = await streamReader.ReadToEndAsync();
// Reset the request's body stream position for next middleware in the pipeline.
request.Body.Position = 0;
return requestBody==null?String.Empty: requestBody.Trim();
}
private async Task<string> ReadResponseBody(HttpResponse response)
{
response.Body.Seek(0, SeekOrigin.Begin);
string responseBody = await new StreamReader(response.Body).ReadToEndAsync();
response.Body.Seek(0, SeekOrigin.Begin);
return $"{responseBody}";
}
}
}

View File

@ -1,55 +0,0 @@
using Microsoft.AspNetCore.Builder;
using Serilog;
using Serilog.Events;
using Serilog.Sinks.Email;
using System;
using System.Net;
namespace IRaCIS.Core.API
{
public class SerilogExtension
{
public static void AddSerilogSetup(string environment, IServiceProvider serviceProvider)
{
var config = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
// Filter out ASP.NET Core infrastructre logs that are Information and below 日志太多了 一个请求 记录好几条
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
.MinimumLevel.Override("Hangfire", LogEventLevel.Warning)
.MinimumLevel.Override("System.Net.Http.HttpClient.HttpReports", LogEventLevel.Warning)
.Enrich.WithClientIp()
.Enrich.FromLogContext()
.Filter.ByExcluding(logEvent =>logEvent.Properties.ContainsKey("RequestPath") && logEvent.Properties["RequestPath"].ToString().Contains("/health"))
//控制台 方便调试 问题 我们显示记录日志 时 获取上下文的ip 和用户名 用户类型
.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning,
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine}")
.WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day,
outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine}");
//.WriteTo.MSSqlServer("Data Source=DESKTOP-4TU9A6M;Initial Catalog=CoreFrame;User ID=sa;Password=123456", "logs", autoCreateSqlTable: true, restrictedToMinimumLevel: LogEventLevel.Information)//从左至右四个参数分别是数据库连接字符串、表名、如果表不存在是否创建、最低等级。Serilog会默认创建一些列。
//if (environment == "Production")
//{
// config.WriteTo.Email(new EmailConnectionInfo()
// {
// EmailSubject = "系统警告,请速速查看!",//邮件标题
// FromEmail = "test@extimaging.com",//发件人邮箱
// MailServer = "smtp.qiye.aliyun.com",//smtp服务器地址
// NetworkCredentials = new NetworkCredential("test@extimaging.com", "SHzyyl2021"),//两个参数分别是发件人邮箱与客户端授权码
// Port = 465,//端口号
// ToEmail = "872297557@qq.com"//收件人
// }, restrictedToMinimumLevel: LogEventLevel.Error,
// outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [ {Level} {ClientIp} {ClientAgent} {TokenUserRealName} {TokenUserType} ] || [path: {RequestPath} arguments: {RequestBody}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine})");
//}
//扩展方法 获取上下文的ip 用户名 用户类型
Log.Logger = config.Enrich.WithHttpContextInfo(serviceProvider).CreateLogger();
}
}
}

View File

@ -0,0 +1,76 @@
using Amazon.SecurityToken.Model;
using DocumentFormat.OpenXml.Bibliography;
using IRaCIS.Core.Domain.Share;
using Microsoft.Extensions.Configuration.Json;
using Microsoft.Extensions.Configuration;
using Serilog;
using Serilog.Events;
using Serilog.Formatting.Compact;
using Serilog.Formatting.Display;
using System;
using System.Collections.Generic;
using System.Net;
namespace IRaCIS.Core.API
{
public class SerilogExtension
{
public static void AddSerilogSetup(string environment)
{
var config = new LoggerConfiguration()
.MinimumLevel.Information()
.MinimumLevel.Override("Microsoft", LogEventLevel.Information)
// Filter out ASP.NET Core infrastructre logs that are Information and below 日志太多了 一个请求 记录好几条
.MinimumLevel.Override("Microsoft.AspNetCore", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.AspNetCore.Hosting", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.AspNetCore.Mvc", LogEventLevel.Warning)
.MinimumLevel.Override("Microsoft.AspNetCore.Routing", LogEventLevel.Warning)
.MinimumLevel.Override("Hangfire", LogEventLevel.Warning)
.Enrich.FromLogContext()
.Filter.ByExcluding(logEvent => logEvent.Properties.ContainsKey("RequestPath") && logEvent.Properties["RequestPath"].ToString().Contains("/health"))
.WriteTo.Console()
.WriteTo.File($"{AppContext.BaseDirectory}Serilogs/.log", rollingInterval: RollingInterval.Day,retainedFileCountLimit:60);
#region 根据环境配置是否打开错误发送邮件通知
//读取配置文件
var configuration = new ConfigurationBuilder().Add(new JsonConfigurationSource { Path = $"appsettings.{environment}.json", ReloadOnChange = true }).Build();
// 手动绑定配置
var emailConfig = new SystemEmailSendConfig();
configuration.GetSection("SystemEmailSendConfig").Bind(emailConfig);
if (emailConfig.IsOpenErrorNoticeEmail)
{
config.WriteTo.Email(options: new Serilog.Sinks.Email.EmailSinkOptions()
{
From = emailConfig.FromEmail,
To = emailConfig.ErrorNoticeEmailList,
Host = emailConfig.Host,
Port = emailConfig.Port,
Subject = new MessageTemplateTextFormatter("Log Alert - 系统发生了异常,请核查"),
Credentials = new NetworkCredential(emailConfig.FromEmail, emailConfig.AuthorizationCode)
}, restrictedToMinimumLevel: Serilog.Events.LogEventLevel.Error);
}
#endregion
Log.Logger = config.CreateLogger();
#region 废弃-输出Json格式的日志
//如果有反向代理并不会获取到用户的真实IP
//.Enrich.WithClientIp()
//.Enrich.WithRequestHeader("User-Agent")
//https://github.com/serilog/serilog-formatting-compact
//// 控制台输出 JSON 格式
//.WriteTo.Console(formatter: new CompactJsonFormatter(), LogEventLevel.Warning),
//// 文件输出 JSON 格式
//.WriteTo.File(new CompactJsonFormatter(), $"{AppContext.BaseDirectory}Serilogs/.json", rollingInterval: RollingInterval.Day);
#endregion
}
}
}

View File

@ -0,0 +1,136 @@
using IP2Region.Net.Abstractions;
using IP2Region.Net.XDB;
using IRaCIS.Core.Application.BackGroundJob;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Panda.DynamicWebApi;
using System;
using System.IO;
using System.Linq;
using System.Reflection;
namespace IRaCIS.Core.API;
public static class ServiceCollectionSetup
{
public static void ConfigureServices(this IServiceCollection services, IConfiguration _configuration)
{
services.AddOptions().Configure<SystemEmailSendConfig>(_configuration.GetSection("SystemEmailSendConfig"));
services.AddOptions().Configure<ServiceVerifyConfigOption>(_configuration.GetSection("BasicSystemConfig"));
services.AddOptions().Configure<AliyunOSSOptions>(_configuration.GetSection("AliyunOSS"));
services.AddOptions().Configure<ObjectStoreServiceOptions>(_configuration.GetSection("ObjectStoreService"));
services.AddOptions().Configure<IRCEncreptOption>(_configuration.GetSection("EncrypteResponseConfig"));
services.AddOptions().Configure<SystemPacsConfig>(_configuration.GetSection("SystemPacsConfig"));
services.Configure<IRaCISBasicConfigOption>(_configuration.GetSection("IRaCISBasicConfig"));
services.Configure<ServiceVerifyConfigOption>(_configuration.GetSection("BasicSystemConfig"));
//转发头设置 获取真实IP
services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
services.AddSingleton<IUserIdProvider, IRaCISUserIdProvider>();
services.AddSingleton<ISearcher>(new Searcher(CachePolicy.Content, Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "ip2region.xdb")));
services.AddScoped(typeof(IRepository<>), typeof(Repository<>));
services.AddScoped<IRepository, Repository>();
services.AddScoped<IObtainTaskAutoCancelJob, ObtainTaskAutoCancelJob>();
// 注册以Service 结尾的服务
services.Scan(scan => scan
.FromAssemblies(typeof(BaseService).Assembly)
.AddClasses(classes => classes.Where(t => t.Name.Contains("Service")))
.AsImplementedInterfaces()
.WithScopedLifetime());
#region Register Controllers
// Register all controllers in the assembly that implement IDynamicWebApi
services.Scan(scan => scan
.FromAssemblies(typeof(BaseService).Assembly)
.AddClasses(classes => classes.AssignableTo<IDynamicWebApi>())
.AsSelf()
.WithScopedLifetime());
#endregion
// MediatR 进程内消息 事件解耦 从程序集中 注册命令和handler对应关系
//builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<ConsistencyVerificationHandler>());
#region 历史废弃配置
//builder.Services.AddMemoryCache();
////上传限制 配置
//builder.Services.Configure<FormOptions>(options =>
//{
// options.MultipartBodyLengthLimit = int.MaxValue;
// options.ValueCountLimit = int.MaxValue;
// options.ValueLengthLimit = int.MaxValue;
//});
//IP 限流 可设置白名单 或者黑名单
//services.AddIpPolicyRateLimitSetup(_configuration);
// 用户类型 策略授权
//services.AddAuthorizationPolicySetup(_configuration);
#endregion
}
}
#region Autofac 废弃
//public class AutofacModuleSetup : Autofac.Module
//{
// protected override void Load(ContainerBuilder containerBuilder)
// {
// #region byzhouhang 20210917 此处注册泛型仓储 可以减少Domain层 和Infra.EFcore 两层 空的仓储接口定义和 仓储文件定义
// containerBuilder.RegisterGeneric(typeof(Repository<>))
// .As(typeof(IRepository<>)).InstancePerLifetimeScope();//注册泛型仓储
// containerBuilder.RegisterType<Repository>().As<IRepository>().InstancePerLifetimeScope();
// #endregion
// #region 指定控制器也由autofac 来进行实例获取 https://www.cnblogs.com/xwhqwer/p/15320838.html
// //获取所有控制器类型并使用属性注入
// containerBuilder.RegisterAssemblyTypes(typeof(BaseService).Assembly)
// .Where(type => typeof(IDynamicWebApi).IsAssignableFrom(type))
// .PropertiesAutowired();
// #endregion
// Assembly application = Assembly.LoadFrom(AppDomain.CurrentDomain.BaseDirectory + "IRaCIS.Core.Application.dll");
// containerBuilder.RegisterAssemblyTypes(application).Where(t => t.FullName.Contains("Service"))
// .PropertiesAutowired().AsImplementedInterfaces();
// //containerBuilder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
// //containerBuilder.RegisterType<UserInfo>().As<IUserInfo>().InstancePerLifetimeScope();
// //注册hangfire任务 依赖注入
// containerBuilder.RegisterType<ObtainTaskAutoCancelJob>().As<IObtainTaskAutoCancelJob>().InstancePerDependency();
// }
//}
#endregion

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