Compare commits

..

1985 Commits

Author SHA1 Message Date
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
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
2024-08-21 14:51:57 +08:00
hang 3b48dfae31 项目缓存状态逻辑,全局修改
continuous-integration/drone/push Build is passing
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
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
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
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
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
2024-08-21 10:46:33 +08:00
hang f8cd361415 添加FusionCache
continuous-integration/drone/push Build is passing
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
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
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
2024-08-20 15:08:03 +08:00
hang 8e8b55fa46 修改分页列表bug
continuous-integration/drone/push Build is passing
2024-08-20 14:58:35 +08:00
hang 3096671595 数组给默认参数
continuous-integration/drone/push Build is passing
2024-08-20 14:09:01 +08:00
hang a6102490c8 修改项目导表-指定项目导出
continuous-integration/drone/push Build is passing
2024-08-20 14:03:42 +08:00
hang 9e1cc1521f 修改分页参数
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
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
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
2024-08-20 10:25:45 +08:00
hang 78dbe23d0e 修改实体
continuous-integration/drone/push Build is running
2024-08-20 10:25:06 +08:00
hang 4bf93d10b0 暂时屏蔽事件分发
continuous-integration/drone/push Build is failing
2024-08-20 09:39:44 +08:00
hang 00827e9975 增加领域事件定义,增加MassTransit 发布事件
continuous-integration/drone/push Build is failing
2024-08-19 23:32:53 +08:00
hang 021b32587a 修改模板
continuous-integration/drone/push Build is passing
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
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
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
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
2024-08-19 15:33:52 +08:00
he 7caf00bd75 修改
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
2024-08-19 13:24:41 +08:00
he 476387b468 修改
continuous-integration/drone/push Build is passing
2024-08-19 13:19:54 +08:00
he 3a2cb138ab 修改
continuous-integration/drone/push Build is passing
2024-08-19 13:12:04 +08:00
he fa763e6341 修改
continuous-integration/drone/push Build is passing
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
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
2024-08-17 20:33:21 +08:00
hang cd2166f11b 数据记录审计方法调整
continuous-integration/drone/push Build is passing
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
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
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
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
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
2024-08-16 10:15:50 +08:00
hang 423fa4001b 修改T4模板
continuous-integration/drone/push Build is passing
2024-08-16 09:54:06 +08:00
hang 3701d8bcd9 精简实体准备
continuous-integration/drone/push Build is passing
2024-08-15 23:53:25 +08:00
hang 0689f731b7 测试修改配置文件拷贝是否生效
continuous-integration/drone/push Build is passing
2024-08-15 17:41:38 +08:00
hang d97025aeca 项目AE修改
continuous-integration/drone/push Build is passing
2024-08-15 17:08:03 +08:00
hang fa929ebde4 邮件配置5s超时
continuous-integration/drone/push Build is passing
2024-08-15 15:29:25 +08:00
hang 32c4d634ed 内部人员 直接pm 可以加pm
continuous-integration/drone/push Build is passing
2024-08-15 14:37:04 +08:00
hang 8d4a791a1c 修改一致性分析增加首次截止全局访视名字
continuous-integration/drone/push Build is passing
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
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
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
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
2024-08-14 17:38:44 +08:00
hang 5e8b5eed9f 取字典的值的时候进行判断
continuous-integration/drone/push Build is passing
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
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
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
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
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
2024-08-14 14:43:25 +08:00
he 161213f2af 修改
continuous-integration/drone/push Build is passing
2024-08-14 13:58:50 +08:00
he c1fcb4f6e3 修改
continuous-integration/drone/push Build is passing
2024-08-14 13:37:22 +08:00
he a9d81f5af5 修改
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
2024-08-13 09:08:04 +08:00
hang 46a304b5a6 用户 性别可为空
continuous-integration/drone/push Build is passing
2024-08-12 17:42:54 +08:00
hang 098ade3c8a subject 软删除,导致任务列表统计数字问题
continuous-integration/drone/push Build is passing
2024-08-12 16:40:20 +08:00
hang 86489b2117 前端国际化状态修改
continuous-integration/drone/push Build is passing
2024-08-12 15:40:13 +08:00
hang 64b5206f86 项目邮件列表修改
continuous-integration/drone/push Build is passing
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
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
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
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
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
2024-08-09 15:24:40 +08:00
hang 63e2ca07b5 修改dicomAE 测试
continuous-integration/drone/push Build is passing
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
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
2024-08-09 14:07:29 +08:00
hang a1778d836b 设置连接超时时间
continuous-integration/drone/push Build is pending
2024-08-09 13:46:08 +08:00
hang cebcf908f9 修改裁判标价判定
continuous-integration/drone/push Build is passing
2024-08-09 13:12:05 +08:00
hang 202a3c26d1 修改取消分配验证生效的是否开始阅片
continuous-integration/drone/push Build is passing
2024-08-08 14:53:29 +08:00
hang fbbda8c0d1 是否可以取消分配bug
continuous-integration/drone/push Build is passing
2024-08-08 14:49:06 +08:00
hang 7954bdeca8 脑转移 未分配的退回也失效
continuous-integration/drone/push Build is passing
2024-08-08 14:39:53 +08:00
hang d8a0c80ca4 修改模板删除,导表显示名称国际哈
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
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
2024-08-07 13:23:50 +08:00
hang a5737073c4 邮件反馈类型错误
continuous-integration/drone/push Build is passing
2024-08-07 10:41:46 +08:00
hang 4a82812b4e 修改导表
continuous-integration/drone/push Build is passing
2024-08-07 10:37:06 +08:00
hang 8ec67d72f1 打开系统反馈
continuous-integration/drone/push Build is passing
2024-08-06 18:04:14 +08:00
hang 405db77dea 修改邮件查询
continuous-integration/drone/push Build is passing
2024-08-06 17:41:40 +08:00
hang 8b8ed1fee3 系统邮件配置修改
continuous-integration/drone/push Build is passing
2024-08-06 16:39:11 +08:00
hang c1e496530d excel 增加英文名字字段
continuous-integration/drone/push Build is passing
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
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
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
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
2024-08-05 17:09:05 +08:00
he 75d162b353 修改
continuous-integration/drone/push Build is running
2024-08-05 17:08:39 +08:00
he 9cbfb2c7e4 修改
continuous-integration/drone/push Build is running
2024-08-05 17:08:06 +08:00
he a47e20ff74 修改
continuous-integration/drone/push Build is passing
2024-08-05 16:54:59 +08:00
he 36a63d7628 修改
continuous-integration/drone/push Build is passing
2024-08-05 16:20:30 +08:00
he 2217ae0353 修改
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
2024-08-05 10:41:42 +08:00
hang 4eaf070243 撤回 dbcontext 连接池
continuous-integration/drone/push Build is passing
2024-08-02 17:44:45 +08:00
hang c353ae645b dbcontext 上下文池,提高性能测试
continuous-integration/drone/push Build is passing
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
2024-08-02 13:58:54 +08:00
hang 1875b56b37 修改用户反馈
continuous-integration/drone/push Build is passing
2024-08-02 13:50:16 +08:00
hang 99eef31202 用户反馈增加数字
continuous-integration/drone/push Build is passing
2024-08-02 13:31:57 +08:00
hang 826f8a670d 邮件模板修改调整
continuous-integration/drone/push Build is passing
2024-08-02 13:25:44 +08:00
hang cb53dbefcf CRC 上传导表
continuous-integration/drone/push Build is passing
2024-08-02 11:48:34 +08:00
hang 9b4e29a812 x
continuous-integration/drone/push Build is passing
2024-08-02 11:28:58 +08:00
hang fa9c9de12c 质控增加字段
continuous-integration/drone/push Build is running
2024-08-02 11:27:51 +08:00
hang c98db93ecb 一致性分析 全局任务 SouceReadModuleId 处理
continuous-integration/drone/push Build is passing
2024-08-02 10:30:33 +08:00
hang eb1dcc9f0a 增加反馈字段
continuous-integration/drone/push Build is passing
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
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
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
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
2024-08-01 13:36:46 +08:00
hang 7069a17d8e 修改参数必传
continuous-integration/drone/push Build is passing
2024-08-01 13:31:53 +08:00
hang 3e5d0b650d 截图给默认值
continuous-integration/drone/push Build is passing
2024-08-01 13:17:23 +08:00
hang a6b8db30c3 scp 传输增加备注
continuous-integration/drone/push Build is passing
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
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
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
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
2024-08-01 10:12:09 +08:00
hang 9fa24a35ef 记录传输日志
continuous-integration/drone/push Build is passing
2024-07-31 17:42:40 +08:00
hang 0e631e6f29 传递logger
continuous-integration/drone/push Build is passing
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
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
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
2024-07-31 16:11:55 +08:00
hang cdbe74f1d9 根据配置设置用户的机构名称
continuous-integration/drone/push Build is passing
2024-07-31 15:51:38 +08:00
hang de01da975e CalledAE 名字错误
continuous-integration/drone/push Build is passing
2024-07-31 15:13:00 +08:00
hang aae243e36e 项目dicom ae 修改
continuous-integration/drone/push Build is passing
2024-07-31 15:08:28 +08:00
hang d3f7c199c7 防止前端重复上传
continuous-integration/drone/push Build is passing
2024-07-31 14:05:38 +08:00
hang ca41fac53d 有问题,撤回修改
continuous-integration/drone/push Build is passing
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
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
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
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
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
2024-07-31 09:25:54 +08:00
hang d602238f82 hangfire 任务调度隐患排除
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
2024-07-30 09:51:48 +08:00
hang 633507d4cd k8s docker 挂载配置文件热更新问题解决
continuous-integration/drone/push Build is passing
2024-07-29 17:59:01 +08:00
hang 8c94e17c14 删除提示语
continuous-integration/drone/push Build is passing
2024-07-29 16:33:35 +08:00
hang 942f3adfe0 修改scp 上传bug
continuous-integration/drone/push Build is running
2024-07-29 16:33:00 +08:00
hang 3b92aaf61c 修改国际化 和 scp 缩略图日志
continuous-integration/drone/push Build is passing
2024-07-29 16:24:34 +08:00
he 4f5d89732d 代码提交
continuous-integration/drone/push Build is passing
2024-07-29 15:13:15 +08:00
he 55bb70179c 代码修改
continuous-integration/drone/push Build is passing
2024-07-29 14:19:03 +08:00
he 6c9c8ee5dc 修改
continuous-integration/drone/push Build is passing
2024-07-29 14:00:40 +08:00
hang 73e9e3239a 修改us配置文件
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
2024-07-25 16:41:42 +08:00
hang 44bcdf7973 系统邮件上线到配置预修改
continuous-integration/drone/push Build is passing
2024-07-25 14:46:13 +08:00
hang 6311884a5c dicom AE 浏览器推荐 发布记录 国际化
continuous-integration/drone/push Build is passing
2024-07-25 12:22:56 +08:00
hang de5fc7c277 修改,无序重阅 和审批
continuous-integration/drone/push Build is passing
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
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
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
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
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
2024-07-24 09:54:43 +08:00
hang 3cdfd3a771 修改dicom ae 接口
continuous-integration/drone/push Build is passing
2024-07-23 15:35:49 +08:00
hang 76792a127f 整体肿瘤评估导表修改
continuous-integration/drone/push Build is passing
2024-07-23 14:58:40 +08:00
hang fc36cbcb75 修改Dicom 推送
continuous-integration/drone/push Build is passing
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
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
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
2024-07-22 14:04:56 +08:00
hang d7f0fdd0e7 oss 下载走内网地址
continuous-integration/drone/push Build is passing
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
2024-07-18 15:18:40 +08:00
hang 22c9386101 修改测试AE
continuous-integration/drone/push Build is passing
2024-07-18 10:55:47 +08:00
hang ff4136e02d 修改AE 配置文件
continuous-integration/drone/push Build is passing
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
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
2024-07-17 14:52:53 +08:00
hang 425bd7bf9a 修改查询列表
continuous-integration/drone/push Build is passing
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
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
2024-07-17 13:37:01 +08:00
he d72f3e89a2 代码修改
continuous-integration/drone/push Build is passing
2024-07-17 11:06:47 +08:00
he 85a303171c 修改
continuous-integration/drone/push Build is passing
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
2024-07-16 17:30:01 +08:00
hang 9924375f82 下拉框增加参数
continuous-integration/drone/push Build is passing
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
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
2024-07-16 15:43:04 +08:00
hang 6e7545be65 返回配置字段
continuous-integration/drone/push Build is passing
2024-07-16 15:28:04 +08:00
hang b77d2d9160 减少压缩包访视层级,同时处理单个非dicom 特殊情况压缩包处理
continuous-integration/drone/push Build is passing
2024-07-15 17:12:01 +08:00
hang 0c94ef86b0 增加打包下载验证
continuous-integration/drone/push Build is passing
2024-07-15 16:27:06 +08:00
hang e0c6e9aabf 修改ivus影像下载功能
continuous-integration/drone/push Build is passing
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
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
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
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
2024-07-11 10:16:02 +08:00
hang cb7140ad38 修改国际化查询
continuous-integration/drone/push Build is passing
2024-07-11 09:20:15 +08:00
hang 29ea2a0ef1 增加国际化
continuous-integration/drone/push Build is passing
2024-07-10 17:42:39 +08:00
hang 46af71e3df 增加uat irc 自动打包成镜像
continuous-integration/drone/push Build is passing
2024-07-10 16:47:25 +08:00
hang 67819fc85d 组件一致性分析筛选条件修改
continuous-integration/drone/push Build is passing
2024-07-10 14:00:04 +08:00
hang 4b15bcdc55 打开后端正式环境验证
continuous-integration/drone/push Build is passing
2024-07-10 10:48:20 +08:00
hang 0ba439e5bd 修改发件箱配置
continuous-integration/drone/push Build is passing
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
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
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
2024-07-09 17:03:20 +08:00
hang d483aca73b 增加映射
continuous-integration/drone/push Build is passing
2024-07-09 16:27:07 +08:00
hang cf45169de2 修改返回
continuous-integration/drone/push Build is passing
2024-07-09 16:16:10 +08:00
hang 0075c18cd8 修改返回的信息
continuous-integration/drone/push Build is passing
2024-07-09 14:56:47 +08:00
hang e55bc5fe7a 增加查询映射
continuous-integration/drone/push Build is passing
2024-07-09 14:25:34 +08:00
hang e6bd7ad0ea 修改pacs 配置
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
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
2024-07-04 17:24:29 +08:00
hang 6264d105ab 浏览器推荐修改
continuous-integration/drone/push Build is passing
2024-07-04 17:22:54 +08:00
hang 0c7495870b pacs 直连 增加修改
continuous-integration/drone/push Build is passing
2024-07-04 13:12:10 +08:00
hang a615b5cefd site dicomAE 提交
continuous-integration/drone/push Build is passing
2024-07-03 14:45:24 +08:00
hang 9f66a932fc 增加pacs 直连 scp项目
continuous-integration/drone/push Build is passing
2024-07-03 14:00:29 +08:00
hang d094f22ab2 pacs 直连修改
continuous-integration/drone/push Build is passing
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
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
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
2024-07-02 09:36:15 +08:00
hang 2354ee9174 修改一致性分析和临床数据
continuous-integration/drone/push Build is passing
2024-07-01 15:40:13 +08:00
hang f158f092ce 修改一致性分析 以及项目部位编辑
continuous-integration/drone/push Build is passing
2024-07-01 14:54:15 +08:00
he f446d400a1 修改
continuous-integration/drone/push Build is passing
2024-07-01 13:46:54 +08:00
he 5b0026f30f 修改
continuous-integration/drone/push Build is passing
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
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
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
2024-06-28 10:19:34 +08:00
he 1a3ad4f602 修改
continuous-integration/drone/push Build is passing
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
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
2024-06-27 15:38:00 +08:00
hang 3efc40e9ae 修改发布版本降序排
continuous-integration/drone/push Build is passing
2024-06-27 15:33:18 +08:00
hang 4922ffa5c3 国际化增加 版本字段展示
continuous-integration/drone/push Build is passing
2024-06-27 15:31:03 +08:00
hang c7935ee90f 修改限制当前版本
continuous-integration/drone/push Build is passing
2024-06-27 15:25:48 +08:00
hang a91a706e0b 修改数据库模型
continuous-integration/drone/push Build is passing
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
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
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
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
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
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
2024-06-25 10:52:16 +08:00
hang 9048963ea5 修改字段名
continuous-integration/drone/push Build is passing
2024-06-25 10:28:18 +08:00
hang d3ab051a39 spm cpm 返回增加字段
continuous-integration/drone/push Build is passing
2024-06-25 10:26:30 +08:00
hang 73edbe8fd3 删掉邮件日志组件
continuous-integration/drone/push Build is passing
2024-06-25 09:17:48 +08:00
hang de70f68640 发送邮件版本退回
continuous-integration/drone/push Build is passing
2024-06-24 17:46:37 +08:00
hang 97b97a164d 修改发送邮件版本
continuous-integration/drone/push Build is passing
2024-06-24 17:37:35 +08:00
hang fb87f4d06a 版本退回
continuous-integration/drone/push Build is passing
2024-06-24 17:26:20 +08:00
hang 20092d6757 升级邮件发送包
continuous-integration/drone/push Build is passing
2024-06-24 17:21:15 +08:00
hang 96c4165cda 修改 界面控制bug
continuous-integration/drone/push Build is passing
2024-06-24 16:54:11 +08:00
hang a4226d4e2f 修改筛选条件
continuous-integration/drone/push Build is passing
2024-06-24 16:28:20 +08:00
hang f97565d9d8 医生入组,没有spm修改逻辑
continuous-integration/drone/push Build is passing
2024-06-24 16:07:41 +08:00
hang ab84e66fe4 国际化修改,增加批量更新接口
continuous-integration/drone/push Build is passing
2024-06-24 10:51:23 +08:00
hang 1f9d29e005 版本历史功能增加
continuous-integration/drone/push Build is passing
2024-06-24 10:13:03 +08:00
hang 8521b0c28c 增加清理跟踪的方法
continuous-integration/drone/push Build is passing
2024-06-20 17:50:17 +08:00
hang 26a62426f0 修改发布方式
continuous-integration/drone/push Build is passing
2024-06-20 15:08:47 +08:00
hang 1246413e30 修改nonedicom过滤
continuous-integration/drone/push Build is passing
2024-06-19 19:38:16 +08:00
hang f50b5819c0 修改过滤规则
continuous-integration/drone/push Build is passing
2024-06-19 18:40:32 +08:00
hang 6db8d61b7c 修改 非dicom 检查过滤
continuous-integration/drone/push Build is passing
2024-06-19 17:57:40 +08:00
hang 58250fe993 非dicom zip过滤
continuous-integration/drone/push Build is passing
2024-06-19 16:57:08 +08:00
hang 6cae7a1ae4 修改非dicom 文件上传 增加文件类型
continuous-integration/drone/push Build is passing
2024-06-19 15:17:55 +08:00
hang 73541efbf4 uat 截图修改配置文件
continuous-integration/drone/push Build is passing
2024-06-19 14:17:35 +08:00
hang f4bd891deb 记录最新登录时间
continuous-integration/drone/push Build is passing
2024-06-19 13:48:59 +08:00
hang a9831657cc 修改Uat IRC 配置
continuous-integration/drone/push Build is passing
2024-06-19 13:11:20 +08:00
hang 500a9fbaca 修改配置文件
continuous-integration/drone/push Build is passing
2024-06-19 09:08:17 +08:00
hang 5f11c3a602 修改site 启用时间逻辑
continuous-integration/drone/push Build is passing
2024-06-18 19:36:57 +08:00
hang 7680e90d65 修改添加trialSite逻辑
continuous-integration/drone/push Build is passing
2024-06-18 19:28:26 +08:00
hang 06a57cd056 修改中心调样cpm bug
continuous-integration/drone/push Build is passing
2024-06-18 15:09:52 +08:00
hang 7626d17540 记录邮件异常
continuous-integration/drone/push Build is passing
2024-06-18 13:28:40 +08:00
hang 344b92c427 修改配置文件
continuous-integration/drone/push Build is passing
2024-06-18 13:16:26 +08:00
hang 4719177009 时间环境配置修改
continuous-integration/drone/push Build is passing
2024-06-18 11:53:17 +08:00
hang c1461633ce 修改中心调研国际化
continuous-integration/drone/push Build is passing
2024-06-18 11:10:18 +08:00
hang 6be7aa1ad9 修改默认值
continuous-integration/drone/push Build is passing
2024-06-18 10:28:10 +08:00
hang 4da7c2f960 irc minio 修改配置文件
continuous-integration/drone/push Build is passing
2024-06-17 11:48:09 +08:00
hang 47a45df610 修改mfa 配置
continuous-integration/drone/push Build is passing
2024-06-17 10:38:42 +08:00
hang 1a44e48b2d 删除备注
continuous-integration/drone/push Build is passing
2024-06-17 08:59:53 +08:00
hang c566a703eb 修改trialSitte Id 问题
continuous-integration/drone/push Build is passing
2024-06-14 16:04:12 +08:00
hang 001c248cb8 中心调研返回项目modality
continuous-integration/drone/push Build is passing
2024-06-14 15:35:08 +08:00
hang 654462fe6b 插入字符串efbug
continuous-integration/drone/push Build is passing
2024-06-14 14:34:18 +08:00
hang ab6642ce33 过滤检查
continuous-integration/drone/push Build is passing
2024-06-14 14:29:55 +08:00
hang 946386ad43 检查技术修改
continuous-integration/drone/push Build is passing
2024-06-14 13:46:30 +08:00
hang cf9c79a928 过滤失效的任务
continuous-integration/drone/push Build is passing
2024-06-14 13:28:42 +08:00
hang 493e4e8dca 枚举不能识别
continuous-integration/drone/push Build is passing
2024-06-14 11:05:07 +08:00
hang ecbe8434f3 修改编译问题
continuous-integration/drone/push Build is passing
2024-06-14 10:55:52 +08:00
he 644fe1bd3c Merge 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
2024-06-14 10:52:02 +08:00
he 870fca2e93 修改 2024-06-14 10:52:01 +08:00
hang 6207fb5006 修改MFA 接口
continuous-integration/drone/push Build is failing
2024-06-14 10:38:58 +08:00
hang ae913d8213 修改中心调研国际化
continuous-integration/drone/push Build is passing
2024-06-14 09:18:06 +08:00
hang ce969822a0 字段名错误
continuous-integration/drone/push Build is passing
2024-06-13 17:42:49 +08:00
hang 4fc311d4a5 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
2024-06-13 17:42:05 +08:00
hang 2b424ff45c site 调研增加配置字段 2024-06-13 17:42:04 +08:00
he e5d9cfc50e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-06-13 17:35:19 +08:00
he ac3552818b 修改 2024-06-13 17:35:18 +08:00
hang c004741f95 上传下载 改为不为空
continuous-integration/drone/push Build is passing
2024-06-13 17:08:09 +08:00
hang 2bdc0c7704 修改siteName 国际化
continuous-integration/drone/push Build is passing
2024-06-13 14:57:38 +08:00
hang 35d90d56dd 修改过滤
continuous-integration/drone/push Build is passing
2024-06-13 09:25:26 +08:00
hang f14525ea95 减少赋值字段
continuous-integration/drone/push Build is failing
2024-06-12 17:24:51 +08:00
hang c2350f1418 影像筛选逻辑增加
continuous-integration/drone/push Build is passing
2024-06-12 17:10:22 +08:00
hang 4b8b02fa55 重构检查列表
continuous-integration/drone/push Build is passing
2024-06-12 16:14:14 +08:00
hang 62102b8b03 重构检查列表
continuous-integration/drone/push Build is failing
2024-06-12 16:10:49 +08:00
hang 0655318d2d 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
2024-06-12 15:44:00 +08:00
hang 0bd2a10091 修改受试者无序阅片 2024-06-12 15:44:00 +08:00
he ce11788878 修改
continuous-integration/drone/push Build is passing
2024-06-12 15:32:17 +08:00
he 0cb74296c3 修改
continuous-integration/drone/push Build is passing
2024-06-12 15:01:23 +08:00
hang def08b72ca 修改返回列表
continuous-integration/drone/push Build is passing
2024-06-12 14:22:01 +08:00
hang 1ef8d2913b 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
2024-06-12 14:11:12 +08:00
hang 7e18b1287e 优化代码 2024-06-12 14:11:11 +08:00
he fdcb6ad12f 修改
continuous-integration/drone/push Build is failing
2024-06-12 14:08:18 +08:00
hang 988bf0e92c 修改任务查询
continuous-integration/drone/push Build is passing
2024-06-12 14:03:38 +08:00
he f6612286d9 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-06-12 13:45:18 +08:00
he c21845c60d 修改 2024-06-12 13:45:17 +08:00
hang 867ef0ef97 任务名称修改逻辑变更
continuous-integration/drone/push Build is passing
2024-06-12 13:25:34 +08:00
hang f27bee83b7 修改任务列表
continuous-integration/drone/push Build is passing
2024-06-12 13:17:48 +08:00
hang e3b6feb4da 修改待阅列表
continuous-integration/drone/push Build is passing
2024-06-12 13:03:50 +08:00
hang d727703075 返回标准Id
continuous-integration/drone/push Build is passing
2024-06-12 10:56:00 +08:00
hang c49cf0ed12 修改登录逻辑
continuous-integration/drone/push Build is passing
2024-06-12 10:50:18 +08:00
hang f324d207dd 编译错误
continuous-integration/drone/push Build is passing
2024-06-12 09:50:09 +08:00
hang c9bda275f5 生成任务名称修改
continuous-integration/drone/push Build is failing
2024-06-12 09:48:07 +08:00
hang 62ed1a408d 影响筛选逻辑修改
continuous-integration/drone/push Build is passing
2024-06-12 09:13:59 +08:00
hang 25efb34f1f 增加MFA认证
continuous-integration/drone/push Build is passing
2024-06-11 17:58:06 +08:00
he eb0f13c075 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-06-07 17:59:54 +08:00
he 7ca92a7675 代码修改 2024-06-07 17:59:53 +08:00
hang e313f88bca site列表增加创建时间
continuous-integration/drone/push Build is passing
2024-06-07 15:59:08 +08:00
hang 4823eb29d5 修改bug
continuous-integration/drone/push Build is passing
2024-06-07 15:25:27 +08:00
hang 43ec332f61 修改随机阅片逻辑
continuous-integration/drone/push Build is passing
2024-06-07 15:04:41 +08:00
hang cac0652120 修改项目site 添加问题
continuous-integration/drone/push Build is passing
2024-06-07 13:55:01 +08:00
hang cc088900b6 项目中心改为分页
continuous-integration/drone/push Build is passing
2024-06-07 10:52:50 +08:00
hang 824b165723 修改site 代码
continuous-integration/drone/push Build is passing
2024-06-07 10:32:43 +08:00
hang 443b94b332 siteCode 添加
continuous-integration/drone/push Build is passing
2024-06-06 18:03:00 +08:00
hang dc116d3a6f 修改site参数不必传
continuous-integration/drone/push Build is passing
2024-06-06 17:28:06 +08:00
he bbc8859a16 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-06-06 17:20:01 +08:00
he 09e388b01a 修改 2024-06-06 17:20:01 +08:00
hang e5fcb75b9f 修改查询接口
continuous-integration/drone/push Build is failing
2024-06-06 17:15:03 +08:00
hang 8e104e133f 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
2024-06-06 16:51:25 +08:00
hang e2a77537f0 增加查询site 2024-06-06 16:51:25 +08:00
he a73a79b627 Merge 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
2024-06-06 16:37:29 +08:00
he e79c3a8f37 代码修改 2024-06-06 16:37:28 +08:00
hang ca9a2dad18 自定义添加项目Site
continuous-integration/drone/push Build is passing
2024-06-06 16:34:29 +08:00
hang cd03f5f31d 修改MIM查询
continuous-integration/drone/push Build is failing
2024-06-06 14:37:18 +08:00
hang 33e25de801 修复查询bug
continuous-integration/drone/push Build is passing
2024-06-06 14:25:10 +08:00
hang 9cd60e9575 修改部位初始化
continuous-integration/drone/push Build is passing
2024-06-06 13:48:25 +08:00
hang 4da4a4de89 x
continuous-integration/drone/push Build is passing
2024-06-06 11:03:46 +08:00
hang ec0a88a5ec 修改默认值
continuous-integration/drone/push Build is passing
2024-06-06 10:25:49 +08:00
hang a52a00e58c 增加标准查询字段
continuous-integration/drone/push Build is passing
2024-06-06 09:57:54 +08:00
hang 0a6ffbba07 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
2024-06-06 09:31:34 +08:00
hang 8cb5423b0b 添加修改 2024-06-06 09:31:33 +08:00
he 5a6411c6c3 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-06-06 09:28:23 +08:00
he b97a8b5a68 代码修改 2024-06-06 09:28:22 +08:00
hang 91794266e7 修改bug
continuous-integration/drone/push Build is running
2024-06-06 09:27:56 +08:00
hang 2f86e2dae1 修改CRO Sponsor
continuous-integration/drone/push Build is passing
2024-06-06 09:22:39 +08:00
he fb76c5af6c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-06-05 17:13:14 +08:00
he 3f6ec5b7ea 修改 2024-06-05 17:13:13 +08:00
hang c95ea8c547 修改 CRO Sponsor 部位
continuous-integration/drone/push Build is passing
2024-06-05 14:54:37 +08:00
hang facd9e0e5f 修改项目部位
continuous-integration/drone/push Build is passing
2024-06-05 13:49:22 +08:00
hang 9d0c3d3fc5 返回提示
continuous-integration/drone/push Build is passing
2024-06-05 10:28:07 +08:00
hang 907d0d39a1 取消医生,增加标准
continuous-integration/drone/push Build is passing
2024-06-05 09:48:56 +08:00
hang 4d689100ee 修改导航属性bug
continuous-integration/drone/push Build is passing
2024-06-04 16:21:06 +08:00
hang 818d9d6f62 导航属性bug
continuous-integration/drone/push Build is passing
2024-06-04 15:51:20 +08:00
hang 9a2059726f 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
2024-06-04 15:50:15 +08:00
hang 8bcac405e5 项目bodypart 以及bug 2024-06-04 15:50:14 +08:00
he 19661c5e82 修改
continuous-integration/drone/push Build is passing
2024-06-04 13:59:58 +08:00
hang 9875d9622d 修改中心
continuous-integration/drone/push Build is passing
2024-06-04 11:42:44 +08:00
hang 7573ffe941 修改nodicom 查询bug
continuous-integration/drone/push Build is passing
2024-06-03 15:51:54 +08:00
hang 47166ab2eb 修改trialsiteId
continuous-integration/drone/push Build is passing
2024-06-03 15:33:05 +08:00
hang 0295b7d919 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
2024-06-03 15:25:41 +08:00
hang 3653072497 统计数字修改 2024-06-03 15:25:41 +08:00
he 0e7f203a1b 修改
continuous-integration/drone/push Build is passing
2024-06-03 15:21:13 +08:00
he ab99265c88 Merge 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
2024-06-03 15:20:55 +08:00
he f774d95f5c 修改 2024-06-03 15:20:54 +08:00
hang 9e1e32f16d 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
2024-06-03 15:13:53 +08:00
hang 0accb453e5 上传监控bug 2024-06-03 15:13:52 +08:00
he e2b285c792 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-06-03 14:54:18 +08:00
he 935f95fa3b 代码提交 2024-06-03 14:54:15 +08:00
hang a4d20d9f08 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
2024-06-03 14:37:42 +08:00
hang 0e23719c7b 修改site关联 2024-06-03 14:37:38 +08:00
hang eb1f06658d 放开cro sponsor 和去掉国际化缓存
continuous-integration/drone/push Build is passing
2024-06-03 11:15:02 +08:00
hang 1e177a2530 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
2024-06-03 11:06:17 +08:00
hang 49031b0e48 国际化修改 2024-06-03 11:06:16 +08:00
hang ca5bbb3064 irc 邮箱验证修改
continuous-integration/drone/push Build is passing
2024-05-31 17:42:12 +08:00
hang b338188c5f 返回 SliceThickness
continuous-integration/drone/push Build is passing
2024-05-31 15:52:33 +08:00
hang 9cbe4cc36e 修改配置
continuous-integration/drone/push Build is passing
2024-05-31 14:58:00 +08:00
hang 6f5f521803 打开限制的配置
continuous-integration/drone/push Build is passing
2024-05-31 13:49:23 +08:00
hang a6db30280b 修改退出接口
continuous-integration/drone/push Build is passing
2024-05-31 13:40:03 +08:00
hang 4db3860ade 修改自动退出时间
continuous-integration/drone/push Build is passing
2024-05-31 11:11:01 +08:00
hang 57837cfe1d CRO Sponsor修改
continuous-integration/drone/push Build is passing
2024-05-31 11:03:13 +08:00
hang b51fdc5769 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
2024-05-30 14:37:39 +08:00
hang 5038d7ad53 修改上传重传bug 2024-05-30 14:37:38 +08:00
he c1d618326b Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-05-30 14:31:20 +08:00
he db1a0195fe 代码修改 2024-05-30 14:31:20 +08:00
hang 238def8089 修改判断
continuous-integration/drone/push Build is passing
2024-05-30 11:23:22 +08:00
hang 59e969c2a8 修改逻辑
continuous-integration/drone/push Build is passing
2024-05-30 11:18:05 +08:00
hang 029a288be2 修改多帧的逻辑
continuous-integration/drone/push Build is passing
2024-05-30 10:34:59 +08:00
hang 11e5448acf 用户列表修改
continuous-integration/drone/push Build is passing
2024-05-29 17:43:54 +08:00
hang 71577d0346 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
2024-05-29 16:39:15 +08:00
hang 681e559cb4 增加邮箱查询和创建时间查询 2024-05-29 16:39:15 +08:00
hang 862390ae78 增加邮箱查询条件 2024-05-29 16:39:11 +08:00
hang f210799c4d 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
2024-05-29 16:38:02 +08:00
hang d7700c3c77 添加备注 2024-05-29 16:38:01 +08:00
he 44fa4d3fc4 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-05-29 14:59:26 +08:00
he f0c57c643b 修改 2024-05-29 14:59:26 +08:00
hang 5e48ed1e23 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
2024-05-28 10:00:32 +08:00
hang a3f12b2a53 增加医生用户名 2024-05-28 10:00:31 +08:00
he cc00cce704 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-05-27 16:48:16 +08:00
he 9c244c6750 修改 2024-05-27 16:48:16 +08:00
hang ffb5d46ca3 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
2024-05-27 16:39:15 +08:00
hang 7376732b1a 项目 sponsor cro 修改 2024-05-27 16:39:14 +08:00
he 1caf4ff8e6 修改
continuous-integration/drone/push Build is passing
2024-05-27 16:11:20 +08:00
he 22147483c1 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-05-27 15:09:25 +08:00
he c7dbf7ba92 修改 2024-05-27 15:09:24 +08:00
hang fd3f76d35c 超窗导出影响列表修改
continuous-integration/drone/push Build is passing
2024-05-24 10:02:44 +08:00
hang e10bca6892 移除 Magicodes 导入excel
continuous-integration/drone/push Build is passing
2024-05-24 09:17:30 +08:00
hang 4a01960426 修改映射
continuous-integration/drone/push Build is passing
2024-05-23 17:22:58 +08:00
hang 318364e70b 修改nuget 包
continuous-integration/drone/push Build is passing
2024-05-23 17:10:38 +08:00
hang 383064a7b7 重传监控
continuous-integration/drone/push Build is passing
2024-05-23 16:02:00 +08:00
hang 78bbfb5f41 一致性核查通过自动关闭质疑
continuous-integration/drone/push Build is passing
2024-05-23 11:15:45 +08:00
hang 9aec1f5f50 修改一致性核查导表
continuous-integration/drone/push Build is passing
2024-05-23 09:12:40 +08:00
hang 66beb43daf 修改邮箱正则
continuous-integration/drone/push Build is passing
2024-05-23 09:03:19 +08:00
hang b02589a957 修改正则
continuous-integration/drone/push Build is passing
2024-05-22 17:49:45 +08:00
hang d4a1d83851 临床数据维护
continuous-integration/drone/push Build is passing
2024-05-22 17:39:52 +08:00
hang 53aee1020d 去掉siteId
continuous-integration/drone/push Build is passing
2024-05-22 13:45:28 +08:00
hang 010c106879 增加删除接口
continuous-integration/drone/push Build is passing
2024-05-22 11:22:15 +08:00
hang fb43e38c7d 测试删除属性
continuous-integration/drone/push Build is passing
2024-05-22 10:34:06 +08:00
hang ca96c67e96 修改多帧接口
continuous-integration/drone/push Build is passing
2024-05-22 10:06:38 +08:00
hang 1fbf635582 增加返回instance 信息
continuous-integration/drone/push Build is passing
2024-05-21 16:00:48 +08:00
hang 44d62b187f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-05-21 14:29:15 +08:00
hang 57600cbad1 IR上传接口修改 2024-05-21 14:29:13 +08:00
he 311d6507ce 修改 2024-05-21 14:11:50 +08:00
he 8e520ce579 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-05-21 13:53:40 +08:00
he 5a97e15885 代码修改 2024-05-21 13:53:33 +08:00
hang bb36c67159 修改上传列表 2024-05-21 11:01:23 +08:00
hang 7a33edc7a6 修改上传监控导航属性bug
continuous-integration/drone/push Build is passing
2024-05-20 13:38:16 +08:00
hang a7d6303da4 处理返回的信息
continuous-integration/drone/push Build is passing
2024-05-17 16:58:01 +08:00
hang 704c201c33 修改逻辑
continuous-integration/drone/push Build is passing
2024-05-17 16:52:52 +08:00
hang c69d3eec36 修改展示
continuous-integration/drone/push Build is passing
2024-05-17 16:27:45 +08:00
hang 6e5a3a0078 修改下载展示列表
continuous-integration/drone/push Build is running
2024-05-17 15:21:06 +08:00
hang ed62de9135 修改bug
continuous-integration/drone/push Build is passing
2024-05-17 14:53:11 +08:00
hang a8b218ce95 多帧修改2
continuous-integration/drone/push Build is passing
2024-05-17 14:40:55 +08:00
hang f6d2b1e7f1 增加新的影像归档检查表
continuous-integration/drone/push Build is passing
2024-05-17 14:14:51 +08:00
hang 85439213b2 增加打包状态 crc列表增加字段,影像下载打包迁移
continuous-integration/drone/push Build is passing
2024-05-17 10:51:30 +08:00
hang 2933d100f7 标准增加字段
continuous-integration/drone/push Build is passing
2024-05-17 09:56:19 +08:00
hang ac799688d3 增加多帧展示字段
continuous-integration/drone/push Build is passing
2024-05-17 09:38:46 +08:00
hang a4b9c44cfa 多帧配合玲姐修改模块1
continuous-integration/drone/push Build is passing
2024-05-17 09:16:07 +08:00
hang af282d2bb8 自定义标准扩充字段
continuous-integration/drone/push Build is passing
2024-05-17 09:01:29 +08:00
hang a93bbebb61 无序修改字段类型
continuous-integration/drone/push Build is passing
2024-05-16 14:54:34 +08:00
hang 4552a24caa 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
2024-05-16 14:16:58 +08:00
hang fc22ec0672 修改保存bug 2024-05-16 14:16:57 +08:00
he 963fbcb5e8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8
continuous-integration/drone/push Build is passing
2024-05-16 13:59:12 +08:00
he 3da3b9de45 修改 2024-05-16 13:59:11 +08:00
hang a055d1c668 阅片单元配置修改
continuous-integration/drone/push Build is passing
2024-05-16 10:40:47 +08:00
hang 0b130bbc01 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
2024-05-16 10:13:04 +08:00
hang 9f9bc9c747 稽查搜索条件修改 2024-05-16 10:13:03 +08:00
he 75367ae727 修改
continuous-integration/drone/push Build is passing
2024-05-16 09:49:48 +08:00
hang bd9d78622f 增加搜索条件
continuous-integration/drone/push Build is passing
2024-05-15 16:35:57 +08:00
hang 6b807f419b 修改项目中心查询,文档查询
continuous-integration/drone/push Build is passing
2024-05-15 16:17:17 +08:00
hang f58ee6f63a 医学审核搜索条件增加
continuous-integration/drone/push Build is passing
2024-05-15 14:43:50 +08:00
hang 7510d86a52 修改医学审核bug
continuous-integration/drone/push Build is passing
2024-05-15 14:24:09 +08:00
hang 65fba6ca41 重阅跟踪修改
continuous-integration/drone/push Build is passing
2024-05-15 11:17:35 +08:00
hang 3e2198b7ba 日志查看时间
continuous-integration/drone/push Build is passing
2024-05-15 10:51:27 +08:00
hang 535c0fc419 阅片界面调整-查询条件
continuous-integration/drone/push Build is passing
2024-05-15 09:42:48 +08:00
hang 1c5d30b673 王总界面优化 新增查询条件以及列
continuous-integration/drone/push Build is passing
2024-05-14 16:02:00 +08:00
hang 3bf26dbbef 修改查询
continuous-integration/drone/push Build is passing
2024-05-14 15:01:18 +08:00
hang 329437411d 增加项目用户接口
continuous-integration/drone/push Build is passing
2024-05-14 14:38:35 +08:00
hang 090cdaf2e4 日志增加区域
continuous-integration/drone/push Build is passing
2024-05-14 14:29:38 +08:00
hang 7c257f261c x
continuous-integration/drone/push Build is passing
2024-05-14 14:19:17 +08:00
hang 477bc7baf7 日志格式测试
continuous-integration/drone/push Build is passing
2024-05-14 14:16:49 +08:00
hang 32d6ebef9c 日志修改
continuous-integration/drone/push Build is passing
2024-05-14 10:25:05 +08:00
he 51e0676ce5 修改
continuous-integration/drone/push Build is passing
2024-05-10 17:24:36 +08:00
he 53156e210f 修改
continuous-integration/drone/push Build is passing
2024-05-10 13:44:48 +08:00
he 84f76c09f7 修改
continuous-integration/drone/push Build is passing
2024-05-10 13:36:37 +08:00
he 74e0765d7a 修改 2024-05-10 13:20:04 +08:00
he 51cfadbc77 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-05-10 13:19:25 +08:00
he 01e047f639 问题修改 2024-05-10 13:19:24 +08:00
hang 4050d7e4a3 修改肿瘤学有序阅片 2024-05-10 10:26:56 +08:00
he adab66172d 修改
continuous-integration/drone/push Build is passing
2024-05-09 16:21:16 +08:00
hang 7c850c969e 修改 错误用户名也展示在项目日志
continuous-integration/drone/push Build is passing
2024-05-08 14:26:14 +08:00
he f55fa98dec 修改
continuous-integration/drone/push Build is passing
2024-05-07 14:45:32 +08:00
hang 7f28c984e1 修改打包配置
continuous-integration/drone/push Build is running
2024-05-06 13:40:05 +08:00
hang 6220e53d8f 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
2024-05-06 13:13:39 +08:00
hang 5bb0231354 服务器更换,地址修改 2024-05-06 13:13:38 +08:00
XCKJ 58eec48af7 添加 README.md
continuous-integration/drone/push Build is passing
2024-05-02 12:18:54 +00:00
he 65545dd3e5 修改
continuous-integration/drone/push Build is passing
2024-04-29 15:09:32 +08:00
he 5b92015c98 修改
continuous-integration/drone/push Build is passing
2024-04-29 15:07:29 +08:00
he 64c97b22d5 测试发布
continuous-integration/drone/push Build is passing
2024-04-29 14:43:46 +08:00
he 87adbe9bed 修改
continuous-integration/drone/push Build is pending
2024-04-29 14:43:10 +08:00
he c6ed8b8318 修改
continuous-integration/drone/push Build is passing
2024-04-29 14:39:52 +08:00
he 4d2890976a 修改
continuous-integration/drone/push Build is passing
2024-04-29 13:08:44 +08:00
hang 9cfddf1327 修改打包配置
continuous-integration/drone/push Build is passing
2024-04-29 09:56:00 +08:00
hang 84203d5aa2 修改bug
continuous-integration/drone/push Build encountered an error
2024-04-28 17:50:53 +08:00
hang 4d19fffc5f 修改bug 2024-04-28 17:42:13 +08:00
hang 18683390b7 修改颜色 2024-04-28 17:15:30 +08:00
hang fb137ae840 修改IRC 3个bug 2024-04-28 17:07:59 +08:00
hang c8bc0c4a32 修改中心调研邮件 2024-04-28 13:38:26 +08:00
hang 8ded82fa81 修改统计查询 2024-04-26 15:12:51 +08:00
hang acd1f47f4a IRC 统计数据bug 2024-04-26 14:41:06 +08:00
he 054827bbae 修改 2024-04-25 16:42:44 +08:00
he a5ebe97dc5 问题修改 2024-04-25 14:40:20 +08:00
he 02b2d8f754 问题修改 2024-04-25 13:39:28 +08:00
he cf5da8f55a 修改 2024-04-25 13:22:08 +08:00
he 40947de05a 修改 2024-04-25 13:14:31 +08:00
he 662648691d 修改 2024-04-25 11:48:11 +08:00
he 29836a9c62 修改 2024-04-24 11:19:33 +08:00
he a2b1a0d64b 修改 2024-04-24 11:13:24 +08:00
hang 87fbd2cb59 IRC 没有这个问题 2024-04-22 17:27:07 +08:00
hang c91e21c23a 修改检查获取序列列表 2024-04-22 17:19:47 +08:00
hang 0f25c7db0e 修改排序 2024-04-19 16:10:18 +08:00
hang e5b5cbb8d8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-19 15:08:36 +08:00
hang 9c1af1b8dc 修改排序 2024-04-19 15:08:36 +08:00
he 0da09da45e 问题修复 2024-04-19 13:01:05 +08:00
he 87aaefadf6 修改 2024-04-19 09:21:34 +08:00
he b5b739a5cb 修改 2024-04-18 18:01:09 +08:00
he 1315d5dc29 修改 2024-04-18 17:25:29 +08:00
he 72b70f5311 修改 2024-04-18 17:24:54 +08:00
he fd15a62148 修改 2024-04-18 16:55:25 +08:00
he e9bd625195 修改 2024-04-18 16:52:04 +08:00
he c37fcf588c 问题修改 2024-04-18 16:43:02 +08:00
he 3f8d5027c8 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-18 11:45:10 +08:00
he 972fc32eeb 代码修改 2024-04-18 11:45:08 +08:00
hang 1ba9efe894 修改退出逻辑 2024-04-17 12:26:56 +08:00
hang f85ac8a813 修改状态码 2024-04-17 12:23:38 +08:00
hang 7bf097c127 修改 自动退出用户 2024-04-17 12:20:01 +08:00
hang fc579d9cf4 修改发布参数 2024-04-17 11:35:30 +08:00
hang b1c0933428 x 2024-04-17 11:22:04 +08:00
hang bd7dd906fb Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-17 11:21:07 +08:00
hang 3a8e400f33 编译错误 2024-04-17 11:21:06 +08:00
hang c6dd323b80 编译错误 2024-04-17 11:19:11 +08:00
hang dfb45d8391 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-16 18:00:52 +08:00
hang 0b0df00525 自动退出逻辑测试 2024-04-16 18:00:51 +08:00
he 96fc5ae78c Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-16 17:38:57 +08:00
he a4b2d68995 代码修改 2024-04-16 17:38:57 +08:00
hang 70ababc2d9 自动退出登录 2024-04-16 17:36:48 +08:00
he e57887eba5 问题修改 2024-04-16 14:00:46 +08:00
he aef7fded18 修改 2024-04-16 09:57:54 +08:00
he e0613c1f2d 问题修改 2024-04-15 15:54:46 +08:00
he f6d323cc31 修改 2024-04-15 15:18:01 +08:00
he aa85562076 Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-15 15:14:29 +08:00
he 0165688799 问题修改 2024-04-15 15:14:27 +08:00
hang c2aefebedc 修改排序和标准确认生成任务 2024-04-15 11:19:31 +08:00
hang 1c5e4454da Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-15 10:29:00 +08:00
hang 65e2a45d74 增加查询条件 2024-04-15 10:28:59 +08:00
he 99026d6483 脾脏状态修改 2024-04-15 10:13:33 +08:00
he 9190783ac4 修改 2024-04-12 16:45:39 +08:00
he ae8f50dc14 修改 2024-04-12 16:36:34 +08:00
he 2a51de03b7 稽查修改 2024-04-12 16:03:30 +08:00
he 2be9daa443 修改 2024-04-12 15:57:06 +08:00
he 2778b3ea7b 修改 2024-04-12 15:43:54 +08:00
he 4cedb9dbcb 修改 2024-04-12 15:42:49 +08:00
he ed6a6fb844 问题修改 2024-04-12 15:39:43 +08:00
he 8daf02246e Merge branch 'Test_IRC_Net8' of https://gitea.frp.extimaging.com/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-12 14:47:17 +08:00
he b3178e6f8d 修改 2024-04-12 14:47:16 +08:00
hang 00cbde90c7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-12 10:36:20 +08:00
hang 938175c49f 附加评估查询修改 2024-04-12 10:36:19 +08:00
he 146fc916d1 修改 2024-04-12 10:31:23 +08:00
he 87776513fb 修改 2024-04-11 16:30:45 +08:00
he 60d462e5f9 修改 2024-04-11 16:28:23 +08:00
he b39d8dd546 修改 2024-04-11 13:36:10 +08:00
he b65635c41c 修改 2024-04-11 11:41:23 +08:00
he fe2539afba 修改 2024-04-11 11:09:53 +08:00
he d2ff216396 修改 2024-04-11 11:08:34 +08:00
he 4c05da8335 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-11 10:41:14 +08:00
he 6061cf5d93 自动计算触发 2024-04-11 10:41:13 +08:00
hang d313b7d8a6 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-10 14:54:34 +08:00
hang 71c21ccc00 修改中心调研bug 需要迁移 2024-04-10 14:54:33 +08:00
he f415c03daa Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-10 14:54:27 +08:00
he 2bfef364ec 备注 2024-04-10 14:54:24 +08:00
helongjun c822d20d0d 计算条件补充说明 2024-04-10 14:46:28 +08:00
hang 3a996212ed Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-09 16:06:03 +08:00
hang 5a3b6a5f93 中心调研,公司名bug 修改 2024-04-09 16:06:02 +08:00
he 3f7227ce32 修改 2024-04-09 10:31:45 +08:00
he af0df80874 修改 2024-04-08 17:44:12 +08:00
he a163d8a785 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-08 17:36:02 +08:00
he 70fbf8d352 修改 2024-04-08 17:36:02 +08:00
hang d9a8692be8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-08 17:30:40 +08:00
hang 56fb9c14d1 稽查排序修改,需要迁移 2024-04-08 17:30:39 +08:00
he 8bc0cee81f 修改 2024-04-08 17:25:08 +08:00
he dc86767184 修改 2024-04-08 14:45:58 +08:00
he e1383445e2 修改 2024-04-08 14:45:39 +08:00
he 0a30107859 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-08 13:44:58 +08:00
he ba27925409 添加病灶编号 2024-04-08 13:44:57 +08:00
hang 3a52021cdc 修改导表查询 2024-04-08 13:29:37 +08:00
hang aba4fc70c2 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-08 11:16:55 +08:00
hang 5b89343192 修改导表 2024-04-08 11:16:55 +08:00
he 20f9e90a69 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-08 11:12:40 +08:00
he 5c58171ac3 代码修改 2024-04-08 11:12:38 +08:00
hang e98d80eea6 修改导表错误 2024-04-08 11:02:35 +08:00
hang c14d5be4ac x 2024-04-07 17:39:29 +08:00
hang fea108371f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-07 16:17:42 +08:00
hang dd47bf05f8 修改一致性分析 2024-04-07 16:17:41 +08:00
he 3a160c1913 iRECIST新病灶评估 修改 2024-04-07 15:41:55 +08:00
he c42c26d76a 临床数据不完备提示 2024-04-07 14:54:41 +08:00
he f7117563f7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-07 14:32:59 +08:00
he 39968194b1 问题修改 2024-04-07 14:32:58 +08:00
hang 0d5f7e5673 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-04-07 14:30:44 +08:00
hang 7f4e111f7d 修改导表bug 2024-04-07 14:30:43 +08:00
he 0c92fcb011 修改 2024-04-07 13:20:44 +08:00
hang 2f4418e3ed 修改查询 2024-04-01 17:50:39 +08:00
hang 75a3d7c80f 修改查询条件 2024-04-01 11:32:59 +08:00
hang 4605053e50 x 2024-04-01 11:14:17 +08:00
hang a8da0c0b55 修改展示样式,修改排序,增加查询条件 2024-04-01 11:02:21 +08:00
he ba984f9263 修改 2024-03-29 14:29:44 +08:00
he 451a311142 修改 2024-03-29 14:23:21 +08:00
he f86bc219cf 修改 2024-03-29 13:31:01 +08:00
he 06bd63b6d1 修改 2024-03-29 13:29:29 +08:00
he be088d8ba2 修改 2024-03-29 13:24:57 +08:00
he c718ec8446 修改 2024-03-28 10:45:43 +08:00
he 668e1019f0 修改 2024-03-28 10:39:52 +08:00
he e2f5a7fae1 修改 2024-03-27 13:29:58 +08:00
he f1a141c018 修改 2024-03-27 11:08:31 +08:00
he 30a0f428bc 修改 2024-03-26 16:04:03 +08:00
he 7a8346621d 修改 2024-03-26 15:53:28 +08:00
he 6d93054d3d Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-26 15:13:14 +08:00
he 5c53e78aca 修改 2024-03-26 15:13:13 +08:00
hang 1eeb832b0e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-26 15:05:45 +08:00
hang c8db9431b2 去除 未生效任务状态 2024-03-26 15:05:44 +08:00
he ce8e0e3972 修改 2024-03-26 14:57:06 +08:00
he ed4192838d Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-25 17:52:54 +08:00
he d900c368e2 修改 2024-03-25 17:52:54 +08:00
hang 6926bb877c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-25 15:27:54 +08:00
hang cb9b54a089 邮件title 重复 2024-03-25 15:27:53 +08:00
he 57c5d14f5a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-25 14:57:01 +08:00
he 4f19d1638d 修改 2024-03-25 14:57:00 +08:00
hang ace39a7f94 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-25 13:09:44 +08:00
hang e8e0540cc2 返回modalitys 2024-03-25 13:09:43 +08:00
he a98799daaf 修改 2024-03-25 10:46:20 +08:00
he f2b53cd359 修改 2024-03-25 10:42:09 +08:00
he 960f479b91 修改 2024-03-25 09:30:12 +08:00
he d6dacb93dd 修改 2024-03-22 15:22:49 +08:00
he 8823656231 修改 2024-03-22 15:22:09 +08:00
he 2c859e7186 修改 2024-03-22 15:11:41 +08:00
he 99828dd82e 修改 2024-03-22 13:51:55 +08:00
he 855242e6fe 修改 2024-03-22 13:01:26 +08:00
he 90a1a920fa 修改 2024-03-22 11:08:08 +08:00
he c73968f490 修改 2024-03-21 16:22:43 +08:00
he 282368b9e0 修改 2024-03-21 16:18:42 +08:00
he 726a2be71e 修改 2024-03-21 14:07:04 +08:00
he 510104d0ff 需改 2024-03-21 13:26:46 +08:00
he 12318937f4 修改 2024-03-21 11:37:01 +08:00
he 8f17d4b110 修改还 2024-03-21 11:29:16 +08:00
he 18496246b2 修改 2024-03-21 11:22:04 +08:00
he 55f60e897a 修改 2024-03-21 10:49:24 +08:00
he dd2d142340 问题修复 2024-03-21 09:55:32 +08:00
he 49a0cf3ece 修改 2024-03-20 17:08:26 +08:00
he f0d4a1c075 修改 2024-03-20 16:41:03 +08:00
he 5e6db93250 修改 2024-03-20 16:03:57 +08:00
he 12adf2f3a9 修改 2024-03-20 15:56:40 +08:00
he b08908b1dc 修改 2024-03-20 15:12:05 +08:00
he 8f08746377 修改 2024-03-20 13:16:35 +08:00
he 045e9346ad Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-20 10:20:01 +08:00
he 864ab17ff3 疾病进展计算 2024-03-20 10:20:00 +08:00
hang 700d111011 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-20 10:17:08 +08:00
hang 7168d68997 清理缓存 2024-03-20 10:17:06 +08:00
he 40ec535e8a 修改 2024-03-20 10:02:04 +08:00
he 4dfaf29f3d 修改 2024-03-20 09:39:21 +08:00
he 702cd361fe 修改 2024-03-19 17:34:07 +08:00
he b776103328 添加获取Series信息 2024-03-19 16:43:02 +08:00
he 381e7b5046 修改 2024-03-19 16:04:29 +08:00
he ebdec8dd62 修改 2024-03-19 15:39:55 +08:00
he 6677f2a01e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-19 14:56:52 +08:00
he 5aaa9043ff 修改 2024-03-19 14:56:52 +08:00
hang 48874adda3 升级nuget 2024-03-19 14:47:58 +08:00
he 0cf5a88d63 修改 2024-03-19 11:43:03 +08:00
he 4b92874ca6 修改 2024-03-19 11:33:34 +08:00
he 2d81b05fba 修改 2024-03-19 11:25:47 +08:00
he 78756aa2f4 获取PT CT 序列 2024-03-19 11:18:58 +08:00
he a15c91ebcb 修改 2024-03-19 10:05:46 +08:00
he 4b389c8293 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-19 09:51:02 +08:00
he 2313b5e907 修改 2024-03-19 09:51:01 +08:00
hang e22941d947 注释服务 2024-03-19 09:13:15 +08:00
hang 3efc173056 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-19 08:58:46 +08:00
hang 6389919cfd 归档预处理1 2024-03-19 08:58:45 +08:00
he 984b840fa7 修改 2024-03-18 18:01:23 +08:00
he 2bf01fbf0c 报告修改 2024-03-18 14:12:13 +08:00
he 116eeb753d 修改 2024-03-18 13:57:08 +08:00
he 82a6237323 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-18 13:39:53 +08:00
he 6220a96666 修改 2024-03-18 13:39:53 +08:00
hang 259ab2c569 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-18 13:06:12 +08:00
hang efda4e0fdd 增加site下拉返回属性 2024-03-18 13:06:11 +08:00
he 968264fe9a 修改 2024-03-18 10:44:53 +08:00
he 57911cf567 修改 2024-03-18 10:32:42 +08:00
he a61d9ae4d1 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-15 10:30:29 +08:00
he 5735383cd7 查询既往信息 2024-03-15 10:30:27 +08:00
hang e3607895b4 修改study 列表 排序 2024-03-14 17:10:25 +08:00
hang 16a2e0b53f 修改site user 时间 2024-03-14 16:36:17 +08:00
hang 41e5f9fd78 修改时区 修改时间 2024-03-14 15:59:13 +08:00
hang 64b750b06e 修改多时区问题解决 2024-03-14 14:18:16 +08:00
hang ca90736366 修改时区问题 2024-03-14 13:48:27 +08:00
hang 664b308e31 暂时屏蔽时区 2024-03-14 13:25:51 +08:00
hang 8de0671d31 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-14 10:37:22 +08:00
hang 19d7192842 修改访视 2024-03-14 10:37:21 +08:00
he c3ed54f05f 修改 2024-03-14 10:19:39 +08:00
he ef6655a014 修改验证 2024-03-14 10:14:09 +08:00
he 234e549b22 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-14 09:31:44 +08:00
he 903f72989a 查询修改 2024-03-14 09:31:43 +08:00
hang 3e9900cc45 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-13 17:42:40 +08:00
hang 78d0cffd3d 分配阅片人查询,增加查询条件 2024-03-13 17:42:40 +08:00
he 658e8d983c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-13 16:31:22 +08:00
he 8174237a82 修改 2024-03-13 16:31:22 +08:00
hang 39a5e8eade 增加efcore 官方批量更新 2024-03-13 16:13:24 +08:00
hang 54dea66f5f 修改一致性分析提示 2024-03-13 16:12:56 +08:00
hang 86fd9ddc0e 修改规则 2024-03-13 15:57:18 +08:00
hang b071d1126b Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-13 15:37:09 +08:00
hang 139e9daec0 修改一致性分析限制 2024-03-13 15:37:09 +08:00
he 4eeda2b3e7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-13 13:45:20 +08:00
he fa64b42a84 既往图片 2024-03-13 13:45:19 +08:00
hang ce67f4828f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-13 13:24:14 +08:00
hang 87e3d953d3 oss私有读预提交 2024-03-13 13:24:14 +08:00
he 5d4668eaee Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-13 10:12:04 +08:00
he cfce8dba1f 计算CTMRI 总体评估 2024-03-13 10:12:03 +08:00
hang c11e319472 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-12 15:37:16 +08:00
hang 7c7a0cd20b 修改统计数字bug 2024-03-12 15:37:15 +08:00
he a66bb42126 病灶融合修改 2024-03-12 15:15:00 +08:00
he 7d63f3f5cb 修改 2024-03-12 14:31:56 +08:00
he b102d23477 代码修改 2024-03-12 14:30:43 +08:00
he e19c03412d 分组修改 2024-03-12 14:13:26 +08:00
he 56cba570bf Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-12 14:05:15 +08:00
he c7abcc153e 查询修改 2024-03-12 14:05:14 +08:00
hang 967a77f371 修改项目文档查询 2024-03-12 13:52:00 +08:00
hang 2060f2c62e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-12 13:28:38 +08:00
hang 193c107539 增加项目编号 2024-03-12 13:28:37 +08:00
he 2fe0851786 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-12 13:25:46 +08:00
he 46b68ca2c9 添加默认医学审核问题修改 2024-03-12 13:25:45 +08:00
hang 396797dc0c 修改查询 2024-03-12 11:47:21 +08:00
hang 5579f543de 修改统计 2024-03-12 11:41:18 +08:00
hang ce31ab3097 修改文档查询 2024-03-12 10:05:04 +08:00
hang daa4764aac Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-12 09:32:03 +08:00
hang a24c6775e8 测试 dicom 注入服务 2024-03-12 09:32:01 +08:00
he eb9de1769e 问题修改 2024-03-11 17:58:53 +08:00
he d675cc50b3 修改 2024-03-11 16:29:42 +08:00
he 350d089c39 修改 2024-03-11 16:18:01 +08:00
he 116969f4f2 修改 2024-03-11 16:03:02 +08:00
he 112d9f9a63 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-11 15:59:42 +08:00
he 5dae9c5d06 代码修改 2024-03-11 15:59:42 +08:00
hang c0a63ecfed Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-11 15:56:25 +08:00
hang 881a5320a8 废弃之前的接口,增加统计 2024-03-11 15:56:25 +08:00
he 22a254890e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-11 15:55:42 +08:00
he 0912909b68 修改 2024-03-11 15:55:41 +08:00
hang cd7318dd63 增加统计字段 2024-03-11 15:45:12 +08:00
hang 21cc610095 工作台,增加我的已签署系统、项目文件 2024-03-11 15:36:43 +08:00
hang cc8151caf8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-11 15:10:38 +08:00
hang 8cce399430 增加c-store-scp 2024-03-11 15:10:37 +08:00
he 99688df446 修改 2024-03-11 14:53:21 +08:00
he de0a278cac 修改 2024-03-11 14:39:27 +08:00
he 7031ea1a04 修改 2024-03-11 14:26:46 +08:00
he 541455a08b x修改 2024-03-11 14:25:53 +08:00
he 814efc4e35 修改排序 2024-03-11 14:20:38 +08:00
he f85bbc41c4 计算修改 2024-03-11 13:23:45 +08:00
he c00e8eb809 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-11 09:32:28 +08:00
he 9dd00170af 修改 2024-03-11 09:32:25 +08:00
hang fdba16de86 修改用户类型排序 2024-03-08 16:05:52 +08:00
hang 38f319b425 修改访视计划默认值 2024-03-08 15:36:10 +08:00
hang d35046b277 修改国际化 2024-03-08 14:45:13 +08:00
hang bdcaf2f2be 修改邮件 2024-03-08 14:01:38 +08:00
hang bba622da0e 邮件修改 2024-03-08 13:46:20 +08:00
hang 0d4f694fcf Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-08 13:37:22 +08:00
hang a41824414e 修改邮件 2024-03-08 13:37:21 +08:00
he c54b0abbd7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-08 13:14:17 +08:00
he d772ea527a 计算修改 2024-03-08 13:14:15 +08:00
helongjun 62b76220d4 更新邮件模板 2024-03-08 12:51:11 +08:00
he 6aa8628c0c 修改 2024-03-08 11:49:25 +08:00
he 7d9f4864d0 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-08 11:32:11 +08:00
he d149d5a5d5 脾脏状态 2024-03-08 11:32:10 +08:00
hang 7572bf9fb0 [医学审核统计修改2] 2024-03-08 11:03:03 +08:00
hang 40ab925a4e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-08 10:30:35 +08:00
hang 75a989b4f1 修改医学审核bug 2024-03-08 10:30:34 +08:00
he f98f89a51d 肿瘤学重复生成 2024-03-08 10:15:02 +08:00
he 423ea4bc6f 计算修改 2024-03-08 10:03:24 +08:00
he 3c60dd9ae8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-08 09:58:47 +08:00
he f9006be79b 靶病灶计算修改
疾病进展计算修改
2024-03-08 09:58:47 +08:00
hang 0492563838 修改医院 site 2024-03-08 09:21:46 +08:00
hang d58089b9ee Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-07 17:18:05 +08:00
hang e17a33a16f 删除 临床数据统计 2024-03-07 17:18:01 +08:00
he c935599fcf 代码修改 2024-03-07 15:00:04 +08:00
he efafdc50b8 医学审核问题修改 2024-03-07 13:26:19 +08:00
he 8846c1d728 修改 2024-03-07 13:02:41 +08:00
he 9bfd89cb9b 计算修改 2024-03-07 10:25:05 +08:00
he 35f01818dd Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-07 10:01:07 +08:00
he 875af7e9f7 医学审核问题修改 2024-03-07 10:01:07 +08:00
hang 7dfce2db55 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-07 09:36:49 +08:00
hang cab5772068 x 2024-03-07 09:36:49 +08:00
he 6319f1e82d 添加截止访视 2024-03-07 09:32:12 +08:00
hang d42c8477aa 自动生成增加验证逻辑 2024-03-07 09:26:48 +08:00
he b559a7882b 阅片标准修复 2024-03-07 09:25:22 +08:00
he 30e1d70099 基线摄取值修改 2024-03-06 17:50:26 +08:00
he 84a8d18519 插入问题修复 2024-03-06 17:20:38 +08:00
he 1fc20e5640 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-06 17:11:10 +08:00
he d8f0fba8e2 修改 2024-03-06 17:11:09 +08:00
hang 2921404540 x 2024-03-06 17:08:32 +08:00
hang df79b7b57b 删除参数 2024-03-06 17:00:43 +08:00
hang 0a45638bac 修改规则 2024-03-06 16:31:11 +08:00
hang 4f725af6cd 修改一致性分析 2024-03-06 15:55:37 +08:00
hang 44ae7bde56 一致性分析修改 2024-03-06 14:08:51 +08:00
hang cd5e0405de 一致性分析修改 2024-03-06 14:02:37 +08:00
hang 5bbf2d3c82 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-06 13:47:54 +08:00
hang 09743f7153 修改更新接口 2024-03-06 13:47:54 +08:00
he f88ef2f3fc lugano修改 2024-03-05 18:05:08 +08:00
he ef032b548e 验证修改 2024-03-05 17:13:38 +08:00
he db2f3cc85a 修改 2024-03-05 14:57:16 +08:00
he 7584f4a5b4 修改 2024-03-05 14:53:23 +08:00
he aac559e221 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-05 14:49:55 +08:00
he aee5c17591 医学审核修改 2024-03-05 14:49:54 +08:00
hang d8248a7973 项目VitrualSiteCode 给默认值 2024-03-05 14:40:39 +08:00
hang b68d060f85 一致性分析规则 列表增加配置信息 2024-03-05 11:43:16 +08:00
hang 74399df5eb 修改一致性分析 2024-03-05 09:06:40 +08:00
hang c3b62137d8 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-04 16:36:18 +08:00
hang 352bd23766 修改统计命名 2024-03-04 16:36:18 +08:00
he 398344854b Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-04 16:01:17 +08:00
he e181c3cc82 医学审核问题配置 2024-03-04 16:01:16 +08:00
hang 24e4008b72 修改统计 2024-03-04 16:00:16 +08:00
hang 50d9ed7e3c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-04 15:47:51 +08:00
hang 9fd113c95f 修改统计 2024-03-04 15:47:50 +08:00
he 5683ced93d 删除也计算病灶状态 2024-03-04 14:31:44 +08:00
he 4360f4b2cb 计算修改 2024-03-04 14:19:43 +08:00
he 43a873defd Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-04 14:11:18 +08:00
he e5d08cdb3e 医生审核问题一件添加 2024-03-04 14:11:18 +08:00
hang c78b80c679 找回密码禁用没有启用的账户 2024-03-04 11:47:14 +08:00
hang 9cd3ba1c67 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-04 10:06:39 +08:00
hang dd22b206dc spm 统计修改 2024-03-04 10:06:38 +08:00
he 12b668642c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-01 16:04:36 +08:00
he 77fa881d69 临床数据修改 2024-03-01 16:04:35 +08:00
hang 05dcbfed2e Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-01 16:00:42 +08:00
hang 6471041fad [项目site code 一致性分析验证] 2024-03-01 16:00:40 +08:00
he 69ab56f878 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-01 15:55:23 +08:00
he 97538333c0 临床数据修改 2024-03-01 15:55:22 +08:00
hang a094e1a2b7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-01 14:08:27 +08:00
hang d0c8df1452 【入组增加一致性分析切换按钮】 2024-03-01 14:08:27 +08:00
he 1b6a31e626 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-01 14:07:44 +08:00
he 2c1cde9f69 x修改临床数据 2024-03-01 14:07:43 +08:00
hang 1aa5e45694 修改模型 2024-03-01 13:34:37 +08:00
hang 9fc04193c7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-01 12:17:38 +08:00
hang b685b9fa13 修改统计列表 2024-03-01 12:17:37 +08:00
he 59f97d0c2d Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-01 11:46:51 +08:00
he 8f94460537 计算修改 2024-03-01 11:46:50 +08:00
hang 26fe947991 修改签署文档统计 2024-03-01 09:24:58 +08:00
hang 16829f9075 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-03-01 09:16:11 +08:00
hang 246314561b 修改面板统计 2024-03-01 09:16:10 +08:00
he 331a3c4178 肿瘤学阅片 2024-02-29 18:12:45 +08:00
he 35ba7861d1 肿瘤学修改 2024-02-29 17:20:17 +08:00
he 59cb66331e 肿瘤学阅片修改 2024-02-29 17:03:55 +08:00
he 782bfaa6c4 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-29 16:09:25 +08:00
he 830af4a164 临床数据修改 2024-02-29 16:09:25 +08:00
hang 994cb73104 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-29 16:08:40 +08:00
hang 8e3dc73408 [一致性分析预提交] 2024-02-29 16:08:39 +08:00
he 6792f9e916 临床数据修改 2024-02-29 16:03:28 +08:00
he a350c35f49 融合修改 2024-02-29 14:12:02 +08:00
he fb498b3723 肿瘤学阅片修改 2024-02-29 14:06:17 +08:00
he 7b9c90b77c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-29 14:01:04 +08:00
he f4fd16d8fd 验证检查类型临床数据修改 2024-02-29 14:01:04 +08:00
hang 5656e66c28 [增加其他角色统计-2] 2024-02-29 10:37:31 +08:00
hang 39882e43ce [增加其他角色统计 1] 2024-02-29 09:49:59 +08:00
he e5f2d1cde9 代码提交 2024-02-28 15:15:33 +08:00
he 4f978863e4 分裂修改 2024-02-28 14:52:49 +08:00
he f26aafa8cb 肿瘤学修改 2024-02-28 10:47:39 +08:00
he e444354cf7 分列修改 2024-02-28 10:27:11 +08:00
he 0e4ae72016 肿瘤学阅片修改 2024-02-28 10:15:10 +08:00
he c1121a2d3f Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-28 09:43:19 +08:00
he 1737825506 肿瘤学阅片 2024-02-28 09:43:18 +08:00
hang 437c569617 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-27 17:27:06 +08:00
hang 9580d77512 [修改IR 医学审核统计] 2024-02-27 17:27:05 +08:00
he f7fb89313c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-27 17:26:18 +08:00
he 721a7d2341 全局阅片修改 2024-02-27 17:26:17 +08:00
hang 3529ab6cb6 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-27 15:52:41 +08:00
hang 484bb3ca5b [保证统计,都有TrialId] 2024-02-27 15:52:40 +08:00
he 121b2d5df1 修改 2024-02-27 15:32:10 +08:00
he 472887d627 肿瘤学修改 2024-02-27 15:19:30 +08:00
he 03f514d5fe 肿瘤学修改 2024-02-27 15:05:32 +08:00
he 36d2203e4c Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-27 14:44:58 +08:00
he 4e11cc7db3 重置阅片标准 2024-02-27 14:44:58 +08:00
hang f23963896d 【项目签名文档限制】 2024-02-27 14:17:46 +08:00
he fd2b13b391 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-27 14:17:01 +08:00
he b90743ded1 肿瘤学修改 2024-02-27 14:16:59 +08:00
hang ee499d9352 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-27 14:02:48 +08:00
hang d12f0bddad 【第一层级统计,需要迁移】 2024-02-27 14:02:47 +08:00
he 9eabd9031b 融合修改 2024-02-26 17:15:43 +08:00
he 552e7a430d 字典修改 2024-02-26 13:30:53 +08:00
he b97f9f8f12 融合修改 2024-02-23 15:35:22 +08:00
he 8be0cea193 病灶修改 2024-02-23 15:27:55 +08:00
he bce088bcdf 融合修改 2024-02-23 14:45:10 +08:00
he 6955c42c8b 融合修改 2024-02-23 14:10:44 +08:00
he 07b36279cf 修改 2024-02-23 14:04:07 +08:00
he 5c1dc0754b 融合 2024-02-23 13:39:46 +08:00
he 7eaa644028 融合修改 2024-02-23 13:37:04 +08:00
he 1b29312bef 融合修改 2024-02-23 13:21:59 +08:00
he 930412bf21 融合修改 2024-02-23 13:19:12 +08:00
he 0e1f4931eb 融合修改 2024-02-23 13:15:37 +08:00
he 2e2c4b4397 修改 2024-02-23 13:10:59 +08:00
he 7665cc7f73 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-23 13:08:11 +08:00
he c743335d13 融合问题修改 2024-02-23 13:08:10 +08:00
hang e9aeb1c918 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-22 17:55:20 +08:00
hang c092e9a8d0 [修改邮件模板 4] 2024-02-22 17:55:18 +08:00
he a55ec01992 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-22 15:50:22 +08:00
he 302e503e02 医学审核修改 2024-02-22 15:50:22 +08:00
hang f82639cdf3 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-22 15:49:31 +08:00
hang 9172d8c5f8 【国际化,项目配置 空格问题】 2024-02-22 15:49:28 +08:00
he 69fd8ec123 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-22 14:51:38 +08:00
he d9c7a512e9 提交 2024-02-22 14:51:37 +08:00
hang 38383f34ff [修改邮件模板 -3] 2024-02-22 14:41:03 +08:00
hang b7585fe022 [修改邮件模板- 替换固定字符串] 2024-02-22 14:31:45 +08:00
hang b7d9009ff4 [邮件发送,配置动态公司名称] 2024-02-22 14:02:51 +08:00
hang 9c26745c2a 关闭 时区 发布aws 2024-02-22 13:28:57 +08:00
hang 67f8e57ab6 编译错误 2024-02-22 09:56:18 +08:00
hang b2ef603729 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-21 16:01:37 +08:00
hang 110ea953c4 [国际化-前端也使用code,唯一标识] 2024-02-21 16:01:34 +08:00
hang cef07a5bff 【时区,修改3 前端时间传递“” 问题解决】 2024-02-21 15:28:08 +08:00
hang a5899023b9 [时区修改-调整名称] 2024-02-21 14:33:38 +08:00
hang 61530be208 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-21 13:58:36 +08:00
hang 292bcd7100 [服务器处理时区上线测试] 2024-02-21 13:58:34 +08:00
he 8f4a6fcf80 异常修改 2024-02-21 11:20:04 +08:00
he dfdb3b5951 病灶修改 2024-02-21 11:19:33 +08:00
he 0cc7b373b7 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-21 09:36:03 +08:00
he 7e5cbd92b4 提示语修改 2024-02-21 09:36:03 +08:00
hang 2594ecd27e [修改启用禁用时,启用时间,增加字段] 2024-02-21 09:30:41 +08:00
he edf8af3e4d 修改 2024-02-20 16:30:20 +08:00
he 5a76275571 修改 2024-02-20 16:23:13 +08:00
he b147ee1c99 修改 2024-02-20 15:13:56 +08:00
he 8b7cc8a220 修改 2024-02-20 14:50:38 +08:00
he 88931a4a56 新加字段 2024-02-20 14:32:39 +08:00
he df187bed58 病灶合并 2024-02-20 14:28:52 +08:00
he 8b86bc6b3f 获取可融合的病灶 2024-02-20 14:12:21 +08:00
he f9ac64023a Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-20 13:19:59 +08:00
he 3a710e1e50 病灶分裂计算 2024-02-20 13:19:58 +08:00
hang 1d4f58f362 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-20 10:02:41 +08:00
hang abfd0a0a2e [删除site调研 中心查询] 2024-02-20 10:02:39 +08:00
he 98839b15dc Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-20 09:52:16 +08:00
he 5b885e98cc 融合 2024-02-20 09:52:16 +08:00
hang 58e29608e5 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-20 09:49:35 +08:00
hang db71cfd396 [中心调研-新增查询site 接口] 2024-02-20 09:49:35 +08:00
hang 0de9cfb240 [中心未启用,不用看到] 2024-02-20 09:42:51 +08:00
he 2a8efb246d Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-20 09:42:37 +08:00
he 071cf4eed8 病灶融合 修改 2024-02-20 09:42:37 +08:00
hang 87a8d8d490 [时区预备测试] 2024-02-20 09:41:01 +08:00
he d3caa1dda9 Merge branch 'Test_IRC_Net8' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test_IRC_Net8 2024-02-19 10:16:54 +08:00
he f832d44f3a 提交 2024-02-19 10:16:53 +08:00
hang 103ab700fc 修改查询条件 2024-02-19 09:56:48 +08:00
hang 6419fa6e61 [修改bug] 2024-02-16 22:08:52 +08:00
hang 98cf2adf92 [修改签名状态] 2024-02-16 21:39:57 +08:00
hang 5660d2e83b 修改医生自己编辑信息
continuous-integration/drone/push Build is passing
2024-02-02 15:44:54 +08:00
hang 5e3e242981 修改邮件发送bug
continuous-integration/drone/push Build is passing
2024-02-02 15:02:09 +08:00
hang 65c31fb457 修改配置文件
continuous-integration/drone/push Build is passing
2024-02-01 15:37:05 +08:00
hang 0f891075cc 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
2024-02-01 15:09:56 +08:00
hang 6d898367e4 修改gcp bug 2024-02-01 15:09:54 +08:00
he 003e63b7fb 修改查询阅片图像
continuous-integration/drone/push Build is passing
2024-02-01 13:42:59 +08:00
he 73c9e15976 阅片图像查询修改 2024-02-01 13:42:55 +08:00
hang 1dc1d673dd 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
2024-02-01 11:38:36 +08:00
hang 46818d9a02 修改医生bug 2024-02-01 11:38:28 +08:00
he d6a585c6cc 添加修改
continuous-integration/drone/push Build is passing
2024-02-01 10:46:43 +08:00
he c54fcf920c 修改
continuous-integration/drone/push Build is passing
2024-02-01 09:59:07 +08:00
he 467c7f77f5 修改
continuous-integration/drone/push Build is passing
2024-02-01 09:46:45 +08:00
he 3c51287178 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
2024-02-01 09:16:54 +08:00
he 9d8fdcfa12 修改 2024-02-01 09:16:53 +08:00
hang fadd8a7f79 修改yml文件
continuous-integration/drone/push Build is passing
2024-01-31 15:52:58 +08:00
hang f2afb7ab1a 增加本地打包推送上海阿里云镜像仓库
continuous-integration/drone/push Build encountered an error
2024-01-31 15:48:42 +08:00
hang b52d8785bb 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
2024-01-31 13:34:57 +08:00
hang 70846525bf 注释 2024-01-31 13:34:56 +08:00
he abe77916a3 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
continuous-integration/drone Build is passing
2024-01-31 11:22:37 +08:00
he 660846a0d8 修改 2024-01-31 11:22:36 +08:00
hang 8dec77f30a 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
2024-01-31 10:28:35 +08:00
hang 5812c8f939 [修改subject 查询 不依赖系统site] 2024-01-31 10:28:34 +08:00
he 1c673e11ac 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
2024-01-31 10:18:24 +08:00
he bf54bcfd9b 代码修改 2024-01-31 10:18:23 +08:00
hang 33a0b8f11f 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
2024-01-31 09:51:35 +08:00
hang 61ffdabc51 【修改 查询写入dicom的信息】 2024-01-31 09:51:32 +08:00
he 2f224047bc 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
2024-01-30 14:29:31 +08:00
he 2747fa82e3 lugano 修改 2024-01-30 14:29:28 +08:00
hang 5dd80c91cf 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
2024-01-29 16:58:33 +08:00
hang 495e602599 [修改医生限制] 2024-01-29 16:58:30 +08:00
he 545ddd4ec9 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
2024-01-29 14:33:43 +08:00
he 9fff53f137 代码提交 2024-01-29 14:33:41 +08:00
hang 1d38fc0879 x
continuous-integration/drone/push Build is passing
2024-01-29 11:01:49 +08:00
hang 48f44b8920 [修改时间]
continuous-integration/drone/push Build is passing
2024-01-26 14:11:20 +08:00
hang e365818ef5 [修改重传没有检查id...]
continuous-integration/drone/push Build is passing
2024-01-26 14:10:19 +08:00
hang c2bb3010cc [修改一致性核查模板]
continuous-integration/drone/push Build is passing
2024-01-26 10:15:22 +08:00
hang 4ca8003d24 [site搜索三个名字]
continuous-integration/drone/push Build is passing
2024-01-26 09:39:34 +08:00
hang 6a212926e0 [退回bug3 ]
continuous-integration/drone/push Build is passing
2024-01-25 12:24:31 +08:00
hang dae5c0440f 删除测试配置
continuous-integration/drone/push Build is passing
2024-01-25 11:24:21 +08:00
hang 6b1d083faa 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
2024-01-25 11:03:14 +08:00
hang c8510bea2a 增加[RuntimeIdentifiers] 2024-01-25 11:03:07 +08:00
hang a00e84018a [修改导出bug]
continuous-integration/drone/push Build is passing
2024-01-24 17:57:52 +08:00
hang 3435806020 [退回bug2]
continuous-integration/drone/push Build is passing
2024-01-24 14:40:09 +08:00
hang 27f0a0fcfa [修改回退bug]
continuous-integration/drone/push Build is passing
2024-01-24 14:13:15 +08:00
hang 1f4bb0128a [邮件模板启用与否没用bug修复]
continuous-integration/drone/push Build is passing
2024-01-24 09:03:51 +08:00
hang e686b6b7d4 修改正式文件配置
continuous-integration/drone/push Build is passing
2024-01-23 13:38:22 +08:00
hang b74d46b425 修改日志过滤
continuous-integration/drone/push Build is passing
2024-01-23 09:12:19 +08:00
hang aa08628b72 [屏蔽健康检查测试3]
continuous-integration/drone/push Build is passing
2024-01-22 17:35:42 +08:00
hang d4b2c48916 [屏蔽健康检查 测试2]
continuous-integration/drone/push Build is passing
2024-01-22 17:18:12 +08:00
hang 152846cfd5 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
2024-01-22 16:54:15 +08:00
hang 48ef1c8605 [屏蔽健康检查日志测试1] 2024-01-22 16:54:10 +08:00
he de72cdb61a 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
2024-01-22 16:16:06 +08:00
he 4c17101e27 添加LimitShow 限制显示 2024-01-22 16:16:03 +08:00
hang 0c1b3b0175 修改配置文件
continuous-integration/drone/push Build is passing
2024-01-22 10:58:15 +08:00
hang 45b51d9bfa 修改邮件模板
continuous-integration/drone/push Build is passing
2024-01-22 10:50:19 +08:00
hang 127916f03e [上传监控修改,增加搜索条件]
continuous-integration/drone/push Build is passing
2024-01-19 16:32:34 +08:00
hang f94e9c98f9 [AWS 对接上传 需要传递文件大小]
continuous-integration/drone/push Build is passing
2024-01-19 16:22:00 +08:00
hang e52523f1fa 修改测试环境aws
continuous-integration/drone/push Build is passing
2024-01-19 15:39:45 +08:00
hang 2d36f75660 修改美国环境配置
continuous-integration/drone/push Build is passing
2024-01-19 15:37:25 +08:00
hang a541423de5 [修改重传没有检查id]
continuous-integration/drone/push Build is passing
2024-01-19 15:33:52 +08:00
hang 8e98d1710b 修改配置文件
continuous-integration/drone/push Build is passing
2024-01-19 15:29:51 +08:00
hang 7b53756753 [修改医生bug 和site bug]
continuous-integration/drone/push Build is passing
2024-01-19 15:12:47 +08:00
hang e20d7982f4 修改配置文件
continuous-integration/drone/push Build is passing
2024-01-19 14:52:42 +08:00
hang ff8604f44a 切换为aws
continuous-integration/drone/push Build is passing
2024-01-19 13:55:40 +08:00
hang aaddd8e26f 增加美国环境
continuous-integration/drone/push Build is passing
2024-01-19 13:41:31 +08:00
hang 5e7fd398f2 [上传失败过,返回标志]
continuous-integration/drone/push Build is passing
2024-01-18 17:41:36 +08:00
hang 53cc5f129f 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
2024-01-18 14:35:58 +08:00
hang 881e67d3e2 美国环境预修改 2024-01-18 14:35:55 +08:00
he 2c385aba12 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
2024-01-17 15:28:27 +08:00
he b53616addc 肿瘤学修改 2024-01-17 15:28:26 +08:00
hang ff3796b7a0 [修改裁判重阅逻辑 2]
continuous-integration/drone/push Build is passing
2024-01-17 14:49:18 +08:00
hang 9aa061e093 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
2024-01-17 14:33:12 +08:00
hang 9524a31fe6 [重阅裁判任务bug ] 2024-01-17 14:33:09 +08:00
he 9c4f2dcf6b 代码修改
continuous-integration/drone/push Build is passing
2024-01-17 13:28:42 +08:00
he c70120bcaa 代码修改
continuous-integration/drone/push Build is passing
2024-01-17 13:10:20 +08:00
he ea693b3ffc 修改
continuous-integration/drone/push Build is passing
2024-01-17 11:16:39 +08:00
he 62ec7d91a9 撤销修改
continuous-integration/drone/push Build is passing
2024-01-17 11:02:25 +08:00
he 01b6799a31 修改
continuous-integration/drone/push Build is passing
2024-01-17 10:50:36 +08:00
he 52f3a88e36 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
2024-01-17 10:07:59 +08:00
he 35687c01ec 肿瘤学阅片 2024-01-17 10:07:58 +08:00
hang ed01407382 [上传监控增加字段]
continuous-integration/drone/push Build is passing
2024-01-16 11:20:50 +08:00
hang 3dbe92a667 Revert "[上传监控增加字段]"
This reverts commit 3d90eaf32c.
2024-01-16 11:20:43 +08:00
hang 127ae75b5b 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
2024-01-16 11:19:41 +08:00
hang 3d90eaf32c [上传监控增加字段] 2024-01-16 11:19:39 +08:00
he 4bbfacd7de 修改
continuous-integration/drone/push Build is passing
2024-01-16 10:48:30 +08:00
he 5bb0f30c77 修改
continuous-integration/drone/push Build is passing
2024-01-16 10:47:00 +08:00
he b179a2fa49 修改
continuous-integration/drone/push Build is passing
2024-01-16 10:40:35 +08:00
he 3d0f0b0f52 修改
continuous-integration/drone/push Build is running
2024-01-16 10:30:38 +08:00
he c11f4a5dc7 修改
continuous-integration/drone/push Build is passing
2024-01-16 10:23:24 +08:00
he dcb9d7b7fc 修改
continuous-integration/drone/push Build is passing
2024-01-16 09:52:31 +08:00
he 87a39fa264 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
2024-01-15 16:36:34 +08:00
he 24f64e9d59 修改计算 2024-01-15 16:36:32 +08:00
hang d7f380fc73 修改前端暂未修改接口,接口报错
continuous-integration/drone/push Build is passing
2024-01-15 15:37:37 +08:00
hang a37a1a6b95 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
2024-01-15 15:14:41 +08:00
hang 33c3fc158f [遗漏 get set] 2024-01-15 15:14:37 +08:00
he 3a6afd6958 修改PET 5PS评分备注
continuous-integration/drone/push Build is passing
2024-01-15 14:25:53 +08:00
he 378f4e13fb 修改
continuous-integration/drone/push Build is passing
2024-01-15 10:32:45 +08:00
he f4d7e30b5d 修改
continuous-integration/drone/push Build is passing
2024-01-15 10:12:58 +08:00
he 088be2f1a5 修改
continuous-integration/drone/push Build is passing
2024-01-12 16:51:09 +08:00
he 56cab93554 修改
continuous-integration/drone/push Build is passing
2024-01-12 16:33:27 +08:00
he 17734753c8 修改
continuous-integration/drone/push Build is passing
2024-01-12 16:23:31 +08:00
he 36fa5e1d73 代码修改
continuous-integration/drone/push Build is passing
2024-01-12 16:10:24 +08:00
he abc364835c 修改
continuous-integration/drone/push Build is passing
2024-01-12 14:35:57 +08:00
he 061625e474 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
2024-01-12 14:32:57 +08:00
he 0888577cde 修改 2024-01-12 14:32:55 +08:00
hang 906bf18971 [修改上传,失败数量传递不准问题]
continuous-integration/drone/push Build is passing
2024-01-12 13:58:39 +08:00
hang 4398afe298 [增加默认值]
continuous-integration/drone/push Build is passing
2024-01-12 13:49:03 +08:00
hang 7c14e9e7a3 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
2024-01-12 13:42:02 +08:00
hang b6798a3466 [上传增加稽查字段]迁移 2024-01-12 13:41:59 +08:00
he 867c7b1752 修改
continuous-integration/drone/push Build is passing
2024-01-12 10:54:45 +08:00
he 0ef8f62a58 代码修改
continuous-integration/drone/push Build is passing
2024-01-12 10:45:53 +08:00
he 03f1f9f157 代码修改
continuous-integration/drone/push Build is passing
2024-01-12 10:43:32 +08:00
he a5e257a2f1 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
2024-01-12 10:41:30 +08:00
he f550750e30 修改 2024-01-12 10:41:28 +08:00
hang 6865c7f4a1 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
2024-01-12 10:23:45 +08:00
hang 9d2bb15ffd 增加真实名字 2024-01-12 10:23:25 +08:00
hang 336b14a4ce 增加上传人 2024-01-12 10:23:04 +08:00
he 344e8f50ae 阅片时间修改
continuous-integration/drone/push Build is passing
2024-01-12 10:01:37 +08:00
he ba0b7f33bc 阅片时间修改
continuous-integration/drone/push Build is passing
2024-01-12 09:52:18 +08:00
he 49bc2e1762 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
2024-01-12 09:40:37 +08:00
he d3ec067224 阅片休息时间 2024-01-12 09:40:35 +08:00
hang 267d0494d3 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
2024-01-11 16:32:36 +08:00
hang 172f6bc29f 修改OSS 上传通用配置 6 2024-01-11 16:32:35 +08:00
he 4f93db928f 获取脾脏验证
continuous-integration/drone/push Build is passing
2024-01-11 15:36:42 +08:00
he c10ee98076 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
2024-01-11 15:24:44 +08:00
he 0820cffd9d 脾脏验证 2024-01-11 15:24:42 +08:00
hang 7f90d64064 修改配置
continuous-integration/drone/push Build is passing
2024-01-11 15:12:17 +08:00
hang c4c98910e8 port修改为int
continuous-integration/drone/push Build is passing
2024-01-11 14:57:08 +08:00
hang 06f1ca232e 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
2024-01-11 14:54:40 +08:00
hang 90320c2b12 修改配置 2024-01-11 14:54:38 +08:00
he f5885f612a 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
2024-01-11 14:48:31 +08:00
he af74059945 修改 2024-01-11 14:48:28 +08:00
hang 42948185f9 修改OSS 需要迁移4
continuous-integration/drone/push Build is passing
2024-01-11 14:40:25 +08:00
hang 6329778123 修改配置文件
continuous-integration/drone/push Build is passing
2024-01-11 14:40:10 +08:00
he eadf8f5266 修改阅片休息时间验证
continuous-integration/drone/push Build is passing
2024-01-11 14:24:03 +08:00
he c4a0e47a84 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
2024-01-11 13:21:05 +08:00
he f9661e3b72 脾脏长度 修改返回 2024-01-11 13:21:03 +08:00
hang 1715d4d056 统一日志记录信息
continuous-integration/drone/push Build is passing
2024-01-11 11:43:07 +08:00
hang 40fae42a9e 修改oss2 需要迁移
continuous-integration/drone/push Build is passing
2024-01-11 11:29:27 +08:00
hang 19e55c1185 修改OSS 配置需要迁移
continuous-integration/drone/push Build is passing
2024-01-11 11:26:59 +08:00
hang 6443a46abb 修改导入国际化
continuous-integration/drone/push Build is passing
2024-01-11 10:16:00 +08:00
hang 8fb2e4b7f4 对接AWS 需要迁移
continuous-integration/drone/push Build is passing
2024-01-11 09:19:19 +08:00
hang 0be25fa16a 修改默认配置
continuous-integration/drone/push Build is passing
2024-01-10 16:43:05 +08:00
hang 8743c028a3 增加AWS 需要迁移
continuous-integration/drone/push Build is passing
2024-01-10 16:17:53 +08:00
hang 7174fd056a 测试AWS
continuous-integration/drone/push Build is passing
2024-01-10 16:17:38 +08:00
hang cd188691f6 测试OSS 下载完成
continuous-integration/drone/push Build is passing
2024-01-10 15:52:02 +08:00
hang c9586e7320 请求前端国际化增加缓存-需要迁移
continuous-integration/drone/push Build is passing
2024-01-10 15:24:45 +08:00
hang c35da39ba6 OSS 对接代码修改
continuous-integration/drone/push Build is passing
2024-01-10 14:57:41 +08:00
hang e2639b8055 修改配置
continuous-integration/drone/push Build is passing
2024-01-10 14:56:58 +08:00
hang 558ed48874 修改配置文件
continuous-integration/drone/push Build is passing
2024-01-10 14:56:34 +08:00
hang e38a3e5f53 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
2024-01-10 13:37:19 +08:00
hang 1175696590 minio 测试修改 2024-01-10 13:37:16 +08:00
he 95862906a4 查询修改
continuous-integration/drone/push Build is passing
2024-01-10 13:18:31 +08:00
he 44cc8d883d 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
2024-01-10 10:48:23 +08:00
he 4c607302f3 查询验证 2024-01-10 10:48:21 +08:00
hang a37ccac097 修改国际化取消权限限制
continuous-integration/drone/push Build is passing
2024-01-10 10:23:34 +08:00
hang b8c460e252 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
2024-01-09 18:03:10 +08:00
hang 4df35ef8c0 修改配置 2024-01-09 18:03:09 +08:00
he 397ac4a154 查询条件修改
continuous-integration/drone/push Build is passing
2024-01-09 15:35:55 +08:00
he 3e6854053d 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
2024-01-09 15:00:39 +08:00
he e155301b60 ir 查询修改 2024-01-09 15:00:38 +08:00
hang 197c315f07 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
2024-01-09 14:27:17 +08:00
hang 5654125091 增加前端国际化修改 2024-01-09 14:27:13 +08:00
he 3768c22aed 休息时间修改
continuous-integration/drone/push Build is passing
2024-01-09 13:58:52 +08:00
he beb43a785e 查询条件修改
continuous-integration/drone/push Build is passing
2024-01-09 11:14:09 +08:00
hang 34e10ac41e 升级net8 模型要求严格了
continuous-integration/drone/push Build is passing
2024-01-05 17:06:50 +08:00
hang 8e26edabba 修改稽查上传文件路径 2024-01-05 13:05:42 +08:00
hang d6cda6337b 修改任务自动生成
continuous-integration/drone/push Build is passing
2024-01-04 15:59:54 +08:00
hang 5b1638ab42 修改待阅列表 临床数据未签名但是可以做后续访视,生成任务逻辑遗漏 2024-01-04 15:55:25 +08:00
hang 3537ccf3cd 清理旧的写法
continuous-integration/drone/push Build is passing
2024-01-04 13:59:19 +08:00
hang d15a9945de 修改打包路径
continuous-integration/drone/push Build is passing
2024-01-04 13:39:18 +08:00
hang 61fa371fd4 升级到最新版的nuget包 2024-01-04 13:24:51 +08:00
hang 05802ae91c 再升级一版本nuget包 2024-01-04 13:24:05 +08:00
hang b4df799a37 升级net8 Program修改 2024-01-04 13:23:03 +08:00
hang 6553bd70c5 升级项目框架提交 2024-01-04 13:22:59 +08:00
hang f3d0c6f28c 修改导表错误
continuous-integration/drone/push Build encountered an error
2024-01-04 12:16:03 +08:00
he 09e35513b0 再次修改
continuous-integration/drone/push Build is passing
2024-01-03 17:17:11 +08:00
he 381e25cda1 修改状态
continuous-integration/drone/push Build is passing
2024-01-03 17:07:49 +08:00
he c763c174d5 修改状态
continuous-integration/drone/push Build is passing
2024-01-03 16:56:55 +08:00
he d4f3239844 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2024-01-03 16:46:52 +08:00
he 806e9528f0 代码修改 修改阅片状态 2024-01-03 16:46:51 +08:00
hang aa59d9ecca Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2024-01-03 15:27:24 +08:00
hang 1226af6376 修改中心调研导表 2024-01-03 15:27:11 +08:00
he 596ecba13f 修复
continuous-integration/drone/push Build is passing
2024-01-03 14:26:30 +08:00
he 57290d6a4b 修改
continuous-integration/drone/push Build is passing
2024-01-03 14:26:01 +08:00
he 52251d420f 阅片状态修改
continuous-integration/drone/push Build is passing
2024-01-03 14:24:24 +08:00
he 95e365fe4f Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2024-01-03 14:01:39 +08:00
he 4f37f2fa0a 验证代码修改 2024-01-03 14:01:38 +08:00
hang 716b7833b0 修改 正式【OSS】配置修改sir.extimaging.com
continuous-integration/drone/push Build is passing
2024-01-03 09:18:43 +08:00
hang 84d8d33349 修改国际化邮件代码
continuous-integration/drone/push Build is passing
2023-12-29 10:19:46 +08:00
hang 132f90b28e 自动发布调整测试
continuous-integration/drone/push Build is passing
2023-12-29 09:19:52 +08:00
hang 7caabad651 域名修改配置网址
continuous-integration/drone/push Build is passing
2023-12-28 13:23:58 +08:00
he c4f3b0d653 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-27 11:24:38 +08:00
he ddb9410c60 代码修改 2023-12-27 11:24:26 +08:00
hang f8ca73c164 迁移修改测试服务器连接地址
continuous-integration/drone/push Build is passing
2023-12-27 10:46:45 +08:00
hang 9512846bb0 系统签名文档废除
continuous-integration/drone/push Build is passing
2023-12-26 09:24:29 +08:00
hang 224097311c 修改事件环境oss 配置
continuous-integration/drone/push Build is passing
2023-12-25 14:47:34 +08:00
hang 903718019e 新增事件环境
continuous-integration/drone/push Build is passing
2023-12-23 12:19:34 +08:00
hang a79ae2d6b5 迁移修改发布环境
continuous-integration/drone/push Build is failing
2023-12-22 17:44:29 +08:00
hang 71cc352982 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-22 17:36:28 +08:00
hang 94381dc5c0 迁移修改数据库配置文件 2023-12-22 17:36:27 +08:00
he ac90d678c1 代码统计修改 查询数量
continuous-integration/drone/push Build is passing
2023-12-22 17:28:48 +08:00
he c3959bbe63 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-22 16:12:18 +08:00
he b88b92d884 修改代码 需要发study 2023-12-22 16:12:06 +08:00
hang b05356b8e2 修改生产连接字符串
continuous-integration/drone/push Build is passing
2023-12-22 13:04:41 +08:00
hang 37a9315066 JudgeVisitTaskId 变更
continuous-integration/drone/push Build is passing
2023-12-21 17:50:43 +08:00
he 7324ec72ed 修改
continuous-integration/drone/push Build is passing
2023-12-21 17:29:31 +08:00
he 90e8aa234d 修改
continuous-integration/drone/push Build is passing
2023-12-21 16:25:41 +08:00
he 40669a14fe Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-21 16:23:44 +08:00
he f55c52d99e 代码修改 2023-12-21 16:23:34 +08:00
hang a47b94e1a6 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-21 15:27:21 +08:00
hang 505af40b7b 属性和字段有区别 2023-12-21 15:27:16 +08:00
he 1fef1aa500 计算小数位修改 需要同步study
continuous-integration/drone/push Build is passing
2023-12-21 13:47:06 +08:00
he 3aa63675c1 代码修改
continuous-integration/drone/push Build is passing
2023-12-21 13:41:33 +08:00
he 5825a5cd63 代码修改
continuous-integration/drone/push Build is passing
2023-12-21 11:43:11 +08:00
he 01d5b031a9 代码修改
continuous-integration/drone/push Build is passing
2023-12-21 11:25:38 +08:00
he 30b6aae25b 修改
continuous-integration/drone/push Build is passing
2023-12-21 09:32:47 +08:00
he 54ebf14f02 修改肿瘤学
continuous-integration/drone/push Build is passing
2023-12-21 09:27:06 +08:00
he 2654f85c32 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-20 16:56:30 +08:00
he fa9573cf54 代码修改 2023-12-20 16:56:18 +08:00
hang 98ea3d1a92 修改导表 5
continuous-integration/drone/push Build is passing
2023-12-20 16:39:54 +08:00
hang e4b20908dc Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-20 16:21:41 +08:00
hang 9b51ca3753 裁判任务失效的时候,清理裁判任务id 需要迁移 2023-12-20 16:21:40 +08:00
he 6d4ce03c10 代码修改
continuous-integration/drone/push Build is passing
2023-12-20 16:04:46 +08:00
he 1316dae035 代码修改
continuous-integration/drone/push Build is passing
2023-12-20 15:53:51 +08:00
he 79a6e43e02 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-20 14:54:08 +08:00
he 625a4819e9 修改 2023-12-20 14:54:04 +08:00
hang 2838b3756f Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-20 14:48:58 +08:00
hang 4f9dcfd584 修改模板文件位置 4 2023-12-20 14:48:58 +08:00
he 37200b4ced Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-20 14:42:14 +08:00
he 4afbbcde99 修改 2023-12-20 14:42:05 +08:00
hang a05c3725e7 修改路径bug 3
continuous-integration/drone/push Build is passing
2023-12-20 14:40:00 +08:00
hang 7110844c7c 修改文档删除2
continuous-integration/drone/push Build is passing
2023-12-20 14:32:48 +08:00
hang 2a205a9634 修改导表时间格式2
continuous-integration/drone/push Build is passing
2023-12-20 14:17:07 +08:00
hang 1fad2c513c Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is failing
2023-12-20 14:00:29 +08:00
hang 1ad4c16d23 更新模板的时候,清理之前的文档,需要迁移 2023-12-20 14:00:25 +08:00
he affc336f7d Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is failing
2023-12-20 13:18:15 +08:00
he e7f21db79a 代码修改 2023-12-20 13:18:09 +08:00
hang 523dd52567 修改导表时间格式
continuous-integration/drone/push Build is failing
2023-12-20 13:02:45 +08:00
he 3191df85e4 代码提交
continuous-integration/drone/push Build is passing
2023-12-20 12:29:47 +08:00
he 2c37915ef7 肿瘤学修改
continuous-integration/drone/push Build is failing
2023-12-20 10:49:59 +08:00
he 1a8bd17f01 肿瘤学修改
continuous-integration/drone/push Build is passing
2023-12-20 10:08:41 +08:00
he a42907e7c8 修改
continuous-integration/drone/push Build is failing
2023-12-19 17:48:41 +08:00
he 1fc5bc8f3b 修改
continuous-integration/drone/push Build encountered an error
2023-12-19 17:24:56 +08:00
he afebbc294b 代码修改
continuous-integration/drone/push Build is failing
2023-12-19 17:24:14 +08:00
he dd50d9cd12 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is failing
2023-12-19 14:16:07 +08:00
he 70f682edd6 修改计算 2023-12-19 14:16:03 +08:00
hang 48f7cee0c4 修改jwt key
continuous-integration/drone/push Build is passing
2023-12-19 12:59:11 +08:00
hang 91fddff077 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is failing
2023-12-19 12:43:32 +08:00
hang c09144690e 修改配置文件 2023-12-19 12:42:47 +08:00
he 5cd4fde48a 修改
continuous-integration/drone/push Build is passing
2023-12-15 15:58:22 +08:00
he fe90438f52 代码修改
continuous-integration/drone/push Build is passing
2023-12-13 14:36:36 +08:00
he a227bfe826 修改
continuous-integration/drone/push Build is passing
2023-12-13 14:27:23 +08:00
he a5f2e3f2e1 修改
continuous-integration/drone/push Build is passing
2023-12-12 17:46:18 +08:00
he 0dead1c4fe 修改Lugano
continuous-integration/drone/push Build is passing
2023-12-12 16:12:39 +08:00
he 2db751bae4 临床数据查询修改
continuous-integration/drone/push Build is passing
2023-12-12 14:11:35 +08:00
he 5d6cd6ab9d 临床数据修改
continuous-integration/drone/push Build is passing
2023-12-12 14:05:28 +08:00
he c93655d199 临床数据修改
continuous-integration/drone/push Build is passing
2023-12-12 13:56:20 +08:00
he 53cb22c474 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is failing
2023-12-12 13:19:39 +08:00
he b58ab5e692 临床数据统计 2023-12-12 13:19:35 +08:00
hang f98dfb7c52 x
continuous-integration/drone/push Build is passing
2023-12-12 13:16:40 +08:00
hang f7c8178a45 修改正式环境配置
continuous-integration/drone/push Build is passing
2023-12-12 13:03:42 +08:00
hang 336462bc02 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-12 12:53:36 +08:00
hang 7af0b6e6a5 修改正式发布文件 2023-12-12 12:53:32 +08:00
he d1d22660c8 临床数据修改
continuous-integration/drone/push Build is passing
2023-12-11 16:04:59 +08:00
he 8afeeefc51 临床数据查询修改
continuous-integration/drone/push Build is passing
2023-12-11 15:45:33 +08:00
he 7f49a437ad 临床数据修改
continuous-integration/drone/push Build is passing
2023-12-11 14:55:08 +08:00
he 6f1651dfc5 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-11 14:18:40 +08:00
he 5372023651 修改 2023-12-11 14:18:32 +08:00
hang 659e92f95b 修改面板统计
continuous-integration/drone/push Build is passing
2023-12-11 13:47:51 +08:00
hang fd79df810c Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-11 13:24:44 +08:00
hang 3f714dd030 上线1.2 数据维护测试 2023-12-11 13:24:41 +08:00
he f39e013eca 修改肿瘤学
continuous-integration/drone/push Build is passing
2023-12-11 10:50:20 +08:00
he d0367ddc36 代码修改
continuous-integration/drone/push Build is passing
2023-12-08 15:56:10 +08:00
he 1ce519673a 修改
continuous-integration/drone/push Build is passing
2023-12-08 15:16:34 +08:00
he 03a96d4fff 修改
continuous-integration/drone/push Build is passing
2023-12-08 15:15:08 +08:00
he 768eeeba1f 医学审核修改
continuous-integration/drone/push Build is passing
2023-12-08 13:47:30 +08:00
he b068d20dd3 修改
continuous-integration/drone/push Build is passing
2023-12-08 13:14:21 +08:00
he 97a61ddfc0 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-08 13:12:21 +08:00
he 4ed45c8616 医学审核加是否有临床数据 2023-12-08 13:12:14 +08:00
hang f4fc3dfab9 windows linux 环境路径修改 迁移
continuous-integration/drone/push Build is passing
2023-12-08 12:44:35 +08:00
hang 4673034737 路径测试windows 和linux
continuous-integration/drone/push Build is passing
2023-12-08 12:39:58 +08:00
hang da155bfca3 继续测试
continuous-integration/drone/push Build is passing
2023-12-08 12:22:52 +08:00
hang b6676b92bf Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-08 11:39:56 +08:00
hang 363e0e11b3 测试路径 2023-12-08 11:39:55 +08:00
he 7af5249e9c Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-08 11:39:25 +08:00
he ff663a1a9a 修改 2023-12-08 11:39:21 +08:00
hang 860a09f6e8 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-08 11:36:47 +08:00
hang 59262a5c72 获取父目录修改方法 2023-12-08 11:36:45 +08:00
he e10e1f990f Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-08 11:26:20 +08:00
he ce8fe53d4d 修改 2023-12-08 11:26:15 +08:00
hang bfad36af3d x
continuous-integration/drone/push Build is passing
2023-12-08 11:25:54 +08:00
hang c909dee4aa Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-08 11:24:37 +08:00
hang 6775cfe170 测试linux目录 2023-12-08 11:24:35 +08:00
he 995b612537 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-08 11:22:14 +08:00
he e61b8e9777 修改 2023-12-08 11:22:01 +08:00
hang db0d90c0f0 修改医学审核统计和发送报告bug
continuous-integration/drone/push Build is failing
2023-12-08 10:42:46 +08:00
hang 6edacd4fd4 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-08 10:15:45 +08:00
hang 0df5e56dee 修改医学审核统计,需要迁移01 2023-12-08 10:15:42 +08:00
he 16e0bebc29 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-07 15:22:49 +08:00
he 5be959f4b8 代码修改 2023-12-07 15:22:29 +08:00
hang ea9a5fa3a0 编码
continuous-integration/drone/push Build is passing
2023-12-07 11:36:18 +08:00
hang 2e15cfaed5 修改trial编码
continuous-integration/drone/push Build is passing
2023-12-07 11:34:59 +08:00
hang 57d8673bb2 代码整理
continuous-integration/drone/push Build is passing
2023-12-07 10:55:10 +08:00
hang bd8a8f744c 修改编码格式2
continuous-integration/drone/push Build is passing
2023-12-07 10:20:11 +08:00
hang edc0734f9f 修改编码格式
continuous-integration/drone/push Build is passing
2023-12-07 10:01:01 +08:00
he 0ad9da1076 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-06 17:02:31 +08:00
hang 6a8a005951 修改trigger 注入服务异常
continuous-integration/drone/push Build is passing
2023-12-06 11:47:10 +08:00
hang fc8aaea395 修改警告
continuous-integration/drone/push Build is passing
2023-12-06 10:33:11 +08:00
hang f469ce0227 兼容之前服务的方式启动
continuous-integration/drone/push Build is passing
2023-12-06 10:17:54 +08:00
hang 1fb1b3d563 修改医生信息报错
continuous-integration/drone/push Build is passing
2023-12-06 09:57:45 +08:00
hang 1baa31db04 写法变更 导致windows 服务挂掉,修改测试
continuous-integration/drone/push Build is passing
2023-12-06 09:30:45 +08:00
hang 0e4c972b19 修改program 代码位置
continuous-integration/drone/push Build is passing
2023-12-06 09:09:59 +08:00
hang 8f438ff314 升级常见nuget包,预备升级net8
continuous-integration/drone/push Build is passing
2023-12-06 08:43:53 +08:00
hang 9bb5266d61 修改启动文件
continuous-integration/drone/push Build is passing
2023-12-05 17:50:57 +08:00
hang edbcabace6 Program修改为新版本写法
continuous-integration/drone/push Build is passing
2023-12-05 17:48:38 +08:00
hang bcc9e1c761 一致性核查国际化修改
continuous-integration/drone/push Build is passing
2023-12-05 14:40:30 +08:00
hang c390997f79 清理无用的文件
continuous-integration/drone/push Build is passing
2023-12-05 14:19:21 +08:00
hang adff45de00 一致性核查调整
continuous-integration/drone/push Build is passing
2023-12-05 13:43:37 +08:00
hang a9cf555513 修改后端上传OSS 解析
continuous-integration/drone/push Build is passing
2023-12-05 12:08:37 +08:00
hang 7885e4f80c Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-05 11:27:56 +08:00
hang 8cccb5da36 修改一致性核查国际化提示 2023-12-05 11:27:55 +08:00
he 1dc6c60de6 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-05 11:03:10 +08:00
he 8cc9cb8caf 修改警告 2023-12-05 11:03:00 +08:00
hang b718fcf185 修改邮件模板
continuous-integration/drone/push Build is passing
2023-12-05 10:33:28 +08:00
hang 495418cac2 修改启动配置
continuous-integration/drone/push Build is passing
2023-12-05 10:19:42 +08:00
hang 3c031a9065 修改警告
continuous-integration/drone/push Build is passing
2023-12-05 10:05:12 +08:00
hang 5109e84fcb 清理+配置 环境变量
continuous-integration/drone/push Build is passing
2023-12-05 09:38:47 +08:00
hang 7616813537 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-04 18:03:03 +08:00
hang 06230bb14b 传递构建号 2023-12-04 18:03:01 +08:00
he a8e0c1691d 代码修改
continuous-integration/drone/push Build is passing
2023-12-04 17:03:53 +08:00
he 8e9e2670fd Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-04 11:15:19 +08:00
hang 95665f0274 修改空提示
continuous-integration/drone/push Build is passing
2023-12-04 11:15:14 +08:00
hang 26dbbd8dc9 禁用一些没必要的警告矫正
continuous-integration/drone/push Build is passing
2023-12-04 11:08:21 +08:00
hang 2c991043ae Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-04 10:52:52 +08:00
hang e739925da2 美国演示,AIR修改 2023-12-04 10:52:35 +08:00
he 65ca6be4cd 修改
continuous-integration/drone/push Build is passing
2023-12-04 10:43:03 +08:00
he bddb4eee6d Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-01 18:06:11 +08:00
he 8470a5f2ac 代码修改 2023-12-01 18:06:00 +08:00
hang 2509d9cd9b CRA 权限
continuous-integration/drone/push Build is passing
2023-12-01 16:03:48 +08:00
hang 633c2e5b8b Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-01 15:58:12 +08:00
hang 9f5ae6f897 CRA 不能签名,需要迁移 2023-12-01 15:58:10 +08:00
hang 06231fe321 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-01 15:41:26 +08:00
hang 76a9a99762 用户登录国际化 2023-12-01 15:41:24 +08:00
he e2f1036ff1 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build encountered an error
2023-12-01 14:34:31 +08:00
he acd8e1765b 代码修改 2023-12-01 14:34:26 +08:00
hang 79b97f089c 删除无用的服务
continuous-integration/drone/push Build is passing
2023-12-01 14:16:24 +08:00
hang 6a6a314718 x
continuous-integration/drone/push Build is passing
2023-12-01 13:33:34 +08:00
hang 6be556dad2 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build encountered an error
2023-12-01 13:30:38 +08:00
hang cee45b87ee 测试linux 打包 2023-12-01 13:30:36 +08:00
he 9e47c34449 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-01 11:05:22 +08:00
he ba96432757 缓存时间修改 需要同步 2023-12-01 11:05:16 +08:00
hang 7acd7ec8fb Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-01 09:39:58 +08:00
hang 333763b3e1 修改警告7 2023-12-01 09:39:56 +08:00
he 7137064ead Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-12-01 09:34:46 +08:00
hang 9813ab55a7 修改警告6
continuous-integration/drone/push Build is passing
2023-12-01 09:33:41 +08:00
hang a656b0c7dd 修改警告5
continuous-integration/drone/push Build is passing
2023-11-30 18:08:03 +08:00
hang 9cf8ef47bb 修改警告4
continuous-integration/drone/push Build is passing
2023-11-30 17:58:17 +08:00
hang ae6a0faa03 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-30 17:44:49 +08:00
hang 88a000d1d6 修改警告4 2023-11-30 17:44:47 +08:00
he 158c3608a0 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-30 17:36:30 +08:00
he d529d5c52f 修改临床数据需要同步01 2023-11-30 17:36:24 +08:00
hang 2e549869af 修改警告 3
continuous-integration/drone/push Build is passing
2023-11-30 17:27:09 +08:00
hang 5346a12641 警告修改2
continuous-integration/drone/push Build is passing
2023-11-30 16:34:53 +08:00
hang c872f46257 修改警告 1
continuous-integration/drone/push Build is passing
2023-11-30 16:17:21 +08:00
hang 56389be6a0 修改QC统计
continuous-integration/drone/push Build is passing
2023-11-30 16:03:22 +08:00
hang 169b76161f Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-30 15:05:07 +08:00
hang 2a56a8490b 修改统计,需要迁移 2023-11-30 15:05:05 +08:00
he 25844c5870 临床数据修改
continuous-integration/drone/push Build is passing
2023-11-30 14:56:31 +08:00
he 8b68fb319f Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-30 14:22:35 +08:00
he 3dfae86b00 临床数据维护 2023-11-30 14:20:15 +08:00
he d26da8a4a8 临床数据问题修改 2023-11-30 14:19:20 +08:00
hang 0cbb375a49 linux 下适配 转换pdf
continuous-integration/drone/push Build is passing
2023-11-30 13:33:51 +08:00
hang de1d971e44 验证环境发布
continuous-integration/drone/push Build is passing
2023-11-30 11:41:09 +08:00
hang a031752d33 日志提示当前部署平台
continuous-integration/drone/push Build is passing
2023-11-30 11:23:27 +08:00
hang b3b3cfff57 x
continuous-integration/drone/push Build is passing
2023-11-30 11:10:13 +08:00
hang a730b4485e OSS 大写改为小写
continuous-integration/drone/push Build is passing
2023-11-30 11:07:45 +08:00
hang 897ad8c3eb 阿里云临时token改为直接返回token和秘钥
continuous-integration/drone/push Build is passing
2023-11-30 10:45:36 +08:00
hang 6266146ecb Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-30 10:26:41 +08:00
hang 7ed13b2b12 hospital修改 需要迁移 2023-11-30 10:26:39 +08:00
he 13e8ed7b6e Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-29 16:33:34 +08:00
he d2e2355673 肿瘤学修改 2023-11-29 16:33:30 +08:00
hang 951b4fde90 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-29 11:46:06 +08:00
hang 0b5cf19078 xx 2023-11-29 11:46:03 +08:00
he 1274eaaec3 稽查5
continuous-integration/drone/push Build is passing
2023-11-29 10:41:32 +08:00
he 638fb12e16 稽查4
continuous-integration/drone/push Build is passing
2023-11-28 17:40:05 +08:00
he aacfbf7178 稽查3
continuous-integration/drone/push Build is passing
2023-11-28 16:51:16 +08:00
he 0f5a1a6335 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-28 16:46:31 +08:00
he 73cbf96a65 稽查2 2023-11-28 16:46:27 +08:00
hang bee4a4b22b 中心调研修改 需要迁移
continuous-integration/drone/push Build is passing
2023-11-28 13:22:32 +08:00
hang 332e39b0fd 修改dockerfile
continuous-integration/drone/push Build is passing
2023-11-28 12:57:08 +08:00
hang 7827fa2846 名称错误
continuous-integration/drone/push Build is passing
2023-11-28 11:50:07 +08:00
hang 9d7c8f9786 测试
continuous-integration/drone/push Build is failing
2023-11-28 11:46:33 +08:00
hang fbe02cd287 修改yml
continuous-integration/drone/push Build is failing
2023-11-28 11:11:44 +08:00
hang 570fd0a27f 禁用clone
continuous-integration/drone/push Build was killed
2023-11-28 11:10:14 +08:00
hang 7164c183ea 修改yml测试
continuous-integration/drone/push Build was killed
2023-11-28 10:59:33 +08:00
hang 094b43e748 修改分支
continuous-integration/drone/push Build was killed
2023-11-28 10:53:36 +08:00
hang d16009272d x
continuous-integration/drone/push Build was killed
2023-11-28 10:51:25 +08:00
hang 3a3212f96c 修改删除的项目查询
continuous-integration/drone/push Build is passing
2023-11-27 16:16:39 +08:00
hang 63b02936b1 1127 稽查修改
continuous-integration/drone/push Build is passing
2023-11-27 13:27:44 +08:00
hang 2eced17ca9 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-24 11:19:43 +08:00
hang c4f0b0d60d OSS 稽查修改 ,新增健康检查 2023-11-24 11:19:41 +08:00
he ec64533b4b 修改
continuous-integration/drone/push Build is passing
2023-11-24 10:56:04 +08:00
he 670cee5923 代码修改
continuous-integration/drone/push Build is passing
2023-11-24 10:51:43 +08:00
he 67091fd72f Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-24 10:28:45 +08:00
he a5dee142bf 稽查修改1 2023-11-24 10:28:41 +08:00
hang ade516d188 合并修改
continuous-integration/drone/push Build is passing
2023-11-24 10:01:13 +08:00
hang da746c0e66 统计排序 03
continuous-integration/drone/push Build is passing
2023-11-23 17:07:18 +08:00
hang 14826ee44b 修改稽查和界面统计 需要迁移02
continuous-integration/drone/push Build is passing
2023-11-23 15:08:53 +08:00
hang 767c24dd56 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-23 12:15:21 +08:00
hang 22487c1893 上传文件到OSS 需要迁移 2023-11-23 12:15:17 +08:00
he e6e2e8a91d Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-23 10:04:24 +08:00
hang 4ebe354caa 修改重阅稽查
continuous-integration/drone/push Build is passing
2023-11-21 14:51:00 +08:00
hang 3b9c87c172 稽查修改
continuous-integration/drone/push Build is passing
2023-11-21 13:27:49 +08:00
hang c36aac0cdf 医学审核稽查修改
continuous-integration/drone/push Build is passing
2023-11-21 13:18:25 +08:00
he ab04db17f3 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-21 13:10:51 +08:00
he 624cbee901 修改 2023-11-21 13:10:39 +08:00
hang a7891ee323 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-21 11:09:50 +08:00
hang 404c414f76 修改统计bug, 2023-11-21 11:09:48 +08:00
hang bc55b870cb 修改统计bug,医学审核增加最新回复人
continuous-integration/drone/push Build is passing
2023-11-21 10:50:34 +08:00
hang ed282e444d Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-21 09:57:10 +08:00
hang 8d3cf31941 1.2 OSS 变更 2023-11-21 09:57:08 +08:00
he bec8720a4d 代码修改
continuous-integration/drone/push Build is failing
2023-11-20 12:53:01 +08:00
he b9121e1468 Merge branch 'Test.IRC' of http://192.168.3.68:2000/XCKJ/irc-netcore-api into Test.IRC
continuous-integration/drone/push Build is passing
2023-11-20 09:17:07 +08:00
hang 55b72a9156 对接MinIO
continuous-integration/drone/push Build is passing
2023-11-17 17:55:19 +08:00
hang 2ce78f333b 确认用户类型
continuous-integration/drone/push Build is passing
2023-11-16 09:15:14 +08:00
hang 5834ac7f37 修改导表bug 2023-11-14 10:11:37 +08:00
hang 1aaf5e10f4 增加角色修改 2023-11-13 14:05:02 +08:00
hang 82212aac16 修改统计03 -需迁移 2023-11-10 17:18:49 +08:00
hang a118cbeb1e CRC 影像质疑 2023-11-10 15:52:44 +08:00
hang c7b956344f 修改页面查询结果显示 2023-11-10 14:12:40 +08:00
hang 2fe19dbf0e 医学审核下拉框修改 2023-11-10 09:57:22 +08:00
hang 50e0e3bf98 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-09 16:56:57 +08:00
hang 5be941663b 修改中心调研导入和增加用户类型 2023-11-09 16:56:55 +08:00
he 7a7acfa15c Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-09 15:53:04 +08:00
he 15ee30bcdf 修改 2023-11-09 15:53:00 +08:00
hang 70362b8f96 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-09 15:51:48 +08:00
hang b217967d9c 一致性核查同步到测试环境 2023-11-09 15:51:46 +08:00
he eadf2d2cfa 修改 2023-11-09 15:13:44 +08:00
he ba441a826a Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-09 14:46:59 +08:00
he 7f063cf626 修改 2023-11-09 14:46:51 +08:00
hang bb2de4cca0 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-08 19:34:44 +08:00
he fae51b4444 领取修改 2023-11-08 18:46:54 +08:00
hang 45438e09e5 合并 2023-11-08 16:47:43 +08:00
hang 1492d5acbb 修改邮件模板 2023-11-08 16:45:52 +08:00
he 8f0dae936b 修改 2023-11-08 15:35:00 +08:00
he cd1222d27f Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-08 15:34:33 +08:00
he 71cfaaad63 代码修改 2023-11-08 15:34:25 +08:00
hang 66682260a0 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-08 10:19:14 +08:00
hang a1fdd5de05 修改中心调研 2023-11-08 10:19:10 +08:00
he 5bcba84acb Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-08 09:08:23 +08:00
he 2cc362edfc 修改 2023-11-08 09:08:00 +08:00
hang 8e5e638914 删除之前废弃的代码 2023-11-07 17:42:48 +08:00
hang 1c689ccfbd 不去掉前后空格 2023-11-07 17:04:19 +08:00
hang 7b300a97c6 一致性核查国际化修改 2023-11-07 16:31:35 +08:00
hang 3199bea647 修改删除 2023-11-07 13:56:26 +08:00
hang bd31a3a598 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-07 11:42:12 +08:00
hang b3d58c5fa5 修改邮件 2023-11-07 11:42:07 +08:00
he 3457283220 修改 2023-11-07 10:50:13 +08:00
he 33fc733f6d 修改 2023-11-07 10:49:46 +08:00
he 07a600c05f Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-06 16:47:21 +08:00
he cf30c49b0e 修改 2023-11-06 16:46:57 +08:00
hang e2fd05db81 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-06 14:09:34 +08:00
hang 9d49ed9e61 文档删除 2023-11-06 14:09:31 +08:00
hang 5d6a44912e Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-03 16:20:41 +08:00
hang ad3b0f84c2 x 2023-11-03 16:20:33 +08:00
he ceb111eccd 修改 2023-11-03 16:13:21 +08:00
he 53c56f5c0a Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-03 16:12:58 +08:00
hang 15834921a8 ImageResizePath 迁移掉了 2023-11-03 13:41:37 +08:00
hang 8a1970bb3d 修改访问影像文件不存在提示问题 2023-11-03 12:24:00 +08:00
hang 50ce20071a 容器真实ip 2023-11-02 15:53:44 +08:00
hang a8771052f3 修改角色,和admin查看列表 2023-11-02 10:08:56 +08:00
hang c53390beb3 修改超声重传 2023-11-02 09:21:06 +08:00
hang 0ec468becb Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-02 09:10:33 +08:00
hang 2c45d4f1a5 修改查询 2023-11-02 09:10:31 +08:00
he 2036c63a59 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-01 13:12:48 +08:00
he e56d3dc632 修改 2023-11-01 13:12:40 +08:00
hang 8dedf719e0 修改邮件发送和稽查 2023-11-01 11:54:46 +08:00
hang c04dfb4b77 稽查查询 2023-11-01 11:47:11 +08:00
hang 281d10f3b4 修改稽查查询 2023-11-01 11:47:07 +08:00
hang e28665fd05 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-01 10:22:42 +08:00
hang cc3b6d7e55 超声接口增加 StudyInstanceUidList 2023-11-01 10:22:39 +08:00
he 37d1c48f2e Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-11-01 09:24:05 +08:00
he 28187aea37 修改 2023-11-01 09:23:48 +08:00
hang 963d0d582f x 2023-10-31 15:22:47 +08:00
hang ce279dda60 拷贝病灶修改 2023-10-31 15:21:48 +08:00
hang ba92a90832 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-31 09:48:14 +08:00
hang 624bec0c88 修改中心调研提示 2023-10-31 09:48:13 +08:00
hang 85934de439 修改中心调研提示 2023-10-31 09:45:35 +08:00
hang 6a56132de9 中心调研映射bug 2023-10-31 09:23:26 +08:00
hang 8075684d1d 修改退回bug 2023-10-30 18:03:18 +08:00
hang 3d3ac28848 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-30 17:53:56 +08:00
hang 5ec879833e 整理代码 2023-10-30 17:53:53 +08:00
he e8d2b494bf 修改 2023-10-30 17:45:18 +08:00
he c271537878 修改 2023-10-30 16:53:24 +08:00
he ae2a3ba8a3 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-30 15:17:19 +08:00
he 72215ad898 修改 2023-10-30 15:16:57 +08:00
hang d36e3c0d91 访视回退拷贝表单 2023-10-30 14:40:10 +08:00
hang 086ca46218 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-30 10:38:29 +08:00
he 6c1288823d 修改 2023-10-30 10:32:06 +08:00
hang 11c83759d2 增加HtmlPath 2023-10-30 10:29:56 +08:00
he 9e2268ce72 修改 2023-10-27 11:30:23 +08:00
he ce2f8ad003 代码修改 2023-10-27 09:52:57 +08:00
he af661212b0 代码修改 2023-10-26 17:16:28 +08:00
he f26db2b523 修改 2023-10-26 14:16:03 +08:00
he 0451ef4190 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-26 14:06:54 +08:00
he 84c5cdeca7 修改 2023-10-26 14:06:47 +08:00
hang ee8014385a Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-26 13:53:33 +08:00
hang 27c63202cd 中心调研修改 2023-10-26 13:53:31 +08:00
he 9d446a6e29 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-26 13:45:42 +08:00
he df27d6492f 修改 2023-10-26 13:45:32 +08:00
hang 1d12d8e2ff 修改上传bug 2023-10-26 10:10:16 +08:00
hang 551eb3851b Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-26 10:04:52 +08:00
hang cb683b6674 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-26 10:03:13 +08:00
hang 4e5b96b8ea xx 2023-10-26 10:03:10 +08:00
he 1db7b86f89 修改 2023-10-26 10:01:36 +08:00
he 7198962847 影像学整体肿瘤评估计算修改 2023-10-25 16:06:23 +08:00
he c7b32fd29a Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-24 17:27:36 +08:00
he 4b9ca6ca25 修改 2023-10-24 17:27:26 +08:00
hang f4a502024d Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-24 17:05:07 +08:00
hang a9fd1978e1 修改医生简历上传 2023-10-24 17:05:03 +08:00
he a73f6a4aeb 代码修改 2023-10-24 10:42:06 +08:00
he e34f13bd6a Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-23 16:52:55 +08:00
he f39ef0d799 代码提交 2023-10-23 16:52:47 +08:00
hang 66b9f2dd5c 下载接口 2023-10-23 16:07:44 +08:00
hang b9d50179c0 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-23 13:55:22 +08:00
hang 35cac0d7e9 对接返回检查Code 2023-10-23 13:55:19 +08:00
he 46980e6b50 修改 2023-10-20 15:36:42 +08:00
he 7fc93a667d 修改 2023-10-20 15:26:42 +08:00
he e8e9105f5c 修改 2023-10-19 17:22:21 +08:00
he e6cd24065c 代码修改 2023-10-19 17:10:31 +08:00
he 65ae0e06f5 修改 2023-10-19 16:04:38 +08:00
he 04a702fb0e 修改 2023-10-19 15:21:38 +08:00
he 5934178a5f 修改 2023-10-19 14:15:13 +08:00
he e43b28969e 修改 2023-10-19 13:49:38 +08:00
he a1bd7b4815 修改 2023-10-19 13:34:21 +08:00
he baaf5af664 修改 2023-10-19 13:17:26 +08:00
he 1f1500c661 修改 2023-10-19 10:50:07 +08:00
he 3d92fac1d6 代码修改 2023-10-19 09:16:43 +08:00
he 682a5d1c44 修改 2023-10-18 17:57:37 +08:00
he e5f10d052a 修改 2023-10-18 16:28:25 +08:00
he 91bd2ac69f 修改 2023-10-18 16:23:30 +08:00
he e7ec55eb61 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 14:41:01 +08:00
he c469b5e506 代码修改 2023-10-18 14:40:55 +08:00
hang e384470705 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 13:49:22 +08:00
hang 7c1e91b945 StudyId bug 2023-10-18 13:49:20 +08:00
he 78e9623598 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 13:32:08 +08:00
he a0f756a4cb 修改 2023-10-18 13:31:58 +08:00
hang 108be0bc23 修改检查序列层级 2023-10-18 12:18:54 +08:00
hang e772407e38 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 11:41:25 +08:00
hang e789c32564 增加阅片标准信息 2023-10-18 11:41:23 +08:00
he 03f7173855 修改 2023-10-18 11:41:06 +08:00
he 61b5a8295c Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 10:51:09 +08:00
he 665c88a681 修改 2023-10-18 10:50:51 +08:00
hang 53402bdda5 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 10:40:37 +08:00
hang 56295b3c98 修改数据库保存异常提示 2023-10-18 10:40:35 +08:00
he 0cbd0f67a1 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 10:27:06 +08:00
he 7cf23668af 修改 2023-10-18 10:27:01 +08:00
hang 7465b8b5b9 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 10:22:27 +08:00
hang 6019fdbe36 遗漏SubjectId 2023-10-18 10:22:25 +08:00
he 532eb15e3b Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 10:17:37 +08:00
he 064abbf8dd 修改 2023-10-18 10:17:32 +08:00
hang d88a0412a0 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-18 10:08:24 +08:00
hang 296b510c41 字段名错误 2023-10-18 10:08:20 +08:00
he 473bb64b42 修改 2023-10-18 09:10:20 +08:00
he 6df9099707 代码修改 2023-10-17 17:53:03 +08:00
he b8c7441c92 修改 2023-10-17 17:48:55 +08:00
he 79c21b24cd 修改 2023-10-17 16:57:52 +08:00
he b72e90f0b9 代码修改 2023-10-17 16:46:37 +08:00
he 658ce479eb Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-17 16:11:45 +08:00
he 2e316c35fe 修改 2023-10-17 16:11:38 +08:00
hang 3e9546aa10 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-17 15:49:26 +08:00
hang 21bd781468 超声对接接口初步完成 2023-10-17 15:49:24 +08:00
he 2ea9c49b2e 修改 2023-10-17 15:19:49 +08:00
he b926519424 代码修改 2023-10-17 14:11:38 +08:00
he 9e82fd124a Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-17 13:48:38 +08:00
he d859def7d6 修改 2023-10-17 13:48:28 +08:00
hang 2d5926913e Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-17 13:37:18 +08:00
hang 8bde83bb7b 超声对接准备 2023-10-17 13:37:15 +08:00
he 08f592a9cb 代码修改 2023-10-17 11:17:36 +08:00
he a088071914 修改 2023-10-17 11:07:44 +08:00
he a313f97736 代码修改 2023-10-17 11:06:39 +08:00
he 367a096b8a 修改 2023-10-17 10:38:41 +08:00
hang 363411f57c 迁移Study 中心调研修改 2023-10-17 10:26:52 +08:00
he 3bedd60b72 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-17 09:40:04 +08:00
he bed277f899 代码修改 2023-10-17 09:39:52 +08:00
hang 6131101520 项目标准查询修改 2023-10-17 09:26:27 +08:00
hang b8f5709e65 解决循环依赖 2023-10-16 15:58:32 +08:00
hang 689e8cf259 暂时屏蔽邮件服务提交 2023-10-16 15:51:12 +08:00
hang 4acbe5b560 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-16 15:45:47 +08:00
hang 2c80ca7812 邮件初步调整完毕 2023-10-16 15:45:44 +08:00
he 75b5458c02 代码修改 2023-10-16 11:47:16 +08:00
he 1f446ac60f 代码修改 2023-10-16 11:44:42 +08:00
he 0b59b0a2cb Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-16 09:27:07 +08:00
he a13b1d08c4 代码修改 2023-10-16 09:26:55 +08:00
hang 39f5110464 确认nuget 包 2023-10-13 23:43:33 +08:00
hang e67bf63bc5 efcore 6 升级到6版本最新,同时EFCore.BulkExtensions 也是6版本最新,但是projectable 不能升级 2023-10-13 21:34:31 +08:00
hang 2fffaca696 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-13 17:16:44 +08:00
hang be3dde7657 零时方案修改 2023-10-13 17:16:06 +08:00
he 4d94784e88 修改 2023-10-13 17:09:50 +08:00
he 7ea39def40 发布 2023-10-13 15:16:41 +08:00
he 5b202121df 发布 2023-10-13 15:11:26 +08:00
he 1e0278fe72 发布 2023-10-13 15:08:08 +08:00
he fd70a01803 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-13 15:07:35 +08:00
hang e6a909bba0 修改nuget包 2023-10-13 15:05:18 +08:00
hang 7ceb4b264b Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-13 14:40:18 +08:00
hang fbaf78d18e 包版本回退 2023-10-13 14:40:15 +08:00
he 7b8189dae2 修改 2023-10-13 14:25:11 +08:00
he f29bdcab3f 修改 2023-10-13 14:20:35 +08:00
he 45de42fc71 代码修改 2023-10-13 13:40:45 +08:00
he b62a1e5d88 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-13 13:39:13 +08:00
he fbf86ab7e3 代码修改 2023-10-13 13:39:02 +08:00
hang 5dec67aa32 修改OSS 上传 2023-10-13 13:27:43 +08:00
hang 6e4d038b38 修改nuget包,清理 2023-10-13 11:57:36 +08:00
hang 9b25cea893 EntityFrameworkCore.Projectables 包问题 导致更新出错 2023-10-13 11:18:26 +08:00
hang 4a2fd0166e 临时修改 2023-10-13 11:03:44 +08:00
hang dfeab8793f Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-12 17:23:22 +08:00
hang a867291b51 修改库引用 2023-10-12 17:23:20 +08:00
he 0fdf9a3419 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-12 13:49:21 +08:00
he 796b3cf710 修改缓存 2023-10-12 13:49:13 +08:00
hang 27e9cadf91 升级项目程序包,清理无用的包 2023-10-12 13:26:30 +08:00
hang 89d852f4ed 升级efcore 清理之前的写法 2023-10-12 13:26:06 +08:00
hang 9ad4c96572 删除 quartz 2023-10-12 11:06:16 +08:00
hang ed89bc652e 定时任务修改迁移 2023-10-12 10:51:21 +08:00
hang 746f2ba7e0 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-12 10:26:43 +08:00
hang 09acd12586 Study 上传 迁移 2023-10-12 10:26:41 +08:00
hang a1d8e2237c 删除JsonPatch 2023-10-12 10:12:22 +08:00
hang 86a486b060 分布式缓存组件准备 2023-10-12 10:09:32 +08:00
hang 173f899881 Merge branch 'Test.IRC' of http://192.168.3.69:2000/XCKJ/irc-netcore-api into Test.IRC 2023-10-12 09:59:08 +08:00
hang 8436a319f8 分布式锁项目修改 2023-10-12 09:59:06 +08:00
hang a565282a94 分布式锁 sqlserver 05 项目迁移修改 2023-10-12 09:48:48 +08:00
hang 5d7beb71e6 分布式锁 sqlserver 测试 04 增加日志 2023-10-12 09:45:26 +08:00
hang 3218be613d 分布式锁 sqlserver 测试 03 2023-10-12 09:44:53 +08:00
hang 9ade3a7c39 引入分布式锁组件 2023-10-12 09:40:00 +08:00
he 3de5142a5b 测试迁移发布 2023-10-11 16:42:17 +08:00
he ba3319d0cd 修改 2023-10-11 16:11:04 +08:00
he 2c82cf525a 代码修改 2023-10-11 15:52:56 +08:00
hang c4e53d5654 study-邮件发送修改-迁移 2023-10-09 11:27:35 +08:00
he 7591f19707 Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-10-09 10:47:54 +08:00
he 7739652e21 修改 2023-10-09 10:47:31 +08:00
hang 40806ffda4 test-study site修改迁移 2023-10-08 16:46:43 +08:00
hang 29783e2f3f Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-10-08 13:29:56 +08:00
hang a888ed25ec 上传oss 对比遗漏提交 2023-10-08 13:29:55 +08:00
hang c402878262 Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-10-08 10:44:12 +08:00
hang b8cbec9462 oss上传修改 2023-10-08 10:44:08 +08:00
he 3d60c3af49 代码修改 2023-10-08 10:01:47 +08:00
hang 551198b6ec 修改异常提示 2023-09-28 11:38:26 +08:00
he 11395d8e5f 代码修改 2023-09-28 09:46:10 +08:00
he 5c89478ecb 代码修改 2023-09-27 15:36:29 +08:00
he f0a8133b94 Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-09-27 15:24:37 +08:00
he 83bdcdad1f 修改 2023-09-27 15:24:27 +08:00
hang f1b5a457df Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-09-27 13:57:25 +08:00
hang 8d00a6b2a3 删除全局稽查找第一条过滤 2023-09-27 13:57:24 +08:00
he 8823392846 代码修改 2023-09-27 11:43:46 +08:00
he 70f1faa312 修改 2023-09-27 09:50:56 +08:00
he 61f95bf59b 修改 2023-09-26 17:51:07 +08:00
he 992dfe39fb 修改代码 2023-09-26 17:41:53 +08:00
he 964a95d934 维护临床数据 2023-09-26 11:21:32 +08:00
he 2f1df92dc3 修改 2023-09-25 17:13:15 +08:00
he 71d128a325 修改 2023-09-25 16:42:56 +08:00
he 1c5aa8ce28 代码修改 2023-09-25 14:39:08 +08:00
he 5dab6ef30b 代码修改 2023-09-25 13:13:02 +08:00
he 473dafbb58 修改 2023-09-22 17:52:24 +08:00
he 6020248afc 修改 2023-09-22 17:34:09 +08:00
he 2c119e900c 修改 2023-09-22 16:29:26 +08:00
he 9f08024514 修改 2023-09-22 16:23:04 +08:00
he 6e1c6fbc49 修改 2023-09-22 16:13:39 +08:00
he a8212404ba 修改 2023-09-22 16:07:33 +08:00
he 5399c89d8e 修改 2023-09-22 15:32:39 +08:00
he 52e8e68cfc 代码修改 2023-09-22 14:54:18 +08:00
he b3e5d2924a 修改 2023-09-22 14:39:58 +08:00
he 2161a5d36d 修改 2023-09-22 13:34:08 +08:00
he 4a482adefe 添加标记 2023-09-22 13:33:05 +08:00
he 3c23dfd792 添加问题标记 包括上一条也是 2023-09-21 16:37:13 +08:00
he d644e150ec 修改 2023-09-21 16:34:03 +08:00
he ceda3f8427 预览新增ParentTriggerValueList
RelevanceValueList 字段
2023-09-21 11:36:07 +08:00
he 6ae2e60b33 代码修改 2023-09-21 10:54:46 +08:00
he 56f86b1303 关键序列修改 2023-09-21 10:48:19 +08:00
he e62774bf9a 代码修改 2023-09-19 14:43:48 +08:00
he c97253cb5f 编辑病灶问题修改 2023-09-19 13:54:59 +08:00
he 285992d137 添加字段 2023-09-15 16:29:33 +08:00
he 67f137927d 添加字段 2023-09-15 15:59:28 +08:00
he f96025ae38 添加字段 2023-09-15 15:30:09 +08:00
he 166b46f6a3 添加另一个标记 2023-09-15 15:25:17 +08:00
he 304ad35f29 添加字段 2023-09-15 09:30:08 +08:00
he 8d8b41253e 添加问题分类字段 2023-09-14 15:42:27 +08:00
he 46ad5920de 修改 2023-09-13 14:02:11 +08:00
he 03c824a1c9 代码提交 2023-09-11 16:47:53 +08:00
he 7f3fae5da7 修改 2023-09-11 16:32:54 +08:00
he a9a51a76c7 代码修改 2023-09-11 13:13:16 +08:00
he d887e9fe6a 代码修改 2023-09-11 10:55:41 +08:00
he 1a14eeb39e 代码提交 2023-09-11 10:54:28 +08:00
he c68e1494ac 代码修改 2023-09-07 17:36:14 +08:00
he ad0b3d4c28 计算修改 2023-09-06 17:45:09 +08:00
he 785641cc47 确认的时候再同步标准问题 2023-09-06 16:08:37 +08:00
he ae40f36853 计算修改 2023-09-06 15:49:19 +08:00
he 2cada0fcbe 计算修改 2023-09-06 15:48:39 +08:00
he 1f45a3aa9f 修改 2023-09-06 09:19:27 +08:00
he 2a917ec091 修改 2023-09-05 17:45:21 +08:00
he bad5f32ffc 代码修改 2023-09-05 17:44:29 +08:00
he b006fff6ed 无序阅片随机顺序 2023-09-05 13:39:13 +08:00
he 35f5a362e3 代码提交 2023-09-05 13:34:34 +08:00
he 8924b2ca7a 代码修改 2023-09-04 11:32:33 +08:00
he 46de4000a1 临床数据表格问题添加依赖父问题 2023-09-04 11:32:28 +08:00
he aea09998f9 Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-09-04 11:31:02 +08:00
hang 80c001ba9c Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-09-01 17:37:15 +08:00
hang eebf08217c 修改中心查询 2023-09-01 17:36:58 +08:00
hang 44ca1ebc9a 修改中心 2023-09-01 17:36:53 +08:00
hang 6854f5c8d3 修改中心 2023-09-01 17:36:48 +08:00
he a362d5a977 修改 2023-09-01 14:45:58 +08:00
he d2aef5df04 Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-08-31 15:45:18 +08:00
he 87992a36e1 代码修改 2023-08-31 15:45:02 +08:00
hang 2c6ef0dffe Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-08-31 10:12:00 +08:00
hang a94670d6ca 修改日志查询 2023-08-31 10:11:35 +08:00
he 9d876b44cf 提交全局阅片存在重复 需要同步环境 2023-08-24 13:30:07 +08:00
he 32af01c8f4 代码修改 2023-08-23 14:31:51 +08:00
he 803f7f43b4 Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-08-23 14:11:11 +08:00
he 2260303876 代码修改 2023-08-23 14:11:02 +08:00
hang 943058b84a Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-08-22 13:33:11 +08:00
he 4f8f4fe9b8 代码添加 2023-08-21 17:12:44 +08:00
he 92aa223f3f 修改 2023-08-21 17:02:11 +08:00
he 4dafe15386 排序修改 2023-08-21 16:59:00 +08:00
he 5e70d2ec36 Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-08-21 13:29:48 +08:00
he f7f84ef28a 代码修改 2023-08-21 13:29:37 +08:00
hang 1f7ce33643 修改文档废除 2023-08-17 15:50:00 +08:00
hang 22a03ff3df 继续测试 2023-08-17 15:29:06 +08:00
hang a256aec1cc 测试修改了服务器时间自动发布 2023-08-17 15:23:13 +08:00
he 8da1ab2413 代码修改 2023-08-17 14:25:15 +08:00
he 6b6ab9e406 代码修改 2023-08-17 10:36:08 +08:00
he a2c35ba83d 代码修改 2023-08-15 16:43:07 +08:00
he dfb8757719 修改 2023-08-15 16:35:39 +08:00
he 65d68a3116 代码修改 2023-08-15 15:07:34 +08:00
he 13d709c88d Merge branch 'Test.IRC' of http://192.168.3.69:3000/XCKJ/irc-netcore-api into Test.IRC 2023-08-14 15:03:31 +08:00
he 31bbd5295e 代码修改 2023-08-14 15:03:17 +08:00
hang 270bccc432 修改数据库名称 Test.IRC 2023-08-10 13:59:49 +08:00
hang 4915b3c62c powershell 发布测试 2023-08-10 13:14:16 +08:00
hang 8d8f9c166e 显示指定缓存发布尝试 2023-08-10 13:13:04 +08:00
hang 6be7f3e81b test-irc 自动发布测试 2023-08-10 11:23:40 +08:00
he a635360c95 修改加急 2023-08-10 11:15:53 +08:00
he 2d32a5e0de 待阅片颜色 2023-08-10 09:38:09 +08:00
he 3cd37c2be6 自动领取下一个质控 2023-08-09 11:43:47 +08:00
he dc63f1c735 V1.2 需求 2023-08-07 15:52:43 +08:00
he 94462015f2 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-08-07 14:18:00 +08:00
hang 689cce246a Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-08-03 10:25:11 +08:00
hang 5d3ed34a31 修改单重阅片生成任务bug 2023-08-03 10:25:06 +08:00
he 8099ff0fa9 S-102 自定义标记 2023-07-31 13:28:12 +08:00
he c0fd38b03b S-101 自定义标记 2023-07-31 11:44:54 +08:00
he ab1fd89026 S-100 国际化修改 2023-07-28 14:15:36 +08:00
he b1d357956c S-99 临床数据 2023-07-28 13:46:19 +08:00
he 045269d88f S-98 时间修改 2023-07-28 13:46:14 +08:00
he c456045381 S-97 添加分组 2023-07-28 13:46:07 +08:00
he 54a44991fd S-96 添加时间 2023-07-25 17:20:13 +08:00
he 975adba203 S-95 2023-07-21 14:20:45 +08:00
he 0d8091b41a S-94 2023-07-21 14:07:06 +08:00
he 41db19ec01 S-93 2023-07-21 13:49:22 +08:00
he 00be8908ef S-92 2023-07-21 13:43:32 +08:00
he 7c5263415f S-91 2023-07-21 10:54:42 +08:00
he d93da5abd9 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-21 10:18:19 +08:00
he 08a7dd9e85 S-90 2023-07-21 10:17:42 +08:00
hang 7476f8a8e9 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-21 08:52:01 +08:00
hang 0c04c845b4 修改组国际化 2023-07-21 08:51:57 +08:00
he b4448df047 S-90 2023-07-20 17:25:36 +08:00
he 74502510db S-89 2023-07-20 16:49:19 +08:00
he c5d94eff03 S-88 2023-07-20 14:10:27 +08:00
he 01501b36b5 S-87 2023-07-20 10:07:58 +08:00
he 5e5913255c S-86 2023-07-20 10:07:14 +08:00
he b1cf4dc592 S-85 2023-07-19 17:30:20 +08:00
he ec53815bb0 S-84 2023-07-19 13:40:53 +08:00
he 01c91a6398 S-83 2023-07-18 18:11:22 +08:00
he 6d1c72718b S-82 2023-07-18 18:01:01 +08:00
he 768d936ba9 S-81 2023-07-18 17:44:40 +08:00
he ef8220c236 S-80 2023-07-18 16:35:31 +08:00
he 47a4403cbe S-79 2023-07-18 16:01:55 +08:00
he 09e0187a7d S-78 2023-07-18 14:50:42 +08:00
he 9d4fea4407 S-77 2023-07-18 14:19:21 +08:00
he df508335a0 S-76 2023-07-18 13:55:52 +08:00
he 6900433496 S-75 2023-07-18 13:48:19 +08:00
he fc5f68bd7c S-74 2023-07-18 13:46:46 +08:00
he e9ee41e1a1 S-73 2023-07-18 11:57:44 +08:00
he e1a63b6da5 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-18 11:31:00 +08:00
he 45a84a65ec S-72 2023-07-18 11:30:41 +08:00
hang 8550612a8b Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-18 11:17:29 +08:00
hang cc02e89e1b hang- 修改CRC 看到的检查列表 2023-07-18 11:16:50 +08:00
he ec808c68f5 S-71 2023-07-17 17:42:39 +08:00
he 644d94ed22 S-70 2023-07-17 16:52:23 +08:00
he b7d50de7d1 S-69 2023-07-17 16:36:03 +08:00
he 6a53aaf010 无序阅片顺序 2023-07-17 15:59:48 +08:00
he edaab02d0b S-68 2023-07-17 14:57:04 +08:00
he 7a03474d07 S-67 2023-07-17 10:59:52 +08:00
he c810f6165f Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-17 10:38:45 +08:00
hang 23673ba60c Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-17 10:23:12 +08:00
hang 065be00d43 hang-用户登录日志 -04 2023-07-17 10:21:26 +08:00
hang da29b194a7 hang-用户登录日志 -03 2023-07-17 10:21:21 +08:00
hang 010a69f7ad hang-用户登录日志 -02 2023-07-17 10:21:17 +08:00
hang 242bae10d1 hang - 用户登录日志修改-01 2023-07-17 10:21:11 +08:00
he b44f79ab60 S-66 同步 2023-07-14 16:20:19 +08:00
he 4f5d817789 S-65 确认就同步标准 2023-07-14 16:19:17 +08:00
he fd13769010 S-64 2023-07-14 13:40:02 +08:00
he fb94e1cf6c S-63 2023-07-14 11:21:59 +08:00
he b03d539578 S-62 2023-07-14 10:59:05 +08:00
he 9f4582bf27 S-61 2023-07-13 17:18:38 +08:00
he 3a79251b91 S-60 VisitHelper 任务临床状态维护 2023-07-13 14:06:56 +08:00
he b4bc39f0d9 S-59 2023-07-13 13:53:11 +08:00
he 2526ac32fa S-58 2023-07-13 11:40:30 +08:00
he fc71dea8e9 S-57 2023-07-13 11:37:51 +08:00
he 27b51e7ede S-56 2023-07-13 10:55:59 +08:00
he 5511d6339e S-55 2023-07-12 18:11:18 +08:00
he 79a4ad8cfd S-54 2023-07-12 17:53:00 +08:00
he a23325584b S-53 2023-07-12 17:12:28 +08:00
he 61cdb2fada S-52 2023-07-12 16:06:52 +08:00
he 8b96163e37 S-51 2023-07-12 15:55:20 +08:00
he d84e246b23 S-50 2023-07-12 15:19:39 +08:00
he 3dd7da5a39 S-50 2023-07-12 15:19:18 +08:00
he 260e29989c S-49 任务的临床状态维护 2023-07-12 15:13:26 +08:00
he a08cc44cd0 S-48 2023-07-12 14:03:40 +08:00
he 98cc35e614 S-47 2023-07-12 13:55:45 +08:00
he b5e4b7db86 S-46 2023-07-12 11:41:49 +08:00
he a10a9a2255 S-45 2023-07-12 10:31:58 +08:00
he 18f5bcd62f S-44 2023-07-11 18:02:37 +08:00
he c2cbbba637 S-43 2023-07-11 16:30:50 +08:00
he 8e9b9c54fd S-42 2023-07-11 15:39:07 +08:00
he f0a7af4af1 S-41 2023-07-11 12:42:43 +08:00
he 2c262f27ad S-40 2023-07-11 11:49:48 +08:00
he a4819c4016 S-39 2023-07-11 10:10:07 +08:00
he 52e7166177 S-38 2023-07-10 16:50:46 +08:00
he 581f7fcbf3 S-37 2023-07-10 14:52:40 +08:00
he 65da0b877b S-36 2023-07-10 14:46:23 +08:00
he 06e8dc21fa Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-10 09:14:51 +08:00
he 03c07cf969 S-35 2023-07-10 09:14:33 +08:00
hang a52aac876a Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-07 16:25:30 +08:00
hang 32d8f8b648 国际化修改 2023-07-07 16:25:11 +08:00
he bfeb41fea9 S-34 2023-07-07 13:48:47 +08:00
he fb118d88f1 S-33 2023-07-07 11:32:38 +08:00
he aacce0b453 S-32 2023-07-07 11:16:23 +08:00
he cee382651b S-31 2023-07-07 10:43:32 +08:00
he 64633a1d63 S-30 2023-07-07 09:24:20 +08:00
he 63e5880154 S-29 2023-07-06 17:51:41 +08:00
he 5e383cb7b5 S-28 2023-07-06 17:36:10 +08:00
he 163af3b269 S-27 2023-07-06 17:06:20 +08:00
he c1bfa55ea6 S-26 2023-07-06 16:40:57 +08:00
he 5ffcc21917 S-25 2023-07-06 15:57:05 +08:00
he 790b69d0a6 S-24 2023-07-06 15:13:58 +08:00
he 313e07de43 S-23 2023-07-06 14:58:06 +08:00
he 7b27009d31 S-22 2023-07-06 14:55:07 +08:00
he 6b318f94fd S-21 2023-07-06 14:21:17 +08:00
he 7da1b40a5c S-20 2023-07-06 13:41:22 +08:00
he d90a98c1ef S-19 2023-07-06 13:20:02 +08:00
he 8a174711f4 S-18 2023-07-06 10:11:23 +08:00
he 48f386546e S-17 2023-07-06 09:38:05 +08:00
he 24d7912f1f S-16 2023-07-06 09:16:16 +08:00
he 090868b299 S-15 2023-07-05 18:31:09 +08:00
he 6dbfda36ee S_014 2023-07-05 17:50:31 +08:00
he 4c6315f2a5 S-13 2023-07-05 16:51:11 +08:00
he e2cdbb7580 修改 2023-07-05 16:33:27 +08:00
he 13abd86be0 S-011 2023-07-05 15:51:41 +08:00
he 8364b00d3f S-010 2023-07-05 15:34:14 +08:00
he 274e4fdcce S-009 2023-07-05 14:49:53 +08:00
he 5354d3b9dc S-008 2023-07-05 14:49:19 +08:00
he 560f58a7b3 S-007 2023-07-05 13:51:32 +08:00
he b3697c1e21 S-006 临床数据 2023-07-05 12:57:59 +08:00
hang 051b61b2e8 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-05 11:44:58 +08:00
hang fc229fb645 中心调研两个版本修改 2023-07-05 11:44:39 +08:00
hang 93517d90ec 修改中心调研 2023-07-05 11:44:35 +08:00
he 0611e373b8 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-05 11:43:51 +08:00
he cadaf368ef 修改 2023-07-05 11:43:33 +08:00
hang ddcd9cb0c1 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-05 10:33:57 +08:00
hang d00158fa38 修改用户登录日志 2023-07-05 10:33:52 +08:00
he 4a6dfc9a2a Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-05 10:30:50 +08:00
he e0829ffecf S-004 临床数据 2023-07-05 10:30:37 +08:00
hang 02ce0c993d Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-05 09:35:47 +08:00
hang ac3eaea3f6 hang-S-002增加枚举,修改密码,重置密码,记录日志 2023-07-05 09:35:38 +08:00
hang 891af745bb 用户日志修改 2023-07-04 17:03:15 +08:00
he 3e49e78dfe S-003 临床数据 2023-07-04 15:48:20 +08:00
he c67dcb1d5c S-002 临床数据修改 2023-07-04 15:24:34 +08:00
hang 0208edb9ed hang_S_1_可逆加密算法增加 2023-07-04 15:24:06 +08:00
he 7f966b0a24 S-01临床数据 2023-07-04 15:03:52 +08:00
he b6f398bd2b 修改 2023-07-04 14:15:26 +08:00
he cb096a1d9b 修改 2023-07-04 13:55:46 +08:00
he 9913ff67ca Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-04 13:55:25 +08:00
he 9f4b274985 修改 2023-07-04 13:55:16 +08:00
hang 6903ccb3a6 测试环境修改配置环境,同步中心影像测试 2023-07-04 13:45:17 +08:00
he 020fbf33e5 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-04 13:34:40 +08:00
he a7b8cc6307 修改 2023-07-04 13:34:22 +08:00
hang 1e5edd1c4c 医学审核修改,暂时不让报错,需要修改之前的接口,待定 2023-07-04 13:25:09 +08:00
hang faafc8fdfc 修改限制配置时间 2023-07-04 11:59:01 +08:00
hang 75543f9bcf 修改用户类型角色 2023-07-04 11:30:29 +08:00
hang 5f158137dd Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-04 09:23:37 +08:00
hang e7f281a03d 修改暂存 2023-07-04 09:23:29 +08:00
he 6813b42ae1 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-03 18:02:20 +08:00
he b20d78c102 修改 2023-07-03 18:02:03 +08:00
hang ec3087efc4 测试挑拣 2023-07-03 17:12:40 +08:00
hang bf04562180 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-03 17:10:08 +08:00
hang 2faec8513f 启动配置文件修改 2023-07-03 17:10:04 +08:00
he a8b732abb9 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-03 16:57:42 +08:00
he fbf90b4efc 修改 2023-07-03 16:57:33 +08:00
hang 34aa515344 暂时不让统计报错 2023-07-03 16:55:29 +08:00
hang 35f8379d65 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-03 16:50:40 +08:00
hang 9d752286f4 修改配置文件 2023-07-03 16:50:33 +08:00
he 6b854cc9ad Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-03 16:45:27 +08:00
he 58e11f12e1 修改 2023-07-03 16:45:17 +08:00
hang 850c44b12a Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-03 16:42:16 +08:00
hang d6a37cbd6b 暂时修改 2023-07-03 16:42:08 +08:00
he f2dee26cdb 修改 2023-07-03 15:58:47 +08:00
he 2ee115a47d 修改 2023-07-03 14:48:05 +08:00
he 849c0be13d 修改 2023-07-03 14:42:45 +08:00
he 9a51c7a3b6 修改 2023-07-03 14:34:59 +08:00
he e9e083d9ee 修改 2023-07-03 14:25:01 +08:00
he bb871a32fd 修改 2023-07-03 14:19:56 +08:00
he 04811681a3 修改 2023-07-03 14:11:44 +08:00
he ec3f4cf121 Merge branch 'master' of http://192.168.1.2:8033/IRaCIS_Core_Api 2023-07-03 14:03:54 +08:00
he e2060a1460 删除表单数据 2023-07-03 14:03:29 +08:00
hang 4a70ba0134 角色列表查询增加展示具体的枚举值 2023-07-03 14:00:06 +08:00
hang 630fda3c45 x 2023-07-03 13:35:48 +08:00
hang 04762b3f7e 修改接口名字 2023-07-03 13:34:40 +08:00
hang 00b48695f6 修改接口名字 2023-07-03 13:34:22 +08:00
hang e996557b51 模拟提交2 2023-07-03 11:34:17 +08:00
hang e5faf00df9 模拟提交1 2023-07-03 11:33:54 +08:00
hang 4beca9497b 去掉添加修改项目里面写死的权限控制 2023-07-03 11:10:45 +08:00
586 changed files with 54949 additions and 13835 deletions
+5
View File
@@ -23,3 +23,8 @@
**/values.dev.yaml **/values.dev.yaml
LICENSE LICENSE
README.md README.md
!**/.gitignore
!.git/HEAD
!.git/config
!.git/packed-refs
!.git/refs/heads/**
+5 -37
View File
@@ -126,46 +126,14 @@ csharp_style_deconstructed_variable_declaration = true:suggestion
csharp_style_unused_value_assignment_preference = discard_variable:suggestion csharp_style_unused_value_assignment_preference = discard_variable:suggestion
csharp_style_unused_value_expression_statement_preference = discard_variable:silent csharp_style_unused_value_expression_statement_preference = discard_variable:silent
# SA0001: XML comment analysis disabled
dotnet_diagnostic.SA0001.severity = suggestion
# SA1002: Semicolons should be spaced correctly
dotnet_diagnostic.SA1002.severity = suggestion
# SA1005: Single line comments should begin with single space
dotnet_diagnostic.SA1005.severity = none
dotnet_diagnostic.CS8618.severity = none
dotnet_diagnostic.CS8604.severity = none
dotnet_diagnostic.CS8600.severity = none
dotnet_diagnostic.CS1570.severity = none dotnet_diagnostic.CS1570.severity = none
dotnet_diagnostic.CS8601.severity = none dotnet_diagnostic.CS1587.severity = none
dotnet_diagnostic.CS8632.severity = none
dotnet_diagnostic.CS8625.severity = none
dotnet_diagnostic.CS8603.severity = none
dotnet_diagnostic.CS8602.severity = none
dotnet_diagnostic.CS1998.severity = none
dotnet_diagnostic.CS0168.severity = none
dotnet_diagnostic.CS0219.severity = none
dotnet_diagnostic.CS0108.severity = none
dotnet_diagnostic.CS0120.severity = none
dotnet_diagnostic.CS8620.severity = none
dotnet_diagnostic.CS8619.severity = none dotnet_diagnostic.CS8619.severity = none
dotnet_diagnostic.CS0162.severity = none dotnet_diagnostic.CS8620.severity = none
dotnet_diagnostic.CS0472.severity = none dotnet_diagnostic.CS8632.severity = none
dotnet_diagnostic.CS8604.severity = none
dotnet_diagnostic.CS8629.severity = none dotnet_diagnostic.CS1998.severity = none
dotnet_diagnostic.CS8073.severity = none
dotnet_diagnostic.CS0414.severity = none
dotnet_diagnostic.CS1573.severity = none
dotnet_diagnostic.CS0109.severity = none
csharp_style_prefer_method_group_conversion = true:silent
csharp_style_prefer_top_level_statements = true:silent
dotnet_diagnostic.SA1003.severity = silent
dotnet_diagnostic.SA1108.severity = silent
dotnet_diagnostic.SA1107.severity = silent
[*.vb] [*.vb]
#### 命名样式 #### #### 命名样式 ####
+2 -24
View File
@@ -1,26 +1,4 @@
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM registry.cn-shanghai.aliyuncs.com/extimaging/aspnetcore:v8.2
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app WORKDIR /app
EXPOSE 80 COPY publish .
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["IRaCIS.Core.API/IRaCIS.Core.API.csproj", "IRaCIS.Core.API/"]
COPY ["IRaCIS.Core.Application/IRaCIS.Core.Application.csproj", "IRaCIS.Core.Application/"]
COPY ["IRaCIS.Core.Infra.EFCore/IRaCIS.Core.Infra.EFCore.csproj", "IRaCIS.Core.Infra.EFCore/"]
COPY ["IRaCIS.Core.Domain/IRaCIS.Core.Domain.csproj", "IRaCIS.Core.Domain/"]
COPY ["IRaCIS.Core.Domain.Share/IRaCIS.Core.Domain.Share.csproj", "IRaCIS.Core.Domain.Share/"]
COPY ["IRaCIS.Core.Infrastructure/IRaCIS.Core.Infrastructure.csproj", "IRaCIS.Core.Infrastructure/"]
RUN dotnet restore "IRaCIS.Core.API/IRaCIS.Core.API.csproj"
COPY . .
WORKDIR "/src/IRaCIS.Core.API"
RUN dotnet build "IRaCIS.Core.API.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "IRaCIS.Core.API.csproj" -c Release -o /app/publish /p:UseAppHost=false
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "IRaCIS.Core.API.dll"] ENTRYPOINT ["dotnet", "IRaCIS.Core.API.dll"]
@@ -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)));
}
}
}
}
@@ -0,0 +1,28 @@
using System;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc.ModelBinding;
namespace IRaCIS.Core.SCP.Filter
{
#region snippet_DisableFormValueModelBindingAttribute
[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)
{
}
}
#endregion
}
@@ -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;//标记当前异常已经被处理过了
}
}
}
@@ -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.Application.Services.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(StaticData.International("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;
}
}
}
+62
View File
@@ -0,0 +1,62 @@
using FellowOakDicom.Imaging;
using SixLabors.ImageSharp.Formats.Jpeg;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.Processing;
using System.Security.Cryptography;
using System.Text;
namespace IRaCIS.Core.Application.Helper;
public static class ImageHelper
{
// 采用ImageSharp组件 跨平台,不依赖windows 平台图像处理组件,这里大坑(net 6 下,之前由于Dicom处理最新组件 依赖了这个库的一个旧版本,导致缩略图bug,单独升级依赖组件才解决)
public static void ResizeSave(string filePath, string? fileStorePath)
{
fileStorePath = fileStorePath ?? filePath + ".preview.jpeg";
using (var image = SixLabors.ImageSharp.Image.Load(filePath))
{
image.Mutate(x => x.Resize(500, 500));
image.Save(fileStorePath);
}
}
public static Stream RenderPreviewJpeg(string filePath)
{
string jpegPath = filePath + ".preview.jpg";
if (!File.Exists(jpegPath))
{
using (Stream stream = new FileStream(jpegPath, FileMode.Create))
{
DicomImage image = new DicomImage(filePath);
var sharpimage = image.RenderImage().AsSharpImage();
sharpimage.Save(stream, new JpegEncoder());
}
}
return new FileStream(jpegPath, FileMode.Open);
}
public static void RemovePreviewJpeg(string filePath)
{
string jpegPath = filePath + ".preview.jpg";
if (File.Exists(jpegPath)) File.Delete(jpegPath);
}
}
@@ -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.Application.Services;
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();
}
}
}
+64
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);
});
}
}
}
@@ -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;
});
}
}
}
@@ -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;
}
}
}
@@ -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);
}
}
}
}
+37
View File
@@ -0,0 +1,37 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Aliyun.OSS.SDK.NetCore" Version="2.13.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="DistributedLock.Core" Version="1.0.6" />
<PackageReference Include="DistributedLock.SqlServer" Version="1.0.4" />
<PackageReference Include="fo-dicom" Version="5.1.2" />
<PackageReference Include="fo-dicom.Codecs" Version="5.12.0" />
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.4" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" />
<PackageReference Include="AutoMapper" Version="13.0.1" />
<PackageReference Include="Minio" Version="6.0.2" />
<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.0.3" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="8.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\IRaCIS.Core.Domain\IRaCIS.Core.Domain.csproj" />
<ProjectReference Include="..\IRaCIS.Core.Infra.EFCore\IRaCIS.Core.Infra.EFCore.csproj" />
</ItemGroup>
</Project>
+214
View File
@@ -0,0 +1,214 @@
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);
//转发头设置 获取真实IP
builder.Services.Configure<ForwardedHeadersOptions>(options =>
{
options.ForwardedHeaders =
ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
});
//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
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();
@@ -0,0 +1,25 @@
{
"$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"
}
}
}
}
+118
View File
@@ -0,0 +1,118 @@
using AutoMapper;
using IRaCIS.Application.Services.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 IRepository _repository { 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(_repository))]
public IRepository _repository { 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(_repository))]
public IRepository _repository { 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 IRepository _repository { 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
}
+370
View File
@@ -0,0 +1,370 @@
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)
: base(stream, fallbackEncoding, log, dependencies)
{
}
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);
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);
if (!_SCPStudyIdList.Contains(scpStudyId))
{
_SCPStudyIdList.Add(scpStudyId);
}
var series = await _seriesRepository.FindAsync(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));
}
}
}
+352
View File
@@ -0,0 +1,352 @@
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;
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)
{
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.FindAsync(studyId);
var findSerice = await _seriesRepository.FindAsync(seriesId);
var findInstance = await _instanceRepository.FindAsync(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
};
++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 });
}
//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);
}
}
}
@@ -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);
}
}
+442
View File
@@ -0,0 +1,442 @@
using Aliyun.OSS;
using IRaCIS.Core.Infrastructure;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Options;
using Minio.DataModel.Args;
using Minio;
using SharpCompress.Common;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.AccessControl;
using System.Text;
using System.Threading.Tasks;
using System.Runtime.InteropServices;
namespace IRaCIS.Core.SCP
{
public class MinIOOptions : AWSOptions
{
public int port { get; set; }
}
public class AWSOptions
{
public string endPoint { get; set; }
public bool useSSL { get; set; }
public string accessKey { get; set; }
public string secretKey { get; set; }
public string bucketName { get; set; }
public string viewEndpoint { 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 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 AliyunOSSOptions AliyunOSS { get; set; }
public MinIOOptions MinIO { get; set; }
public AWSOptions AWS { get; set; }
}
public class AliyunOSSTempToken
{
public string AccessKeyId { get; set; }
public string AccessKeySecret { get; set; }
public string SecurityToken { get; set; }
public string Expiration { get; set; }
public string Region { get; set; }
public string BucketName { get; set; }
public string ViewEndpoint { get; set; }
}
public enum ObjectStoreUse
{
AliyunOSS = 0,
MinIO = 1,
AWS = 2,
}
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 class OSSService : IOSSService
{
public ObjectStoreServiceOptions ObjectStoreServiceOptions { 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)
{
var ossRelativePath = isFileNameAddGuid ? $"{oosFolderPath}/{Guid.NewGuid()}_{fileRealName}" : $"{oosFolderPath}/{fileRealName}";
//var ossRelativePath = $"{oosFolderPath}/{Guid.NewGuid()}_{fileRealName}";
//var ossRelativePath = 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, aliConfig.accessKeyId, aliConfig.accessKeySecret);
// 上传文件
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.accessKey, minIOConfig.secretKey).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 minIOConfig = ObjectStoreServiceOptions.AWS;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.endPoint}")
.WithCredentials(minIOConfig.accessKey, minIOConfig.secretKey).WithSSL(minIOConfig.useSSL)
.Build();
var putObjectArgs = new PutObjectArgs()
.WithBucket(minIOConfig.bucketName)
.WithObject(ossRelativePath)
.WithStreamData(memoryStream)
.WithObjectSize(memoryStream.Length);
await minioClient.PutObjectAsync(putObjectArgs);
}
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>
/// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
public async Task<string> UploadToOSSAsync(string localFilePath, string oosFolderPath, bool isFileNameAddGuid = true)
{
var localFileName = Path.GetFileName(localFilePath);
var ossRelativePath = isFileNameAddGuid ? $"{oosFolderPath}/{Guid.NewGuid()}_{localFileName}" : $"{oosFolderPath}/{localFileName}";
//var ossRelativePath = oosFolderPath + "/" + localFileName;
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.endPoint : aliConfig.internalEndpoint, aliConfig.accessKeyId, aliConfig.accessKeySecret);
// 上传文件
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.accessKey, minIOConfig.secretKey).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 minIOConfig = ObjectStoreServiceOptions.AWS;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.endPoint}")
.WithCredentials(minIOConfig.accessKey, minIOConfig.secretKey).WithSSL(minIOConfig.useSSL)
.Build();
var putObjectArgs = new PutObjectArgs()
.WithBucket(minIOConfig.bucketName)
.WithObject(ossRelativePath)
.WithFileName(localFilePath);
await minioClient.PutObjectAsync(putObjectArgs);
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
return "/" + ossRelativePath;
}
public async Task DownLoadFromOSSAsync(string ossRelativePath, string localFilePath)
{
ossRelativePath = ossRelativePath.TrimStart('/');
try
{
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.endPoint : aliConfig.internalEndpoint, aliConfig.accessKeyId, aliConfig.accessKeySecret);
// 上传文件
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.accessKey, minIOConfig.secretKey).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 minIOConfig = ObjectStoreServiceOptions.AWS;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.endPoint}")
.WithCredentials(minIOConfig.accessKey, minIOConfig.secretKey).WithSSL(minIOConfig.useSSL)
.Build();
var getObjectArgs = new GetObjectArgs()
.WithBucket(minIOConfig.bucketName)
.WithObject(ossRelativePath)
.WithFile(localFilePath);
await minioClient.GetObjectAsync(getObjectArgs);
}
else
{
throw new BusinessValidationFailedException("未定义的存储介质类型");
}
}
catch (Exception ex)
{
throw new BusinessValidationFailedException("oss下载失败!" + ex.Message);
}
}
public async Task<string> GetSignedUrl(string ossRelativePath)
{
ossRelativePath = ossRelativePath.TrimStart('/');
try
{
if (ObjectStoreServiceOptions.ObjectStoreUse == "AliyunOSS")
{
var aliConfig = ObjectStoreServiceOptions.AliyunOSS;
var _ossClient = new OssClient(RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? aliConfig.endPoint : aliConfig.internalEndpoint, aliConfig.accessKeyId, aliConfig.accessKeySecret);
// 生成签名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.accessKey, minIOConfig.secretKey).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 minIOConfig = ObjectStoreServiceOptions.AWS;
var minioClient = new MinioClient().WithEndpoint($"{minIOConfig.endPoint}")
.WithCredentials(minIOConfig.accessKey, minIOConfig.secretKey).WithSSL(minIOConfig.useSSL)
.Build();
var args = new PresignedGetObjectArgs()
.WithBucket(minIOConfig.bucketName)
.WithObject(ossRelativePath)
.WithExpiry(3600);
var presignedUrl = await minioClient.PresignedGetObjectAsync(args);
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);
}
}
}
}
@@ -10,12 +10,13 @@
"ObjectStoreUse": "AliyunOSS", "ObjectStoreUse": "AliyunOSS",
"AliyunOSS": { "AliyunOSS": {
"regionId": "cn-shanghai", "regionId": "cn-shanghai",
"internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"endpoint": "https://oss-cn-shanghai.aliyuncs.com", "endpoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ", "accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ",
"accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio", "accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio",
"bucketName": "zy-sir-store", "bucketName": "zy-irc-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload", "roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-sir-cache.oss-cn-shanghai.aliyuncs.com", "viewEndpoint": "https://zy-irc-cache.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai" "region": "oss-cn-shanghai"
}, },
@@ -30,10 +31,8 @@
}, },
"ConnectionStrings": { "ConnectionStrings": {
//"RemoteNew": "Server=47.117.165.18,1434;Database=Prod_Study;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true", "RemoteNew": "Server=us-prod-mssql-service,1433;Database=US_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
//"Hangfire": "Server=47.117.165.18,1434;Database=Prod_Study_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true", "Hangfire": "Server=us-prod-mssql-service,1433;Database=US_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
"RemoteNew": "Server=prod_mssql_standard,1433;Database=Prod_Study;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
"Hangfire": "Server=prod_mssql_standard,1433;Database=Prod_Study_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
}, },
"BasicSystemConfig": { "BasicSystemConfig": {
@@ -10,23 +10,24 @@
"ObjectStoreUse": "AliyunOSS", "ObjectStoreUse": "AliyunOSS",
"AliyunOSS": { "AliyunOSS": {
"regionId": "cn-shanghai", "regionId": "cn-shanghai",
"endpoint": "https://oss-cn-shanghai.aliyuncs.com", "internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"endPoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ", "accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ",
"accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio", "accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio",
"bucketName": "zy-sir-test-store", "bucketName": "zy-irc-test-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload", "roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-sir-test-store.oss-cn-shanghai.aliyuncs.com", "viewEndpoint": "https://zy-irc-test-store.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai" "region": "oss-cn-shanghai"
}, },
"MinIO": { "MinIO": {
"endPoint": "123.56.94.154", "endPoint": "106.14.89.110",
"port": "9001", "port": "9001",
"useSSL": true, "useSSL": false,
"accessKey": "fbStsVYCIPKHQneeqMwD", "accessKey": "fbStsVYCIPKHQneeqMwD",
"secretKey": "TzgvyA3zGXMUnpilJNUlyMYHfosl1hBMl6lxPmjy", "secretKey": "TzgvyA3zGXMUnpilJNUlyMYHfosl1hBMl6lxPmjy",
"bucketName": "study-test", "bucketName": "hir-test",
"viewEndpoint": "http://study.test.extimaging.com/oss/study-test" "viewEndpoint": "http://106.14.89.110:9001/hir-test/"
}, },
"AWS": { "AWS": {
@@ -40,8 +41,8 @@
}, },
"ConnectionStrings": { "ConnectionStrings": {
"RemoteNew": "Server=106.14.89.110,1435;Database=Test_Study;User ID=sa;Password=xc@123456;TrustServerCertificate=true", "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_Study_Hangfire;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"
}, },
"BasicSystemConfig": { "BasicSystemConfig": {
@@ -66,6 +67,14 @@
"AuthorizationCode": "zhanying123", "AuthorizationCode": "zhanying123",
"SiteUrl": "http://study.test.extimaging.com/login" "SiteUrl": "http://study.test.extimaging.com/login"
},
"DicomSCPServiceConfig": {
"CalledAEList": [
"STORESCP",
"Value1",
"Value2",
"Value3"
],
"ServerPort": 11112
} }
} }
+67
View File
@@ -0,0 +1,67 @@
{
"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": "LTAI5tKvzs7ed3UfSpNk3xwQ",
"accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio",
"bucketName": "zy-irc-uat-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-irc-uat-store.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai"
},
"AWS": {
"endPoint": "s3.us-east-1.amazonaws.com",
"useSSL": false,
"accessKey": "AKIAZQ3DRSOHFPJJ6FEU",
"secretKey": "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",
"bucketName": "ei-irc-test-store",
"viewEndpoint": "https://ei-irc-test-store.s3.amazonaws.com/"
}
},
"ConnectionStrings": {
"RemoteNew": "Server=47.117.164.182,1434;Database=Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=47.117.164.182,1434;Database=Uat_IRC.Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"BasicSystemConfig": {
"OpenUserComplexPassword": false,
"OpenSignDocumentBeforeWork": false,
"OpenTrialRelationDelete": true,
"OpenLoginLimit": false,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30
},
"SystemEmailSendConfig": {
"Port": 465,
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "uat-study@extimaging.com",
"FromName": "Uat_Study",
"AuthorizationCode": "zhanying123",
"SiteUrl": "http://study.uat.extimaging.com/login"
},
"DicomSCPServiceConfig": {
"CalledAEList": [
"STORESCP",
"Value1",
"Value2",
"Value3"
],
"ServerPort": 11112
}
}
+9
View File
@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}
+6
View File
@@ -17,6 +17,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Infra.EFCore",
EndProject EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Infrastructure", "IRaCIS.Core.Infrastructure\IRaCIS.Core.Infrastructure.csproj", "{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}" Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IRaCIS.Core.Infrastructure", "IRaCIS.Core.Infrastructure\IRaCIS.Core.Infrastructure.csproj", "{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}"
EndProject EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "IRC.Core.SCP", "IRC.Core.SCP\IRC.Core.SCP.csproj", "{ECD08F47-DC1A-484E-BB91-6CDDC8823CC5}"
EndProject
Global Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU Debug|Any CPU = Debug|Any CPU
@@ -51,6 +53,10 @@ Global
{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Debug|Any CPU.Build.0 = Debug|Any CPU {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.ActiveCfg = Release|Any CPU
{07EED0F8-08E6-46F3-ACBE-17BC1391BD4C}.Release|Any CPU.Build.0 = 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
EndGlobalSection EndGlobalSection
GlobalSection(SolutionProperties) = preSolution GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE HideSolutionNode = FALSE
+99
View File
@@ -0,0 +1,99 @@
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; }
}
}
}
-231
View File
@@ -1,231 +0,0 @@
//using Autofac;
//using Autofac.Extensions.DependencyInjection;
//using IRaCIS.Core.API;
//using IRaCIS.Core.Application.Filter;
//using IRaCIS.Core.Application.MediatR.Handlers;
//using LogDashboard;
//using MassTransit;
//using MassTransit.NewIdProviders;
//using MediatR;
//using Microsoft.AspNetCore.Builder;
//using Microsoft.AspNetCore.Http.Features;
//using Microsoft.AspNetCore.HttpOverrides;
//using Microsoft.AspNetCore.SignalR;
//using Microsoft.Extensions.Configuration;
//using Microsoft.Extensions.DependencyInjection;
//using Microsoft.Extensions.Hosting;
//using Serilog;
//using System;
//var builder = WebApplication.CreateBuilder(args);
// //以配置文件为准,否则 从url中取环境值(服务以命令行传递参数启动,配置文件配置了就不需要传递环境参数)
// var config = new ConfigurationBuilder()
// .AddEnvironmentVariables()
// .Build();
// var enviromentName = config["ASPNETCORE_ENVIRONMENT"];
// if (string.IsNullOrWhiteSpace(enviromentName))
// {
// var index = Array.IndexOf(args, "--env");
// enviromentName = index > -1
// ? args[index + 1]
// : "Development";
// }
// NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
//builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory())
// .ConfigureContainer<ContainerBuilder>(containerBuilder =>
// {
// containerBuilder.RegisterModule<AutofacModuleSetup>();
// })
// .UseWindowsService().UseSerilog();
//// Add services to the container.
////本地化
//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>();
// //}
//}).AddNewtonsoftJsonSetup(); // NewtonsoftJson 序列化 处理
////动态WebApi + UnifiedApiResultFilter 省掉控制器代码
//builder.Services.AddDynamicWebApiSetup();
////AutoMapper
//builder.Services.AddAutoMapperSetup();
////EF ORM QueryWithNoLock
//builder.Services.AddEFSetup(builder.Configuration);
////Http 响应压缩
//builder.Services.AddResponseCompressionSetup();
////Swagger Api 文档
//builder.Services.AddSwaggerSetup();
////JWT Token 验证
//builder.Services.AddJWTAuthSetup(builder.Configuration);
//// MediatR 进程内消息 事件解耦 从程序集中 注册命令和handler对应关系
//builder.Services.AddMediatR(typeof(ConsistencyVerificationHandler).Assembly);
//// EasyCaching 缓存
//builder.Services.AddEasyCachingSetup();
////services.AddDistributedMemoryCache();
////// hangfire 定时任务框架 有界面,更友好~
//builder.Services.AddhangfireSetup(builder.Configuration);
////// QuartZ 定时任务框架 使用了hangfire 暂时不用,后续需要可以打开,已经配好
////builder.Services.AddQuartZSetup(_configuration);
//// 保护上传文件
////services.AddStaticFileAuthorizationSetup();
//////HttpReports 暂时废弃
////services.AddHttpReports().AddHttpTransport();
////Serilog 日志可视化 LogDashboard日志
//builder.Services.AddLogDashboardSetup();
////上传限制 配置
//builder.Services.Configure<FormOptions>(options =>
//{
// options.MultipartBodyLengthLimit = int.MaxValue;
// options.ValueCountLimit = int.MaxValue;
// options.ValueLengthLimit = int.MaxValue;
//});
////IP 限流 可设置白名单 或者黑名单
////services.AddIpPolicyRateLimitSetup(_configuration);
////用户类型 策略授权
//builder.Services.AddAuthorizationPolicySetup(builder.Configuration);
//builder.Services.AddJsonConfigSetup(builder.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.AddControllers();
//// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
////builder.Services.AddEndpointsApiExplorer();
////builder.Services.AddSwaggerGen();
////SerilogExtension.AddSerilogSetup(enviromentName, builder.Host.confi);
//var app = builder.Build();
//// Configure the HTTP request pipeline.
////本地化
//app.UseLocalization();
//app.UseForwardedHeaders();
////不需要 token 访问的静态文件 wwwroot css, JavaScript, and images don't require authentication.
//app.UseStaticFiles();
//app.UseIRacisHostStaticFileStore(app.Environment);
////LogDashboard
//app.UseLogDashboard("/LogDashboard");
////hangfire
////app.UseHangfireConfig(app.Environment);
//////暂时废弃
////app.UseHttpReports();
//////限流 中间件
////app.UseIpRateLimiting();
////响应压缩
//app.UseResponseCompression();
//if (app.Environment.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//}
//else
//{
// //app.UseHsts();
//}
//SwaggerSetup.Configure(app, app.Environment);
//Console.WriteLine("当前环境: " + builder.Environment.EnvironmentName);
////app.UseMiddleware<AuthMiddleware>();
//// 特殊异常处理 比如 404
//app.UseStatusCodePagesWithReExecute("/Error/{0}");
//////serilog 记录请求的用户信息
//app.UseSerilogConfig(app.Environment);
//app.UseRouting();
//app.UseCors(t => t.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
//app.UseAuthentication();
////app.UseJwtBearerQueryString();
//app.UseAuthorization();
//////文件伺服 必须带Token 访问
//////app.UseIRacisHostStaticFileStore(env);
////app.UseEndpoints(endpoints =>
////{
//// endpoints.MapControllers();
//// endpoints.MapHub<UploadHub>("/UploadHub")/*.RequireCors(t=>t.WithOrigins(new string[] {"null"}).AllowAnyMethod().AllowAnyHeader().AllowCredentials())*/;
////});
//app.MapControllers();
//app.MapHub<UploadHub>("/UploadHub")/*.RequireCors(t=>t.WithOrigins(new string[] {"null"}).AllowAnyMethod().AllowAnyHeader().AllowCredentials())*/;
//app.Run();
//测试同步
-106
View File
@@ -1,106 +0,0 @@
{
"needAnonymizeTag": [
{ //PatientsName
"Group": "0010",
"Element": "0010",
"ReplaceValue": "",
"Enable": true
},
{ // PatientID
"Group": "0010",
"Element": "0020",
"ReplaceValue": "",
"Enable": true
},
{ // IssuerOfPatientID
"Group": "0010",
"Element": "0021",
"ReplaceValue": "",
"Enable": true
},
{ // PatientsBirthDate
"Group": "0010",
"Element": "0030",
"ReplaceValue": "",
"Enable": true
},
{ // PatientsBirthTime
"Group": "0010",
"Element": "0032",
"ReplaceValue": "",
"Enable": false
},
{ // PatientsSex
"Group": "0010",
"Element": "0040",
"ReplaceValue": "",
"Enable": false
},
{ // OtherPatientIDs
"Group": "0010",
"Element": "1000",
"ReplaceValue": "",
"Enable": false
},
{ // OtherPatientNames
"Group": "0010",
"Element": "1001",
"ReplaceValue": "",
"Enable": false
},
{ // OtherPatientNames
"Group": "0010",
"Element": "1005",
"ReplaceValue": "",
"Enable": true
},
{ // PatientBirthName
"Group": "0010",
"Element": "1005",
"ReplaceValue": "",
"Enable": true
},
{ // PatientsAge
"Group": "0010",
"Element": "1010",
"ReplaceValue": "",
"Enable": true
},
{ // PatientsAddress
"Group": "0010",
"Element": "1040",
"ReplaceValue": "",
"Enable": true
},
{ // PatientsMothersBirthName
"Group": "0010",
"Element": "1060",
"ReplaceValue": "",
"Enable": true
},
{
"Group": "0010",
"Element": "2150",
"ReplaceValue": "",
"Enable": true
},
{
"Group": "0010",
"Element": "2152",
"ReplaceValue": "",
"Enable": true
},
{
"Group": "0010",
"Element": "2154",
"ReplaceValue": "",
"Enable": true
},
{
"Group": "0012",
"Element": "0040",
"ReplaceValue": "XXX",
"Enable": true
}
]
}
+168 -36
View File
@@ -21,13 +21,18 @@ using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using System.Linq; using System.Linq;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Aliyun.Acs.Core;
using Aliyun.Acs.Core.Profile;
using Aliyun.Acs.Sts.Model.V20150401;
using Microsoft.AspNetCore.Hosting;
using MassTransit; 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 IRaCIS.Core.Application.Helper;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using IRaCIS.Core.Application.Contracts;
using LoginReturnDTO = IRaCIS.Application.Contracts.LoginReturnDTO;
using DocumentFormat.OpenXml.Spreadsheet;
using AutoMapper.QueryableExtensions;
using NetTopologySuite.Algorithm;
namespace IRaCIS.Api.Controllers namespace IRaCIS.Api.Controllers
{ {
@@ -39,16 +44,110 @@ namespace IRaCIS.Api.Controllers
{ {
/// <summary>
/// 获取医生详情
/// </summary>
/// <param name="attachmentService"></param>
/// <param name="_doctorService"></param>
/// <param name="_educationService"></param>
/// <param name="_trialExperienceService"></param>
/// <param name="_researchPublicationService"></param>
/// <param name="_vacationService"></param>
/// <param name="doctorId"></param>
/// <returns></returns>
[HttpGet, Route("doctor/getDetail/{doctorId:guid}")]
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)
{
var education = await _educationService.GetEducation(doctorId);
var sowList = _doctorService.GetDoctorSowList(doctorId);
var ackSowList = _doctorService.GetDoctorAckSowList(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),
EducationList = education.EducationList,
PostgraduateList = education.PostgraduateList,
TrialExperienceView = await _trialExperienceService.GetTrialExperience(doctorId),
ResearchPublicationView = await _researchPublicationService.GetResearchPublication(doctorId),
SpecialtyView = await _doctorService.GetSpecialtyInfo(doctorId),
InHoliday = (await _vacationService.OnVacation(doctorId)).IsSuccess,
IntoGroupInfo = _doctorService.GetDoctorIntoGroupInfo(doctorId),
SowList = sowList,
AckSowList = ackSowList
};
return ResponseOutput.Ok(doctorDetail);
}
/// <summary> 系统用户登录接口[New] </summary> /// <summary> 系统用户登录接口[New] </summary>
[HttpPost, Route("user/login")] [HttpPost, Route("user/login")]
[AllowAnonymous] [AllowAnonymous]
public async Task<IResponseOutput<LoginReturnDTO>> Login(UserLoginDTO loginUser, [FromServices] IEasyCachingProvider provider, [FromServices] IUserService _userService, public async Task<IResponseOutput> Login(UserLoginDTO loginUser,
[FromServices] ITokenService _tokenService, [FromServices] IConfiguration configuration) [FromServices] IEasyCachingProvider provider,
[FromServices] IUserService _userService,
[FromServices] ITokenService _tokenService,
[FromServices] IReadingImageTaskService readingImageTaskService,
IOptionsMonitor<ServiceVerifyConfigOption> _verifyConfig,
IMailVerificationService _mailVerificationService)
{ {
//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); var returnModel = await _userService.Login(loginUser.UserName, loginUser.Password);
if (returnModel.IsSuccess) if (returnModel.IsSuccess)
@@ -114,26 +213,83 @@ namespace IRaCIS.Api.Controllers
#endregion #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;
var hiddenEmail = EmailMaskHelper.MaskEmail(email);
returnModel.Data.BasicInfo.EMail = hiddenEmail;
await _userService.SendMFAEmail(userId);
}
else
{
returnModel.Data.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(returnModel.Data.BasicInfo)); returnModel.Data.JWTStr = _tokenService.GetToken(IRaCISClaims.Create(returnModel.Data.BasicInfo));
// 创建一个 CookieOptions 对象,用于设置 Cookie 的属性 // 创建一个 CookieOptions 对象,用于设置 Cookie 的属性
var option = new CookieOptions var option = new CookieOptions
{ {
Expires = DateTime.Now.AddMonths(1), Expires = DateTime.Now.AddMonths(1), // 设置过期时间为 30 分钟之后
HttpOnly = true, // 确保 cookie 只能通过 HTTP 访问 HttpOnly = false, // 确保 cookie 只能通过 HTTP 访问
SameSite = Microsoft.AspNetCore.Http.SameSiteMode.Unspecified, // 设置 SameSite 属性 SameSite = Microsoft.AspNetCore.Http.SameSiteMode.None, // 设置 SameSite 属性
Secure = false // 确保 cookie 只能通过 HTTPS 访问 Secure = false // 确保 cookie 只能通过 HTTPS 访问
}; };
HttpContext.Response.Cookies.Append("access_token", returnModel.Data.JWTStr, option); HttpContext.Response.Cookies.Append("access_token", returnModel.Data.JWTStr, option);
}
var userId = returnModel.Data.BasicInfo.Id.ToString();
//provider.Set(userId, userId, TimeSpan.FromMinutes(AppSettings.LoginExpiredTimeSpan)); // 验证阅片休息时间
await readingImageTaskService.ResetReadingRestTime(returnModel.Data.BasicInfo.Id);
await provider.SetAsync(userId.ToString(), returnModel.Data.JWTStr, TimeSpan.FromDays(7)); 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 returnModel;
}
}
[HttpGet, Route("imageShare/ShareImage")]
[AllowAnonymous]
public IResponseOutput ShareImage([FromServices] ITokenService _tokenService)
{
var token = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo()
{
Id = Guid.Empty,
IsReviewer = false,
IsAdmin = false,
RealName = "Share001",
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")] [HttpGet("user/GetObjectStoreToken")]
@@ -239,30 +395,6 @@ namespace IRaCIS.Api.Controllers
[HttpGet, Route("imageShare/ShareImage")]
[AllowAnonymous]
public IResponseOutput ShareImage([FromServices] ITokenService _tokenService)
{
var token = _tokenService.GetToken(IRaCISClaims.Create(new UserBasicInfo()
{
Id = Guid.Empty,
IsReviewer = false,
IsAdmin = false,
RealName = "Share001",
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/UserRedirect")] [HttpGet("User/UserRedirect")]
[AllowAnonymous] [AllowAnonymous]
public async Task<IActionResult> UserRedirect([FromServices] IRepository<User> _userRepository, string url, [FromServices] ILogger<ExtraController> _logger) public async Task<IActionResult> UserRedirect([FromServices] IRepository<User> _userRepository, string url, [FromServices] ILogger<ExtraController> _logger)
@@ -22,14 +22,14 @@ namespace IRaCIS.Core.API.Controllers.Special
public class FinancialChangeController : ControllerBase public class FinancialChangeController : ControllerBase
{ {
private readonly ITrialService _trialService; private readonly ITrialService _trialService;
private readonly ICalculateService _calculateService;
private IStringLocalizer _localizer { get; set; } private IStringLocalizer _localizer { get; set; }
public FinancialChangeController(ITrialService trialService, IStringLocalizer localizer public FinancialChangeController(ITrialService trialService, ICalculateService calculateService, IStringLocalizer localizer
) )
{ {
_localizer = localizer; _localizer = localizer;
_trialService = trialService; _trialService = trialService;
_calculateService = calculateService;
} }
@@ -60,27 +60,267 @@ namespace IRaCIS.Core.API.Controllers.Special
var userId = Guid.Parse(User.FindFirst("id").Value); var userId = Guid.Parse(User.FindFirst("id").Value);
var result = await _trialService.AddOrUpdateTrial(param); 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);
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; return result;
} }
/// <summary>
/// 添加或更新工作量[AUTH]
/// </summary>
/// <param name="_trialWorkloadService"></param>
/// <param name="workLoadAddOrUpdateModel"></param>
/// <returns></returns>
[HttpPost, Route("doctorWorkload/workLoadAddOrUpdate")]
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> WorkLoadAddOrUpdate([FromServices] IDoctorWorkloadService _trialWorkloadService, WorkloadCommand workLoadAddOrUpdateModel)
{
var userId = Guid.Parse(User.FindFirst("id").Value);
var result = await _trialWorkloadService.AddOrUpdateWorkload(workLoadAddOrUpdateModel, userId);
if (result.IsSuccess && workLoadAddOrUpdateModel.DataFrom == 2)
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
workLoadAddOrUpdateModel.DoctorId
},
CalculateMonth = workLoadAddOrUpdateModel.WorkTime
}, User.FindFirst("id").Value);
}
return result;
}
[HttpDelete, Route("doctorWorkload/deleteWorkLoad/{id:guid}/{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> DeleteWorkLoad([FromServices] IDoctorWorkloadService _trialWorkloadService, Guid id)
{
//先判断该工作量的费用是否被锁定,如果被锁定,则不能删除
var workload = await _trialWorkloadService.GetWorkloadDetailById(id);
var yearMonth = workload.WorkTime.ToString("yyyy-MM");
var isLock = await _calculateService.IsLock(workload.DoctorId, yearMonth);
if (isLock)
{
//---Expenses have been settled and workload can not be reset.
return ResponseOutput.NotOk(_localizer["Financial_ChargeSettled"]);
}
var deleteResult = await _trialWorkloadService.DeleteWorkload(id);
if (workload.DataFrom == (int)Domain.Share.WorkLoadFromStatus.FinalConfirm)
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
workload.DoctorId
},
CalculateMonth = workload.WorkTime
}, User.FindFirst("id").Value);
}
return deleteResult;
}
/// <summary>
/// 添加或更新汇率(会触发没有对锁定的费用计算)
/// </summary>
[HttpPost, Route("exchangeRate/addOrUpdateExchangeRate")]
public async Task<IResponseOutput> AddOrUpdateExchangeRate([FromServices] IExchangeRateService _exchangeRateService, [FromServices] IPaymentAdjustmentService _costAdjustmentService, ExchangeRateCommand addOrUpdateModel)
{
var result = await _exchangeRateService.AddOrUpdateExchangeRate(addOrUpdateModel);
var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, addOrUpdateModel.YearMonth);
foreach (var item in calcList)
{
if (item != null)
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
item.DoctorId
},
CalculateMonth = DateTime.Parse(item.YearMonth)
}, User.FindFirst("id").Value);
}
}
await _costAdjustmentService.CalculateCNY(addOrUpdateModel.YearMonth, addOrUpdateModel.Rate);
return result;
}
/// <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 calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty);
foreach (var item in calcList)
{
if (item != null && needCalReviewerIds.Contains(item.DoctorId))
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
item.DoctorId
},
CalculateMonth = DateTime.Parse(item.YearMonth)
}, User.FindFirst("id").Value);
}
}
}
var userId = Guid.Parse(User.FindFirst("id").Value);
return await _rankPriceService.AddOrUpdateRankPrice(addOrUpdateModel, userId);
}
/// <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 calcList = await _calculateService.GetNeedCalculateReviewerList(addOrUpdateModel.DoctorId, string.Empty);
foreach (var item in calcList)
{
if (item != null)
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
item.DoctorId
},
CalculateMonth = DateTime.Parse(item.YearMonth)
}, User.FindFirst("id").Value);
}
}
return result;
}
/// <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 needCalReviewerIds = await _trialService.GetTrialEnrollmentReviewerIds(addOrUpdateModel.TrialId);
var calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty);
foreach (var item in calcList)
{
if (item != null && needCalReviewerIds.Contains(item.DoctorId))
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
item.DoctorId
},
CalculateMonth = DateTime.Parse(item.YearMonth)
}, User.FindFirst("id").Value);
}
}
return result;
}
/// <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 calcList = await _calculateService.GetNeedCalculateReviewerList(Guid.Empty, string.Empty);
foreach (var item in calcList)
{
if (item != null)
{
await _calculateService.CalculateMonthlyPayment(new CalculateDoctorAndMonthDTO()
{
NeedCalculateReviewers = new List<Guid>()
{
item.DoctorId
},
CalculateMonth = DateTime.Parse(item.YearMonth)
}, User.FindFirst("id").Value);
}
}
return result;
}
/// <summary>
/// 计算医生月度费用,并将计算的结果存入费用表
/// </summary>
[HttpPost, Route("financial/calculateMonthlyPayment")]
public async Task<IResponseOutput> CalculateMonthlyPayment(CalculateDoctorAndMonthDTO param)
{
if (!ModelState.IsValid)
{
//---Invalid parameter.
return ResponseOutput.NotOk(_localizer["Financial_InvalidParameter"]);
}
return await _calculateService.CalculateMonthlyPayment(param, User.FindFirst("id").Value);
}
/// <summary>
/// Financials /Monthly Payment 列表查询接口
/// </summary>
[HttpPost, Route("financial/getMonthlyPaymentList")]
public async Task<IResponseOutput<PaymentDTO>> GetMonthlyPaymentList([FromServices] IPaymentService _paymentService, [FromServices] IExchangeRateService _exchangeRateService, MonthlyPaymentQueryDTO queryParam)
{
return ResponseOutput.Ok(new PaymentDTO
{
CostList = await _paymentService.GetMonthlyPaymentList(queryParam),
ExchangeRate = await _exchangeRateService.GetExchangeRateByMonth(queryParam.StatisticsDate.ToString("yyyy-MM"))
});
}
} }
@@ -308,6 +308,23 @@ namespace IRaCIS.Core.API.Controllers
} }
/// <summary>
/// PM签名一致性分析临床数据
/// </summary>
/// <param name="opt"></param>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingClinicalData/SignConsistencyAnalysisReadingClinicalData")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "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>
/// 提交结构化录入并签名 /// 提交结构化录入并签名
/// </summary> /// </summary>
@@ -402,6 +419,19 @@ namespace IRaCIS.Core.API.Controllers
return result; return result;
} }
[HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialPACSInfoConfirm")]
[UnitOfWork]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "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;
}
/// <summary> /// <summary>
/// 签名确认 /// 签名确认
/// </summary> /// </summary>
@@ -419,6 +449,23 @@ namespace IRaCIS.Core.API.Controllers
} }
/// <summary>
/// 重置并同步项目阅片标准
/// </summary>
/// <returns></returns>
[HttpPost, Route("Inspection/ReadingCriterion/ResetAndAsyncCriterion")]
[UnitOfWork]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "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;
}
/// <summary> /// <summary>
/// CRC RequestToQC 批量提交 /// CRC RequestToQC 批量提交
@@ -10,8 +10,7 @@ using IRaCIS.Core.Application.Contracts.Dicom;
using IRaCIS.Core.Application.Contracts.Dicom.DTO; using IRaCIS.Core.Application.Contracts.Dicom.DTO;
using IRaCIS.Core.Application.Filter; using IRaCIS.Core.Application.Filter;
using IRaCIS.Core.Application.Helper; using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.MediatR.CommandAndQueries; using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Application.MediatR.Handlers;
using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Application.Service.ImageAndDoc; using IRaCIS.Core.Application.Service.ImageAndDoc;
using IRaCIS.Core.Application.Service.Reading.Dto; using IRaCIS.Core.Application.Service.Reading.Dto;
@@ -20,9 +19,8 @@ using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention; using IRaCIS.Core.Infrastructure.Extention;
using Magicodes.ExporterAndImporter.Excel;
using MassTransit; using MassTransit;
using MediatR; using MassTransit.Mediator;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Cors.Infrastructure; using Microsoft.AspNetCore.Cors.Infrastructure;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
@@ -33,12 +31,12 @@ using Microsoft.AspNetCore.SignalR;
using Microsoft.AspNetCore.StaticFiles; using Microsoft.AspNetCore.StaticFiles;
using Microsoft.AspNetCore.WebUtilities; using Microsoft.AspNetCore.WebUtilities;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Net.Http.Headers; using Microsoft.Net.Http.Headers;
using MiniExcelLibs; using MiniExcelLibs;
using Newtonsoft.Json; using Newtonsoft.Json;
using SharpCompress.Archives; using SharpCompress.Archives;
using SkiaSharp;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Data; using System.Data;
@@ -233,15 +231,22 @@ namespace IRaCIS.Core.API.Controllers
{ {
public IMapper _mapper { get; set; } public IMapper _mapper { get; set; }
public IUserInfo _userInfo { get; set; } public IUserInfo _userInfo { get; set; }
private readonly IMediator _mediator; private readonly IMediator _mediator;
public IStringLocalizer _localizer { get; set; }
private readonly IWebHostEnvironment _hostEnvironment; private readonly IWebHostEnvironment _hostEnvironment;
private readonly IRepository _repository; private readonly IRepository _repository;
private readonly IEasyCachingProvider _provider; private readonly IEasyCachingProvider _provider;
private readonly QCCommon _qCCommon; private readonly QCCommon _qCCommon;
public StudyController(IMapper mapper, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IMediator mediator, IEasyCachingProvider provider, public StudyController(IMapper mapper, IStringLocalizer localizer, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IMediator mediator, IEasyCachingProvider provider,
QCCommon qCCommon, QCCommon qCCommon,
IRepository repository) IRepository repository)
{ {
@@ -249,12 +254,13 @@ namespace IRaCIS.Core.API.Controllers
_provider = provider; _provider = provider;
_hostEnvironment = hostEnvironment; _hostEnvironment = hostEnvironment;
_mediator = mediator; _mediator = mediator;
_localizer = localizer;
_mapper = mapper; _mapper = mapper;
_userInfo = userInfo; _userInfo = userInfo;
_repository = repository; _repository = repository;
} }
[HttpPost, Route("Study/PreArchiveStudy")] [HttpPost, Route("Study/PreArchiveStudy")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
public async Task<IResponseOutput> PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand, public async Task<IResponseOutput> PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand,
@@ -262,17 +268,11 @@ namespace IRaCIS.Core.API.Controllers
[FromServices] IRepository<StudyMonitor> _studyMonitorRepository) [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 savedInfo = _studyService.GetSaveToDicomInfo(preArchiveStudyCommand.SubjectVisitId);
var studyMonitor = new StudyMonitor() var studyMonitor = new StudyMonitor()
{ {
TrialId = savedInfo.TrialId, TrialId = savedInfo.TrialId,
SiteId = savedInfo.SiteId,
SubjectId = savedInfo.SubjectId, SubjectId = savedInfo.SubjectId,
SubjectVisitId = savedInfo.SubjectVisitId, SubjectVisitId = savedInfo.SubjectVisitId,
@@ -312,7 +312,7 @@ namespace IRaCIS.Core.API.Controllers
string.IsNullOrEmpty(mediaTypeHeader.Boundary.Value)) string.IsNullOrEmpty(mediaTypeHeader.Boundary.Value))
{ {
//---不支持的MediaType //---不支持的MediaType
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_UnsupportedMedia")); return ResponseOutput.NotOk(_localizer["UploadDownLoad_UnsupportedMedia"]);
} }
var archiveStudyCommand = new ArchiveStudyCommand() { AbandonStudyId = abandonStudyId, StudyInstanceUid = studyInstanceUid, SubjectVisitId = subjectVisitId }; var archiveStudyCommand = new ArchiveStudyCommand() { AbandonStudyId = abandonStudyId, StudyInstanceUid = studyInstanceUid, SubjectVisitId = subjectVisitId };
@@ -401,12 +401,12 @@ namespace IRaCIS.Core.API.Controllers
} }
catch (Exception ex) catch (Exception)
{ {
_provider.Remove($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}"); _provider.Remove($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}");
//---请求异常,请重试! //---请求异常,请重试!
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_RequestError")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_RequestError"]);
} }
studyMonitor.FileSize = (decimal)HttpContext.Request.ContentLength; studyMonitor.FileSize = (decimal)HttpContext.Request.ContentLength;
@@ -460,248 +460,6 @@ namespace IRaCIS.Core.API.Controllers
} }
#region
///// <summary>
///// 上传临床数据 多文件
///// </summary>
///// <param name="subjectVisitId"></param>
///// <returns></returns>
//[HttpPost("ClinicalData/UploadVisitClinicalData/{trialId:guid}/{subjectVisitId:guid}")]
//[DisableRequestSizeLimit]
////[Authorize(Policy = IRaCISPolicy.CRC)]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
//public async Task<IResponseOutput> UploadVisitClinicalData(Guid subjectVisitId)
//{
// await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
// var sv = _repository.Where<SubjectVisit>(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.SiteId, t.SubjectId }).FirstOrDefault().IfNullThrowException();
// await FileUploadAsync(async (fileName) =>
// {
// var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetClinicalDataPath(_hostEnvironment, fileName, sv.TrialId, sv.SiteId, sv.SubjectId, subjectVisitId);
// //插入临床pdf 路径
// await _repository.AddAsync(new PreviousPDF()
// {
// SubjectVisitId = subjectVisitId,
// IsVisist = true,
// DataType = ClinicalDataType.MedicalHistory,
// UploadType = ClinicalUploadType.PDF,
// SubjectId = sv.SubjectId,
// TrialId = sv.TrialId,
// ClinicalLevel = ClinicalLevel.Subject,
// Path = relativePath,
// FileName = fileRealName
// });
// return serverFilePath;
// });
// await _repository.SaveChangesAsync();
// return ResponseOutput.Ok();
//}
///// <summary>
///// 上传临床数据模板
///// </summary>
///// <param name="trialId"></param>
///// <returns></returns>
//[HttpPost("ClinicalData/UploadClinicalTemplate")]
//[DisableRequestSizeLimit]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
//public async Task<IResponseOutput<List<FileDto>>> UploadClinicalTemplate(Guid? trialId)
//{
// if (trialId == null)
// trialId = default(Guid);
// var filerelativePath = string.Empty;
// List<FileDto> fileDtos = new List<FileDto>();
// await FileUploadAsync(async (fileName) =>
// {
// var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetClinicalTemplatePath(_hostEnvironment, fileName, trialId.Value);
// //插入临床pdf 路径
// filerelativePath = relativePath;
// fileDtos.Add(new FileDto()
// {
// FileName = fileName,
// Path = relativePath
// });
// await Task.CompletedTask;
// return serverFilePath;
// });
// return ResponseOutput.Ok(fileDtos);
//}
///// <summary>
///// 上传阅片临床数据
///// </summary>
///// <param name="trialId"></param>
///// <param name="subjectId"></param>
///// <param name="readingId"></param>
///// <returns></returns>
//[HttpPost("ClinicalData/UploadClinicalData/{trialId:guid}/{subjectId:guid}/{readingId:guid}")]
//[DisableRequestSizeLimit]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
//public async Task<IResponseOutput<List<FileDto>>> UploadReadClinicalData(Guid trialId, Guid subjectId, Guid readingId)
//{
// var filerelativePath = string.Empty;
// List<FileDto> fileDtos = new List<FileDto>();
// var siteid = await _repository.Where<Subject>(x => x.Id == subjectId).Select(x => x.SiteId).FirstOrDefaultAsync();
// await FileUploadAsync(async (fileName) =>
// {
// var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetReadClinicalDataPath(_hostEnvironment, fileName, trialId, siteid, subjectId, readingId);
// //插入临床pdf 路径
// filerelativePath = relativePath;
// fileDtos.Add(new FileDto()
// {
// FileName = fileName,
// Path = relativePath
// });
// await Task.CompletedTask;
// return serverFilePath;
// });
// return ResponseOutput.Ok(fileDtos);
//}
///// <summary>
///// 上传截图
///// </summary>
///// <param name="subjectId"></param>
///// <returns></returns>
//[HttpPost("Printscreen/UploadPrintscreen/{subjectId:guid}")]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
//public async Task<IResponseOutput<FileDto>> UploadPrintscreen(Guid subjectId)
//{
// var subjectInfo = await this._repository.Where<Subject>(x => x.Id == subjectId).FirstNotNullAsync();
// FileDto fileDto = new FileDto();
// await FileUploadAsync(async (fileName) =>
// {
// var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetUploadPrintscreenFilePath(_hostEnvironment, fileName, subjectInfo.TrialId, subjectInfo.SiteId, subjectInfo.Id);
// fileDto.Path = relativePath;
// fileDto.FileName = fileName;
// await Task.CompletedTask;
// return serverFilePath;
// });
// return ResponseOutput.Ok(fileDto);
//}
///// <summary>
///// 上传Reading问题的图像
///// </summary>
///// <param name="trialId"></param>
///// <param name="visitTaskId"></param>
///// <returns></returns>
//[HttpPost("VisitTask/UploadReadingAnswerImage/{trialId:guid}/{visitTaskId:guid}")]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
//public async Task<IResponseOutput<FileDto>> UploadReadingAnswerImage(Guid trialId, Guid visitTaskId)
//{
// FileDto fileDto = new FileDto();
// await FileUploadAsync(async (fileName) =>
// {
// var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetFilePath(_hostEnvironment, fileName, trialId, visitTaskId, StaticData.Folder.JudgeTask);
// fileDto.Path = relativePath;
// fileDto.FileName = fileName;
// await Task.CompletedTask;
// return serverFilePath;
// });
// return ResponseOutput.Ok(fileDto);
//}
///// <summary>
///// 上传裁判任务的图像
///// </summary>
///// <param name="trialId"></param>
///// <param name="visitTaskId"></param>
///// <returns></returns>
//[HttpPost("VisitTask/UploadJudgeTaskImage/{trialId:guid}/{visitTaskId:guid}")]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
//public async Task<IResponseOutput<FileDto>> UploadJudgeTaskImage(Guid trialId, Guid visitTaskId)
//{
// FileDto fileDto = new FileDto();
// await FileUploadAsync(async (fileName) =>
// {
// var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetFilePath(_hostEnvironment, fileName, trialId, visitTaskId, StaticData.Folder.JudgeTask);
// fileDto.Path = relativePath;
// fileDto.FileName = fileName;
// await Task.CompletedTask;
// return serverFilePath;
// });
// return ResponseOutput.Ok(fileDto);
//}
///// <summary>
///// 上传医学审核图片
///// </summary>
///// <param name="trialId"></param>
///// <param name="taskMedicalReviewId"></param>
///// <returns></returns>
//[HttpPost("TaskMedicalReview/UploadMedicalReviewImage/{trialId:guid}/{taskMedicalReviewId:guid}")]
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
//public async Task<IResponseOutput<FileDto>> UploadMedicalReviewImage(Guid trialId, Guid taskMedicalReviewId)
//{
// string path = string.Empty;
// FileDto fileDto = new FileDto();
// await FileUploadAsync(async (fileName) =>
// {
// var (serverFilePath, relativePath, fileRealName) = FileStoreHelper.GetMedicalReviewImage(_hostEnvironment, fileName, trialId, taskMedicalReviewId);
// //await _repository.UpdatePartialFromQueryAsync<TaskMedicalReview>(x => x.Id == taskMedicalReviewId, x => new TaskMedicalReview()
// //{
// // ImagePath = relativePath,
// // FileName = fileName,
// //});
// path = relativePath;
// fileDto.Path = relativePath;
// fileDto.FileName = fileName;
// return serverFilePath;
// });
// await _repository.SaveChangesAsync();
// return ResponseOutput.Ok(fileDto);
//}
#endregion
public class UploadNoneDicomFileCommand public class UploadNoneDicomFileCommand
{ {
public Guid TrialId { get; set; } public Guid TrialId { get; set; }
@@ -718,18 +476,21 @@ namespace IRaCIS.Core.API.Controllers
public string FilePath { get; set; } public string FilePath { get; set; }
public string FileName { get; set; } public string FileName { get; set; }
public int FileFize { get; set; } public int FileFize { get; set; }
public string FileType { get; set; }
} }
} }
/// <summary> /// <summary>
/// 上传非Dicom 文件 支持压缩包 多文件上传 /// 上传非Dicom 文件 支持压缩包 多文件上传
/// </summary> /// </summary>
/// <param name="incommand"></param>
/// <param name="_noneDicomStudyRepository"></param> /// <param name="_noneDicomStudyRepository"></param>
/// <param name="_studyMonitorRepository"></param>
/// <returns></returns> /// <returns></returns>
//[DisableRequestSizeLimit]
[HttpPost("NoneDicomStudy/UploadNoneDicomFile")] [HttpPost("NoneDicomStudy/UploadNoneDicomFile")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
//[Authorize(Policy = IRaCISPolicy.CRC)]
public async Task<IResponseOutput> UploadNoneDicomFile(UploadNoneDicomFileCommand incommand, public async Task<IResponseOutput> UploadNoneDicomFile(UploadNoneDicomFileCommand incommand,
[FromServices] IRepository<NoneDicomStudy> _noneDicomStudyRepository, [FromServices] IRepository<StudyMonitor> _studyMonitorRepository) [FromServices] IRepository<NoneDicomStudy> _noneDicomStudyRepository, [FromServices] IRepository<StudyMonitor> _studyMonitorRepository)
{ {
@@ -741,7 +502,7 @@ namespace IRaCIS.Core.API.Controllers
await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId); await _qCCommon.VerifyIsCRCSubmmitAsync(_repository, _userInfo, subjectVisitId);
var sv = (await _repository.Where<SubjectVisit>(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.SiteId, t.SubjectId }).FirstOrDefaultAsync()).IfNullThrowConvertException(); var sv = (await _repository.Where<SubjectVisit>(t => t.Id == subjectVisitId).Select(t => new { t.TrialId, t.TrialSiteId, t.SubjectId }).FirstOrDefaultAsync()).IfNullThrowConvertException();
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == studyMonitorId); var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == studyMonitorId);
@@ -749,7 +510,7 @@ namespace IRaCIS.Core.API.Controllers
foreach (var item in incommand.UploadedFileList) foreach (var item in incommand.UploadedFileList)
{ {
await _repository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, NoneDicomStudyId = noneDicomStudyId }); await _repository.AddAsync(new NoneDicomStudyFile() { FileName = item.FileName, Path = item.FilePath, NoneDicomStudyId = noneDicomStudyId,FileType=item.FileType });
} }
var uploadFinishedTime = DateTime.Now; var uploadFinishedTime = DateTime.Now;
@@ -766,20 +527,27 @@ namespace IRaCIS.Core.API.Controllers
studyMonitor.StudyCode = noneDicomStudy.StudyCode; studyMonitor.StudyCode = noneDicomStudy.StudyCode;
studyMonitor.ArchiveFinishedTime = DateTime.Now; studyMonitor.ArchiveFinishedTime = DateTime.Now;
studyMonitor.IP = _userInfo.IP; studyMonitor.IP = _userInfo.IP;
studyMonitor.IsSuccess = true;
await _repository.SaveChangesAsync(); await _repository.SaveChangesAsync();
return ResponseOutput.Ok(); return ResponseOutput.Ok();
} }
/// <summary> /// <summary>
/// 一致性核查 excel上传 支持三种格式 /// 一致性核查 excel上传 支持三种格式
/// </summary> /// </summary>
/// <param name="trialId"></param> /// <param name="trialId"></param>
/// <param name="oSSService"></param>
/// <returns></returns> /// <returns></returns>
/// <exception cref="BusinessValidationFailedException"></exception>
[HttpPost("QCOperation/UploadVisitCheckExcel/{trialId:guid}")] [HttpPost("QCOperation/UploadVisitCheckExcel/{trialId:guid}")]
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })] [TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
//[Authorize(Policy = IRaCISPolicy.PM_APM)]
public async Task<IResponseOutput> UploadVisitCheckExcel(Guid trialId, [FromServices] IOSSService oSSService) public async Task<IResponseOutput> UploadVisitCheckExcel(Guid trialId, [FromServices] IOSSService oSSService)
{ {
@@ -793,7 +561,7 @@ namespace IRaCIS.Core.API.Controllers
if (!fileName.EndsWith(".xlsx") && !fileName.EndsWith(".csv") && !fileName.EndsWith(".xls")) if (!fileName.EndsWith(".xlsx") && !fileName.EndsWith(".csv") && !fileName.EndsWith(".xls"))
{ {
//---支持.xlsx、.xls、.csv格式的文件上传。 //---支持.xlsx、.xls、.csv格式的文件上传。
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_SupportedFormats")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_SupportedFormats"]);
} }
fileStream.CopyTo(templateFileStream); fileStream.CopyTo(templateFileStream);
@@ -814,9 +582,22 @@ namespace IRaCIS.Core.API.Controllers
var etcCheckList = new List<CheckViewModel>(); var etcCheckList = new List<CheckViewModel>();
#region MiniExcel #region MiniExcel
if (fileName.EndsWith(".xlsx"))
{
etcCheckList = MiniExcel.Query<CheckViewModel>(templateFileStream, excelType: ExcelType.XLSX).ToList();
}
else if (fileName.EndsWith(".csv"))
{
//因为csv 需要加配置文件 不然都是null
etcCheckList = MiniExcel.Query<CheckViewModel>(templateFileStream, null, configuration: new MiniExcelLibs.Csv.CsvConfiguration()
{
StreamReaderFunc = (stream) => new StreamReader(stream, Encoding.GetEncoding("gb2312"))
}).ToList();
}
//if (fileName.EndsWith(".csv")) //if (fileName.EndsWith(".csv"))
//{ //{
// //因为csv 需要加配置文件 不然都是null // //因为csv 需要加配置文件 不然都是null
@@ -832,67 +613,72 @@ namespace IRaCIS.Core.API.Controllers
#endregion #endregion
#region net8
//Magicodes 支持自定义特性验证 //Magicodes 支持自定义特性验证
if (fileName.EndsWith(".xlsx")) // if (fileName.EndsWith(".xlsx"))
{ //{
var Importer = new ExcelImporter(); // var Importer = new ExcelImporter();
var import = await Importer.Import<CheckViewModel>(templateFileStream); // var import = await Importer.Import<CheckViewModel>(templateFileStream);
if (import.Exception != null) return ResponseOutput.NotOk(import.Exception.ToString());
//if (import.RowErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.RowErrors));
if (import.TemplateErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.TemplateErrors));
etcCheckList = import.Data.ToList();
}
else if (fileName.EndsWith(".csv"))
{
#region MiniExcel读取 xlsx Magicodes验证数据
//因为csv 需要加配置文件 不然都是null
etcCheckList = MiniExcel.Query<CheckViewModel>(templateFileStream, null, configuration: new MiniExcelLibs.Csv.CsvConfiguration()
{
StreamReaderFunc = (stream) => new StreamReader(stream, Encoding.GetEncoding("gb2312"))
}).ToList();
var (csVToXlsxPath, csVToXlsxRelativePath) = FileStoreHelper.GetTrialCheckFilePath(_hostEnvironment, Path.GetFileNameWithoutExtension(fileName) + ".xlsx", trialId);
await MiniExcel.SaveAsAsync(csVToXlsxPath, etcCheckList, excelType: ExcelType.XLSX);
var Importer = new ExcelImporter();
var import = await Importer.Import<CheckViewModel>(System.IO.File.OpenRead(csVToXlsxPath));
if (import.Exception != null) return ResponseOutput.NotOk(import.Exception.ToString());
//if (import.RowErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.RowErrors));
if (import.TemplateErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.TemplateErrors));
etcCheckList = import.Data.ToList();
#endregion
#region excel编码格式
//var Importer = new CsvImporter();
//var import = await Importer.Import<CheckViewModel>(File.OpenRead(filePath));
// if (import.Exception != null) return ResponseOutput.NotOk(import.Exception.ToString()); // if (import.Exception != null) return ResponseOutput.NotOk(import.Exception.ToString());
//if (import.RowErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.RowErrors)); // //if (import.RowErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.RowErrors));
// if (import.TemplateErrors.Count > 0) return ResponseOutput.NotOk(_localizer["UploadDownLoad_TemplateErrors"]);
// etcCheckList = import.Data.ToList();
//}
//else if (fileName.EndsWith(".csv"))
//{
// #region 临时方案 MiniExcel读取 然后保存为xlsx 再用 Magicodes验证数据
// //因为csv 需要加配置文件 不然都是null
// etcCheckList = MiniExcel.Query<CheckViewModel>(templateFileStream, null, configuration: new MiniExcelLibs.Csv.CsvConfiguration()
// {
// StreamReaderFunc = (stream) => new StreamReader(stream, Encoding.GetEncoding("gb2312"))
// }).ToList();
// var (csVToXlsxPath, csVToXlsxRelativePath) = FileStoreHelper.GetTrialCheckFilePath(_hostEnvironment, Path.GetFileNameWithoutExtension(fileName) + ".xlsx", trialId);
// await MiniExcel.SaveAsAsync(csVToXlsxPath, etcCheckList, excelType: ExcelType.XLSX);
// var Importer = new ExcelImporter();
// var import = await Importer.Import<CheckViewModel>(System.IO.File.OpenRead(csVToXlsxPath));
// if (import.Exception != null) return ResponseOutput.NotOk(import.Exception.ToString());
// //if (import.RowErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.RowErrors));
// if (import.TemplateErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.TemplateErrors)); // if (import.TemplateErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.TemplateErrors));
// etcCheckList = import.Data.ToList(); // etcCheckList = import.Data.ToList();
#endregion
} // #endregion
// #region 导入组件有问题 excel编码格式
// //var Importer = new CsvImporter();
// //var import = await Importer.Import<CheckViewModel>(File.OpenRead(filePath));
// //if (import.Exception != null) return ResponseOutput.NotOk(import.Exception.ToString());
// //if (import.RowErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.RowErrors));
// //if (import.TemplateErrors.Count > 0) return ResponseOutput.NotOk(JsonConvert.SerializeObject(import.TemplateErrors));
// //etcCheckList = import.Data.ToList();
// #endregion
//}
#endregion
//ExcelReaderFactory 需要自己验证数据 并且从固定列取数据 //ExcelReaderFactory 需要自己验证数据 并且从固定列取数据
else else
{ {
@@ -931,7 +717,7 @@ namespace IRaCIS.Core.API.Controllers
if (etcCheckList == null || etcCheckList.Count == 0) if (etcCheckList == null || etcCheckList.Count == 0)
{ {
//---请保证上传数据符合模板文件中的样式,且存在有效数据。 //---请保证上传数据符合模板文件中的样式,且存在有效数据。
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_InvalidData")); return ResponseOutput.NotOk(_localizer["UploadDownLoad_InvalidData"]);
} }
else else
{ {
@@ -952,13 +738,18 @@ namespace IRaCIS.Core.API.Controllers
if (etcCheckList.Count == 0) if (etcCheckList.Count == 0)
{ {
//---请保证上传数据符合模板文件中的样式,且存在有效数据。 //---请保证上传数据符合模板文件中的样式,且存在有效数据。
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_InvalidData")); 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(); return ResponseOutput.Ok();
@@ -968,8 +759,140 @@ namespace IRaCIS.Core.API.Controllers
#endregion #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);
}
}
#endregion
#region #region
@@ -981,25 +904,18 @@ namespace IRaCIS.Core.API.Controllers
public IMapper _mapper { get; set; } public IMapper _mapper { get; set; }
public IUserInfo _userInfo { get; set; } public IUserInfo _userInfo { get; set; }
private readonly IMediator _mediator; private readonly IMediator _mediator;
public IStringLocalizer _localizer { get; set; }
private readonly IWebHostEnvironment _hostEnvironment; private readonly IWebHostEnvironment _hostEnvironment;
public UploadDownLoadController(IMapper mapper, IUserInfo userInfo, IStringLocalizer localizer, IMediator mediator, IWebHostEnvironment hostEnvironment)
public UploadDownLoadController(IMapper mapper, IUserInfo userInfo, IMediator mediator, IWebHostEnvironment hostEnvironment)
{ {
_hostEnvironment = hostEnvironment; _hostEnvironment = hostEnvironment;
_localizer = localizer;
_mediator = mediator; _mediator = mediator;
_mapper = mapper; _mapper = mapper;
_userInfo = userInfo; _userInfo = userInfo;
} }
[HttpPost, Route("TrialSiteSurvey/TestOOS")]
public string TestUploadFileToOOS(string path)
{
return FileStoreHelper.UploadOOS(path, "testc/test", true);
}
[HttpPost, Route("TrialSiteSurvey/UploadTrialSiteSurveyUser")] [HttpPost, Route("TrialSiteSurvey/UploadTrialSiteSurveyUser")]
[DisableFormValueModelBinding] [DisableFormValueModelBinding]
[UnitOfWork] [UnitOfWork]
@@ -1021,7 +937,7 @@ namespace IRaCIS.Core.API.Controllers
if (!realFileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase)) if (!realFileName.EndsWith(".xlsx", StringComparison.OrdinalIgnoreCase))
{ {
// 请用提供格式的模板excel上传需要处理的数据 // 请用提供格式的模板excel上传需要处理的数据
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_TemplateUploadData")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_TemplateUploadData"]);
} }
var ossRelativePath = await oSSService.UploadToOSSAsync(fileStream, "InspectionUpload/SiteSurvey", realFileName); var ossRelativePath = await oSSService.UploadToOSSAsync(fileStream, "InspectionUpload/SiteSurvey", realFileName);
@@ -1042,7 +958,7 @@ namespace IRaCIS.Core.API.Controllers
if (excelList.Any(t => string.IsNullOrWhiteSpace(t.TrialSiteCode) || string.IsNullOrWhiteSpace(t.FirstName) || string.IsNullOrWhiteSpace(t.LastName) || string.IsNullOrWhiteSpace(t.Email) || string.IsNullOrWhiteSpace(t.UserTypeStr))) if (excelList.Any(t => string.IsNullOrWhiteSpace(t.TrialSiteCode) || string.IsNullOrWhiteSpace(t.FirstName) || string.IsNullOrWhiteSpace(t.LastName) || string.IsNullOrWhiteSpace(t.Email) || string.IsNullOrWhiteSpace(t.UserTypeStr)))
{ {
//请确保Excel中 每一行的 中心编号,姓名,邮箱,用户类型数据记录完整再进行上传 //请确保Excel中 每一行的 中心编号,姓名,邮箱,用户类型数据记录完整再进行上传
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_EnsureCompleteData")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_EnsureCompleteData"]);
} }
var siteCodeList = excelList.Select(t => t.TrialSiteCode.Trim().ToUpper()).Distinct().ToList(); var siteCodeList = excelList.Select(t => t.TrialSiteCode.Trim().ToUpper()).Distinct().ToList();
@@ -1050,35 +966,35 @@ namespace IRaCIS.Core.API.Controllers
if (_trialSiteRepository.Where(t => t.TrialId == trialId && siteCodeList.Contains(t.TrialSiteCode.ToUpper())).Count() != siteCodeList.Count) if (_trialSiteRepository.Where(t => t.TrialId == trialId && siteCodeList.Contains(t.TrialSiteCode.ToUpper())).Count() != siteCodeList.Count)
{ {
//在项目中未找到该Excel中部分或全部中心 //在项目中未找到该Excel中部分或全部中心
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_InvalidCenters")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_InvalidCenters"]);
} }
if (excelList.GroupBy(t => new { t.TrialSiteCode, t.UserTypeStr, t.Email }).Any(g => g.Count() > 1)) if (excelList.GroupBy(t => new { t.TrialSiteCode, t.UserTypeStr, t.Email }).Any(g => g.Count() > 1))
{ {
// 同一邮箱,同一用户类型,只能生成一个账户,请核查Excel数据 // 同一邮箱,同一用户类型,只能生成一个账户,请核查Excel数据
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_CheckDuplicateAccounts")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_CheckDuplicateAccounts"]);
} }
if (excelList.Any(t => !t.Email.Contains("@"))) if (excelList.Any(t => !t.Email.Contains("@")))
{ {
//有邮箱不符合邮箱格式,请核查Excel数据 //有邮箱不符合邮箱格式,请核查Excel数据
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_InvalidEmail")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_InvalidEmail"]);
} }
var generateUserTypeList = new List<string>() { "CRC", "CRA","SR" }; var generateUserTypeList = new List<string>() { "CRC", "CRA" };
if (excelList.Any(t => !generateUserTypeList.Contains(t.UserTypeStr.ToUpper()))) if (excelList.Any(t => !generateUserTypeList.Contains(t.UserTypeStr.ToUpper())))
{ {
//用户类型仅能为 CRC,SR,CRA 请核查Excel数据 //用户类型仅能为 CRC,SR,CRA 请核查Excel数据
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_InvalidUserType")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_InvalidUserType"]);
} }
if (excelList.Count == 0) if (excelList.Count == 0)
{ {
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_NoValiddata")); throw new BusinessValidationFailedException(_localizer["UploadDownLoad_NoValiddata"]);
} }
//处理好 用户类型 和用户类型枚举 //处理好 用户类型 和用户类型枚举
var sysUserTypeList = _usertypeRepository.Where(t => t.UserTypeEnum == UserTypeEnum.CRA || t.UserTypeEnum == UserTypeEnum.ClinicalResearchCoordinator || t.UserTypeEnum == UserTypeEnum.SR).Select(t => new { UserTypeId = t.Id, t.UserTypeEnum }).ToList(); 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, t.SiteId }).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) foreach (var item in excelList)
{ {
@@ -1095,14 +1011,11 @@ namespace IRaCIS.Core.API.Controllers
item.UserTypeEnum = UserTypeEnum.CRA; item.UserTypeEnum = UserTypeEnum.CRA;
break; break;
case "SR":
item.UserTypeId = sysUserTypeList.FirstOrDefault(t => t.UserTypeEnum == UserTypeEnum.SR).UserTypeId;
item.UserTypeEnum = UserTypeEnum.SR;
break;
} }
item.SiteId = siteList.FirstOrDefault(t => t.TrialSiteCode.ToUpper() == item.TrialSiteCode.ToUpper()).SiteId; item.TrialSiteId = siteList.FirstOrDefault(t => t.TrialSiteCode.ToUpper() == item.TrialSiteCode.ToUpper()).TrialSiteId;
} }
@@ -1137,12 +1050,12 @@ namespace IRaCIS.Core.API.Controllers
[DisableFormValueModelBinding] [DisableFormValueModelBinding]
public async Task<IResponseOutput> UploadCommonDoc() public async Task<IResponseOutput> UploadCommonDoc()
{ {
return await SingleFileUploadAsync((fileName) => FileStoreHelper.GetCommonDocPath(_hostEnvironment, fileName)); return await SingleFileUploadAsync((fileName) => FileStoreHelper.GetCommonDocPath(_hostEnvironment, fileName));
} }
public enum UploadFileType public enum UploadFileType
{ {
DataUpload = 1, DataUpload = 1,
@@ -1196,8 +1109,6 @@ namespace IRaCIS.Core.API.Controllers
} }
} }
#endregion #endregion
+18 -36
View File
@@ -14,7 +14,7 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<DocumentationFile>.\IRaCIS.Core.API.xml</DocumentationFile> <DocumentationFile>.\IRaCIS.Core.API.xml</DocumentationFile>
<NoWarn>1701;1702;1591;</NoWarn> <NoWarn>1701;1702;1591;1570;</NoWarn>
<OutputPath>..\bin\</OutputPath> <OutputPath>..\bin\</OutputPath>
</PropertyGroup> </PropertyGroup>
@@ -24,12 +24,7 @@
<NoWarn>1701;1702;1591</NoWarn> <NoWarn>1701;1702;1591</NoWarn>
</PropertyGroup> </PropertyGroup>
<ItemGroup>
<Compile Remove="wwwroot\**" />
<EmbeddedResource Remove="UploadFile\**" />
<EmbeddedResource Remove="wwwroot\**" />
</ItemGroup>
<ItemGroup> <ItemGroup>
<Content Remove="web.config" /> <Content Remove="web.config" />
@@ -68,25 +63,25 @@
<ItemGroup> <ItemGroup>
<PackageReference Include="aliyun-net-sdk-sts" Version="3.1.2" /> <PackageReference Include="aliyun-net-sdk-sts" Version="3.1.2" />
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" /> <PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" /> <PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="EasyCaching.Interceptor.Castle" Version="1.9.1" /> <PackageReference Include="ConfigMapFileProvider" Version="2.0.1" />
<PackageReference Include="EasyCaching.Serialization.MessagePack" Version="1.9.1" /> <PackageReference Include="EasyCaching.Interceptor.Castle" Version="1.9.2" />
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.1" /> <PackageReference Include="EasyCaching.Serialization.MessagePack" Version="1.9.2">
<PackageReference Include="EasyCaching.InMemory" Version="1.9.1" /> <TreatAsUsed>true</TreatAsUsed>
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.5" /> </PackageReference>
<PackageReference Include="Hangfire.AspNetCore" Version="1.8.14" />
<PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" /> <PackageReference Include="Hangfire.Dashboard.BasicAuthorization" Version="1.0.2" />
<PackageReference Include="Hangfire.SqlServer" Version="1.8.5" /> <PackageReference Include="Hangfire.InMemory" Version="0.10.3" />
<PackageReference Include="Hangfire.SqlServer" Version="1.8.14" />
<PackageReference Include="Invio.Extensions.Authentication.JwtBearer" Version="2.0.1" /> <PackageReference Include="Invio.Extensions.Authentication.JwtBearer" Version="2.0.1" />
<PackageReference Include="LogDashboard" Version="1.4.8" /> <PackageReference Include="LogDashboard" Version="1.4.8" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.23" /> <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.6" />
<PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="7.0.1" /> <PackageReference Include="Microsoft.Extensions.Hosting.WindowsServices" Version="8.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.17.2" /> <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.20.1" />
<PackageReference Include="Quartz.Extensions.DependencyInjection" Version="3.7.0" /> <PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageReference Include="Quartz.Extensions.Hosting" Version="3.7.0" /> <PackageReference Include="Serilog.Enrichers.ClientInfo" Version="2.0.3" />
<PackageReference Include="Serilog.AspNetCore" Version="7.0.0" /> <PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Serilog.Enrichers.ClientInfo" Version="2.0.1" /> <PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.6.2" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.SwaggerUI" Version="6.5.0" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
@@ -99,11 +94,6 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Update="appsettings.Uat_Study.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</Content>
<Content Update="wwwroot\EmailTemplate\AdminAddUser_US.html"> <Content Update="wwwroot\EmailTemplate\AdminAddUser_US.html">
<CopyToOutputDirectory>Always</CopyToOutputDirectory> <CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content> </Content>
@@ -164,15 +154,7 @@
<Folder Include="Properties\PublishProfiles\" /> <Folder Include="Properties\PublishProfiles\" />
</ItemGroup> </ItemGroup>
<ProjectExtensions><VisualStudio><UserProperties anonymizetagsetting_1json__JsonSchema="http://json.schemastore.org/jovo-language-model" properties_4launchsettings_1json__JsonSchema="" /></VisualStudio></ProjectExtensions> <ProjectExtensions><VisualStudio><UserProperties properties_4launchsettings_1json__JsonSchema="" /></VisualStudio></ProjectExtensions>
<ItemGroup>
<None Remove="..\.dockerignore" />
</ItemGroup>
<ItemGroup>
<None Remove="..\.dockerignore" />
</ItemGroup>
</Project> </Project>
+111 -1
View File
@@ -16,7 +16,20 @@
医生基本信息 、工作信息 专业信息、审核状态 医生基本信息 、工作信息 专业信息、审核状态
</summary> </summary>
</member> </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,Microsoft.Extensions.Configuration.IConfiguration)"> <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)">
<summary>
获取医生详情
</summary>
<param name="attachmentService"></param>
<param name="_doctorService"></param>
<param name="_educationService"></param>
<param name="_trialExperienceService"></param>
<param name="_researchPublicationService"></param>
<param name="_vacationService"></param>
<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> <summary> 系统用户登录接口[New] </summary>
</member> </member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateTrialInspection(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Application.Contracts.TrialCommand})"> <member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateTrialInspection(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Application.Contracts.TrialCommand})">
@@ -28,6 +41,49 @@
<param name="param"></param> <param name="param"></param>
<returns>新记录Id</returns> <returns>新记录Id</returns>
</member> </member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.WorkLoadAddOrUpdate(IRaCIS.Application.Services.IDoctorWorkloadService,IRaCIS.Application.Contracts.WorkloadCommand)">
<summary>
添加或更新工作量[AUTH]
</summary>
<param name="_trialWorkloadService"></param>
<param name="workLoadAddOrUpdateModel"></param>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateExchangeRate(IRaCIS.Application.Interfaces.IExchangeRateService,IRaCIS.Application.Interfaces.IPaymentAdjustmentService,IRaCIS.Application.Contracts.ExchangeRateCommand)">
<summary>
添加或更新汇率(会触发没有对锁定的费用计算)
</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateRankPrice(IRaCIS.Application.Interfaces.IReviewerPayInfoService,IRaCIS.Application.Interfaces.IRankPriceService,IRaCIS.Application.Contracts.RankPriceCommand)">
<summary>
添加或更新 职称单价[AUTH]
</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateReviewerPayInfo(IRaCIS.Application.Interfaces.IReviewerPayInfoService,IRaCIS.Application.Contracts.ReviewerPayInfoCommand)">
<summary>
添加或更新(替换)医生支付展信息[AUTH]
</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateTrialPaymentPrice(IRaCIS.Application.Interfaces.ITrialPaymentPriceService,IRaCIS.Application.Contracts.TrialPaymentPriceCommand)">
<summary>
保存(替换)项目支付价格信息(会触发没有被锁定的费用计算)[AUTH]
</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.AddOrUpdateAwardPriceList(IRaCIS.Application.Interfaces.IVolumeRewardService,System.Collections.Generic.IEnumerable{IRaCIS.Application.Interfaces.AwardPriceCommand})">
<summary>
批量更新奖励费用[AUTH]
</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.CalculateMonthlyPayment(IRaCIS.Application.Contracts.CalculateDoctorAndMonthDTO)">
<summary>
计算医生月度费用,并将计算的结果存入费用表
</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.Special.FinancialChangeController.GetMonthlyPaymentList(IRaCIS.Application.Interfaces.IPaymentService,IRaCIS.Application.Interfaces.IExchangeRateService,IRaCIS.Application.Contracts.MonthlyPaymentQueryDTO)">
<summary>
Financials /Monthly Payment 列表查询接口
</summary>
</member>
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.GetInspectionList(IRaCIS.Core.Application.Service.Inspection.DTO.GetDataInspectionDto)"> <member name="M:IRaCIS.Core.API.Controllers.InspectionController.GetInspectionList(IRaCIS.Core.Application.Service.Inspection.DTO.GetDataInspectionDto)">
<summary> <summary>
获取稽查数据 获取稽查数据
@@ -111,6 +167,13 @@
<param name="opt"></param> <param name="opt"></param>
<returns></returns> <returns></returns>
</member> </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})"> <member name="M:IRaCIS.Core.API.Controllers.InspectionController.SubmitClinicalFormAndSign(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.Service.Reading.Dto.SubmitClinicalFormInDto})">
<summary> <summary>
提交结构化录入并签名 提交结构化录入并签名
@@ -152,6 +215,12 @@
</summary> </summary>
<returns></returns> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.ResetAndAsyncCriterion(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.Service.Reading.Dto.ResetAndAsyncCriterionInDto})">
<summary>
重置并同步项目阅片标准
</summary>
<returns></returns>
</member>
<member name="M:IRaCIS.Core.API.Controllers.InspectionController.CRCRequestToQC(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.Contracts.CRCRequestToQCCommand})"> <member name="M:IRaCIS.Core.API.Controllers.InspectionController.CRCRequestToQC(IRaCIS.Core.Application.Service.Inspection.DTO.DataInspectionDto{IRaCIS.Core.Application.Contracts.CRCRequestToQCCommand})">
<summary> <summary>
CRC RequestToQC 批量提交 CRC RequestToQC 批量提交
@@ -216,7 +285,9 @@
<summary> <summary>
上传非Dicom 文件 支持压缩包 多文件上传 上传非Dicom 文件 支持压缩包 多文件上传
</summary> </summary>
<param name="incommand"></param>
<param name="_noneDicomStudyRepository"></param> <param name="_noneDicomStudyRepository"></param>
<param name="_studyMonitorRepository"></param>
<returns></returns> <returns></returns>
</member> </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)">
@@ -224,6 +295,35 @@
一致性核查 excel上传 支持三种格式 一致性核查 excel上传 支持三种格式
</summary> </summary>
<param name="trialId"></param> <param name="trialId"></param>
<param name="oSSService"></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> <returns></returns>
</member> </member>
<member name="M:IRaCIS.Core.API.Controllers.UploadDownLoadController.DownloadCommonFile(System.String,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument})"> <member name="M:IRaCIS.Core.API.Controllers.UploadDownLoadController.DownloadCommonFile(System.String,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.CommonDocument})">
@@ -246,6 +346,11 @@
IPLimit限流 启动服务 IPLimit限流 启动服务
</summary> </summary>
</member> </member>
<member name="T:IRaCIS.Core.API.JSONTimeZoneConverter">
<summary>
序列化,反序列化的时候,处理时间 时区转换
</summary>
</member>
<member name="M:IRaCIS.Core.API.NullToEmptyStringResolver.CreateProperties(System.Type,Newtonsoft.Json.MemberSerialization)"> <member name="M:IRaCIS.Core.API.NullToEmptyStringResolver.CreateProperties(System.Type,Newtonsoft.Json.MemberSerialization)">
<summary> <summary>
创建属性 创建属性
@@ -261,6 +366,11 @@
<param name="httpContext"></param> <param name="httpContext"></param>
<returns></returns> <returns></returns>
</member> </member>
<member name="T:TimeZoneAdjustmentMiddleware">
<summary>
废弃,没用
</summary>
</member>
<member name="T:ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt.CustomHSJWTService"> <member name="T:ZhaoXi._001.NET5Demo.Practice.WebApi.Utility.Jwt.CustomHSJWTService">
<summary> <summary>
对称可逆加密 对称可逆加密
@@ -0,0 +1,118 @@
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);
}
}
+111 -29
View File
@@ -4,8 +4,6 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Serilog; using Serilog;
using MediatR;
using IRaCIS.Core.Application.MediatR.Handlers;
using System.Threading.Tasks; using System.Threading.Tasks;
using MassTransit; using MassTransit;
using MassTransit.NewIdProviders; using MassTransit.NewIdProviders;
@@ -24,10 +22,17 @@ using IRaCIS.Core.Application.Filter;
using Microsoft.AspNetCore.HttpOverrides; using Microsoft.AspNetCore.HttpOverrides;
using IRaCIS.Application.Services.BackGroundJob; using IRaCIS.Application.Services.BackGroundJob;
using LogDashboard; using LogDashboard;
using OfficeOpenXml.Utils; using FellowOakDicom.Network;
using IRaCIS.Core.Application.Service.ImageAndDoc;
using IP2Region.Net.Abstractions; using IP2Region.Net.Abstractions;
using IP2Region.Net.XDB; using IP2Region.Net.XDB;
using IRaCIS.Core.Application.BusinessFilter;
using Microsoft.AspNetCore.Http;
using IRaCIS.Core.Infrastructure.Extention;
using Newtonsoft.Json;
using Microsoft.AspNetCore.Diagnostics;
using IRaCIS.Core.Application.MassTransit.Command;
using IRaCIS.Core.Application.MassTransit.Consumer;
#region #region
@@ -76,8 +81,8 @@ if (urlsIndex > -1)
NewId.SetProcessIdProvider(new CurrentProcessIdProvider()); NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
builder.Configuration.AddJsonFile("appsettings.json", false, true) builder.Configuration.AddJsonFile(ConfigMapFileProvider.FromRelativePath(""), "appsettings.json", false, true)
.AddJsonFile($"appsettings.{enviromentName}.json", false, true); .AddJsonFile(ConfigMapFileProvider.FromRelativePath(""), $"appsettings.{enviromentName}.json", false, true);
builder.Host builder.Host
.UseServiceProviderFactory(new AutofacServiceProviderFactory()) .UseServiceProviderFactory(new AutofacServiceProviderFactory())
@@ -104,19 +109,19 @@ builder.Services.AddControllers(options =>
options.Filters.Add<ModelActionFilter>(); options.Filters.Add<ModelActionFilter>();
options.Filters.Add<ProjectExceptionFilter>(); options.Filters.Add<ProjectExceptionFilter>();
options.Filters.Add<UnitOfWorkFilter>(); options.Filters.Add<UnitOfWorkFilter>();
options.Filters.Add<EncreptApiResultFilter>(10);
if (_configuration.GetSection("BasicSystemConfig").GetValue<bool>("OpenLoginLimit"))
{
options.Filters.Add<LimitUserRequestAuthorization>(); options.Filters.Add<LimitUserRequestAuthorization>();
}
}) })
.AddNewtonsoftJsonSetup(); // NewtonsoftJson 序列化 处理 .AddNewtonsoftJsonSetup(builder.Services); // NewtonsoftJson 序列化 处理
builder.Services.AddOptions().Configure<SystemEmailSendConfig>(_configuration.GetSection("SystemEmailSendConfig")); builder.Services.AddOptions().Configure<SystemEmailSendConfig>(_configuration.GetSection("SystemEmailSendConfig"));
builder.Services.AddOptions().Configure<ServiceVerifyConfigOption>(_configuration.GetSection("BasicSystemConfig")); builder.Services.AddOptions().Configure<ServiceVerifyConfigOption>(_configuration.GetSection("BasicSystemConfig"));
builder.Services.AddOptions().Configure<AliyunOSSOptions>(_configuration.GetSection("AliyunOSS")); builder.Services.AddOptions().Configure<AliyunOSSOptions>(_configuration.GetSection("AliyunOSS"));
builder.Services.AddOptions().Configure<ObjectStoreServiceOptions>(_configuration.GetSection("ObjectStoreService")); builder.Services.AddOptions().Configure<ObjectStoreServiceOptions>(_configuration.GetSection("ObjectStoreService"));
builder.Services.AddOptions().Configure<EncreptResponseOption>(_configuration.GetSection("EncrypteResponseConfig"));
builder.Services.AddOptions().Configure<SystemPacsConfig>(_configuration.GetSection("SystemPacsConfig"));
//动态WebApi + UnifiedApiResultFilter 省掉控制器代码 //动态WebApi + UnifiedApiResultFilter 省掉控制器代码
@@ -133,15 +138,34 @@ builder.Services.AddSwaggerSetup();
builder.Services.AddJWTAuthSetup(_configuration); builder.Services.AddJWTAuthSetup(_configuration);
// MediatR 进程内消息 事件解耦 从程序集中 注册命令和handler对应关系 // MediatR 进程内消息 事件解耦 从程序集中 注册命令和handler对应关系
builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<ConsistencyVerificationHandler>()); //builder.Services.AddMediatR(cfg => cfg.RegisterServicesFromAssemblyContaining<ConsistencyVerificationHandler>());
#region MassTransit
//masstransit组件 也支持MediatR 中介者模式,但是支持分布式,考虑后续,所以在次替代MediatR
builder.Services.AddMediator(cfg =>
{
cfg.AddConsumer<ConsistencyCheckConsumer>();
});
builder.Services.AddMassTransit(cfg =>
{
cfg.UsingInMemory();
});
#endregion
#region FusionCache
builder.Services.AddFusionCache();
#endregion
// EasyCaching 缓存 // EasyCaching 缓存
builder.Services.AddEasyCachingSetup(_configuration); builder.Services.AddEasyCachingSetup(_configuration);
// hangfire 定时任务框架 有界面,更友好~ // hangfire 定时任务框架 有界面,更友好~
builder.Services.AddhangfireSetup(_configuration); builder.Services.AddhangfireSetup(_configuration);
//
builder.Services.AddQuartZSetup(_configuration);
//Serilog 日志可视化 LogDashboard日志 //Serilog 日志可视化 LogDashboard日志
builder.Services.AddLogDashboardSetup(); builder.Services.AddLogDashboardSetup();
@@ -162,12 +186,14 @@ builder.Services.AddSignalR();
builder.Services.AddSingleton<IUserIdProvider, IRaCISUserIdProvider>(); builder.Services.AddSingleton<IUserIdProvider, IRaCISUserIdProvider>();
//builder.Services.AddMemoryCache();
builder.Services.AddSingleton<ISearcher>(new Searcher(CachePolicy.Content, Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "ip2region.xdb")));
//builder.Services.AddExceptionHandler<GlobalExceptionHandler>();
//builder.Services.AddProblemDetails();
#region #region
//builder.Services.AddMemoryCache();
////上传限制 配置 ////上传限制 配置
//builder.Services.Configure<FormOptions>(options => //builder.Services.Configure<FormOptions>(options =>
//{ //{
@@ -181,7 +207,6 @@ builder.Services.AddSingleton<IUserIdProvider, IRaCISUserIdProvider>();
//services.AddAuthorizationPolicySetup(_configuration); //services.AddAuthorizationPolicySetup(_configuration);
#endregion #endregion
builder.Services.AddSingleton<ISearcher>(new Searcher(CachePolicy.Content, Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, "ip2region.xdb")));
#endregion #endregion
var app = builder.Build(); var app = builder.Build();
@@ -192,6 +217,56 @@ var env = app.Environment;
// Configure the HTTP request pipeline. // Configure the HTTP request pipeline.
#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(o => { });
//这里没生效,原因未知,官方文档也是这种写法,也用了GlobalExceptionHandler 尝试,还是不行,怀疑框架bug
//app.UseExceptionHandler(configure =>
//{
// configure.Run(async context =>
// {
// var exceptionHandlerPathFeature = context.Features.Get<IExceptionHandlerPathFeature>();
//var ex = exceptionHandlerPathFeature?.Error;
//context.Response.ContentType = "application/json";
//if (ex != null)
//{
// var errorInfo = $"Exception: {ex.Message}[{ex.StackTrace}]" + (ex.InnerException != null ? $" InnerException: {ex.InnerException.Message}[{ex.InnerException.StackTrace}]" : "");
// await context.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk($"{ex?.Message}")));
// Log.Logger.Error(errorInfo);
//}
// });
//});
#endregion
//本地化 //本地化
app.UseLocalization(); app.UseLocalization();
@@ -200,12 +275,11 @@ app.UseForwardedHeaders();
//响应压缩 //响应压缩
app.UseResponseCompression(); app.UseResponseCompression();
//app.UseCors(t => t.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader());
//不需要 token 访问的静态文件 wwwroot css, JavaScript, and images don't require authentication. //不需要 token 访问的静态文件 wwwroot css, JavaScript, and images don't require authentication.
app.UseStaticFiles(); app.UseStaticFiles();
//app.UseMiddleware<MultiDiskStaticFilesMiddleware>();
//LogDashboard //LogDashboard
app.UseLogDashboard("/LogDashboard"); app.UseLogDashboard("/LogDashboard");
@@ -213,22 +287,24 @@ app.UseLogDashboard("/LogDashboard");
//hangfire //hangfire
app.UseHangfireConfig(env); app.UseHangfireConfig(env);
#region
//app.UseMiddleware<MultiDiskStaticFilesMiddleware>();
////限流 中间件 ////限流 中间件
//app.UseIpRateLimiting(); //app.UseIpRateLimiting();
//if (env.IsDevelopment())
//{
// app.UseDeveloperExceptionPage();
//}
//else
//{
// //app.UseHsts();
//}
#endregion
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
//app.UseHsts();
}
// 特殊异常处理 比如 404
app.UseStatusCodePagesWithReExecute("/Error/{0}");
SwaggerSetup.Configure(app, env); SwaggerSetup.Configure(app, env);
@@ -261,6 +337,7 @@ var hangfireJobService = app.Services.GetRequiredService<IIRaCISHangfireJob>();
await hangfireJobService.InitHangfireJobTaskAsync(); await hangfireJobService.InitHangfireJobTaskAsync();
#endregion #endregion
try try
@@ -296,6 +373,11 @@ try
//Log.Logger.Warning($"ContentRootPath——GetParent{Directory.GetParent(env.ContentRootPath).Parent.FullName}"); //Log.Logger.Warning($"ContentRootPath——GetParent{Directory.GetParent(env.ContentRootPath).Parent.FullName}");
//Log.Logger.Warning($"ContentRootPath——xx{Path.GetDirectoryName(Path.GetDirectoryName(env.ContentRootPath))}"); //Log.Logger.Warning($"ContentRootPath——xx{Path.GetDirectoryName(Path.GetDirectoryName(env.ContentRootPath))}");
var server = DicomServerFactory.Create<CStoreSCPService>(11112, userState: app.Services);
app.Run(); app.Run();
} }
+52 -6
View File
@@ -1,21 +1,67 @@
{ {
"$schema": "http://json.schemastore.org/launchsettings.json", "$schema": "http://json.schemastore.org/launchsettings.json",
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:3305",
"sslPort": 0
}
},
"profiles": { "profiles": {
"Test_Study": { "IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Test_IRC"
}
},
"IRaCIS.Test_IRC": {
"commandName": "Project", "commandName": "Project",
"launchBrowser": true, "launchBrowser": true,
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Test_Study" "ASPNETCORE_ENVIRONMENT": "Test_IRC"
}, },
"applicationUrl": "http://localhost:6100" "applicationUrl": "http://localhost:6100"
}, },
"Uat_Study": { "IRaCIS.Event_IRC": {
"commandName": "Project", "commandName": "Project",
"launchBrowser": true, "launchBrowser": true,
"environmentVariables": { "environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Uat_Study" "ASPNETCORE_ENVIRONMENT": "Event_IRC"
}, },
"applicationUrl": "http://localhost:6101" "applicationUrl": "http://localhost:6100"
} },
"Docker": {
"commandName": "Docker",
"launchBrowser": true,
"launchUrl": "{Scheme}://{ServiceHost}:{ServicePort}",
"publishAllPorts": true
},
"IRaCIS.Uat_IRC": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Uat_IRC"
},
"applicationUrl": "http://localhost:6100"
},
"IRaCIS.Prod_IRC": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Prod_IRC"
},
"applicationUrl": "http://localhost:6100"
},
"IRaCIS.US_Uat_IRC": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "US_Uat_IRC"
},
"applicationUrl": "http://localhost:6100"
}
} }
} }
@@ -1,39 +0,0 @@
using Hangfire.Dashboard;
using System.IdentityModel.Tokens.Jwt;
using System;
using System.Linq;
using IRaCIS.Core.Domain.Share;
namespace IRaCIS.Core.API.Filter
{
//从cookie 中取值
public class hangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize(DashboardContext context)
{
var httpContext = context.GetHttpContext();
// Allow all authenticated users to see the Dashboard (potentially dangerous).
//return httpContext.User.Identity.IsAuthenticated;
var jwtToken = httpContext.Request.Cookies["access_token"]?.ToString();
var handler = new JwtSecurityTokenHandler();
if (handler.CanReadToken(jwtToken))
{
var jwtSecurityToken = handler.ReadJwtToken(jwtToken);
return jwtSecurityToken.Claims.Any(t => t.Type == JwtIRaCISClaimType.UserTypeEnum && (t.Value == UserTypeEnum.Admin.ToString()|| t.Value== UserTypeEnum.SuperAdmin.ToString()));
}
else
{
return false;
}
}
}
}
@@ -0,0 +1,17 @@
using Hangfire.Dashboard;
namespace IRaCIS.Core.API.Filter
{
public class hangfireAuthorizationFilter : IDashboardAuthorizationFilter
{
public bool Authorize(DashboardContext context)
{
var httpContext = context.GetHttpContext();
// Allow all authenticated users to see the Dashboard (potentially dangerous).
return httpContext.User.Identity.IsAuthenticated;
//return true;
}
}
}
@@ -1,8 +1,11 @@
using IRaCIS.Core.Application.Helper; using Azure;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.StaticFiles; using Microsoft.AspNetCore.StaticFiles;
using Microsoft.Extensions.FileProviders; using Microsoft.Extensions.FileProviders;
using Microsoft.Extensions.FileProviders.Physical; using Microsoft.Extensions.FileProviders.Physical;
@@ -11,6 +14,7 @@ using Microsoft.Extensions.Hosting.Internal;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Microsoft.VisualBasic; using Microsoft.VisualBasic;
using Newtonsoft.Json;
using SharpCompress.Common; using SharpCompress.Common;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
@@ -47,7 +51,7 @@ namespace IRaCIS.Core.API
var path = context.Request.Path.Value; var path = context.Request.Path.Value;
var isIRacisFile = path.StartsWith($"/{StaticData.Folder.IRaCISDataFolder}"); var isIRacisFile = path.StartsWith($"/{StaticData.Folder.IRaCISDataFolder}");
var isDicomFile = path.Contains($"{StaticData.Folder.DicomFolder}"); var isDicomFile = isIRacisFile && path.Contains($"{StaticData.Folder.DicomFolder}");
@@ -147,6 +151,12 @@ namespace IRaCIS.Core.API
return; return;
} }
} }
// 如果没有找到文件,返回404
context.Response.StatusCode = 404;
context.Response.ContentType = "application/json";
await context.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("File not found")));
} }
@@ -1,4 +1,5 @@
using Microsoft.AspNetCore.Builder; using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Localization; using Microsoft.AspNetCore.Localization;
using System.Collections.Generic; using System.Collections.Generic;
using System.Globalization; using System.Globalization;
@@ -12,8 +13,9 @@ namespace IRaCIS.Core.API
{ {
var supportedCultures = new List<CultureInfo> 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 var options = new RequestLocalizationOptions
@@ -1,4 +1,6 @@
using IRaCIS.Core.API._PipelineExtensions.Serilog; using Hangfire;
using Hangfire.Dashboard;
using IRaCIS.Core.API._PipelineExtensions.Serilog;
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Hosting;
using Serilog; using Serilog;
@@ -21,7 +21,7 @@ namespace IRaCIS.Core.API
diagnosticContext.Set("Host", request.Host); diagnosticContext.Set("Host", request.Host);
//这种获取的Ip不准 配置服务才行 //这种获取的Ip不准 配置服务才行
diagnosticContext.Set("RequestIP", httpContext.Connection.RemoteIpAddress.ToString()); //diagnosticContext.Set("RequestIP", httpContext.Connection.RemoteIpAddress.ToString());
//这种方式可以,但是serilog提供了 就不用了 //这种方式可以,但是serilog提供了 就不用了
//diagnosticContext.Set("TestIP", httpContext.GetUserIp()); //diagnosticContext.Set("TestIP", httpContext.GetUserIp());
@@ -16,7 +16,7 @@ namespace IRaCIS.Core.API
public IStringLocalizer _localizer; public IStringLocalizer _localizer;
public ApiResponseHandler(IOptionsMonitor<AuthenticationSchemeOptions> options, public ApiResponseHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
IStringLocalizer localizer, IStringLocalizer localizer,
ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) ILoggerFactory logger, UrlEncoder encoder) : base(options, logger, encoder)
{ {
_localizer = localizer; _localizer = localizer;
@@ -0,0 +1,86 @@
using IRaCIS.Core.Application.Auth;
using IRaCIS.Core.Domain.Share;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.API
{
public static class AuthorizationPolicySetup
{
public static void AddAuthorizationPolicySetup(this IServiceCollection services, IConfiguration configuration)
{
services.AddAuthorization(options =>
{
//影像质控策略 只允许 CRC IQC进行操作
options.AddPolicy(IRaCISPolicy.CRC_IQC, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ClinicalResearchCoordinator).ToString(), ((int)UserTypeEnum.IQC).ToString());
});
//一致性核查策略 只允许 CRC PM APM 进行操作
options.AddPolicy(IRaCISPolicy.PM_APM_CRC, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.ClinicalResearchCoordinator).ToString(), ((int)UserTypeEnum.APM).ToString());
});
options.AddPolicy(IRaCISPolicy.PM_APM, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.APM).ToString());
});
options.AddPolicy(IRaCISPolicy.PM_IQC, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString(), ((int)UserTypeEnum.IQC).ToString());
});
options.AddPolicy(IRaCISPolicy.PM, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ProjectManager).ToString());
});
options.AddPolicy(IRaCISPolicy.IQC, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.IQC).ToString());
});
options.AddPolicy(IRaCISPolicy.CRC, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.ClinicalResearchCoordinator).ToString());
});
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());
});
options.AddPolicy(IRaCISPolicy.SPM_CPM, policyBuilder =>
{
policyBuilder.RequireClaim("userTypeEnumInt", ((int)UserTypeEnum.SPM).ToString(), ((int)UserTypeEnum.CPM).ToString());
});
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());
});
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(),
((int)UserTypeEnum.CPM).ToString(), ((int)UserTypeEnum.SMM).ToString(), ((int)UserTypeEnum.CMM).ToString());
});
});
}
}
}
@@ -1,5 +1,6 @@
using AutoMapper.EquivalencyExpression; using AutoMapper.EquivalencyExpression;
using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Domain.Models;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
namespace IRaCIS.Core.API namespace IRaCIS.Core.API
@@ -14,6 +15,10 @@ namespace IRaCIS.Core.API
//AutoMapper.Collection.EntityFrameworkCore //AutoMapper.Collection.EntityFrameworkCore
automapper.AddCollectionMappers(); automapper.AddCollectionMappers();
// 全局忽略 DomainEvents 属性
automapper.AddGlobalIgnore(nameof(Entity.DomainEvents));
#region 使 IncludeMembers 使 #region 使 IncludeMembers 使
//mapping an EntityFramework Core DbContext-object. //mapping an EntityFramework Core DbContext-object.
//automapper.UseEntityFrameworkCoreModel<IRaCISDBContext>(services); //automapper.UseEntityFrameworkCoreModel<IRaCISDBContext>(services);
@@ -10,11 +10,9 @@ using System.Linq;
using System.Reflection; using System.Reflection;
using IRaCIS.Core.Domain.Models; using IRaCIS.Core.Domain.Models;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using MediatR;
using IRaCIS.Application.Services; using IRaCIS.Application.Services;
using IRaCIS.Application.Interfaces; using IRaCIS.Application.Interfaces;
using AutoMapper; using AutoMapper;
using Quartz;
namespace IRaCIS.Core.API namespace IRaCIS.Core.API
{ {
@@ -31,10 +29,6 @@ namespace IRaCIS.Core.API
containerBuilder.RegisterType<Repository>().As<IRepository>().InstancePerLifetimeScope(); containerBuilder.RegisterType<Repository>().As<IRepository>().InstancePerLifetimeScope();
//containerBuilder.RegisterType<Mapper>().As<IMapper>().InstancePerLifetimeScope();
//containerBuilder.RegisterGeneric(typeof(EFUnitOfWork<>))
// .As(typeof(IEFUnitOfWork<>)).InstancePerLifetimeScope();//注册仓储
#endregion #endregion
@@ -50,8 +44,7 @@ namespace IRaCIS.Core.API
#endregion #endregion
//containerBuilder.RegisterType<BaseService>().As<IBaseService>().PropertiesAutowired().InstancePerLifetimeScope();
//containerBuilder.RegisterType<DictionaryService>().As<IDictionaryService>().InstancePerLifetimeScope();
@@ -59,18 +52,10 @@ namespace IRaCIS.Core.API
containerBuilder.RegisterAssemblyTypes(application).Where(t => t.FullName.Contains("Service")) containerBuilder.RegisterAssemblyTypes(application).Where(t => t.FullName.Contains("Service"))
.PropertiesAutowired().AsImplementedInterfaces().EnableClassInterceptors(); .PropertiesAutowired().AsImplementedInterfaces().EnableClassInterceptors();
//Assembly infrastructure = Assembly.Load("IRaCIS.Core.Infra.EFCore");
//containerBuilder.RegisterAssemblyTypes(infrastructure).AsImplementedInterfaces();
containerBuilder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
containerBuilder.RegisterType<UserInfo>().As<IUserInfo>().InstancePerLifetimeScope();
//containerBuilder.RegisterType<Dictionary>().InstancePerLifetimeScope(); //containerBuilder.RegisterType<HttpContextAccessor>().As<IHttpContextAccessor>().SingleInstance();
//Autofac 注册拦截器 需要注意的是生成api上服务上的动态代理AOP失效 间接掉用不影响 //containerBuilder.RegisterType<UserInfo>().As<IUserInfo>().InstancePerLifetimeScope();
//containerBuilder.RegisterType<TrialStatusAutofacAOP>();
//containerBuilder.RegisterType<UserAddAOP>();
//containerBuilder.RegisterType<QANoticeAOP>();
//containerBuilder.RegisterType<LogService>().As<ILogService>().SingleInstance();
//注册hangfire任务 依赖注入 //注册hangfire任务 依赖注入
+38 -4
View File
@@ -1,11 +1,17 @@
using Hangfire.SqlServer; using Castle.Core.Logging;
using EntityFramework.Exceptions.SqlServer;
using Hangfire.SqlServer;
using IRaCIS.Core.Application.Triggers; using IRaCIS.Core.Application.Triggers;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Infra.EFCore.Interceptor;
using Medallion.Threading; using Medallion.Threading;
using Medallion.Threading.SqlServer; using Medallion.Threading.SqlServer;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Diagnostics;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using StackExchange.Redis; using StackExchange.Redis;
namespace IRaCIS.Core.API namespace IRaCIS.Core.API
@@ -14,18 +20,35 @@ namespace IRaCIS.Core.API
{ {
public static void AddEFSetup( this IServiceCollection services, IConfiguration configuration) public static void AddEFSetup( this IServiceCollection services, IConfiguration configuration)
{ {
//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 //这个注入没有成功--注入是没问题的,构造函数也只是支持参数就好,错在注入的地方不能写DbContext
//Web程序中通过重用池中DbContext实例可提高高并发场景下的吞吐量, 这在概念上类似于ADO.NET Provider原生的连接池操作方式,具有节省DbContext实例化成本的优点 //Web程序中通过重用池中DbContext实例可提高高并发场景下的吞吐量, 这在概念上类似于ADO.NET Provider原生的连接池操作方式,具有节省DbContext实例化成本的优点
services.AddDbContext<IRaCISDBContext>(options => 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, options.UseSqlServer(configuration.GetSection("ConnectionStrings:RemoteNew").Value,
contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure()); contextOptionsBuilder => contextOptionsBuilder.EnableRetryOnFailure());
options.UseLoggerFactory(logFactory);
options.UseExceptionProcessor();
options.EnableSensitiveDataLogging(); options.EnableSensitiveDataLogging();
options.AddInterceptors(new QueryWithNoLockDbCommandInterceptor()); options.AddInterceptors(new QueryWithNoLockDbCommandInterceptor());
options.AddInterceptors(sp.GetServices<ISaveChangesInterceptor>());
options.UseProjectables(); options.UseProjectables();
@@ -49,14 +72,25 @@ namespace IRaCIS.Core.API
triggerOptions.AddTrigger<TableQuestionRowTrigger>(); triggerOptions.AddTrigger<TableQuestionRowTrigger>();
//triggerOptions.AddTrigger<AddlTrialUserTrigger>(); //triggerOptions.AddTrigger<AddlTrialUserTrigger>();
triggerOptions.AddTrigger<VisitTaskIsFrontTaskNeedSignButNotSignTrigger>(); triggerOptions.AddTrigger<VisitTaskIsFrontTaskNeedSignButNotSignTrigger>();
triggerOptions.AddTrigger<VisitTaskIAfterSignTrigger>(); triggerOptions.AddTrigger<VisitTaskIbeforeTrigger>();
triggerOptions.AddTrigger<UserLogTrigger>(); triggerOptions.AddTrigger<UserLogTrigger>();
}); });
}); });
// 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 //注意区分 easy caching 也有 IDistributedLockProvider
services.AddSingleton<IDistributedLockProvider>(sp => services.AddSingleton<IDistributedLockProvider>(sp =>
{ {
@@ -13,14 +13,12 @@ namespace IRaCIS.Core.API
services.AddLogDashboard(opt => services.AddLogDashboard(opt =>
{ {
//opt.PathMatch = "/api/LogDashboard"; //opt.PathMatch = "/api/LogDashboard";
opt.PathMatch = "/back/logs"; opt.PathMatch = "/LogDashboard";
//opt.AddAuthorizationFilter(new LogDashboardBasicAuthFilter("admin", "zhizhun2018")); //opt.AddAuthorizationFilter(new LogDashboardBasicAuthFilter("admin", "zhizhun2018"));
//opt.AddAuthorizationFilter(new LogDashBoardAuthFilter()); //opt.AddAuthorizationFilter(new LogDashBoardAuthFilter());
}); });
} }
@@ -1,81 +0,0 @@
//using System;
//using Microsoft.Extensions.DependencyInjection;
//using StackExchange.Profiling.Storage;
//namespace IRaCIS.Core.API
//{
// public class MiniProfilerConfigure
// {
// public static void ConfigureMiniProfiler(IServiceCollection services)
// {
// services.AddMiniProfiler(options =>
// {
// // All of this is optional. You can simply call .AddMiniProfiler() for all defaults
// // (Optional) Path to use for profiler URLs, default is /mini-profiler-resources
// options.RouteBasePath = "/profiler";
// //// (Optional) Control storage
// //// (default is 30 minutes in MemoryCacheStorage)
// (options.Storage as MemoryCacheStorage).CacheDuration = TimeSpan.FromMinutes(10);
// //// (Optional) Control which SQL formatter to use, InlineFormatter is the default
// //options.SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter();
// //// (Optional) To control authorization, you can use the Func<HttpRequest, bool> options:
// //// (default is everyone can access profilers)
// //options.ResultsAuthorize = request => MyGetUserFunction(request).CanSeeMiniProfiler;
// //options.ResultsListAuthorize = request => MyGetUserFunction(request).CanSeeMiniProfiler;
// //// Or, there are async versions available:
// //options.ResultsAuthorizeAsync = async request => (await MyGetUserFunctionAsync(request)).CanSeeMiniProfiler;
// //options.ResultsAuthorizeListAsync = async request => (await MyGetUserFunctionAsync(request)).CanSeeMiniProfilerLists;
// //// (Optional) To control which requests are profiled, use the Func<HttpRequest, bool> option:
// //// (default is everything should be profiled)
// //options.ShouldProfile = request => MyShouldThisBeProfiledFunction(request);
// //// (Optional) Profiles are stored under a user ID, function to get it:
// //// (default is null, since above methods don't use it by default)
// //options.UserIdProvider = request => MyGetUserIdFunction(request);
// //// (Optional) Swap out the entire profiler provider, if you want
// //// (default handles async and works fine for almost all applications)
// //options.ProfilerProvider = new MyProfilerProvider();
// //// (Optional) You can disable "Connection Open()", "Connection Close()" (and async variant) tracking.
// //// (defaults to true, and connection opening/closing is tracked)
// //options.TrackConnectionOpenClose = true;
// //// (Optional) Use something other than the "light" color scheme.
// //// (defaults to "light")
// //options.ColorScheme = StackExchange.Profiling.ColorScheme.Auto;
// //// The below are newer options, available in .NET Core 3.0 and above:
// //// (Optional) You can disable MVC filter profiling
// //// (defaults to true, and filters are profiled)
// //options.EnableMvcFilterProfiling = true;
// //// ...or only save filters that take over a certain millisecond duration (including their children)
// //// (defaults to null, and all filters are profiled)
// //// options.MvcFilterMinimumSaveMs = 1.0m;
// //// (Optional) You can disable MVC view profiling
// //// (defaults to true, and views are profiled)
// //options.EnableMvcViewProfiling = true;
// //// ...or only save views that take over a certain millisecond duration (including their children)
// //// (defaults to null, and all views are profiled)
// //// options.MvcViewMinimumSaveMs = 1.0m;
// //// (Optional) listen to any errors that occur within MiniProfiler itself
// //// options.OnInternalError = e => MyExceptionLogger(e);
// //// (Optional - not recommended) You can enable a heavy debug mode with stacks and tooltips when using memory storage
// //// It has a lot of overhead vs. normal profiling and should only be used with that in mind
// //// (defaults to false, debug/heavy mode is off)
// ////options.EnableDebugMode = true;
// });
// //.AddEntityFramework();
// }
// }
//}
@@ -1,46 +0,0 @@
using IRaCIS.Core.Domain.Share;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using System;
namespace IRaCIS.Core.API
{
public class JSONCustomDateConverter : DateTimeConverterBase
{
private TimeZoneInfo _timeZoneInfo;
private string _dateFormat;
private IUserInfo _userInfo;
public JSONCustomDateConverter(string dateFormat, TimeZoneInfo timeZoneInfo, IUserInfo userInfo)
{
_dateFormat = dateFormat;
_timeZoneInfo = timeZoneInfo;
_userInfo = userInfo;
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
throw new NotImplementedException();
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
var timeZoneId = _userInfo.TimeZoneId;
var needConvertUtcDateTime = Convert.ToDateTime(value);
var tz = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
var dateTimeOffset = new DateTimeOffset(needConvertUtcDateTime);
var time = TimeZoneInfo.ConvertTimeFromUtc(needConvertUtcDateTime, tz).ToString(_dateFormat);
writer.WriteValue(time);
writer.Flush();
}
}
}
@@ -0,0 +1,103 @@
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Http;
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using StackExchange.Redis;
using System;
using System.Globalization;
namespace IRaCIS.Core.API
{
/// <summary>
/// 序列化,反序列化的时候,处理时间 时区转换
/// </summary>
public class JSONTimeZoneConverter : DateTimeConverterBase
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly TimeZoneInfo _clientTimeZone;
public JSONTimeZoneConverter(IHttpContextAccessor httpContextAccessor)
{
_httpContextAccessor = httpContextAccessor;
//默认是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))
{
timeZoneId = timeZoneIdHeader.Value;
}
_clientTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId);
}
public override bool CanConvert(Type objectType)
{
// 仅支持 DateTime 类型的转换
return objectType == typeof(DateTime)|| objectType == typeof(DateTime?);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (reader.Value == null)
{
return null;
}
DateTime dateTime;
if (reader.ValueType == typeof(DateTime) || reader.ValueType == typeof(DateTime?))
{
DateTime? nullableDateTime = reader.Value as DateTime?;
if (nullableDateTime != null && nullableDateTime.HasValue)
{
dateTime = nullableDateTime.Value;
}
else
{
return null;
}
}
else
{
if (DateTime.TryParse((string)reader.Value, out dateTime) == false)
{
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);
}
else
{
writer.WriteNull();
}
}
}
}
@@ -1,4 +1,6 @@
using IRaCIS.Core.API._ServiceExtensions.NewtonsoftJson;
using IRaCIS.Core.Application.Helper;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Newtonsoft.Json; using Newtonsoft.Json;
using Newtonsoft.Json.Converters; using Newtonsoft.Json.Converters;
@@ -8,8 +10,12 @@ namespace IRaCIS.Core.API
{ {
public static class NewtonsoftJsonSetup public static class NewtonsoftJsonSetup
{ {
public static void AddNewtonsoftJsonSetup(this IMvcBuilder builder) public static void AddNewtonsoftJsonSetup(this IMvcBuilder builder, IServiceCollection services)
{ {
services.AddHttpContextAccessor();
services.AddScoped<JSONTimeZoneConverter>();
services.AddScoped<CustomStringConverter>();
services.AddScoped<IOSSService,OSSService>();
builder.AddNewtonsoftJson(options => builder.AddNewtonsoftJson(options =>
{ {
@@ -23,8 +29,15 @@ namespace IRaCIS.Core.API
// 设置时间格式 // 设置时间格式
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss"; options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
options.SerializerSettings.DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind;
//options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ; //options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ;
options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<JSONTimeZoneConverter>());
//options.SerializerSettings.Converters.Add(services.BuildServiceProvider().GetService<CustomStringConverter>());
//IsoDateTimeConverter //IsoDateTimeConverter
//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore; //options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
@@ -28,7 +28,7 @@ namespace IRaCIS.Core.API
if(_MemberInfo.PropertyType == typeof(string)) 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 else
@@ -0,0 +1,65 @@
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>
{
//private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IOSSService _oSSService;
// 构造函数
public CustomStringConverter(/*IHttpContextAccessor httpContextAccessor*/ IOSSService oSSService)
{
//_httpContextAccessor = httpContextAccessor;
_oSSService = oSSService;
}
public override string ReadJson(JsonReader reader, Type objectType, string existingValue, bool hasExistingValue, JsonSerializer serializer)
{
if (reader.TokenType == JsonToken.String)
{
return (string)reader.Value;
}
return null;
}
public override void WriteJson(JsonWriter writer, string value, JsonSerializer serializer)
{
if (value != null)
{
// 在这里对字符串进行处理,例如转换大小写、去除空格等
// 这里只是一个示例,您可以根据实际需求进行更改
// 获取当前正在序列化的属性名
string propertyName = writer.Path.Split('.').Last();
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))
{
var tt= _oSSService.GetSignedUrl(value);
writer.WriteValue(tt);
}
else
{
// 将处理后的字符串写入到 JsonWriter 中
writer.WriteValue(value);
}
}
else
{
writer.WriteNull();
}
}
}
}
@@ -1,49 +0,0 @@
using IRaCIS.Application.Services.BackGroundJob;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Quartz;
namespace IRaCIS.Core.API
{
public static class QuartZSetup
{
public static void AddQuartZSetup(this IServiceCollection services, IConfiguration configuration)
{
services.AddTransient<CancelTaskQuartZJob>();
services.AddQuartz(q =>
{
// base quartz scheduler, job and trigger configuration
// as of 3.3.2 this also injects scoped services (like EF DbContext) without problems
q.UseMicrosoftDependencyInjectionJobFactory();
// 基本Quartz调度器、作业和触发器配置
//var jobKey = new JobKey("RegularTrialWork", "regularWorkGroup");
//q.AddJob<CacheTrialStatusQuartZJob>(jobKey, j => j
// .WithDescription("Trial regular work")
//);
//q.AddTrigger(t => t
// .WithIdentity("TrialStatusTrigger")
// .ForJob(jobKey)
// .WithCronSchedule("0 0 * * * ?")
// .WithDescription("My regular trial work trigger")
//);
});
// ASP.NET Core hosting
services.AddQuartzHostedService(options =>
{
// when shutting down we want jobs to complete gracefully
options.WaitForJobsToComplete = true;
});
}
}
}
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.ResponseCompression; using Microsoft.AspNetCore.ResponseCompression;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System.IO.Compression;
namespace IRaCIS.Core.API namespace IRaCIS.Core.API
{ {
@@ -10,9 +11,20 @@ namespace IRaCIS.Core.API
{ {
services.AddResponseCompression(options => services.AddResponseCompression(options =>
{ {
options.EnableForHttps = true;
options.Providers.Add<BrotliCompressionProvider>(); options.Providers.Add<BrotliCompressionProvider>();
options.Providers.Add<GzipCompressionProvider>(); options.Providers.Add<GzipCompressionProvider>();
}); });
services.Configure<BrotliCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;
});
services.Configure<GzipCompressionProviderOptions>(options =>
{
options.Level = CompressionLevel.Optimal;
});
} }
} }
} }
@@ -21,8 +21,8 @@ namespace IRaCIS.Core.API
.MinimumLevel.Override("Hangfire", LogEventLevel.Warning) .MinimumLevel.Override("Hangfire", LogEventLevel.Warning)
.MinimumLevel.Override("System.Net.Http.HttpClient.HttpReports", LogEventLevel.Warning) .MinimumLevel.Override("System.Net.Http.HttpClient.HttpReports", LogEventLevel.Warning)
.Enrich.WithClientIp() .Enrich.WithClientIp()
.Enrich.FromLogContext() .Enrich.FromLogContext()
.Filter.ByExcluding(logEvent =>logEvent.Properties.ContainsKey("RequestPath") && logEvent.Properties["RequestPath"].ToString().Contains("/health"))
//控制台 方便调试 问题 我们显示记录日志 时 获取上下文的ip 和用户名 用户类型 //控制台 方便调试 问题 我们显示记录日志 时 获取上下文的ip 和用户名 用户类型
.WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning, .WriteTo.Console(restrictedToMinimumLevel: LogEventLevel.Warning,
@@ -3,6 +3,7 @@ using Hangfire.SqlServer;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using System; using System;
using System.Runtime.InteropServices;
namespace IRaCIS.Core.API namespace IRaCIS.Core.API
{ {
@@ -14,9 +15,14 @@ namespace IRaCIS.Core.API
services.AddHangfire(hangFireConfig => services.AddHangfire(hangFireConfig =>
{ {
//本地window 调试 使用内存,服务器部署使用数据库,防止服务器任务调度到本地
if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
{
hangFireConfig.UseInMemoryStorage();
//hangFireConfig.UseInMemoryStorage(); }
else
{
//指定存储介质 //指定存储介质
hangFireConfig.UseSqlServerStorage(hangFireConnStr, new SqlServerStorageOptions() hangFireConfig.UseSqlServerStorage(hangFireConnStr, new SqlServerStorageOptions()
{ {
@@ -27,6 +33,11 @@ namespace IRaCIS.Core.API
UseRecommendedIsolationLevel = true, UseRecommendedIsolationLevel = true,
DisableGlobalLocks = true DisableGlobalLocks = true
}); });
}
//hangFireConfig.UseTagsWithSql(); //nuget引入Hangfire.Tags.SqlServer //hangFireConfig.UseTagsWithSql(); //nuget引入Hangfire.Tags.SqlServer
//.UseHangfireHttpJob(); //.UseHangfireHttpJob();
@@ -0,0 +1,70 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ConnectionStrings": {
"RemoteNew": "Server=47.117.164.182,1434;Database=Event_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=47.117.164.182,1434;Database=Event_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS",
"AliyunOSS": {
"regionId": "cn-shanghai",
"internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"endpoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ",
"accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio",
"bucketName": "zy-irc-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-irc-cache.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai"
},
"MinIO": {
"endpoint": "http://192.168.3.68",
"port": "8001",
"useSSL": false,
"accessKey": "IDFkwEpWej0b4DtiuThL",
"secretKey": "Lhuu83yMhVwu7c1SnjvGY6lq74jzpYqifK6Qtj4h",
"bucketName": "test"
}
},
"BasicSystemConfig": {
"OpenUserComplexPassword": true,
"OpenSignDocumentBeforeWork": true,
"OpenLoginLimit": true,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 60,
"ContinuousReadingTimeMin": 120,
"ReadingRestTimeMin": 10,
"IsNeedChangePassWord": true,
"ChangePassWordDays": 90
},
"SystemEmailSendConfig": {
"Port": 465,
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "uat@extimaging.com",
"FromName": "UAT_IRC",
"AuthorizationCode": "SHzyyl2021",
"SiteUrl": "http://irc.event.extimaging.com/login",
"CompanyName": "Extensive Imaging",
"CompanyNameCN": "上海展影医疗科技有限公司",
"CompanyShortName": "Extensive Imaging",
"CompanyShortNameCN": "展影医疗"
}
}
+72
View File
@@ -0,0 +1,72 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ConnectionStrings": {
//"RemoteNew": "Server=101.132.193.237,1434;Database=Prod_IRC;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true",
//"Hangfire": "Server=101.132.193.237,1434;Database=Prod_IRC_Hangfire;User ID=sa;Password=zhanying@2021;TrustServerCertificate=true"
"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"
},
"ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS",
"AliyunOSS": {
"regionId": "cn-shanghai",
"internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"endpoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ",
"accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio",
"bucketName": "zy-irc-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-irc-cache.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai"
},
"MinIO": {
"endpoint": "http://192.168.3.68",
"port": "8001",
"useSSL": false,
"accessKey": "IDFkwEpWej0b4DtiuThL",
"secretKey": "Lhuu83yMhVwu7c1SnjvGY6lq74jzpYqifK6Qtj4h",
"bucketName": "test"
}
},
"BasicSystemConfig": {
"OpenUserComplexPassword": true,
"OpenSignDocumentBeforeWork": true,
"OpenLoginLimit": true,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 360,
"OpenLoginMFA": false,
"ContinuousReadingTimeMin": 120,
"ReadingRestTimeMin": 10,
"IsNeedChangePassWord": true,
"ChangePassWordDays": 90
},
"SystemEmailSendConfig": {
"Port": 465,
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "IRC@extimaging.com",
"FromName": "IRC",
"AuthorizationCode": "ExtImg@2022",
"SiteUrl": "http://irc.extimaging.com/login",
"OrganizationName": "Extlmaging",
"OrganizationNameCN": "Extlmaging",
"CompanyName": "Extensive Imaging",
"CompanyNameCN": "上海展影医疗科技有限公司",
"CompanyShortName": "Extensive Imaging",
"CompanyShortNameCN": "展影医疗"
}
}
+94
View File
@@ -0,0 +1,94 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"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"
},
"ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS",
"AliyunOSS": {
"regionId": "cn-shanghai",
"internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"endPoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ",
"accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio",
"bucketName": "zy-irc-test-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-irc-test-store.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai"
},
"MinIO": {
"endPoint": "hir-oss.test.extimaging.com",
"port": "443",
"useSSL": true,
"accessKey": "fbStsVYCIPKHQneeqMwD",
"secretKey": "TzgvyA3zGXMUnpilJNUlyMYHfosl1hBMl6lxPmjy",
"bucketName": "irc-test",
"viewEndpoint": "https://hir-oss.test.extimaging.com/irc-test"
},
"AWS": {
"endPoint": "s3.us-east-1.amazonaws.com",
"useSSL": true,
"accessKey": "AKIAZQ3DRSOHFPJJ6FEU",
"secretKey": "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",
"bucketName": "ei-irc-test-store",
"viewEndpoint": "https://ei-irc-test-store.s3.amazonaws.com/"
}
},
"BasicSystemConfig": {
"OpenUserComplexPassword": false,
"OpenSignDocumentBeforeWork": false,
"OpenTrialRelationDelete": true,
"OpenLoginLimit": false,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 1,
"AutoLoginOutMinutes": 1,
"OpenLoginMFA": false,
"ContinuousReadingTimeMin": 120,
"ReadingRestTimeMin": 10,
"IsNeedChangePassWord": true,
"ChangePassWordDays": 90
},
"SystemEmailSendConfig": {
"Port": 465,
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "test@extimaging.com",
"FromName": "Test_IRC",
"AuthorizationCode": "SHzyyl2021",
"SiteUrl": "http://irc.test.extimaging.com/login",
"OrganizationName": "Extlmaging",
"OrganizationNameCN": "Extlmaging",
"CompanyName": "Extensive Imaging",
"CompanyNameCN": "上海展影医疗科技有限公司",
"CompanyShortName": "Extensive Imaging",
"CompanyShortNameCN": "展影医疗"
},
"SystemPacsConfig": {
"Port": "11113",
"IP": "106.14.89.110"
}
}
@@ -0,0 +1,88 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ConnectionStrings": {
"RemoteNew": "Server=us-prod-mssql-service,1433;Database=US_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=us-prod-mssql-service,1433;Database=US_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
//"RemoteNew": "Server=44.210.231.169,1435;Database=US_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
//"Hangfire": "Server=44.210.231.169,1435;Database=US_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
},
"ObjectStoreService": {
"ObjectStoreUse": "AWS",
"AliyunOSS": {
"regionId": "cn-shanghai",
"internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"endPoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "",
"accessKeySecret": "",
"bucketName": "zy-irc-test-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-irc-test-store.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai"
},
"MinIO": {
"endPoint": "44.210.231.169",
"port": "9001",
"useSSL": false,
"accessKey": "e9bT1isTOqSAUxb6wd4n",
"secretKey": "b5TaDzNdQCBtCvfm8eZ3dR6yY7tfZu2JYze2Po1i",
"bucketName": "prod-irc-us",
"viewEndpoint": "http://44.210.231.169:9001/prod-irc-us/"
},
"AWS": {
"endPoint": "s3.us-east-1.amazonaws.com",
"useSSL": true,
"accessKey": "AKIAW3MEAFJX5P32P6NA",
"secretKey": "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",
"bucketName": "ei-med-s3-lili-store",
"viewEndpoint": "https://ei-med-s3-lili-store.s3.amazonaws.com/"
}
},
"BasicSystemConfig": {
"OpenUserComplexPassword": false,
"OpenSignDocumentBeforeWork": false,
"OpenTrialRelationDelete": true,
"OpenLoginLimit": false,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 60,
"ContinuousReadingTimeMin": 120,
"ReadingRestTimeMin": 10,
"IsNeedChangePassWord": true,
"ChangePassWordDays": 90
},
"SystemEmailSendConfig": {
"Port": 587,
"Host": "smtp-mail.outlook.com",
"FromEmail": "donotreply@elevateimaging.ai",
"FromName": "LiLi",
"AuthorizationCode": "Q#669869497420ul",
"OrganizationName": "Elevate Imaging",
"OrganizationNameCN": "Elevate Imaging",
"CompanyName": "Elevate Imaging Inc.",
"CompanyNameCN": "上海展影医疗科技有限公司",
"CompanyShortName": "Elevate Imaging",
"CompanyShortNameCN": "展影医疗",
"SiteUrl": "https://lili.elevateimaging.ai/login"
}
}
@@ -0,0 +1,94 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"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"
},
"ObjectStoreService": {
"ObjectStoreUse": "MinIO",
"AliyunOSS": {
"regionId": "cn-shanghai",
"internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"endPoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ",
"accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio",
"bucketName": "zy-irc-test-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-irc-test-store.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai"
},
"MinIO": {
//"endPoint": "hir-oss.uat.extimaging.com",
//"port": "443",
//"useSSL": true,
//"viewEndpoint": "https://hir-oss.uat.extimaging.com/hir-uat",
"endPoint": "47.117.164.182",
"port": "9001",
"useSSL": false,
"viewEndpoint": "http://47.117.164.182:9001/test-irc-us",
"accessKey": "b9Ul0e98xPzt6PwRXA1Q",
"secretKey": "DzMaU2L4OXl90uytwOmDXF2encN0Jf4Nxu2XkYqQ",
"bucketName": "test-irc-us"
},
"AWS": {
"endPoint": "s3.us-east-1.amazonaws.com",
"useSSL": true,
"accessKey": "AKIAZQ3DRSOHFPJJ6FEU",
"secretKey": "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",
"bucketName": "ei-irc-test-store",
"viewEndpoint": "https://ei-irc-test-store.s3.amazonaws.com/"
}
},
"BasicSystemConfig": {
"OpenUserComplexPassword": false,
"OpenSignDocumentBeforeWork": false,
"OpenTrialRelationDelete": true,
"OpenLoginLimit": false,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 60,
"ContinuousReadingTimeMin": 120,
"ReadingRestTimeMin": 10,
"IsNeedChangePassWord": true,
"ChangePassWordDays": 90
},
"SystemEmailSendConfig": {
"Port": 587,
"Host": "smtp-mail.outlook.com",
"FromEmail": "donotreply@elevateimaging.ai",
"FromName": "LiLi",
"AuthorizationCode": "Q#669869497420ul",
"OrganizationName": "Elevate Imaging",
"OrganizationNameCN": "Elevate Imaging",
"CompanyName": "Elevate Imaging Inc.",
"CompanyNameCN": "上海展影医疗科技有限公司",
"CompanyShortName": "Elevate Imaging",
"CompanyShortNameCN": "展影医疗",
"SiteUrl": "https://lili.test.elevateimaging.ai/login"
}
}
@@ -0,0 +1,88 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"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"
//"RemoteNew": "Server=3.226.182.187,1435;Database=US_Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
//"Hangfire": "Server=3.226.182.187,1435;Database=US_Uat_IRC_Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"ObjectStoreService": {
"ObjectStoreUse": "AWS",
"MinIO": {
//"endPoint": "hir-minio.uat.elevateimaging.ai",
//"port": "443",
//"useSSL": true,
//"viewEndpoint": "https://hir-minio.uat.elevateimaging.ai/uat-irc-us",
"endPoint": "3.226.182.187",
"port": "9001",
"useSSL": false,
"viewEndpoint": "http://44.218.11.19:9001/uat-irc-us",
"accessKey": "lH8DkKskLuDqPaiubuSQ",
"secretKey": "pdPdicvvLeH7xAC5yFUrI7odMyBfOXxvVWMvKYV4",
"bucketName": "uat-irc-us"
},
"AWS": {
"endPoint": "s3.us-east-1.amazonaws.com",
"useSSL": true,
"accessKey": "AKIAW3MEAFJXUO6XYFYN",
"secretKey": "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",
"bucketName": "ei-med-s3-lili-uat-store",
"viewEndpoint": "https://ei-med-s3-lili-uat-store.s3.amazonaws.com/"
}
},
"BasicSystemConfig": {
"OpenUserComplexPassword": false,
"OpenSignDocumentBeforeWork": false,
"OpenTrialRelationDelete": true,
"OpenLoginLimit": false,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 60,
"ContinuousReadingTimeMin": 120,
"ReadingRestTimeMin": 10,
"IsNeedChangePassWord": true,
"ChangePassWordDays": 90,
"OpenLoginMFA": true
},
"SystemEmailSendConfig": {
"Port": 587,
"Host": "smtp-mail.outlook.com",
"FromEmail": "donotreply@elevateimaging.ai",
"FromName": "LiLi",
"AuthorizationCode": "Q#669869497420ul",
"OrganizationName": "Elevate Imaging",
"OrganizationNameCN": "Elevate Imaging",
"CompanyName": "Elevate Imaging Inc.",
"CompanyNameCN": "上海展影医疗科技有限公司",
"CompanyShortName": "Elevate Imaging",
"CompanyShortNameCN": "展影医疗",
"SiteUrl": "https://lili.test.elevateimaging.ai/login"
}
}
+85
View File
@@ -0,0 +1,85 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ConnectionStrings": {
"RemoteNew": "Server=47.117.164.182,1434;Database=Uat_IRC;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=47.117.164.182,1434;Database=Uat_IRC.Hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS",
"AliyunOSS": {
"regionId": "cn-shanghai",
"internalEndpoint": "https://oss-cn-shanghai-internal.aliyuncs.com",
"endpoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "LTAI5tKvzs7ed3UfSpNk3xwQ",
"accessKeySecret": "zTIceGEShlZDGnLrCFfIGFE7TXVRio",
"bucketName": "zy-irc-uat-store",
"roleArn": "acs:ram::1899121822495495:role/oss-upload",
"viewEndpoint": "https://zy-irc-uat-store.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai"
},
"MinIO": {
"endPoint": "hir-oss.uat.extimaging.com",
"port": "80",
"useSSL": false,
"viewEndpoint": "http://hir-oss.uat.extimaging.com/irc-uat",
//"port": "443",
//"useSSL": true,
//"viewEndpoint": "https://hir-oss.uat.extimaging.com/irc-uat",
"accessKey": "b9Ul0e98xPzt6PwRXA1Q",
"secretKey": "DzMaU2L4OXl90uytwOmDXF2encN0Jf4Nxu2XkYqQ",
"bucketName": "irc-uat"
}
},
"BasicSystemConfig": {
"OpenUserComplexPassword": true,
"OpenSignDocumentBeforeWork": true,
"OpenLoginLimit": true,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30,
"AutoLoginOutMinutes": 60,
"OpenLoginMFA": false,
"ContinuousReadingTimeMin": 120,
"ReadingRestTimeMin": 10,
"IsNeedChangePassWord": true,
"ChangePassWordDays": 90
},
"SystemEmailSendConfig": {
"Port": 465,
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "uat@extimaging.com",
"FromName": "UAT_IRC",
"AuthorizationCode": "SHzyyl2021",
"SiteUrl": "http://irc.uat.extimaging.com/login",
"OrganizationName": "Extlmaging",
"OrganizationNameCN": "Extlmaging",
"CompanyName": "Extensive Imaging",
"CompanyNameCN": "上海展影医疗科技有限公司",
"CompanyShortName": "Extensive Imaging",
"CompanyShortNameCN": "展影医疗"
},
"SystemPacsConfig": {
"Port": "11113",
"IP": "47.117.164.182"
}
}
@@ -1,50 +0,0 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ObjectStoreService": {
"ObjectStoreUse": "AliyunOSS",
"AliyunOSS": {
"regionId": "cn-shanghai",
"endpoint": "https://oss-cn-shanghai.aliyuncs.com",
"accessKeyId": "LTAI5tL9GrNqqvCWYWtfVfn9",
"accessKeySecret": "YAZuoDTenF7ljLcDPgNjvh93KemAxk",
"bucketName": "tl-med-sir-uat-store",
"roleArn": "acs:ram::1078130221702011:role/uat-oss-access",
"viewEndpoint": "https://tl-med-sir-uat-store.oss-cn-shanghai.aliyuncs.com",
"region": "oss-cn-shanghai"
}
},
"ConnectionStrings": {
"RemoteNew": "Server=101.132.253.119,1435;Database=Uat_Study;User ID=sa;Password=xc@123456;TrustServerCertificate=true",
"Hangfire": "Server=101.132.253.119,1435;Database=Uat_Study_hangfire;User ID=sa;Password=xc@123456;TrustServerCertificate=true"
},
"BasicSystemConfig": {
"OpenUserComplexPassword": false,
"OpenSignDocumentBeforeWork": false,
"OpenTrialRelationDelete": true,
"OpenLoginLimit": false,
"LoginMaxFailCount": 5,
"LoginFailLockMinutes": 30
},
"SystemEmailSendConfig": {
"Port": 465,
"Host": "smtp.qiye.aliyun.com",
"FromEmail": "uat-study@extimaging.com",
"FromName": "Uat_Study",
"AuthorizationCode": "zhanying123",
"SiteUrl": "http://study.uat.extimaging.com/login"
}
}
+10 -6
View File
@@ -1,11 +1,10 @@
{ {
"JwtSetting": { "JwtSetting": {
"SecurityKey": "3e6dbfa227234a03977a2f421bdb7f4f", "SecurityKey": "ShangHaiZhanYing_SecurityKey_SHzyyl@2021",
"Issuer": "IRaCIS", "Issuer": "Extimaging",
"Audience": "ZhiZhun", "Audience": "EICS",
"TokenExpireDays": "7" "TokenExpireDays": "7"
}, },
//ip
"IpRateLimiting": { "IpRateLimiting": {
"EnableEndpointRateLimiting": true, "EnableEndpointRateLimiting": true,
"StackBlockedRequests": false, "StackBlockedRequests": false,
@@ -20,7 +19,6 @@
"EndpointWhitelist": [ "EndpointWhitelist": [
"post:/study/archivestudy/*" "post:/study/archivestudy/*"
], ],
"IpWhitelist": [], "IpWhitelist": [],
"GeneralRules": [ "GeneralRules": [
{ {
@@ -92,7 +90,13 @@
"DicomStudyCodePrefix": "ST", "DicomStudyCodePrefix": "ST",
"SystemSiteCodePrefix": "S", "SystemSiteCodePrefix": "S",
"DefaultPassword": "123456", "DefaultPassword": "123456",
"DefaultInternalOrganizationName": "ExtImaging",
"ImageShareExpireDays": 10 "ImageShareExpireDays": 10
},
"EncrypteResponseConfig": {
"IsEnable": true,
"ApiPathList": [
"/test/get"
]
} }
} }
Binary file not shown.
@@ -11,7 +11,7 @@
尊敬的 {0} ,您好: 尊敬的 {0} ,您好:
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
展影医疗为您添加了账户,账户信息如下: {company abbreviation}为您添加了账户,账户信息如下:
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
@@ -23,7 +23,7 @@
</div> </div>
<div> <div>
首次登陆前,请通过该链接修改您的账户信息: 首次登陆前,请通过该链接修改您的账户信息:
<a href='{3}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{3}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
初始化账号信息 初始化账号信息
</a> </a>
</div> </div>
@@ -32,7 +32,7 @@
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,17 +4,17 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Dear {0} , Dear {0} ,
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
Extensive Imaging has generated a user account for you. <br>The account information is as follows: {company abbreviation} has created an account for you. The account information is as follows:
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
<div> <div>
User ID: {1} User ID: {1}
</div> </div>
@@ -22,17 +22,17 @@
Role: {2} Role: {2}
</div> </div>
<div> <div>
Before logging in for the first time, please initialize your account information through this link: Before logging in for the first time, please modify the account information through this link
<a href='{3}' style='margin-left:30px;font-size:12px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;font-size: 16px'> <a href='{3}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
Initialize Account Information Initialize account information
</a> </a>
</div> </div>
</div> </div>
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -11,7 +11,7 @@
尊敬的 {0} ,您好: 尊敬的 {0} ,您好:
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
展影医疗将您的账户密码已重置,账户信息如下: {company abbreviation}将您的账户密码已重置,账户信息如下:
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
@@ -29,7 +29,7 @@
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,17 +4,17 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Dear {0} , Dear {0} ,
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
Extensive Imaging has reset your password.<br>The account information is as follows: {company abbreviation} has reset your account password, and the account information is as follows:
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 12px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
<div> <div>
User ID: {1} User ID: {1}
</div> </div>
@@ -27,9 +27,9 @@
</div> </div>
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -19,7 +19,7 @@
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,22 +4,22 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;font-size: 16px'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Dear Sir or Madam: Dear
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
Thank you for using our IRC imaging system. Thank you for using {company abbreviation} Cloud System.
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
{0}. {0}
</div> </div>
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -11,7 +11,7 @@
尊敬的 {0} ,您好: 尊敬的 {0} ,您好:
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
展影医疗作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目阅片相关工作。 {company abbreviation}作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目阅片相关工作。
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
该项目采用电子化工作流,系统及您的账号信息如下: 该项目采用电子化工作流,系统及您的账号信息如下:
@@ -35,7 +35,7 @@
</div> </div>
<div> <div>
系统登录地址: 系统登录地址:
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
点击跳转 点击跳转
</a> </a>
</div> </div>
@@ -43,7 +43,7 @@
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,20 +4,20 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Dear {0}, Dear {0},
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
As the service provider of {1} trialProtocol ID is {2}, Extensive Imaging invites you to participate in the independent assessment work of this trial. {company abbreviation} invites you to participate in the IRC work of a trial ({1} , {2}).
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
Digital workflow is implemented for this trial, and your account information is as follows: Your account information is as follows
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
<div> <div>
Trial ID: {3} Trial ID: {3}
</div> </div>
@@ -28,22 +28,23 @@
Study Name: {1} Study Name: {1}
</div> </div>
<div> <div>
User Name: {4} User ID: {4}
</div> </div>
<div> <div>
Role: {5} Role: {5}
</div> </div>
<div> <div>
Login URL: Login URL:
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
click redirect Click to login
</a> </a>
</div> </div>
</div> </div>
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -11,7 +11,7 @@
尊敬的 {0} ,您好: 尊敬的 {0} ,您好:
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
展影医疗作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目阅片相关工作,欢迎您提供指导和建议,非常感谢! {company abbreviation}作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作,欢迎您提供指导和建议,非常感谢!
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
该项目采用电子化工作流,系统及您的账号信息如下: 该项目采用电子化工作流,系统及您的账号信息如下:
@@ -35,7 +35,7 @@
</div> </div>
<div> <div>
首次登陆前,请通过该链接修改您的账户信息: 首次登陆前,请通过该链接修改您的账户信息:
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
初始化账号信息 初始化账号信息
</a> </a>
</div> </div>
@@ -44,7 +44,7 @@
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,21 +4,20 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Dear {0}, Dear {0},
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
As the service provider of {1}trial (Protocol ID is {2}), Extensive Imaging invites you to participate in the independent assessment work of this trial. {company abbreviation} invites you to participate in the IRC work of a trial ({1}, {2}).
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> Your account information is as follows
Digital workflow is implemented for this trial, and your account information is as follows:
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
<div> <div>
Trial ID: {3} Trial ID: {3}
</div> </div>
@@ -35,17 +34,17 @@
Role: {5} Role: {5}
</div> </div>
<div> <div>
Before logging in for the first time, please modify your account information through this link: Before logging in for the first time, please modify the account information through this link
<a href='{6}' style='margin-left:30px;font-size:16px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
Initialize Account Information Initialize account information
</a> </a>
</div> </div>
</div> </div>
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;font-size: 16px'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -11,7 +11,7 @@
尊敬的 {0} ,您好: 尊敬的 {0} ,您好:
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
好, 您填写的中心调研表被驳回,详细信息如下: 您填写的中心调研表被驳回,详细信息如下:
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
@@ -41,7 +41,7 @@
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,17 +4,17 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;font-size: 16px'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;font-size: 16px'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Dear {0} , Dear {0} ,
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
The site survey questionnaire you filled in has been rejected. Details are as follows: The site survey form you filled in has been rejected. The details are as follows
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
<div> <div>
Trial ID: {1} Trial ID: {1}
</div> </div>
@@ -28,20 +28,20 @@
Site ID: {4} Site ID: {4}
</div> </div>
<div> <div>
Site Name: {5} Site name: {5}
</div> </div>
<div> <div>
Reason for rejection: {6} Reason for rejection: {6}
</div> </div>
</div> </div>
<a href='{7}' style='margin-left:60px;font-size:16px;padding: 10px;text-decoration: none;display:{8} ;height: 40px;width: 140px;background: #00D1B2;color:#fff;border-radius: 5px;line-height: 40px;text-align: center;margin-bottom: 100px;font-size: 16px'> <a href='{7}' style='margin-left:60px;font-size:14px;padding: 10px;text-decoration: none;display:{8} ;height: 40px;width: 140px;background: #00D1B2;color:#fff;border-radius: 5px;line-height: 40px;text-align: center;margin-bottom: 100px;'>
Login & View Login and view
</a> </a>
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -11,7 +11,7 @@
尊敬的 {0} ,您好: 尊敬的 {0} ,您好:
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
展影医疗作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目相关工作,欢迎您提供指导和建议,非常感谢! {company abbreviation}作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目相关工作,欢迎您提供指导和建议,非常感谢!
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
该项目采用电子化工作流,系统及您的账号信息如下: 该项目采用电子化工作流,系统及您的账号信息如下:
@@ -35,7 +35,7 @@
</div> </div>
<div> <div>
系统登录地址: 系统登录地址:
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{6}' style='margin-left:5px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
点击跳转 点击跳转
</a> </a>
</div> </div>
@@ -44,7 +44,7 @@
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,20 +4,20 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;font-size: 16px'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6;font-size: 16px'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;font-size: 16px'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Dear {0}, Dear {0},
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'>
As the service provider of {1} trial (Protocol ID is {2}), Extensive Imaging invites you to participate in related work of this trial. {company abbreviation} invites you to participate in the IRC work of a trial ({1}, {2}).
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
Digital workflow is implemented for this trial, and your account information is as follows: Your account information is as follows
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
<div> <div>
Trial ID: {3} Trial ID: {3}
</div> </div>
@@ -28,23 +28,23 @@
Study Name: {1} Study Name: {1}
</div> </div>
<div> <div>
User Name: {4} User ID: {4}
</div> </div>
<div> <div>
Role: {5} Role: {5}
</div> </div>
<div> <div>
Login URL: Login URL:
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
click redirect Click to login
</a> </a>
</div> </div>
</div> </div>
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -11,7 +11,7 @@
尊敬的 {0} ,您好: 尊敬的 {0} ,您好:
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
展影医疗作为 [{1} (试验方案号:{2 })] 项目的供应商,诚邀您参加该项目相关工作 {company abbreviation}作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
该项目采用电子化工作流,系统及您的账号信息如下: 该项目采用电子化工作流,系统及您的账号信息如下:
@@ -35,7 +35,7 @@
</div> </div>
<div> <div>
首次登陆前,请通过该链接修改您的账户信息: 首次登陆前,请通过该链接修改您的账户信息:
<a href='{6}' style='margin-left:30px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
初始化账号信息 初始化账号信息
</a> </a>
</div> </div>
@@ -44,7 +44,7 @@
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,20 +4,20 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;font-size: 16px'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Dear {0}, Dear {0},
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
As the service provider of {1} trial (Protocol ID is {2}), Extensive Imaging invites you to participate in related work of this trial. {company abbreviation} invites you to participate in the IRC work of a trial ({1}, {2}).
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
Digital workflow is implemented for this trial, and your account information is as follows: Your account information is as follows
</div> </div>
<span style="color: #00D1B2"></span> <span style="color: #00D1B2"></span>
<div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;font-size: 16px'> <div style='border: 1px solid #eee;box-sizing:border-box;width: 50%;background: #fff;padding: 20px;line-height: 40px;font-size: 14px;border-radius: 5px;margin-left: 60px;margin-bottom: 30px;'>
<div> <div>
Trial ID: {3} Trial ID: {3}
</div> </div>
@@ -28,23 +28,23 @@
Study Name: {1} Study Name: {1}
</div> </div>
<div> <div>
User Name: {4} User ID: {4}
</div> </div>
<div> <div>
Role: {5} Role: {5}
</div> </div>
<div> <div>
Before logging in for the first time, please modify your account information through this link: Before logging in for the first time, please modify the account information through this link
<a href='{6}' style='margin-left:30px;font-size:16px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'> <a href='{6}' style='margin-left:1px;font-size:14px;text-decoration: none;display: inline-block;color:#00D1B2;border-radius: 5px;line-height: 40px;text-align: center;'>
Initialize Account Information Initialize the account information
</a> </a>
</div> </div>
</div> </div>
<div style='line-height: 24px;font-size: 16px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -8,18 +8,20 @@
<div style='padding-left: 40px;background: #f6f6f6'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 18px'> <div style='line-height: 40px;font-size: 18px'>
Hello {0}, {0}您好,
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
感谢您使用展影云平台。 感谢您使用展影云平台。
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
{1},验证码是: {2},请在3分钟内输入该验证码,进行后续操作。如非本人操作,请忽略该邮件 {1},验证码是: <span style="font-weight:bold">{2}</span>
</div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
请在3分钟内输入该验证码,进行后续操作
</div> </div>
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>祝您顺利!</div> <div>祝您顺利!</div>
<div style="font-size: 14px;">展影医疗</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -4,25 +4,25 @@
<meta charset='UTF-8'> <meta charset='UTF-8'>
<title>Title</title> <title>Title</title>
</head> </head>
<body style='font-family: Times New Roman;padding: 0;margin: 0;'> <body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
<div style='padding-left: 40px;background: #f6f6f6'> <div style='padding-left: 40px;background: #f6f6f6'>
<div style='padding-top: 20px;'> <div style='padding-top: 20px;'>
<div style='line-height: 40px;font-size: 16px'> <div style='line-height: 40px;font-size: 18px'>
Hello {0}, Dear {0},
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
Thank you for using our imaging system. {1}
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
{1}, the verification code is {2}. Please enter this code within 3 minutes for follow-up operations. The verification code is <span style="font-weight:bold">{2}</span>.
</div> </div>
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;font-size: 16px'> <div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
If you are not the intended person, please ignore this email. This code will expire in 3 minutes.
</div> </div>
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;font-size: 16px'> <div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
<div>Best regards,</div> <div>Best regards,</div>
<div style="font-size: 16px;">Extensive Imaging</div> <div style="font-size: 14px;">{company}</div>
</div> </div>
</div> </div>
</div> </div>
@@ -276,8 +276,10 @@ var abp = abp || {};
} }
var password = document.getElementById('password').value; var password = document.getElementById('password').value;
if (!password) { var pwdMd5 = document.getElementById('pwdMd5').value;
alert('PassWord Can Not Be Null'); console.log(pwdMd5);
if (!password && !pwdMd5) {
alert('PassWord And Md5 Can Not Be Null');
return false; return false;
} }
@@ -321,6 +323,9 @@ var abp = abp || {};
UserName: usernameOrEmailAddress, UserName: usernameOrEmailAddress,
Password: hex_md5(password), Password: hex_md5(password),
} }
if (pwdMd5 != '') {
parm.Password = pwdMd5;
}
xhr.send(JSON.stringify(parm)); xhr.send(JSON.stringify(parm));
//xhr.send("{" + "userName:'" + usernameOrEmailAddress + "'," + "passWord:'" + password + "'}"); //xhr.send("{" + "userName:'" + usernameOrEmailAddress + "'," + "passWord:'" + password + "'}");
@@ -416,6 +421,7 @@ var abp = abp || {};
createInput(modalUxContent, 'tenancyName', 'Tenancy Name (Leave empty for Host)'); createInput(modalUxContent, 'tenancyName', 'Tenancy Name (Leave empty for Host)');
createInput(modalUxContent, 'userName', 'Username or email address','text','cyldev'); createInput(modalUxContent, 'userName', 'Username or email address','text','cyldev');
createInput(modalUxContent, 'password', 'Password', 'password', '123456'); createInput(modalUxContent, 'password', 'Password', 'password', '123456');
createInput(modalUxContent, 'pwdMd5', 'PwdMd5', 'text', '');
//Buttons //Buttons
var authBtnWrapper = document.createElement('div'); var authBtnWrapper = document.createElement('div');
@@ -1,73 +0,0 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using EasyCaching.Core;
using IRaCIS.Core.Domain;
using IRaCIS.Core.Infra.EFCore;
using IRaCIS.Core.Domain.Models;
using Microsoft.Extensions.Logging;
using Quartz;
using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Application.ViewModel;
using IRaCIS.Core.Application.Contracts;
namespace IRaCIS.Application.Services.BackGroundJob
{
public class CancelTaskQuartZJob : IJob
{
private readonly IRepository<Subject> _subjectRepository;
private readonly ILogger<CancelTaskQuartZJob> _logger;
private readonly IRepository<VisitTask> _visitTaskRepository;
public CancelTaskQuartZJob(IRepository<Subject> subjectRepository, IEasyCachingProvider provider, ILogger<CancelTaskQuartZJob> logger, IRepository<VisitTask> visitTaskRepository)
{
_subjectRepository = subjectRepository;
_logger = logger;
_visitTaskRepository = visitTaskRepository;
}
public async Task Execute(IJobExecutionContext context)
{
_logger.LogInformation($"开始执行QuartZ定时取消任务作业");
try
{
JobDataMap dataMap = context.JobDetail.JobDataMap;
bool isInOrder = (bool)dataMap.Get("IsInOrder");
if (isInOrder)
{
Guid subjectId = (Guid)dataMap.Get("SubjectId");
Guid trialReadingCriterionId = (Guid)dataMap.Get("TrialReadingCriterionId");
await _visitTaskRepository.BatchUpdateNoTrackingAsync(t => t.SubjectId == subjectId && t.TrialReadingCriterionId==trialReadingCriterionId, u => new VisitTask() { SubjectCriterionClaimUserId = null });
}
else
{
Guid id = (Guid)dataMap.Get("VisitTaskId");
await _visitTaskRepository.UpdatePartialFromQueryAsync(t => t.Id == id && t.ReadingTaskState!=ReadingTaskState.HaveSigned, u => new VisitTask() { DoctorUserId = null }, true);
}
}
catch (Exception e)
{
_logger.LogError($"QuartZ定时取消任务异常" + e.Message);
}
_logger.LogInformation("QuartZ定时取消任务作业结束");
}
}
}
@@ -5,10 +5,11 @@ using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Application.Service; using IRaCIS.Core.Application.Service;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Infrastructure;
using Microsoft.EntityFrameworkCore.SqlServer.Query.Internal;
using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Newtonsoft.Json; using Newtonsoft.Json;
using SharpCompress.Common;
using ZiggyCreatures.Caching.Fusion;
namespace IRaCIS.Application.Services.BackGroundJob namespace IRaCIS.Application.Services.BackGroundJob
{ {
@@ -21,138 +22,48 @@ namespace IRaCIS.Application.Services.BackGroundJob
Task InitHangfireJobTaskAsync(); Task InitHangfireJobTaskAsync();
} }
public class IRaCISCHangfireJob : IIRaCISHangfireJob public class IRaCISCHangfireJob(IRepository<Trial> _trialRepository,
IEasyCachingProvider _provider,
ILogger<IRaCISCHangfireJob> _logger,
IRepository<SystemAnonymization> _systemAnonymizationRepository,
IRepository<Internationalization> _internationalizationRepository,
IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository
) : IIRaCISHangfireJob
{ {
public static string JsonFileFolder = Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources); public static string JsonFileFolder = Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources);
private readonly IRepository<Trial> _trialRepository;
private readonly IEasyCachingProvider _provider;
private readonly ILogger<IRaCISCHangfireJob> _logger;
private readonly IRepository<TrialEmailNoticeConfig> _trialEmailNoticeConfigRepository;
private readonly IRepository<Internationalization> _internationalizationRepository;
public IRaCISCHangfireJob(IRepository<Trial> trialRepository, ILogger<IRaCISCHangfireJob> logger, IEasyCachingProvider provider, IRepository<TrialEmailNoticeConfig> trialEmailNoticeConfigRepository, IRepository<Internationalization> internationalizationRepository)
{
_trialRepository = trialRepository;
_provider = provider;
_logger = logger;
_trialEmailNoticeConfigRepository = trialEmailNoticeConfigRepository;
_internationalizationRepository = internationalizationRepository;
}
public async Task InitHangfireJobTaskAsync() public async Task InitHangfireJobTaskAsync()
{ {
_logger.LogInformation("项目启动 hangfire 任务初始化 执行开始~"); _logger.LogInformation("项目启动 hangfire 任务初始化 执行开始~");
//初始化国际化
//项目状态 立即加载到缓存中 await InternationalizationHelper.InitInternationlizationDataAndWatchJsonFileAsync(_internationalizationRepository);
await MemoryCacheTrialStatusAsync();
//创建项目缓存 定时任务
HangfireJobHelper.AddOrUpdateInitCronJob<IIRaCISHangfireJob>("RecurringJob_Cache_TrialState", t => t.MemoryCacheTrialStatusAsync(), Cron.Daily());
//初始化
await InitInternationlizationDataAndWatchJsonFileAsync();
//创建邮件定时任务 //创建邮件定时任务
await InitSysAndTrialCronJobAsync(); await InitSysAndTrialCronJobAsync();
#region
////项目状态 立即加载到缓存中
//await MemoryCacheTrialStatusAsync();
////await MemoryCacheAnonymizeData();
////创建项目缓存 定时任务
//HangfireJobHelper.AddOrUpdateInitCronJob<IIRaCISHangfireJob>("RecurringJob_Cache_TrialState", t => t.MemoryCacheTrialStatusAsync(), Cron.Daily());
#endregion
_logger.LogInformation("项目启动 hangfire 任务初始化 执行结束"); _logger.LogInformation("项目启动 hangfire 任务初始化 执行结束");
} }
/// <summary>
/// 缓存项目状态
/// </summary>
/// <returns></returns>
public async Task MemoryCacheTrialStatusAsync()
{
var list = await _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr })
.ToListAsync();
list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(7)));
}
#region
public async Task InitInternationlizationDataAndWatchJsonFileAsync()
{
//查询数据库的数据
var toJsonList = await _internationalizationRepository.Where(t => t.InternationalizationType == 1).Select(t => new
{
t.Code,
t.Value,
t.ValueCN
}).ToListAsync();
//组织成json 文件
var usJsonPath = Path.Combine(JsonFileFolder, StaticData.En_US_Json);
var cnJsonPath = Path.Combine(JsonFileFolder, StaticData.Zh_CN_Json);
//本地静态文件国际化需要
foreach (var tojsonItem in toJsonList)
{
StaticData.En_US_Dic[tojsonItem.Code] = tojsonItem.Value;
StaticData.Zh_CN_Dic[tojsonItem.Code] = tojsonItem.ValueCN;
}
File.WriteAllText(usJsonPath, JsonConvert.SerializeObject(StaticData.En_US_Dic));
File.WriteAllText(cnJsonPath, JsonConvert.SerializeObject(StaticData.Zh_CN_Dic));
//监测Json文件变更 实时刷新数据
WatchJsonFile(usJsonPath);
WatchJsonFile(cnJsonPath);
}
public void WatchJsonFile(string filePath)
{
if (!File.Exists(filePath))
{
throw new BusinessValidationFailedException(StaticData.International("IRaCISCHangfireJob_FileNotFound"));
}
FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(filePath), Path.GetFileName(filePath));
watcher.Changed += (sender, e) => LoadJsonFile(filePath);
watcher.EnableRaisingEvents = true;
}
private void LoadJsonFile(string filePath)
{
IConfigurationBuilder builder = new ConfigurationBuilder().AddJsonFile(filePath);
IConfigurationRoot enConfiguration = builder.Build();
foreach (IConfigurationSection section in enConfiguration.GetChildren())
{
if (filePath.Contains(StaticData.En_US_Json))
{
StaticData.En_US_Dic[section.Key] = section.Value;
}
else
{
StaticData.Zh_CN_Dic[section.Key] = section.Value;
}
}
}
#endregion
public async Task InitSysAndTrialCronJobAsync() public async Task InitSysAndTrialCronJobAsync()
{ {
@@ -194,6 +105,36 @@ namespace IRaCIS.Application.Services.BackGroundJob
} }
#region
/// <summary>
/// 缓存项目状态--之前是启动的时候就获取所有的项目进行缓存,加上定时任务刷新,现在的话,改为是按照需要进行缓存请求数据库
/// </summary>
/// <returns></returns>
public async Task MemoryCacheTrialStatusAsync()
{
var list = await _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr })
.ToListAsync();
list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(7)));
}
public async Task MemoryCacheAnonymizeData()
{
var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync();
_provider.Set(StaticData.Anonymize.Anonymize_AddFixedFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed).ToList(), TimeSpan.FromDays(7));
_provider.Set(StaticData.Anonymize.Anonymize_AddIRCInfoFiled, systemAnonymizationList.Where(t => t.IsAdd && t.IsFixed == false).ToList(), TimeSpan.FromDays(7));
_provider.Set(StaticData.Anonymize.Anonymize_FixedField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed).ToList(), TimeSpan.FromDays(7));
_provider.Set(StaticData.Anonymize.Anonymize_IRCInfoField, systemAnonymizationList.Where(t => t.IsAdd == false && t.IsFixed == false).ToList(), TimeSpan.FromDays(7));
}
#endregion
} }
+14 -5
View File
@@ -8,6 +8,8 @@ using Panda.DynamicWebApi;
using Panda.DynamicWebApi.Attributes; using Panda.DynamicWebApi.Attributes;
using System.Diagnostics.CodeAnalysis; using System.Diagnostics.CodeAnalysis;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Mvc;
using ZiggyCreatures.Caching.Fusion;
namespace IRaCIS.Core.Application namespace IRaCIS.Core.Application
{ {
@@ -17,7 +19,8 @@ namespace IRaCIS.Core.Application
#region #region
[Authorize, DynamicWebApi, UnifiedApiResultFilter] [TypeFilter(typeof(UnifiedApiResultFilter))]
[Authorize, DynamicWebApi]
public class BaseService : IBaseService, IDynamicWebApi public class BaseService : IBaseService, IDynamicWebApi
{ {
public IMapper _mapper { get; set; } public IMapper _mapper { get; set; }
@@ -30,7 +33,7 @@ namespace IRaCIS.Core.Application
public IWebHostEnvironment _hostEnvironment { get; set; } public IWebHostEnvironment _hostEnvironment { get; set; }
public IFusionCache _fusionCache { get; set; }
public static IResponseOutput Null404NotFound<TEntity>(TEntity? businessObject) where TEntity : class public static IResponseOutput Null404NotFound<TEntity>(TEntity? businessObject) where TEntity : class
@@ -58,6 +61,9 @@ namespace IRaCIS.Core.Application
[MemberNotNull(nameof(_hostEnvironment))] [MemberNotNull(nameof(_hostEnvironment))]
public IWebHostEnvironment _hostEnvironment { get; set; } public IWebHostEnvironment _hostEnvironment { get; set; }
[MemberNotNull(nameof(_fusionCache))]
public IFusionCache _fusionCache { get; set; }
} }
#endregion #endregion
@@ -79,12 +85,13 @@ namespace IRaCIS.Core.Application
[MemberNotNull(nameof(_localizer))] [MemberNotNull(nameof(_localizer))]
public IStringLocalizer _localizer { get; set; } public IStringLocalizer _localizer { get; set; }
[MemberNotNull(nameof(_fusionCache))]
public IFusionCache _fusionCache { get; set; }
} }
[TypeFilter(typeof(UnifiedApiResultFilter))]
[Authorize, DynamicWebApi, UnifiedApiResultFilter] [Authorize, DynamicWebApi]
public class BaseServiceTest<T> : IBaseServiceTest<T>, IDynamicWebApi where T : Entity public class BaseServiceTest<T> : IBaseServiceTest<T>, IDynamicWebApi where T : Entity
{ {
public IMapper _mapper { get; set; } public IMapper _mapper { get; set; }
@@ -95,6 +102,8 @@ namespace IRaCIS.Core.Application
public IStringLocalizer _localizer { get; set; } public IStringLocalizer _localizer { get; set; }
public IFusionCache _fusionCache { get; set; }
public static IResponseOutput Null404NotFound<TEntity>(TEntity? businessObject) where TEntity : class public static IResponseOutput Null404NotFound<TEntity>(TEntity? businessObject) where TEntity : class
{ {
return new ResponseOutput<string>() return new ResponseOutput<string>()
@@ -0,0 +1,71 @@
using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Options;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.BusinessFilter
{
public class EncreptApiResultFilter : IAsyncResultFilter
{
private readonly IOptionsMonitor<EncreptResponseOption> _encreptResponseMonitor;
public EncreptApiResultFilter(IOptionsMonitor<EncreptResponseOption> encreptResponseMonitor)
{
_encreptResponseMonitor = encreptResponseMonitor;
}
public async Task OnResultExecutionAsync(ResultExecutingContext context, ResultExecutionDelegate next)
{
if(_encreptResponseMonitor.CurrentValue.IsEnable)
{
if (context.Result is ObjectResult objectResult)
{
var statusCode = objectResult.StatusCode ?? context.HttpContext.Response.StatusCode;
var objectValue = objectResult.Value;
if (objectValue is IResponseOutput)
{
var responseOutput = objectValue as IResponseOutput<object>;
var path = context.HttpContext?.Request.Path.Value?.ToLower();
if(!string.IsNullOrEmpty(path) && path.Length>5 && _encreptResponseMonitor.CurrentValue.ApiPathList.Contains(path.ToLower()))
{
if(responseOutput.IsSuccess)
{
responseOutput.Code = ApiResponseCodeEnum.ResultEncrepted;
responseOutput.Data = JsonConvert.SerializeObject(Convert.ToBase64String(Encoding.UTF8.GetBytes(responseOutput.Data.ToString())));
objectResult.Value = responseOutput;
}
}
}
}
}
await next.Invoke();
}
}
}
@@ -0,0 +1,50 @@
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace IRaCIS.Core.Application.BusinessFilter
{
/// <summary>
/// 不生效,不知道为啥
/// </summary>
public class GlobalExceptionHandler : IExceptionHandler
{
private readonly ILogger<GlobalExceptionHandler> _logger;
public GlobalExceptionHandler(ILogger<GlobalExceptionHandler> logger)
{
this._logger = logger;
}
public ValueTask<bool> TryHandleAsync(
HttpContext httpContext,
Exception exception,
CancellationToken cancellationToken)
{
httpContext.Response.ContentType = "application/json";
var ex = exception;
var errorInfo = $"Exception: {ex.Message}[{ex.StackTrace}]" + (ex.InnerException != null ? $" InnerException: {ex.InnerException.Message}[{ex.InnerException.StackTrace}]" : "");
httpContext.Response.WriteAsJsonAsync(ResponseOutput.NotOk($"{ex?.Message}"));
_logger.LogError(errorInfo);
// return true to signal that this exception is handled
return ValueTask.FromResult(false);
}
}
}
@@ -35,6 +35,8 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
public async Task OnAuthorizationAsync(AuthorizationFilterContext context) public async Task OnAuthorizationAsync(AuthorizationFilterContext context)
{ {
var minutes = _verifyConfig.CurrentValue.AutoLoginOutMinutes;
if (_verifyConfig.CurrentValue.OpenLoginLimit) if (_verifyConfig.CurrentValue.OpenLoginLimit)
{ {
if (context.ActionDescriptor.EndpointMetadata.Any(item => item is IAllowAnonymous)) if (context.ActionDescriptor.EndpointMetadata.Any(item => item is IAllowAnonymous))
@@ -58,22 +60,45 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["LimitUser_AuthTokenMissing"])); context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["LimitUser_AuthTokenMissing"]));
} }
//2、在这里取缓存 进行比较 看是否有其他人进行了登陆,如果其他人登陆了,就把之前用户挤掉 //2、在这里取缓存 进行比较 看是否有其他人进行了登陆,如果其他人登陆了,就把之前用户挤掉
var cacheUserToken = (await _provider.GetAsync<string>(_userInfo.Id.ToString())).Value; var cacheUserToken = (await _provider.GetAsync<string>(_userInfo.Id.ToString())).Value;
//缓存中没有取到Token //缓存中没有取到Token
if (string.IsNullOrWhiteSpace(cacheUserToken)) if (string.IsNullOrWhiteSpace(cacheUserToken))
{ {
cacheUserToken = _userInfo.UserToken;
//设置当前用户最新Token //设置当前用户最新Token
await _provider.SetAsync(_userInfo.Id.ToString(), _userInfo.UserToken, TimeSpan.FromDays(7)); await _provider.SetAsync(_userInfo.Id.ToString(), _userInfo.UserToken, TimeSpan.FromDays(7));
cacheUserToken = _userInfo.UserToken; //重启应用程序,所有人续期,不一下子踢出所有人
await _provider.SetAsync($"{_userInfo.Id.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(minutes));
} }
//是同一个人 //是同一个人
else if (cacheUserToken == _userInfo.UserToken) else if (cacheUserToken == _userInfo.UserToken)
{ {
var cacheTime = (await _provider.GetAsync<string>($"{_userInfo.Id.ToString()}_Online")).Value;
//过期了 需要自动退出
if (string.IsNullOrEmpty(cacheTime))
{
context.HttpContext.Response.ContentType = "application/json";
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["LimitUser_AccountAuto_LoginOut"], ApiResponseCodeEnum.AutoLoginOut));
}
else
{
await _provider.SetAsync($"{_userInfo.Id.ToString()}_Online", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), TimeSpan.FromMinutes(minutes));
}
} }
else else
@@ -1,4 +1,5 @@
using IRaCIS.Core.Infrastructure; using IRaCIS.Core.Domain.Share;
using IRaCIS.Core.Infrastructure;
using IRaCIS.Core.Infrastructure.Extention; using IRaCIS.Core.Infrastructure.Extention;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
@@ -34,7 +35,19 @@ namespace IRaCIS.Core.Application.Filter
{ {
var error = context.Exception as BusinessValidationFailedException; var error = context.Exception as BusinessValidationFailedException;
context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message, error!.Code)); var info = string.Empty;
if (!string.IsNullOrWhiteSpace(error!.LocalizedKey) && StaticData.Log_Locoalize_Dic.ContainsKey(error!.LocalizedKey))
{
info = $"[{error!.LocalizedKey}]:{StaticData.Log_Locoalize_Dic[error!.LocalizedKey]}";
}
context.Result = new JsonResult(ResponseOutput.NotOk(context.Exception.Message, "", error!.Code, localizedInfo: info));
//warning 级别记录
//_logger.LogWarning($"[{error!.LocalizedKey}]:{StaticData.Log_Locoalize_Dic[error!.LocalizedKey]}");
} }
else if (context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException)) else if (context.Exception.GetType() == typeof(QueryBusinessObjectNotExistException))
{ {
@@ -44,18 +57,21 @@ namespace IRaCIS.Core.Application.Filter
{ {
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["Project_ExceptionContactDeveloper"] + (context.Exception.InnerException is null ? (context.Exception.Message /*+ context.Exception.StackTrace*/) 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)); : (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)); _logger.LogError(context.Exception.InnerException is null ? (context.Exception.Message + context.Exception.StackTrace) : (context.Exception.InnerException?.Message + context.Exception.InnerException?.StackTrace));
}
context.ExceptionHandled = true;//标记当前异常已经被处理过了
//throw new Exception("test-result-exceptioin");
} }
else else
{ {
//继续 //继续
} }
context.ExceptionHandled = true;//标记当前异常已经被处理过了
} }
} }
} }
@@ -1,10 +1,12 @@
using EasyCaching.Core; using EasyCaching.Core;
using IRaCIS.Core.Application.Helper;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.Extensions.Localization; using Microsoft.Extensions.Localization;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using ZiggyCreatures.Caching.Fusion;
using static IRaCIS.Core.Domain.Share.StaticData; using static IRaCIS.Core.Domain.Share.StaticData;
namespace IRaCIS.Core.Application.Filter namespace IRaCIS.Core.Application.Filter
@@ -16,37 +18,26 @@ namespace IRaCIS.Core.Application.Filter
{ {
private readonly IEasyCachingProvider _provider; private readonly IEasyCachingProvider _provider;
private readonly IUserInfo _userInfo; private readonly IUserInfo _userInfo;
private readonly IFusionCache _fusionCache;
public IStringLocalizer _localizer; public IStringLocalizer _localizer;
private readonly IRepository<Trial> _trialRepository;
private readonly List<string> _trialOptList = new List<string>(); private readonly List<string> _trialOptList = new List<string>();
public TrialResourceFilter(IEasyCachingProvider provider, IStringLocalizer localizer , IUserInfo userInfo, string trialOpt = null, string trialOpt2 = null, string trialOpt3 = null) public TrialResourceFilter(IFusionCache fusionCache, IRepository<Trial> trialRepository, IEasyCachingProvider provider, IStringLocalizer localizer, IUserInfo userInfo, string trialOpt = null, string trialOpt2 = null, string trialOpt3 = null)
{ {
_fusionCache = fusionCache;
_provider = provider; _provider = provider;
_userInfo = userInfo; _userInfo = userInfo;
_localizer = localizer; _localizer = localizer;
//_trialOpt = trialOpt; _trialRepository = trialRepository;
if (!string.IsNullOrWhiteSpace(trialOpt)) _trialOptList.Add(trialOpt.Trim()); if (!string.IsNullOrWhiteSpace(trialOpt)) _trialOptList.Add(trialOpt.Trim());
if (!string.IsNullOrWhiteSpace(trialOpt2)) _trialOptList.Add(trialOpt2.Trim()); if (!string.IsNullOrWhiteSpace(trialOpt2)) _trialOptList.Add(trialOpt2.Trim());
if (!string.IsNullOrWhiteSpace(trialOpt3)) _trialOptList.Add(trialOpt3.Trim()); if (!string.IsNullOrWhiteSpace(trialOpt3)) _trialOptList.Add(trialOpt3.Trim());
} }
//public TrialResourceFilter(IEasyCachingProvider provider, IUserInfo userInfo)
//{
// _provider = provider;
// _userInfo = userInfo;
//}
//优先选择异步的方法 //优先选择异步的方法
public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next) public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
{ {
@@ -56,16 +47,12 @@ namespace IRaCIS.Core.Application.Filter
#region #region
// 后期列举出具体的类型,其他任何用户类型,都不允许操作 // 后期列举出具体的类型,其他任何用户类型,都不允许操作
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA) if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA && _userInfo.RequestUrl.ToLower() != "TrialDocument/userConfirm".ToLower())
{
if (!_userInfo.RequestUrl.Contains("TrialDocument/userConfirm"))
{ {
//---对不起,您的账户没有操作权限。 //---对不起,您的账户没有操作权限。
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_NoAccessPermission"])); context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_NoAccessPermission"]));
return; return;
}
} }
#endregion #endregion
@@ -132,16 +119,16 @@ namespace IRaCIS.Core.Application.Filter
if (matchResult.Success) if (matchResult.Success)
{ {
//有可能匹配错误 "trialId":"","documentId":"b8180000-3e2c-0016-9fe0-08da33f96236" 从缓存里面验证下 //有可能匹配错误 "trialId":"","documentId":"b8180000-3e2c-0016-9fe0-08da33f96236" 从缓存里面验证下
var cacheResultDic = _provider.GetAll<string>(new[] { matchResult.Value });
var trialStatusStr = cacheResultDic[matchResult.Value.ToLower()].Value;
if (!string.IsNullOrWhiteSpace(trialStatusStr))
{
trialIdStr = matchResult.Value; trialIdStr = matchResult.Value;
var trialStatusStr = await _fusionCache.GetOrSetAsync(CacheKeys.Trial(trialIdStr), _ => CacheHelper.GetTrialStatusAsync(Guid.Parse(trialIdStr), _trialRepository), TimeSpan.FromDays(7));
if (string.IsNullOrWhiteSpace(trialStatusStr))
{
//数据库 检查该项目Id不对
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_ReferTrialIdFailed"]));
} }
} }
else else
{ {
@@ -159,29 +146,7 @@ namespace IRaCIS.Core.Application.Filter
//通过path 或者body 找到trialId 了 //通过path 或者body 找到trialId 了
if (!string.IsNullOrWhiteSpace(trialIdStr)) if (!string.IsNullOrWhiteSpace(trialIdStr))
{ {
var trialStatusStr = await _fusionCache.GetOrSetAsync(CacheKeys.Trial(trialIdStr), _ => CacheHelper.GetTrialStatusAsync(Guid.Parse(trialIdStr), _trialRepository), TimeSpan.FromDays(7));
//如果没缓存数据,可能定时任务没执行或者缓存丢失 在此重新缓存
if (_provider.GetCount() == 0)
{
var _trialRepository = context.HttpContext.RequestServices.GetService(typeof(IRepository<Trial>)) as IRepository<Trial>;
var list = _trialRepository.IfNullThrowException().Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr })
.ToList();
list.ForEach(t => _provider.Set(t.TrialId.ToString(), t.TrialStatusStr, TimeSpan.FromDays(7)));
}
var cacheResultDic = _provider.GetAll<string>(new[] { trialIdStr });
var trialStatusStr = cacheResultDic[trialIdStr].Value;
//意外 导致缓存过期,调整服务器时间,测试不想重启程序
if (string.IsNullOrWhiteSpace(trialStatusStr))
{
var trialRepository = context.HttpContext.RequestServices.GetService(typeof(IRepository<Trial>)) as IRepository<Trial>;
trialStatusStr = trialRepository?.Where(t => t.Id == Guid.Parse(trialIdStr)).Select(t => t.TrialStatusStr).FirstOrDefault();
}
// 这里是统一拦截 项目有关的操作允许情况(特殊的地方,比如项目配置(有的在多种状态(初始化,ongoing)都可以操作,有的仅仅在Initializing)还有 项目添加和更新,不走这里,特殊处理,不然在这里显得很乱,判断是哪个接口) // 这里是统一拦截 项目有关的操作允许情况(特殊的地方,比如项目配置(有的在多种状态(初始化,ongoing)都可以操作,有的仅仅在Initializing)还有 项目添加和更新,不走这里,特殊处理,不然在这里显得很乱,判断是哪个接口)
if (trialStatusStr == StaticData.TrialState.TrialOngoing || _trialOptList.Any(t => t == TrialOpt.BeforeOngoingCantOpt)) if (trialStatusStr == StaticData.TrialState.TrialOngoing || _trialOptList.Any(t => t == TrialOpt.BeforeOngoingCantOpt))
@@ -1,6 +1,7 @@
using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc.Filters;
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc;
using IRaCIS.Core.Domain.Share; using IRaCIS.Core.Domain.Share;
using Microsoft.Extensions.Logging;
namespace IRaCIS.Application.Services.BusinessFilter namespace IRaCIS.Application.Services.BusinessFilter
{ {
@@ -10,6 +11,13 @@ namespace IRaCIS.Application.Services.BusinessFilter
/// </summary> /// </summary>
public class UnifiedApiResultFilter : Attribute, IAsyncResultFilter public class UnifiedApiResultFilter : Attribute, IAsyncResultFilter
{ {
private readonly ILogger _logger;
public UnifiedApiResultFilter(ILogger<UnifiedApiResultFilter> logger)
{
_logger = logger;
}
/// <summary> /// <summary>
/// 异步版本 /// 异步版本
/// </summary> /// </summary>
@@ -26,15 +34,6 @@ namespace IRaCIS.Application.Services.BusinessFilter
//是200 并且没有包装 那么包装结果 //是200 并且没有包装 那么包装结果
if (statusCode == 200 && !(objectResult.Value is IResponseOutput)) 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(); var type = objectResult.Value?.GetType();
@@ -44,13 +43,12 @@ namespace IRaCIS.Application.Services.BusinessFilter
//报错 //报错
//var tuple = (object, object))objectResult.Value; //var tuple = (object, object))objectResult.Value;
//var (val1, val2) = ((dynamic, dynamic))objectResult.Value; //var (val1, val2) = ((dynamic, dynamic))objectResult.Value;
//var apiResponse = ResponseOutput.Ok(val1, val2); //var apiResponse = ResponseOutput.Ok(val1, val2);
//OK //OK
var tuple = (dynamic)objectResult.Value; var tuple = (dynamic)objectResult.Value;
var apiResponse = ResponseOutput.Ok(tuple.Item1, tuple.Item2); var apiResponse = ResponseOutput.Ok(tuple!.Item1, tuple!.Item2);
objectResult.Value = apiResponse; objectResult.Value = apiResponse;
@@ -65,12 +63,14 @@ namespace IRaCIS.Application.Services.BusinessFilter
} }
//}
} }
//如果是200 是IResponseOutput 不处理 //如果是200 是IResponseOutput 记录下日志
else if (statusCode != 200 && (objectResult.Value is IResponseOutput)) else if (statusCode == 200 && (objectResult.Value is IResponseOutput))
{ {
var result = objectResult.Value as IResponseOutput;
//统一在这里记录国际化的日志信息
_logger.LogWarning($"{result.LocalizedInfo}");
} }
else if (statusCode != 200 && !(objectResult.Value is IResponseOutput)) else if (statusCode != 200 && !(objectResult.Value is IResponseOutput))

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