Compare commits
915 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| cde58ace66 | |||
| 989511ad68 | |||
| 9b6e8feabf | |||
| 73862c10c5 | |||
| 63572942ea | |||
| ea6c6c8490 | |||
| 11455e6c78 | |||
| f7ed595f7c | |||
| 8b481aaae2 | |||
| a8cff18985 | |||
| 39f14c8d11 | |||
| f9a46561e8 | |||
| 5a55fea38a | |||
| 884e03fab5 | |||
| 584ad2a7c4 | |||
| 4abad486d2 | |||
| 1958dca2be | |||
| ba121827ac | |||
| b946672e9e | |||
| e21e1488e7 | |||
| 3a03eec1ab | |||
| f9277de9ef | |||
| 3b37cec42d | |||
| 514a8a2d0f | |||
| 80ad4be4cb | |||
| 6da34061da | |||
| 97d5010f0c | |||
| 18dfc3ca37 | |||
| 9f27d4ff11 | |||
| f828a7d1e2 | |||
| f19febaa6e | |||
| e344392450 | |||
| f9c61cabcc | |||
| 7ce98a8c81 | |||
| c4860cdb74 | |||
| 5b92110f43 | |||
| 431375946b | |||
| 1a6ffa5d84 | |||
| bb6744dc6f | |||
| 84973bb441 | |||
| 4e8c228b92 | |||
| 505ebd2d41 | |||
| 0fd1b52036 | |||
| df4493e5af | |||
| 38629114b6 | |||
| f43c384a27 | |||
| 5f119d6f0e | |||
| 2eecca60f0 | |||
| bca9993e68 | |||
| 466ac5e03e | |||
| 9901eb83ad | |||
| 9b73522a8e | |||
| d1b5d5fadc | |||
| 8c267ec6f4 | |||
| 46c4416434 | |||
| c0bd5c9d88 | |||
| df8d4e3afc | |||
| 32deb59df4 | |||
| fa92144439 | |||
| 04cfb2b977 | |||
| 7760d85721 | |||
| 23cbf79474 | |||
| a86c43d8d9 | |||
| 8c43bcf030 | |||
| 482a91a08c | |||
| d495d03619 | |||
| c223244f10 | |||
| 6a7971f314 | |||
| 19ebce1c98 | |||
| 1f04bdb57a | |||
| 6e1feebc11 | |||
| 43174b37cf | |||
| a0fe1db962 | |||
| 4309ee627a | |||
| 371cc24520 | |||
| ac2fbc07dd | |||
| 79133ccde8 | |||
| 1d4a2eb1b0 | |||
| 62a1200cf3 | |||
| eac6fe52a6 | |||
| bd6a11b77a | |||
| 93fc3a8306 | |||
| 90286d435e | |||
| 55dac5c0c1 | |||
| fa97d752c8 | |||
| 421bee68dc | |||
| d5fccaf23b | |||
| e4a567044e | |||
| f17849ad6f | |||
| 818055ca6c | |||
| f77f2ce224 | |||
| 74121384a7 | |||
| ad1e29e62b | |||
| 4b1db3a673 | |||
| 1dc0219fa1 | |||
| e4d9bdf998 | |||
| b00ac06cee | |||
| 04dd15df5f | |||
| a42867879d | |||
| 9dcd9c900a | |||
| 9d289bede7 | |||
| 99dd1b6f3d | |||
| 6886c24204 | |||
| b5fc28bc18 | |||
| 78e52831d1 | |||
| de7a913fc1 | |||
| 548d9cd820 | |||
| f03c384dab | |||
| e010732c2f | |||
| fcc93e7c4d | |||
| ac99397530 | |||
| 67f996c47f | |||
| f9f80a1d58 | |||
| f33e3fa623 | |||
| 095be8aa1a | |||
| 82d06c7426 | |||
| 6e7d288832 | |||
| e8e1142363 | |||
| 3ae1d6d726 | |||
| dc10030a67 | |||
| 0930b9116b | |||
| 39c1919884 | |||
| 91db0054d8 | |||
| 8f745481f0 | |||
| cbd90961aa | |||
| 76d913bbd3 | |||
| 473851c9fd | |||
| 8ec9a29f93 | |||
| 5c33aaa599 | |||
| a7e7f19c6c | |||
| cf03ff62e7 | |||
| 43893886b8 | |||
| 7c4002c252 | |||
| 525ce01abf | |||
| e659c49d6f | |||
| f24f168295 | |||
| cf4cace26e | |||
| 4eaa7abb1f | |||
| 6d7b09d73f | |||
| 82b0fc771d | |||
| b928edb036 | |||
| e5c9bf0688 | |||
| 032936982d | |||
| 57257a66ba | |||
| 2838a21a2f | |||
| f4c391f340 | |||
| 7d5f6a29a0 | |||
| 8294d6dc80 | |||
| 691b842591 | |||
| d8f7d1dcea | |||
| af06deb9a8 | |||
| de3c4b5338 | |||
| 69ec28cf36 | |||
| 1a7e9fcace | |||
| 2923d9e761 | |||
| 833f3d5075 | |||
| f6ca102297 | |||
| 432a2bca21 | |||
| 011189564a | |||
| 59b6be751f | |||
| 0d49e56efd | |||
| 3c3c94a035 | |||
| cb2d6e9bdf | |||
| c9eff0d0ac | |||
| f556583f06 | |||
| f5ab48f031 | |||
| f910085116 | |||
| f7830e6a3b | |||
| ba0bed7eef | |||
| 3160672ecc | |||
| 6ca4ff736a | |||
| c6b568c17c | |||
| f04d20f57d | |||
| cb2aa0cfa4 | |||
| e7f17f97d6 | |||
| 9528bb4bfb | |||
| 63a74b81ed | |||
| 6e45ac9df8 | |||
| 028053e908 | |||
| b0a3aa4b18 | |||
| ec59d60e43 | |||
| d07838071a | |||
| e8f2dfc5d6 | |||
| c8ee8a6081 | |||
| 6a8498527e | |||
| 49ce934300 | |||
| 1815311e72 | |||
| 4566d8ebcf | |||
| c86e393f4d | |||
| dfecd1cb3b | |||
| 1dae1834a4 | |||
| a123d6c255 | |||
| 11e7cc6806 | |||
| 9f1ff445fa | |||
| c7869abfaa | |||
| 6d87f7f1e3 | |||
| 33bcabaa73 | |||
| 4165afcc12 | |||
| 3e3fc13602 | |||
| 6ff47341c7 | |||
| 3bac8fc9e2 | |||
| 44af846e11 | |||
| 9f52d771e9 | |||
| 55ba1a4cb9 | |||
| f47a75f208 | |||
| c7e61ad247 | |||
| c9f7a2b3f7 | |||
| 3f3a9093b2 | |||
| 638de8c386 | |||
| 4f3b19953b | |||
| 6be7076bce | |||
| 880847659f | |||
| ab284bd7a0 | |||
| d9c8b9a453 | |||
| a04fb8394e | |||
| 561db9a9c9 | |||
| 1c2030a425 | |||
| d4a3f1c69a | |||
| 0a1d5bd5aa | |||
| 2869804272 | |||
| d654775cce | |||
| 0d8bb7de6a | |||
| 2663633798 | |||
| aee50bf668 | |||
| 402a08f03d | |||
| 040f721394 | |||
| 0017b9c98e | |||
| d311290547 | |||
| 95d0363bc3 | |||
| 6f3065f7a6 | |||
| a2bb52421b | |||
| 5fad6877a5 | |||
| 156e9df954 | |||
| 4227002816 | |||
| 86e6db400e | |||
| 02883db402 | |||
| d339f5f476 | |||
| 2134aa4bef | |||
| 2bbf70639d | |||
| c28fbf0093 | |||
| eddc091c0f | |||
| 354dba5de7 | |||
| b0f189c338 | |||
| bd028771b6 | |||
| 74b8869293 | |||
| 424174636e | |||
| a59f71a01e | |||
| fba9a7ce19 | |||
| 74fe7c6e15 | |||
| cd8b7db66a | |||
| e5f92c198c | |||
| 63d0e45343 | |||
| 3bcf88ffe3 | |||
| 3ab00c54bf | |||
| 24e03d5d3d | |||
| ef923e7be0 | |||
| bad2f59f85 | |||
| bf8938ea31 | |||
| be3567b904 | |||
| 8d80545229 | |||
| 87a4b3f58d | |||
| 54812bf4bb | |||
| aae8ea1d5c | |||
| fcaa0f1cfd | |||
| 1709a9746c | |||
| 656e9cc9d7 | |||
| f4171d5973 | |||
| 2c8b90aa1b | |||
| bfea26342e | |||
| 873e66d7a6 | |||
| 0b1d2b0da9 | |||
| de04d51cd7 | |||
| 8c49955057 | |||
| 95b932554d | |||
| 3b20301edc | |||
| fe666d3c08 | |||
| afe5f1e58f | |||
| 31a902605d | |||
| 128b2a00bf | |||
| b29ea57acd | |||
| 2842791af4 | |||
| cbf193587c | |||
| ca04fd1b3b | |||
| 7d17d993af | |||
| 0b42547455 | |||
| 77659dedca | |||
| e0d6424de7 | |||
| 8519913ece | |||
| 12646eb205 | |||
| a5c2fce817 | |||
| 5d50ef975c | |||
| 41d08f71a3 | |||
| 8ee34d7656 | |||
| 107c95aa9f | |||
| e7c389ea0f | |||
| e947ec3feb | |||
| 3e4def27ee | |||
| d1a8b836cc | |||
| 5b87b9719d | |||
| 6ed1ae85c2 | |||
| 616cc5e286 | |||
| 18e53c6974 | |||
| 7b07f88749 | |||
| c737c494a7 | |||
| 51aebaab21 | |||
| 08281d161f | |||
| b818c05525 | |||
| 1a85dbf81a | |||
| 32ce326133 | |||
| 82070e9bbf | |||
| 12c67cac8f | |||
| 7bbbb51eb0 | |||
| 00dddb2383 | |||
| 54db21b08d | |||
| a42472fb39 | |||
| 36a19a1c0a | |||
| 65118a567d | |||
| 0e57d5d505 | |||
| abfadf48e5 | |||
| 5d3d9bc153 | |||
| d0e89e74bd | |||
| 836b763ab5 | |||
| c0dcfe9a7e | |||
| dd4e28d0ad | |||
| 73badc1b14 | |||
| 3439a6b691 | |||
| e7a34e51a9 | |||
| 19959965a2 | |||
| 1b04ed9506 | |||
| 3f33509c18 | |||
| ae546cd016 | |||
| 9d72564a3f | |||
| c243e01908 | |||
| 9403347d96 | |||
| 48e2e098c3 | |||
| 397afad22b | |||
| fa85421e5d | |||
| 631c0c4327 | |||
| 75badd8b69 | |||
| 6578b610c9 | |||
| 4f262f8224 | |||
| 7a61b4fb9c | |||
| 58294c2e62 | |||
| 5cbad9d31c | |||
| 5ff59c6321 | |||
| 20624b9358 | |||
| 113adaa7e7 | |||
| e46640f603 | |||
| a07334ec37 | |||
| 5f26cbd80f | |||
| e7112ded44 | |||
| b6892509a4 | |||
| 10b23cb394 | |||
| 163f803af9 | |||
| 8187f20111 | |||
| 34cd92cd6f | |||
| 45c6936726 | |||
| 719e975a71 | |||
| a6b65378d9 | |||
| c7517b56da | |||
| 77be8b7e4a | |||
| 11a6ecb5bb | |||
| edabc6b376 | |||
| 11b18c1499 | |||
| 1d17d5af82 | |||
| d65c1d5bb8 | |||
| 9878bde8da | |||
| 831832413a | |||
| 39bb28f1bd | |||
| ae3219be57 | |||
| 652e4d7ef1 | |||
| 1c16dcf961 | |||
| fe81bb224a | |||
| cbae1e8d5e | |||
| 5752a3bb68 | |||
| b9b02b4ed0 | |||
| 66af10f522 | |||
| 80370e000a | |||
| c88b83bb6b | |||
| 4b012e825a | |||
| ed3d18b168 | |||
| 30829a2d62 | |||
| b62560a4c7 | |||
| aad722603a | |||
| a489350d21 | |||
| 54198b8c96 | |||
| 5bd9cd680b | |||
| cb7a85d583 | |||
| bde25001e5 | |||
| 6c8720c471 | |||
| a9703942f6 | |||
| bd6819bf77 | |||
| eed270be72 | |||
| 2ad02f3798 | |||
| daed7ea078 | |||
| e0842e1b4d | |||
| a82c371015 | |||
| 6e3145685d | |||
| 5ef01658d6 | |||
| 66a65a770d | |||
| 54976b389b | |||
| 9ccde75731 | |||
| 4a05a09da5 | |||
| 81406bfccc | |||
| cad6ee8dfa | |||
| c706cc97cc | |||
| a713666a8d | |||
| f4b082b3c5 | |||
| 32ebad2978 | |||
| 622d8bcb3a | |||
| 4f4a4525b4 | |||
| b4171a6086 | |||
| 234c6e11c8 | |||
| 81c59c3f12 | |||
| 6cd0f20424 | |||
| 840eca51b8 | |||
| fc877c9b40 | |||
| 0709f886b0 | |||
| 0e55c50d4c | |||
| d6a7e8dc62 | |||
| c4c237f131 | |||
| dffdaa369c | |||
| d154123b71 | |||
| 6baae40a38 | |||
| ffbd575fd7 | |||
| 20ef960389 | |||
| fe54d51e3f | |||
| e1ba59c0b6 | |||
| 58e4cd82ef | |||
| 64a433ea10 | |||
| 816e12c6f1 | |||
| 081cd7fc98 | |||
| d21632dbef | |||
| 2a7280b501 | |||
| 94f3d12a6b | |||
| 372fa13239 | |||
| cfb6ba593b | |||
| 733a6677be | |||
| 6f1a0f14a5 | |||
| fb2b3ace59 | |||
| c2c553e032 | |||
| 4b07a9f6b9 | |||
| 8c743f5b7b | |||
| 4d017bb55b | |||
| 298efa20b3 | |||
| af2f2f468e | |||
| 492963f298 | |||
| 7cbede4507 | |||
| 271fa2bccc | |||
| a862ec5561 | |||
| 38b9775ad2 | |||
| 37aed2fb1c | |||
| 22616a0b4d | |||
| cc3513846f | |||
| 42e0a52b99 | |||
| 4c4470af16 | |||
| 2251029356 | |||
| 57558af3eb | |||
| 2cc72cc16b | |||
| d7f82d7473 | |||
| 4471ecf150 | |||
| dcb231f788 | |||
| ea0d3e08d8 | |||
| fd914997ba | |||
| 4809b012e8 | |||
| f49fafe866 | |||
| 6c298d54c6 | |||
| 12a7d5b8fd | |||
| 9975eced9b | |||
| 456eaf5dee | |||
| 2b3d5b4960 | |||
| f0414fcdc3 | |||
| 7aa4b719e5 | |||
| 45a52e1f58 | |||
| 15a2294688 | |||
| 2c4ca49059 | |||
| 4e587b5b18 | |||
| ec93a4f4dc | |||
| f750f2d4c9 | |||
| 3807db1b86 | |||
| f51380d274 | |||
| 4543a69698 | |||
| 1a39de861b | |||
| 752d47c023 | |||
| e5ffd496dd | |||
| 70039bcedf | |||
| 7fa5d24c6c | |||
| 2b5108cb76 | |||
| 62a3e7608f | |||
| 97f06689ec | |||
| bb1d784797 | |||
| a808680819 | |||
| c8f606b302 | |||
| bc6ce155c6 | |||
| efbe1d3511 | |||
| 1f82b6cecf | |||
| 0e72420b8e | |||
| 9ed80154af | |||
| 6bbf0a0984 | |||
| cfe076f6c5 | |||
| 771937cf78 | |||
| 37773dac6b | |||
| 797eff73fa | |||
| cdd714e2a4 | |||
| 3859db7c8b | |||
| a2de5c7632 | |||
| 694cf0f59a | |||
| c370c6e4af | |||
| 1c3ef26eac | |||
| 3323481b60 | |||
| d17aff4cc0 | |||
| f5dfc768b6 | |||
| 7e9888d4f9 | |||
| 451beb023e | |||
| 3b1d8239ca | |||
| c7580473b0 | |||
| 8677ac1192 | |||
| 700f6488aa | |||
| 078fff447c | |||
| 18272935ea | |||
| 5fa60d16b6 | |||
| 7e831fcedb | |||
| 26c8718a39 | |||
| 073ab6b16b | |||
| 4e004cbe8c | |||
| c70ee0412d | |||
| d8d1eb3915 | |||
| 0f55406cef | |||
| cda209d3d3 | |||
| f5b4a36f25 | |||
| c9b6287b46 | |||
| 18c81854d0 | |||
| e836cd2daa | |||
| 4e4336c461 | |||
| e3519d47a6 | |||
| 75f806ce80 | |||
| 7d708e03c7 | |||
| 9e0f4eb0d6 | |||
| 6996ab51b4 | |||
| 518b2fddd3 | |||
| 3fd3160a95 | |||
| 6791470880 | |||
| 62c39ee163 | |||
| 273303f1b6 | |||
| 5786c493c7 | |||
| 35bd4d7e21 | |||
| feb476f83e | |||
| 67f11fc7c7 | |||
| 68a86e9e8c | |||
| 3ca58dc9a0 | |||
| bf46830b85 | |||
| 042d2a1d71 | |||
| 32595ca92f | |||
| 0241f5f635 | |||
| 6196c76dd1 | |||
| 951776ea6b | |||
| 8f38cef49f | |||
| 2662d89c53 | |||
| 20d7ca22b5 | |||
| a81bb9e3b9 | |||
| 34d36b024d | |||
| 316aa7d94c | |||
| 6192c2e144 | |||
| 3be5f50f3a | |||
| a52adf9723 | |||
| 3780a182ca | |||
| 63c6b8da69 | |||
| 6bc3b2f16d | |||
| 368d97bc8f | |||
| 92656b691d | |||
| 9c632648dc | |||
| 1052be18d4 | |||
| d9262b1623 | |||
| 7b77f123b9 | |||
| 8db12bc919 | |||
| 8cd5d3ba9b | |||
| 1f7459259b | |||
| 03d5e93c55 | |||
| 91c2425ff8 | |||
| a4396c07d9 | |||
| cf0bf46f7e | |||
| 9ccbf2a22f | |||
| 8ae0ae96e3 | |||
| 1abfc0dc63 | |||
| 2024812f61 | |||
| 5518770cf6 | |||
| 9e9d3ed2d0 | |||
| 2175755cd6 | |||
| 2f88a1ea6f | |||
| 91ca4e5adf | |||
| 813cc033c6 | |||
| a696b0f1a8 | |||
| 829dec352a | |||
| ad42d77694 | |||
| 7aa443ab59 | |||
| 20a86b1918 | |||
| 704b1c9390 | |||
| cb916d5ef1 | |||
| 21b457d281 | |||
| e59d5c15e2 | |||
| ea79b01d4c | |||
| 8f4b47aad6 | |||
| b6d73ffd92 | |||
| a59f2f2f60 | |||
| af603b7bc6 | |||
| aa32fe4671 | |||
| 2aa16d0d12 | |||
| 4f4f335e89 | |||
| 2c53d5fa09 | |||
| ec4b1c58ef | |||
| d51a605f54 | |||
| 4133953b93 | |||
| 855f4980d5 | |||
| 087a834661 | |||
| dcd9121e4c | |||
| d5f72ca7de | |||
| 01c9aeef48 | |||
| 68d236ee5e | |||
| 5a50b95987 | |||
| f947ffa800 | |||
| cadbae617d | |||
| 17a29c6729 | |||
| 6b0eed3fb7 | |||
| 866e08c05e | |||
| e17a19e281 | |||
| f03028dde8 | |||
| cb78bd6a66 | |||
| f45cb3db86 | |||
| 421bc39b6d | |||
| 2a532a8ee6 | |||
| 3a520cb38d | |||
| c930df4153 | |||
| eb72ae82e7 | |||
| 6e1b4f5403 | |||
| d8eb8f6982 | |||
| 194e00941c | |||
| a4eebf60cc | |||
| b7e7251d52 | |||
| 3e7920e22f | |||
| 127a9b8221 | |||
| 8c6145ddf1 | |||
| 9b1b42f42d | |||
| 707e55fe31 | |||
| ebd9596a5f | |||
| 9d405b3f1b | |||
| 4b6fdd5d27 | |||
| 9235f1f5ea | |||
| c41fa2d735 | |||
| 3d666377c3 | |||
| 9909eaab74 | |||
| 08bb3e748a | |||
| 8964b65d87 | |||
| e288d1411a | |||
| 4cc104236e | |||
| f92380b1e0 | |||
| 5d0d1fcacb | |||
| ef7e0ebf81 | |||
| 5e559bf13b | |||
| 8441427fcd | |||
| 5d0660145f | |||
| 28a18b336d | |||
| c984a9116b | |||
| bed17af3b2 | |||
| dc0de31164 | |||
| 0a941cee30 | |||
| 39ee653979 | |||
| a0d763ed86 | |||
| 4666e030ac | |||
| 1e26ca3189 | |||
| 9e968c3063 | |||
| 1c546fcb2b | |||
| 3520c1213c | |||
| 7ca524c3d3 | |||
| 84bdeffebe | |||
| 5133a38f6c | |||
| 8fb35857ff | |||
| caacfb86a6 | |||
| e687f50b2a | |||
| e31f4b7dd4 | |||
| bf9d833d38 | |||
| ad753ed2a8 | |||
| f1017af518 | |||
| f7b2e069da | |||
| eaf4cc3b61 | |||
| 7432642bdb | |||
| 114ad74522 | |||
| 38a6cbf1b9 | |||
| d295d29756 | |||
| d20f566ee3 | |||
| 18c8600684 | |||
| bfbf51dd9a | |||
| de210bcf9c | |||
| e6ad1bfe9a | |||
| ac8af5f4b0 | |||
| 4b741ca108 | |||
| 86e330c586 | |||
| ab5b0ba083 | |||
| da77c35b7c | |||
| 9296871b28 | |||
| e22a4a097d | |||
| 70ac13c8d4 | |||
| 79d4c6a116 | |||
| e18b890f96 | |||
| ab89154e67 | |||
| 228f970cf9 | |||
| a95bcbd180 | |||
| 9b46d68729 | |||
| 275baf16db | |||
| bf630825e0 | |||
| c9f93f4d70 | |||
| 44e05180c5 | |||
| fd3aeaff4c | |||
| d201cc4c86 | |||
| cc9f1d8e82 | |||
| 183d6cf5f4 | |||
| d30b12b425 | |||
| 0faa78ed29 | |||
| 39f3bc738d | |||
| c7ef738dd9 | |||
| 47ed7caf1f | |||
| 0fe37fb5c1 | |||
| 3f9ffb029b | |||
| 72c4fedfd5 | |||
| ff47324c35 | |||
| 332f020662 | |||
| e1d60b3482 | |||
| c1f87bb410 | |||
| ea7f7b5155 | |||
| 8c4655e44d | |||
| 4ad3ee56bf | |||
| c5a138d7cf | |||
| 60a75aaaa1 | |||
| 225569ce7c | |||
| 88975db473 | |||
| 8825a841fa | |||
| 695d8af721 | |||
| 0f27f1cb9f | |||
| 108be7ce51 | |||
| 2ff9518a3a | |||
| b3fc87bd18 | |||
| 6b9464017d | |||
| a8a2ce677d | |||
| 26cd63936f | |||
| 261a038cf3 | |||
| 35aed3a31c | |||
| 0f3834414c | |||
| 8a8b78498e | |||
| e9988526b0 | |||
| ef642356da | |||
| 2e00b68bba | |||
| 0236657832 | |||
| 99f9d48ae4 | |||
| c1db506baf | |||
| 40bb3897f1 | |||
| 8e22284833 | |||
| b28ef3b82e | |||
| 0655d5bdb0 | |||
| b0c9a2fee2 | |||
| cae80eeeba | |||
| 8ef9e98833 | |||
| ec5c472e3c | |||
| 4480c0189d | |||
| 0ccdc000cd | |||
| a321e25c04 | |||
| 9936a15079 | |||
| 25263ec709 | |||
| 4800b1d4ad | |||
| 0d1e599712 | |||
| 9bde1171d6 | |||
| 21f5be6e21 | |||
| 7843dc63ed | |||
| 120dd22561 | |||
| 7d58c687c5 | |||
| 007c14ba9e | |||
| 0882fb3aad | |||
| 9cb7896b5e | |||
| ab0d75903a | |||
| 5dc560eff1 | |||
| 68788c5294 | |||
| 46abd0ab77 | |||
| cfc7e0ec16 | |||
| d04db9521d | |||
| 717134932e | |||
| 53043eae50 | |||
| 41a7c43fe9 | |||
| cb8b603296 | |||
| 61cb10d1fe | |||
| fafbf9fcea | |||
| d7b1937495 | |||
| e2716c2a7b | |||
| 99b7abb930 | |||
| 68b233559e | |||
| 869c66d20c | |||
| 3c43498fdb | |||
| 99d681bde5 | |||
| 7e64174acb | |||
| cacd825835 | |||
| 07f7a420f3 | |||
| dab955b151 | |||
| a79338ab32 | |||
| 4c4fb90637 | |||
| e56df5384e | |||
| fda332f424 | |||
| 25daabda9c | |||
| af3b22551d | |||
| 2a334a714f | |||
| 0f60809c32 | |||
| e936416f25 | |||
| 4b7d96be33 | |||
| ce06163a4c | |||
| f1a70bb6ad | |||
| 6a7a5cc2dd | |||
| 70679cbf17 | |||
| 91f6c67cc6 | |||
| 288fe4c690 | |||
| bc3d2c0f71 | |||
| 50527d9c33 | |||
| 1a5c2806e0 | |||
| 0134c96f28 | |||
| f59f8e214c | |||
| 7bd30717bb | |||
| 01375d0adc | |||
| 31ee156d86 | |||
| 3eaa8a1078 | |||
| 64605dfa25 | |||
| 88b7b4d2f6 | |||
| d78e5469b2 | |||
| 744229da06 | |||
| ecf9ac911c | |||
| 2832f0f3b0 | |||
| db04a40f48 | |||
| eec4f8de5a | |||
| 57b28e7356 | |||
| 7589a25ed3 | |||
| 7dec6bbc1a | |||
| df0f50187e | |||
| 15666271fd | |||
| fc18f02423 | |||
| 5deaf6ce7f | |||
| c416cc1e9a | |||
| 27f40962f7 | |||
| 8838871c0d | |||
| ce4ca4b382 | |||
| 0aba716ae0 | |||
| e516e009de | |||
| 5602f45ebd | |||
| 1225d18e75 | |||
| aac6a9a279 | |||
| 6738f6a90a | |||
| 9b27865675 | |||
| 8bc4b0d244 | |||
| 6e6974bfdd | |||
| 0cd9d1867c | |||
| f8720f9c1d | |||
| 674cd139ea | |||
| 8b3b69fbb8 | |||
| b69430e3cb | |||
| f42d9a4587 | |||
| 225cd8c949 | |||
| 6fcd163988 | |||
| 2441a6ae3b | |||
| e7ff7547a1 | |||
| bfda98d254 | |||
| d3ea103c85 | |||
| c6b36bf805 | |||
| f0bcf2d070 | |||
| 11644212c9 | |||
| 0c6b968fd5 | |||
| e31e6177fb | |||
| 4998f6034d | |||
| 6fafa66975 | |||
| caa573551e | |||
| 75c598c912 | |||
| dcbb9fa391 | |||
| 932cb89a44 | |||
| b4ffae867b | |||
| b055365f18 | |||
| b8e21e5265 | |||
| 55d2ec2dd7 | |||
| f96ce12758 | |||
| 2e743448f7 | |||
| 7c8efc6139 | |||
| 28cab4bd11 | |||
| d1418b94d3 | |||
| b97036b98c | |||
| 3ddf04fb09 | |||
| 3cf38fa3cf | |||
| 52515f3dfe | |||
| d03aa27f9e | |||
| b827d678aa | |||
| 153eefcc71 | |||
| c00b63a1b0 | |||
| c5194c1c3a | |||
| e911305aaa | |||
| 9a430dfa0e | |||
| b81619d854 | |||
| 5ea5323112 | |||
| 8cf077d9f1 | |||
| ab4630ab24 | |||
| 2d1d3979b1 | |||
| 38cdc008e5 | |||
| c15ef3137c | |||
| 523f09d8aa | |||
| 9a5b5636e9 | |||
| 1ad7308108 | |||
| b194451752 | |||
| c96934e503 | |||
| 3212dfdf7a | |||
| 567d204a62 | |||
| d86988cb8f | |||
| 9b2cdee052 | |||
| ccd53bfdf8 | |||
| 867a0728ea | |||
| 3515469ca5 | |||
| b66f747562 |
@@ -227,3 +227,5 @@
|
||||
|
||||
|
||||
//app.Run();
|
||||
|
||||
//测试同步
|
||||
|
||||
@@ -12,6 +12,7 @@ using IRaCIS.Core.Application.Service.Inspection.DTO;
|
||||
using IRaCIS.Core.Infra.EFCore;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Application.Auth;
|
||||
using Microsoft.Extensions.Localization;
|
||||
|
||||
namespace IRaCIS.Core.API.Controllers.Special
|
||||
{
|
||||
@@ -22,11 +23,12 @@ namespace IRaCIS.Core.API.Controllers.Special
|
||||
{
|
||||
private readonly ITrialService _trialService;
|
||||
private readonly ICalculateService _calculateService;
|
||||
|
||||
public FinancialChangeController(ITrialService trialService, ICalculateService calculateService
|
||||
)
|
||||
private IStringLocalizer _localizer { get; set; }
|
||||
public FinancialChangeController(ITrialService trialService, ICalculateService calculateService, IStringLocalizer localizer
|
||||
)
|
||||
{
|
||||
_trialService = trialService;
|
||||
_localizer = localizer;
|
||||
_trialService = trialService;
|
||||
_calculateService = calculateService;
|
||||
}
|
||||
|
||||
@@ -51,6 +53,8 @@ namespace IRaCIS.Core.API.Controllers.Special
|
||||
/// <returns>新记录Id</returns>
|
||||
[HttpPost, Route("trial/addOrUpdateTrial")]
|
||||
[Authorize(Policy = IRaCISPolicy.PM_APM)]
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AddOrUpdateTrial", "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput<Trial>> AddOrUpdateTrial(TrialCommand param)
|
||||
{
|
||||
var userId = Guid.Parse(User.FindFirst("id").Value);
|
||||
@@ -122,7 +126,8 @@ namespace IRaCIS.Core.API.Controllers.Special
|
||||
|
||||
if (isLock)
|
||||
{
|
||||
return ResponseOutput.NotOk("Expenses have been settled and workload can not be reset.");
|
||||
//---Expenses have been settled and workload can not be reset.
|
||||
return ResponseOutput.NotOk(_localizer["Financial_ChargeSettled"]);
|
||||
}
|
||||
|
||||
var deleteResult = await _trialWorkloadService.DeleteWorkload(id);
|
||||
@@ -298,7 +303,8 @@ namespace IRaCIS.Core.API.Controllers.Special
|
||||
{
|
||||
if (!ModelState.IsValid)
|
||||
{
|
||||
return ResponseOutput.NotOk("Invalid parameter.");
|
||||
//---Invalid parameter.
|
||||
return ResponseOutput.NotOk(_localizer["Financial_InvalidParameter"]);
|
||||
}
|
||||
return await _calculateService.CalculateMonthlyPayment(param, User.FindFirst("id").Value);
|
||||
}
|
||||
|
||||
@@ -112,6 +112,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/ReadingImageTask/SubmitOncologyReadingInfo")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> SetOncologyReadingInfo(DataInspectionDto<SubmitOncologyReadingInfoInDto> opt)
|
||||
{
|
||||
@@ -127,6 +129,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/ReadingImageTask/SubmitDicomVisitTask")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> SubmitDicomVisitTask(DataInspectionDto<SubmitDicomVisitTaskInDto> opt)
|
||||
{
|
||||
@@ -144,6 +148,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/ReadingImageTask/SubmitGlobalReadingInfo")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> SubmitGlobalReadingInfo(DataInspectionDto<SubmitGlobalReadingInfoInDto> opt)
|
||||
{
|
||||
@@ -161,6 +167,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/configTrialBasicInfo/TrialReadingInfoSign")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> TrialReadingInfoSign(DataInspectionDto<TrialReadingInfoSignInDto> opt)
|
||||
{
|
||||
@@ -178,6 +186,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/ReadingMedicalReview/FinishMedicalReview")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> FinishMedicalReview(DataInspectionDto<FinishMedicalReviewInDto> opt)
|
||||
{
|
||||
@@ -193,6 +203,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/ReadingMedicineQuestion/ConfirmReadingMedicineQuestion")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> ConfirmReadingMedicineQuestion(DataInspectionDto<ConfirmReadingMedicineQuestionInDto> opt)
|
||||
{
|
||||
@@ -209,6 +221,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/ReadingImageTask/SubmitVisitTaskQuestions")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> SubmitVisitTaskQuestions(DataInspectionDto<SubmitVisitTaskQuestionsInDto> opt)
|
||||
{
|
||||
@@ -225,6 +239,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/ReadingImageTask/SubmitJudgeVisitTaskResult")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> SubmitJudgeVisitTaskResult(DataInspectionDto<SaveJudgeVisitTaskResult> opt)
|
||||
{
|
||||
@@ -262,7 +278,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/configTrialBasicInfo/ConfigTrialProcessInfoConfirm")]
|
||||
[UnitOfWork]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt" })]
|
||||
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt" })]
|
||||
public async Task<IResponseOutput> ConfigTrialProcessInfoConfirm(DataInspectionDto<TrialProcessConfig> opt)
|
||||
{
|
||||
opt.Data.IsTrialProcessConfirmed = true;
|
||||
@@ -318,6 +334,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/QCOperation/CRCRequestToQC")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> CRCRequestToQC(DataInspectionDto<CRCRequestToQCCommand> opt)
|
||||
{
|
||||
@@ -332,6 +349,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// 设置QC 通过或者不通过 7:QC failed 8:QC passed
|
||||
/// </summary>
|
||||
[HttpPost, Route("Inspection/QCOperation/QCPassedOrFailed")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> QCPassedOrFailed(DataInspectionDto<QCPassedOrFailedDto> opt)
|
||||
{
|
||||
@@ -345,6 +363,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// 一致性核查 回退 对话记录不清除 只允许PM回退
|
||||
/// </summary>
|
||||
[HttpPost, Route("Inspection/QCOperation/CheckBack")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> CheckBack(DataInspectionDto<IDDto> opt)
|
||||
{
|
||||
@@ -361,7 +380,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/ReadClinicalData/ReadClinicalDataSign")]
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> ReadClinicalDataSign(DataInspectionDto<ReadingClinicalDataSignIndto> opt)
|
||||
{
|
||||
@@ -376,6 +395,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// CRC 设置已经重传完成
|
||||
/// </summary>
|
||||
[HttpPost, Route("Inspection/QCOperation/SetReuploadFinished")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> SetReuploadFinished(DataInspectionDto<CRCReuploadFinishedCommand> opt)
|
||||
{
|
||||
@@ -391,6 +411,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="opt"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/TrialConfig/updateTrialState")]
|
||||
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt" })]
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> UpdateTrialState(DataInspectionDto<UpdateTrialStateDto> opt)
|
||||
{
|
||||
@@ -406,11 +428,11 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/TrialDocument/userConfirm")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "SignSystemDocNoTrialId", "AfterStopCannNotOpt" })]
|
||||
[UnitOfWork]
|
||||
public async Task<IResponseOutput> UserConfirm(DataInspectionDto<UserConfirmCommand> opt)
|
||||
{
|
||||
var singid = await _inspectionService.RecordSing(opt.SignInfo);
|
||||
|
||||
opt.Data.SignText = opt.SignInfo.SignText;
|
||||
var result = await _trialDocumentService.UserConfirm(opt.Data);
|
||||
await _inspectionService.CompletedSign(singid, result);
|
||||
@@ -423,6 +445,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost, Route("Inspection/VisitTask/ConfirmReReading")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[UnitOfWork]
|
||||
|
||||
public async Task<IResponseOutput> ConfirmReReading(DataInspectionDto<ConfirmReReadingCommand> opt , [FromServices] IVisitTaskHelpeService _visitTaskCommonService,[FromServices] IVisitTaskService _visitTaskService)
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using AutoMapper;
|
||||
using DocumentFormat.OpenXml.Drawing;
|
||||
using EasyCaching.Core;
|
||||
using ExcelDataReader;
|
||||
using IRaCIS.Application.Contracts;
|
||||
@@ -12,6 +13,7 @@ using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Application.MediatR.CommandAndQueries;
|
||||
using IRaCIS.Core.Application.MediatR.Handlers;
|
||||
using IRaCIS.Core.Application.Service;
|
||||
using IRaCIS.Core.Application.Service.ImageAndDoc;
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Domain.Models;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
@@ -43,6 +45,7 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Path = System.IO.Path;
|
||||
|
||||
namespace IRaCIS.Core.API.Controllers
|
||||
{
|
||||
@@ -137,53 +140,53 @@ namespace IRaCIS.Core.API.Controllers
|
||||
public virtual async Task DicomFileUploadAsync(Func<string, Stream, int, Task> filePathFunc, string boundary)
|
||||
{
|
||||
|
||||
var fileCount = 0;
|
||||
var fileCount = 0;
|
||||
|
||||
var reader = new MultipartReader(boundary, HttpContext.Request.Body);
|
||||
var reader = new MultipartReader(boundary, HttpContext.Request.Body);
|
||||
|
||||
var section = await reader.ReadNextSectionAsync();
|
||||
var section = await reader.ReadNextSectionAsync();
|
||||
|
||||
while (section != null)
|
||||
while (section != null)
|
||||
{
|
||||
var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition);
|
||||
|
||||
if (hasContentDispositionHeader)
|
||||
{
|
||||
var hasContentDispositionHeader = ContentDispositionHeaderValue.TryParse(section.ContentDisposition, out var contentDisposition);
|
||||
|
||||
if (hasContentDispositionHeader)
|
||||
var fileName = contentDisposition.FileName.Value ?? String.Empty;
|
||||
|
||||
string mediaType = section.ContentType ?? String.Empty;
|
||||
|
||||
|
||||
//处理压缩文件
|
||||
if (fileName.Contains(".Zip", StringComparison.OrdinalIgnoreCase) || fileName.Contains(".rar", StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var archive = ArchiveFactory.Open(section.Body);
|
||||
|
||||
var fileName = contentDisposition.FileName.Value ?? String.Empty;
|
||||
|
||||
string mediaType = section.ContentType ?? String.Empty;
|
||||
|
||||
|
||||
//处理压缩文件
|
||||
if (fileName.Contains(".Zip", StringComparison.OrdinalIgnoreCase) || fileName.Contains(".rar", StringComparison.OrdinalIgnoreCase))
|
||||
foreach (var entry in archive.Entries)
|
||||
{
|
||||
var archive = ArchiveFactory.Open(section.Body);
|
||||
|
||||
foreach (var entry in archive.Entries)
|
||||
{
|
||||
if (!entry.IsDirectory)
|
||||
{
|
||||
++fileCount;
|
||||
|
||||
await filePathFunc(entry.Key, entry.OpenEntryStream(), fileCount);
|
||||
}
|
||||
}
|
||||
}
|
||||
//普通单个文件
|
||||
else
|
||||
{
|
||||
if (mediaType.Contains("octet-stream") || mediaType.Contains("dicom"))
|
||||
if (!entry.IsDirectory)
|
||||
{
|
||||
++fileCount;
|
||||
|
||||
await filePathFunc(fileName, section.Body, fileCount);
|
||||
await filePathFunc(entry.Key, entry.OpenEntryStream(), fileCount);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
section = await reader.ReadNextSectionAsync();
|
||||
//普通单个文件
|
||||
else
|
||||
{
|
||||
if (mediaType.Contains("octet-stream") || mediaType.Contains("dicom"))
|
||||
{
|
||||
++fileCount;
|
||||
|
||||
await filePathFunc(fileName, section.Body, fileCount);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
section = await reader.ReadNextSectionAsync();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -209,11 +212,12 @@ namespace IRaCIS.Core.API.Controllers
|
||||
private readonly IRepository _repository;
|
||||
|
||||
private readonly IEasyCachingProvider _provider;
|
||||
|
||||
private readonly QCCommon _qCCommon;
|
||||
public StudyController(IMapper mapper, IUserInfo userInfo, IWebHostEnvironment hostEnvironment, IMediator mediator, IEasyCachingProvider provider,
|
||||
|
||||
QCCommon qCCommon,
|
||||
IRepository repository)
|
||||
{
|
||||
_qCCommon = qCCommon;
|
||||
_provider = provider;
|
||||
_hostEnvironment = hostEnvironment;
|
||||
_mediator = mediator;
|
||||
@@ -223,53 +227,92 @@ namespace IRaCIS.Core.API.Controllers
|
||||
_repository = repository;
|
||||
}
|
||||
|
||||
[HttpPost, Route("Study/PreArchiveStudy")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> PreArchiveStudy(PreArchiveStudyCommand preArchiveStudyCommand,
|
||||
[FromServices] IStudyService _studyService,
|
||||
[FromServices] IRepository<StudyMonitor> _studyMonitorRepository)
|
||||
{
|
||||
|
||||
if (_provider.Get<List<SystemAnonymization>>(StaticData.Anonymize.Anonymize_AddFixedFiled).Value == null)
|
||||
{
|
||||
await _mediator.Send(new AnonymizeCacheRequest());
|
||||
}
|
||||
|
||||
var savedInfo = _studyService.GetSaveToDicomInfo(preArchiveStudyCommand.SubjectVisitId);
|
||||
|
||||
var studyMonitor = new StudyMonitor()
|
||||
{
|
||||
TrialId = savedInfo.TrialId,
|
||||
SiteId = savedInfo.SiteId,
|
||||
SubjectId = savedInfo.SubjectId,
|
||||
SubjectVisitId = savedInfo.SubjectVisitId,
|
||||
|
||||
IsSuccess = false,
|
||||
UploadStartTime = DateTime.Now,
|
||||
IsDicom = preArchiveStudyCommand.IsDicom,
|
||||
IP = _userInfo.IP
|
||||
};
|
||||
|
||||
|
||||
var addEntity = await _studyMonitorRepository.AddAsync(studyMonitor, true);
|
||||
|
||||
return ResponseOutput.Ok(addEntity.Id);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>Dicom 归档</summary>
|
||||
[HttpPost, Route("Study/ArchiveStudy")]
|
||||
[DisableFormValueModelBinding]
|
||||
[DisableRequestSizeLimit]
|
||||
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId,
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> ArchiveStudyNew(/*[FromForm] ArchiveStudyCommand archiveStudyCommand,*/ Guid trialId, Guid subjectVisitId, string studyInstanceUid, Guid? abandonStudyId,Guid studyMonitorId,
|
||||
[FromServices] ILogger<UploadDownLoadController> _logger,
|
||||
[FromServices] IEasyCachingProvider _provider,
|
||||
[FromServices] IStudyService _studyService,
|
||||
[FromServices] IHubContext<UploadHub, IUploadClient> _uploadHub,
|
||||
[FromServices] IDicomArchiveService _dicomArchiveService,
|
||||
[FromServices] IRepository _repository
|
||||
[FromServices] IRepository<StudyMonitor> _studyMonitorRepository
|
||||
)
|
||||
{
|
||||
|
||||
|
||||
if (_provider.Get<List<SystemAnonymization>>(StaticData.Anonymize.Anonymize_AddFixedFiled).Value==null )
|
||||
{
|
||||
await _mediator.Send(new AnonymizeCacheRequest());
|
||||
}
|
||||
|
||||
//_logger.LogError("请求到达接口");
|
||||
|
||||
|
||||
|
||||
if (!HttpContext.Request.HasFormContentType ||
|
||||
!MediaTypeHeaderValue.TryParse(HttpContext.Request.ContentType, out var mediaTypeHeader) ||
|
||||
string.IsNullOrEmpty(mediaTypeHeader.Boundary.Value))
|
||||
{
|
||||
return ResponseOutput.NotOk("不支持的MediaType");
|
||||
//---不支持的MediaType
|
||||
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_UnsupportedMedia"));
|
||||
}
|
||||
|
||||
var archiveStudyCommand = new ArchiveStudyCommand() { AbandonStudyId = abandonStudyId, StudyInstanceUid = studyInstanceUid, SubjectVisitId = subjectVisitId };
|
||||
|
||||
|
||||
string studycode = string.Empty;
|
||||
|
||||
var startTime = DateTime.Now;
|
||||
|
||||
if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}" ))
|
||||
if (_provider.Exists($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}"))
|
||||
{
|
||||
return ResponseOutput.NotOk("当前已有人正在上传和归档该检查!");
|
||||
//---当前已有人正在上传和归档该检查!
|
||||
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_ArchiveInProgress"));
|
||||
}
|
||||
else
|
||||
{
|
||||
_provider.Set($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}", _userInfo.Id, TimeSpan.FromMinutes(30));
|
||||
}
|
||||
|
||||
//到了接口,代表上传结束了
|
||||
|
||||
var studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == studyMonitorId);
|
||||
|
||||
studyMonitor.UploadFinishedTime = DateTime.Now;
|
||||
|
||||
|
||||
var (archiveResult, archivedStudyIds) = (new DicomArchiveResult(), new List<Guid>());
|
||||
|
||||
|
||||
@@ -329,26 +372,16 @@ namespace IRaCIS.Core.API.Controllers
|
||||
{
|
||||
_provider.Remove($"StudyUid_{trialId}_{archiveStudyCommand.StudyInstanceUid}");
|
||||
|
||||
throw new BusinessValidationFailedException("请求异常,请重试!");
|
||||
//---请求异常,请重试!
|
||||
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_RequestError"));
|
||||
}
|
||||
|
||||
studyMonitor.FileSize = (decimal)HttpContext.Request.ContentLength;
|
||||
studyMonitor.FileCount = archiveResult.ReceivedFileCount;
|
||||
studyMonitor.FailedFileCount = archiveResult.ErrorFiles.Count;
|
||||
studyMonitor.IsDicomReUpload = archiveStudyCommand.AbandonStudyId != null;
|
||||
studyMonitor.Note = JsonConvert.SerializeObject(archiveResult);
|
||||
|
||||
var studyMonitor = new StudyMonitor()
|
||||
{
|
||||
TrialId = savedInfo.TrialId,
|
||||
SiteId = savedInfo.SiteId,
|
||||
SubjectId = savedInfo.SubjectId,
|
||||
SubjectVisitId = savedInfo.SubjectVisitId,
|
||||
|
||||
|
||||
|
||||
UploadStartTime = startTime,
|
||||
FileSize = (decimal)HttpContext.Request.ContentLength,
|
||||
FileCount = archiveResult.ReceivedFileCount,
|
||||
IsDicom = true,
|
||||
IsDicomReUpload = archiveStudyCommand.AbandonStudyId != null,
|
||||
IP = _userInfo.IP
|
||||
};
|
||||
|
||||
try
|
||||
{
|
||||
@@ -365,21 +398,12 @@ namespace IRaCIS.Core.API.Controllers
|
||||
studyMonitor.IsSuccess = true;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
studyMonitor.IsSuccess = false;
|
||||
studyMonitor.Note = JsonConvert.SerializeObject(archiveResult);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
studyMonitor.IsSuccess = false;
|
||||
studyMonitor.Note = JsonConvert.SerializeObject(new { Message = e.Message, Result = archiveResult });
|
||||
|
||||
_logger.LogError(e.Message + e.StackTrace);
|
||||
|
||||
}
|
||||
@@ -389,9 +413,9 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
studyMonitor.StudyId = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.Id ?? Guid.Empty;
|
||||
studyMonitor.StudyCode = archiveResult.ArchivedDicomStudies.FirstOrDefault()?.StudyCode;
|
||||
studyMonitor.UploadFinishedTime = DateTime.Now;
|
||||
await _repository.AddAsync(studyMonitor, true);
|
||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||
|
||||
await _studyMonitorRepository.SaveChangesAsync();
|
||||
}
|
||||
|
||||
|
||||
@@ -415,9 +439,11 @@ namespace IRaCIS.Core.API.Controllers
|
||||
[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);
|
||||
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) =>
|
||||
@@ -451,6 +477,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <returns></returns>
|
||||
[HttpPost("ClinicalData/UploadClinicalTemplate")]
|
||||
[DisableRequestSizeLimit]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
|
||||
|
||||
|
||||
public async Task<IResponseOutput<List<FileDto>>> UploadClinicalTemplate(Guid? trialId)
|
||||
{
|
||||
@@ -489,6 +517,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <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;
|
||||
@@ -516,6 +546,34 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <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>
|
||||
@@ -523,7 +581,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="visitTaskId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("VisitTask/UploadReadingAnswerImage/{trialId:guid}/{visitTaskId:guid}")]
|
||||
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput<FileDto>> UploadReadingAnswerImage(Guid trialId, Guid visitTaskId)
|
||||
{
|
||||
|
||||
@@ -548,7 +606,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="visitTaskId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("VisitTask/UploadJudgeTaskImage/{trialId:guid}/{visitTaskId:guid}")]
|
||||
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput<FileDto>> UploadJudgeTaskImage(Guid trialId, Guid visitTaskId)
|
||||
{
|
||||
|
||||
@@ -576,7 +634,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="taskMedicalReviewId"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost("TaskMedicalReview/UploadMedicalReviewImage/{trialId:guid}/{taskMedicalReviewId:guid}")]
|
||||
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput<FileDto>> UploadMedicalReviewImage(Guid trialId, Guid taskMedicalReviewId)
|
||||
{
|
||||
string path = string.Empty;
|
||||
@@ -611,20 +669,25 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="formCollection"></param>
|
||||
/// <param name="subjectVisitId"></param>
|
||||
/// <param name="noneDicomStudyId"></param>
|
||||
/// <param name="studyMonitorId"></param>
|
||||
/// <param name="_noneDicomStudyRepository"></param>
|
||||
/// <returns></returns>
|
||||
//[DisableRequestSizeLimit]
|
||||
[RequestSizeLimit(1_073_741_824)]
|
||||
[HttpPost("NoneDicomStudy/UploadNoneDicomFile/{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyId:guid}")]
|
||||
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[HttpPost("NoneDicomStudy/UploadNoneDicomFile/{trialId:guid}/{subjectVisitId:guid}/{noneDicomStudyId:guid}/{studyMonitorId:guid}")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[Authorize(Policy = IRaCISPolicy.CRC)]
|
||||
public async Task<IResponseOutput> UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId, [FromServices] IRepository<NoneDicomStudy> _noneDicomStudyRepository)
|
||||
public async Task<IResponseOutput> UploadNoneDicomFile(IFormCollection formCollection, Guid subjectVisitId, Guid noneDicomStudyId, Guid studyMonitorId,
|
||||
[FromServices] IRepository<NoneDicomStudy> _noneDicomStudyRepository, [FromServices] IRepository<StudyMonitor> _studyMonitorRepository)
|
||||
{
|
||||
var startTime = DateTime.Now;
|
||||
|
||||
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 studyMonitor = await _studyMonitorRepository.FirstOrDefaultAsync(t => t.Id == studyMonitorId);
|
||||
|
||||
studyMonitor.UploadFinishedTime = DateTime.Now;
|
||||
|
||||
await FileUploadAsync(async (fileName) =>
|
||||
{
|
||||
@@ -636,6 +699,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
return serverFilePath;
|
||||
});
|
||||
|
||||
var uploadFinishedTime = DateTime.Now;
|
||||
|
||||
|
||||
//// 上传非Dicom 后 将状态改为待提交 分为普通上传 和QC后重传 普通上传时才改为待提交
|
||||
@@ -645,22 +709,14 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
noneDicomStudy.FileCount = noneDicomStudy.FileCount + formCollection.Files.Count;
|
||||
|
||||
await _repository.AddAsync(new StudyMonitor()
|
||||
{
|
||||
FileCount = formCollection.Files.Count,
|
||||
FileSize = formCollection.Files.Sum(t => t.Length),
|
||||
IsDicom = false,
|
||||
IsDicomReUpload = false,
|
||||
StudyId = noneDicomStudyId,
|
||||
StudyCode = noneDicomStudy.StudyCode,
|
||||
UploadStartTime = startTime,
|
||||
UploadFinishedTime = DateTime.Now,
|
||||
IP = _userInfo.IP,
|
||||
TrialId = sv.TrialId,
|
||||
SiteId = sv.SiteId,
|
||||
SubjectId = sv.SubjectId,
|
||||
SubjectVisitId = subjectVisitId,
|
||||
});
|
||||
studyMonitor.FileCount = formCollection.Files.Count;
|
||||
studyMonitor.FileSize = formCollection.Files.Sum(t => t.Length);
|
||||
studyMonitor.IsDicom = false;
|
||||
studyMonitor.IsDicomReUpload = false;
|
||||
studyMonitor.StudyId = noneDicomStudyId;
|
||||
studyMonitor.StudyCode = noneDicomStudy.StudyCode;
|
||||
studyMonitor.ArchiveFinishedTime = DateTime.Now;
|
||||
studyMonitor.IP = _userInfo.IP;
|
||||
|
||||
await _repository.SaveChangesAsync();
|
||||
|
||||
@@ -676,7 +732,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
/// <param name="trialId"></param>
|
||||
/// <returns></returns>
|
||||
[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)
|
||||
{
|
||||
@@ -688,7 +744,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
if (!fileName.EndsWith(".xlsx") && !fileName.EndsWith(".csv") && !fileName.EndsWith(".xls"))
|
||||
{
|
||||
throw new BusinessValidationFailedException("支持.xlsx、.xls、.csv格式的文件上传。");
|
||||
//---支持.xlsx、.xls、.csv格式的文件上传。
|
||||
throw new BusinessValidationFailedException(StaticData.International("UploadDownLoad_SupportedFormats"));
|
||||
}
|
||||
|
||||
(serverFilePath, relativePath) = FileStoreHelper.GetTrialCheckFilePath(_hostEnvironment, fileName, trialId);
|
||||
@@ -739,7 +796,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
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(JsonConvert.SerializeObject(import.TemplateErrors));
|
||||
|
||||
@@ -767,7 +824,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
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(JsonConvert.SerializeObject(import.TemplateErrors));
|
||||
|
||||
@@ -828,7 +885,8 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
if (etcCheckList == null || etcCheckList.Count == 0)
|
||||
{
|
||||
return ResponseOutput.NotOk("请保证上传数据符合模板文件中的样式,且存在有效数据。");
|
||||
//---请保证上传数据符合模板文件中的样式,且存在有效数据。
|
||||
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_InvalidData"));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -844,11 +902,12 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
var dt = DateTime.Now;
|
||||
|
||||
etcCheckList = etcCheckList.Where(t => !(t.Modality == string.Empty && t.SiteCode == string.Empty && t.SubjectCode == string.Empty && t.VisitName == string.Empty && t.StudyDate == string.Empty && DateTime.TryParse(t.StudyDate, out dt))).ToList();
|
||||
etcCheckList = etcCheckList.Where(t => !(t.Modality == string.Empty || t.SiteCode == string.Empty || t.SubjectCode == string.Empty || t.VisitName == string.Empty || t.StudyDate == string.Empty ||! DateTime.TryParse(t.StudyDate, out dt))).ToList();
|
||||
|
||||
if (etcCheckList.Count == 0)
|
||||
{
|
||||
return ResponseOutput.NotOk("请保证上传数据符合模板文件中的样式,且存在有效数据。");
|
||||
//---请保证上传数据符合模板文件中的样式,且存在有效数据。
|
||||
return ResponseOutput.NotOk(StaticData.International("UploadDownLoad_InvalidData"));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -907,6 +966,9 @@ namespace IRaCIS.Core.API.Controllers
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 上传文件( 不是医生个人的文件)[FileUpload]
|
||||
/// 例如:阅片章程等
|
||||
@@ -953,7 +1015,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
public async Task<IResponseOutput<UploadFileInfoDTO>> DownloadOfficialResume(int language, Guid[] doctorIds)
|
||||
{
|
||||
|
||||
var path = await _fileService.CreateDoctorsAllAttachmentZip(doctorIds);
|
||||
var path = await _fileService.CreateDoctorsAllAttachmentZip(doctorIds);
|
||||
return ResponseOutput.Ok(new UploadFileInfoDTO
|
||||
{
|
||||
FilePath = await _fileService.CreateOfficialResumeZip(language, doctorIds),
|
||||
@@ -982,7 +1044,7 @@ namespace IRaCIS.Core.API.Controllers
|
||||
|
||||
|
||||
[HttpPost, Route("enroll/downloadResume/{trialId:guid}/{language}")]
|
||||
[TypeFilter(typeof(TrialResourceFilter),Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
[AllowAnonymous]
|
||||
public async Task<IResponseOutput<string>> DownloadResume(int language, Guid trialId, Guid[] doctorIdArray)
|
||||
{
|
||||
|
||||
Binary file not shown.
@@ -6,6 +6,10 @@
|
||||
<UserSecretsId>354572d4-9e15-4099-807c-63a2d29ff9f2</UserSecretsId>
|
||||
<LangVersion>default</LangVersion>
|
||||
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
|
||||
<Version>1.0.1.001</Version>
|
||||
<Company>上海展影医疗科技有限公司</Company>
|
||||
<Product>IRC影像系统 (EICS)</Product>
|
||||
<Copyright>上海展影医疗科技有限公司版权所有</Copyright>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
|
||||
@@ -21,10 +25,7 @@
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Compile Remove="UploadFile\**" />
|
||||
<Compile Remove="wwwroot\**" />
|
||||
<Content Remove="UploadFile\**" />
|
||||
|
||||
<EmbeddedResource Remove="UploadFile\**" />
|
||||
<EmbeddedResource Remove="wwwroot\**" />
|
||||
|
||||
@@ -105,30 +106,60 @@
|
||||
<Content Update="NLog.config">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\AdminAddUser_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\AdminResetUser_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\AdminResetUser.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\EmailConfigTest_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\EmailConfigTest.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\SubjectEnrollConfirmOrPDProgress_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialDoctorExistJoin_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialDoctorFirstJoin.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialSiteSurveyReject.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialSiteSurveyReject_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialDoctorExistJoin.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialUserExistJoin_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialUserExistJoin.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\AdminAddUser.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialDoctorFirstJoin.html">
|
||||
<Content Update="wwwroot\EmailTemplate\TrialDoctorFirstJoin_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\SubjectEnrollConfirmOrPDProgress.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\TrialUserFirstJoin_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\UserOptCommon_US.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
<Content Update="wwwroot\EmailTemplate\UserOptCommon.html">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</Content>
|
||||
|
||||
@@ -230,7 +230,7 @@
|
||||
<member name="M:IRaCIS.Core.API.Controllers.UploadBaseController.DicomFileUploadAsync(System.Func{System.String,System.IO.Stream,System.Int32,System.Threading.Tasks.Task},System.String)">
|
||||
<summary> 流式上传 Dicom上传 </summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.ArchiveStudyNew(System.Guid,System.Guid,System.String,System.Nullable{System.Guid},Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.API.Controllers.UploadDownLoadController},EasyCaching.Core.IEasyCachingProvider,IRaCIS.Core.Application.Contracts.IStudyService,Microsoft.AspNetCore.SignalR.IHubContext{IRaCIS.Core.API.UploadHub,IRaCIS.Core.API.IUploadClient},IRaCIS.Core.Application.Contracts.Dicom.IDicomArchiveService,IRaCIS.Core.Infra.EFCore.IRepository)">
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.ArchiveStudyNew(System.Guid,System.Guid,System.String,System.Nullable{System.Guid},System.Guid,Microsoft.Extensions.Logging.ILogger{IRaCIS.Core.API.Controllers.UploadDownLoadController},EasyCaching.Core.IEasyCachingProvider,IRaCIS.Core.Application.Contracts.IStudyService,Microsoft.AspNetCore.SignalR.IHubContext{IRaCIS.Core.API.UploadHub,IRaCIS.Core.API.IUploadClient},IRaCIS.Core.Application.Contracts.Dicom.IDicomArchiveService,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
|
||||
<summary>Dicom 归档</summary>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadVisitClinicalData(System.Guid)">
|
||||
@@ -256,6 +256,13 @@
|
||||
<param name="readingId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadPrintscreen(System.Guid)">
|
||||
<summary>
|
||||
上传截图
|
||||
</summary>
|
||||
<param name="subjectId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadReadingAnswerImage(System.Guid,System.Guid)">
|
||||
<summary>
|
||||
上传Reading问题的图像
|
||||
@@ -280,13 +287,15 @@
|
||||
<param name="taskMedicalReviewId"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadNoneDicomFile(Microsoft.AspNetCore.Http.IFormCollection,System.Guid,System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy})">
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadNoneDicomFile(Microsoft.AspNetCore.Http.IFormCollection,System.Guid,System.Guid,System.Guid,IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.NoneDicomStudy},IRaCIS.Core.Infra.EFCore.IRepository{IRaCIS.Core.Domain.Models.StudyMonitor})">
|
||||
<summary>
|
||||
上传非Dicom 文件 支持压缩包 多文件上传
|
||||
</summary>
|
||||
<param name="formCollection"></param>
|
||||
<param name="subjectVisitId"></param>
|
||||
<param name="noneDicomStudyId"></param>
|
||||
<param name="studyMonitorId"></param>
|
||||
<param name="_noneDicomStudyRepository"></param>
|
||||
<returns></returns>
|
||||
</member>
|
||||
<member name="M:IRaCIS.Core.API.Controllers.StudyController.UploadVisitCheckExcel(System.Guid)">
|
||||
|
||||
+55
-56
@@ -9,6 +9,8 @@ using IRaCIS.Core.Application.MediatR.Handlers;
|
||||
using System.Threading.Tasks;
|
||||
using MassTransit;
|
||||
using MassTransit.NewIdProviders;
|
||||
using System.IO;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
@@ -50,23 +52,27 @@ namespace IRaCIS.Core.API
|
||||
.Build();
|
||||
|
||||
|
||||
//// Serilog
|
||||
SerilogExtension.AddSerilogSetup(enviromentName, host.Services);
|
||||
Log.Logger.Warning($"当前环境:{enviromentName}");
|
||||
|
||||
|
||||
|
||||
NewId.SetProcessIdProvider(new CurrentProcessIdProvider());
|
||||
|
||||
|
||||
|
||||
|
||||
//// Serilog
|
||||
SerilogExtension.AddSerilogSetup(enviromentName, host.Services);
|
||||
|
||||
//缓存项目的状态 匿名化数据
|
||||
await InitCache(host);
|
||||
|
||||
WatchJsonFile(Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, StaticData.En_US_Json) );
|
||||
|
||||
WatchJsonFile(Path.Combine(AppContext.BaseDirectory, StaticData.Folder.Resources, StaticData.Zh_CN_Json));
|
||||
|
||||
|
||||
|
||||
|
||||
host.Run();
|
||||
|
||||
Log.Logger.Warning($"当前环境:{enviromentName}");
|
||||
|
||||
}
|
||||
catch (Exception e)
|
||||
@@ -75,46 +81,6 @@ namespace IRaCIS.Core.API
|
||||
Log.Logger.Error(e.InnerException is null ? e.Message + e.StackTrace : e.InnerException?.Message + e.InnerException?.StackTrace);
|
||||
}
|
||||
|
||||
|
||||
|
||||
#region Nlog 废弃
|
||||
//var logger = NLog.Web.NLogBuilder.ConfigureNLog("NLog.config").GetCurrentClassLogger();
|
||||
//try
|
||||
//{
|
||||
// var ihostBuilder = CreateHostBuilder(args);
|
||||
|
||||
// ihostBuilder.UseEnvironment(environment);
|
||||
|
||||
// ihostBuilder.ConfigureAppConfiguration((hostContext, config) =>
|
||||
// {
|
||||
|
||||
// //Console.WriteLine(hostContext.HostingEnvironment.EnvironmentName);
|
||||
// config.AddJsonFile("appsettings.json", false, true)
|
||||
// .AddJsonFile($"appsettings.{environment}.json", false, true);
|
||||
// });
|
||||
|
||||
// var host = ihostBuilder.Build();
|
||||
|
||||
// CacheTrialStatus(host);
|
||||
|
||||
// host.Run();
|
||||
|
||||
//}
|
||||
//catch (Exception exception)
|
||||
//{
|
||||
// //NLog: catch setup errors
|
||||
// logger.Error(exception, "Stopped program because of exception");
|
||||
//}
|
||||
//finally
|
||||
//{
|
||||
// // Ensure to flush and stop internal timers/threads before application-exit (Avoid segmentation fault on Linux)
|
||||
// NLog.LogManager.Shutdown();
|
||||
//}
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static IHostBuilder CreateHostBuilder(string[] args) =>
|
||||
@@ -133,16 +99,7 @@ namespace IRaCIS.Core.API
|
||||
//webBuilder.UseSerilog();//在宿主机启动的时候配置serilog,与微软ILogger进行整合
|
||||
webBuilder.UseStartup<Startup>();
|
||||
}).UseSerilog()
|
||||
.UseServiceProviderFactory(new AutofacServiceProviderFactory());//使用Autofac替代本身容器
|
||||
//ConfigureLogging(logging =>
|
||||
//{
|
||||
// logging.ClearProviders();
|
||||
// logging.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
|
||||
//})
|
||||
//.UseNLog()
|
||||
// NLog: Setup NLog for Dependency injection;
|
||||
|
||||
|
||||
.UseServiceProviderFactory(new AutofacServiceProviderFactory());
|
||||
|
||||
|
||||
private static async Task InitCache(IHost host)
|
||||
@@ -154,5 +111,47 @@ namespace IRaCIS.Core.API
|
||||
await _mediator.Send(new TrialStateCacheRequest());
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static 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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
public static void WatchJsonFile(string filePath)
|
||||
{
|
||||
LoadJsonFile(filePath);
|
||||
|
||||
|
||||
FileSystemWatcher watcher = new FileSystemWatcher(Path.GetDirectoryName(filePath), Path.GetFileName(filePath));
|
||||
watcher.Changed += (sender, e) => LoadJsonFile(filePath);
|
||||
watcher.EnableRaisingEvents = true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -45,6 +45,14 @@
|
||||
"ASPNETCORE_ENVIRONMENT": "Production"
|
||||
},
|
||||
"applicationUrl": "http://localhost:6300"
|
||||
},
|
||||
"IRaCIS.CertificateApply": {
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "CertificateApply"
|
||||
},
|
||||
"applicationUrl": "http://localhost:6400"
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -23,6 +23,7 @@ using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using Invio.Extensions.Authentication.JwtBearer;
|
||||
using Microsoft.AspNetCore.SignalR;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.AspNetCore.StaticFiles;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
@@ -229,12 +230,8 @@ namespace IRaCIS.Core.API
|
||||
////文件伺服 必须带Token 访问
|
||||
////app.UseIRacisHostStaticFileStore(env);
|
||||
|
||||
|
||||
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
|
||||
|
||||
endpoints.MapControllers();
|
||||
|
||||
endpoints.MapHub<UploadHub>("/UploadHub");
|
||||
|
||||
@@ -14,7 +14,8 @@ namespace IRaCIS.Core.API.Utility
|
||||
|
||||
if (string.IsNullOrWhiteSpace(boundary))
|
||||
{
|
||||
throw new InvalidDataException("Missing content-type boundary.");
|
||||
throw new InvalidDataException(
|
||||
"Missing content-type boundary.");
|
||||
}
|
||||
|
||||
if (boundary.Length > lengthLimit)
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace IRaCIS.Core.API
|
||||
|
||||
//周期性任务,1天执行一次
|
||||
|
||||
RecurringJob.AddOrUpdate<IIRaCISCacheHangfireJob>(t => t.MemoryCacheTrialStatus(), Cron.Daily);
|
||||
RecurringJob.AddOrUpdate<IIRaCISCacheHangfireJob>(t => t.ProjectStartCache(), Cron.Daily);
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
+2
-8
@@ -13,7 +13,7 @@ namespace IRaCIS.Core.API
|
||||
public static void UseIRacisHostStaticFileStore(this IApplicationBuilder app, IWebHostEnvironment _hostEnvironment)
|
||||
{
|
||||
|
||||
var iRaCISDataFolder = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);
|
||||
var iRaCISDataFolder = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);
|
||||
|
||||
if (!Directory.Exists(iRaCISDataFolder))
|
||||
{
|
||||
@@ -26,13 +26,7 @@ namespace IRaCIS.Core.API
|
||||
RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
||||
ServeUnknownFileTypes = true,
|
||||
DefaultContentType = "application/octet-stream"
|
||||
|
||||
// // Set up custom content types - associating file extension to MIME type
|
||||
//var provider = new FileExtensionContentTypeProvider();
|
||||
// // Add new mappings
|
||||
// provider.Mappings[".myapp"] = "application/x-msdownload";
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,146 @@
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.AspNetCore.Builder;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.StaticFiles;
|
||||
using Microsoft.Extensions.FileProviders;
|
||||
using Microsoft.Extensions.FileProviders.Physical;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using Microsoft.Extensions.Hosting.Internal;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Microsoft.Extensions.Options;
|
||||
using Microsoft.VisualBasic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
{
|
||||
|
||||
|
||||
public class MultiDiskStaticFilesMiddleware
|
||||
{
|
||||
private readonly RequestDelegate _next;
|
||||
private readonly IWebHostEnvironment _hostingEnv;
|
||||
private readonly StaticFileOptions _options;
|
||||
private readonly ILoggerFactory _loggerFactory;
|
||||
|
||||
private string iRaCISDefaultDataFolder = string.Empty;
|
||||
|
||||
public MultiDiskStaticFilesMiddleware(RequestDelegate next, IWebHostEnvironment hostingEnv, StaticFileOptions options, ILoggerFactory loggerFactory)
|
||||
{
|
||||
_next = next;
|
||||
_hostingEnv = hostingEnv;
|
||||
_options = options;
|
||||
_loggerFactory = loggerFactory;
|
||||
|
||||
iRaCISDefaultDataFolder = FileStoreHelper.GetIRaCISRootDataFolder(_hostingEnv);
|
||||
|
||||
if (!Directory.Exists(iRaCISDefaultDataFolder))
|
||||
{
|
||||
Directory.CreateDirectory(iRaCISDefaultDataFolder);
|
||||
}
|
||||
}
|
||||
|
||||
public async Task Invoke(HttpContext context)
|
||||
{
|
||||
var path = context.Request.Path.Value;
|
||||
var isIRacisFile = path.StartsWith($"/{StaticData.Folder.IRaCISDataFolder}");
|
||||
|
||||
var isDicomFile = path.Contains($"{StaticData.Folder.DicomFolder}");
|
||||
|
||||
var defaultFileProvider = new PhysicalFileProvider(iRaCISDefaultDataFolder);
|
||||
var staticFileOptions = new StaticFileOptions
|
||||
{
|
||||
FileProvider = defaultFileProvider,
|
||||
RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
||||
ServeUnknownFileTypes = true,
|
||||
DefaultContentType = "application/octet-stream"
|
||||
};
|
||||
|
||||
var defaultRoot = Path.GetPathRoot(iRaCISDefaultDataFolder);
|
||||
|
||||
//先从默认里面去找
|
||||
if (isIRacisFile)
|
||||
{
|
||||
if (defaultFileProvider.GetFileInfo(context.Request.Path).Exists)
|
||||
{
|
||||
var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(staticFileOptions), _loggerFactory);
|
||||
await staticFileMiddleware.Invoke(context);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
//没找到
|
||||
//dicom影像,从多个文件夹尝试,因为会存在切换磁盘
|
||||
if (isDicomFile)
|
||||
{
|
||||
var disks = GetDisks().Where(t=>!t.Contains(defaultRoot));
|
||||
|
||||
|
||||
foreach (var item in disks)
|
||||
{
|
||||
var otherFileStoreFolder = Path.Combine(item, _hostingEnv.EnvironmentName);
|
||||
|
||||
var otherFileProvider= new PhysicalFileProvider(otherFileStoreFolder);
|
||||
|
||||
var otherStaticFileOptions = new StaticFileOptions
|
||||
{
|
||||
FileProvider = otherFileProvider,
|
||||
RequestPath = $"/{StaticData.Folder.IRaCISDataFolder}",
|
||||
ServeUnknownFileTypes = true,
|
||||
DefaultContentType = "application/octet-stream"
|
||||
};
|
||||
|
||||
if (otherFileProvider.GetFileInfo(context.Request.Path).Exists)
|
||||
{
|
||||
var staticFileMiddleware = new StaticFileMiddleware(_next, _hostingEnv, Options.Create(staticFileOptions), _loggerFactory);
|
||||
await staticFileMiddleware.Invoke(context);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// 如果所有磁盘都不存在所请求的文件,则将请求传递给下一个中间件组件。
|
||||
await _next.Invoke(context);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private string[] GetDisks()
|
||||
{
|
||||
// 获取系统中所有可用的磁盘
|
||||
return DriveInfo.GetDrives()
|
||||
.Where(d => d.IsReady && d.DriveType == DriveType.Fixed).Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))
|
||||
.Select(d => d.RootDirectory.FullName)
|
||||
.ToArray();
|
||||
}
|
||||
|
||||
|
||||
//private static string GetContentType(string path)
|
||||
//{
|
||||
// var provider = new FileExtensionContentTypeProvider();
|
||||
// if (!provider.TryGetContentType(path, out var contentType))
|
||||
// {
|
||||
// contentType = "application/octet-stream";
|
||||
// }
|
||||
|
||||
// return contentType;
|
||||
//}
|
||||
|
||||
//private async Task ServeFileAsync(HttpContext context, IFileInfo fileInfo)
|
||||
//{
|
||||
// var response = context.Response;
|
||||
// response.ContentType = GetContentType(fileInfo.PhysicalPath);
|
||||
|
||||
// using (var fileStream = fileInfo.CreateReadStream())
|
||||
// {
|
||||
// await fileStream.CopyToAsync(response.Body);
|
||||
// }
|
||||
//}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -42,6 +42,12 @@ namespace IRaCIS.Core.API
|
||||
triggerOptions.AddTrigger<SubjectVisitTrigger>();
|
||||
triggerOptions.AddTrigger<TrialCriterionSignTrigger>();
|
||||
triggerOptions.AddTrigger<TableQuestionRowTrigger>();
|
||||
//triggerOptions.AddTrigger<AddlTrialUserTrigger>();
|
||||
triggerOptions.AddTrigger<VisitTaskIsFrontTaskNeedSignButNotSignTrigger>();
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Newtonsoft.Json;
|
||||
using Newtonsoft.Json.Converters;
|
||||
using System;
|
||||
|
||||
namespace IRaCIS.Core.API
|
||||
@@ -22,6 +23,9 @@ namespace IRaCIS.Core.API
|
||||
// 设置时间格式
|
||||
options.SerializerSettings.DateFormatString = "yyyy-MM-dd HH:mm:ss";
|
||||
|
||||
//options.SerializerSettings.Converters.Add(new JSONCustomDateConverter()) ;
|
||||
|
||||
//IsoDateTimeConverter
|
||||
//options.SerializerSettings.NullValueHandling = NullValueHandling.Ignore;
|
||||
|
||||
})
|
||||
|
||||
@@ -36,10 +36,10 @@ namespace IRaCIS.Core.API
|
||||
config.WriteTo.Email(new EmailConnectionInfo()
|
||||
{
|
||||
EmailSubject = "系统警告,请速速查看!",//邮件标题
|
||||
FromEmail = "iracis_grr@163.com",//发件人邮箱
|
||||
MailServer = "smtp.163.com",//smtp服务器地址
|
||||
NetworkCredentials = new NetworkCredential("iracis_grr@163.com", "XLWVQKZAEKLDWOAH"),//两个参数分别是发件人邮箱与客户端授权码
|
||||
Port = 25,//端口号
|
||||
FromEmail = "test@extimaging.com",//发件人邮箱
|
||||
MailServer = "smtp.qiye.aliyun.com",//smtp服务器地址
|
||||
NetworkCredentials = new NetworkCredential("test@extimaging.com", "SHzyyl2021"),//两个参数分别是发件人邮箱与客户端授权码
|
||||
Port = 465,//端口号
|
||||
ToEmail = "872297557@qq.com"//收件人
|
||||
}, restrictedToMinimumLevel: LogEventLevel.Error,
|
||||
outputTemplate: "{Timestamp:yyyy-MM-dd HH:mm:ss.fff} [ {Level} {ClientIp} {ClientAgent} {TokenUserRealName} {TokenUserType} ] || [path: {RequestPath} arguments: {RequestBody}] {SourceContext:l} || {Message} || {Exception} ||end {NewLine})");
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft": "Warning",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"ConnectionStrings": {
|
||||
"RemoteNew": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=IRaCIS_Certificate;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true",
|
||||
"Hangfire": "Server=123.56.94.154,1433\\MSSQLSERVER;Database=Hangfire_IRaCIS;User ID=sa;Password=dev123456DEV;TrustServerCertificate=true"
|
||||
|
||||
},
|
||||
"BasicSystemConfig": {
|
||||
|
||||
"OpenUserComplexPassword": false,
|
||||
|
||||
"OpenSignDocumentBeforeWork": false,
|
||||
|
||||
"OpenTrialRelationDelete": true,
|
||||
|
||||
"OpenLoginLimit": false
|
||||
},
|
||||
|
||||
"SystemEmailSendConfig": {
|
||||
"Port": 465,
|
||||
"Host": "smtp.qiye.aliyun.com",
|
||||
"FromEmail": "test@extimaging.com",
|
||||
"FromName": "Test_IRC",
|
||||
"AuthorizationCode": "SHzyyl2021"
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft": "Warning",
|
||||
"Microsoft.Hosting.Lifetime": "Information"
|
||||
}
|
||||
},
|
||||
"ConnectionStrings": {
|
||||
"RemoteNew": "Server=47.90.161.85,1433\\MSSQLSERVER;Database=IRaCIS_Demo_US;User ID=sa;Password=zhanying2021;TrustServerCertificate=true",
|
||||
"Hangfire": "Server=47.90.161.85,1433\\MSSQLSERVER;Database=Hangfire.IRaCIS_Demo_US;User ID=sa;Password=zhanying2021;TrustServerCertificate=true"
|
||||
|
||||
},
|
||||
"BasicSystemConfig": {
|
||||
|
||||
"OpenUserComplexPassword": false,
|
||||
|
||||
"OpenSignDocumentBeforeWork": false,
|
||||
|
||||
"OpenTrialRelationDelete": true,
|
||||
|
||||
"OpenLoginLimit": false
|
||||
},
|
||||
|
||||
"SystemEmailSendConfig": {
|
||||
"Port": 465,
|
||||
"Host": "smtp.qiye.aliyun.com",
|
||||
"FromEmail": "test@extimaging.com",
|
||||
"FromName": "Test_IRC",
|
||||
"AuthorizationCode": "SHzyyl2021"
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,16 +1,13 @@
|
||||
{
|
||||
"ConnectionStrings": {
|
||||
"hang": "Server=ZHOU;Database=IRaCIS;User ID=sa;Password=sa123456;"
|
||||
},
|
||||
"JwtSetting": {
|
||||
"SecurityKey": "3e6dbfa227234a03977a2f421bdb7f4f", // 密钥
|
||||
"Issuer": "IRaCIS", // 颁发者
|
||||
"Audience": "ZhiZhun", // 接收者
|
||||
"TokenExpireDays": "7" // 过期时间(7day)
|
||||
"SecurityKey": "3e6dbfa227234a03977a2f421bdb7f4f",
|
||||
"Issuer": "IRaCIS",
|
||||
"Audience": "ZhiZhun",
|
||||
"TokenExpireDays": "7"
|
||||
},
|
||||
"IpRateLimiting": {
|
||||
"EnableEndpointRateLimiting": true, //False: globally executed, true: executed for each
|
||||
"StackBlockedRequests": false, // set to false, rejected calls are not added to the throttle counter
|
||||
"EnableEndpointRateLimiting": true,
|
||||
"StackBlockedRequests": false,
|
||||
"RealIpHeader": "X-Real-IP",
|
||||
"ClientIdHeader": "X-ClientId",
|
||||
"QuotaExceededResponse": {
|
||||
@@ -19,12 +16,10 @@
|
||||
"StatusCode": 429
|
||||
},
|
||||
"HttpStatusCode": 429,
|
||||
//"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
|
||||
"EndpointWhitelist": [ "post:/study/archivestudy/*" ],
|
||||
//"EndpointWhitelist": [ ],
|
||||
//"EndpointWhitelist": ["post:/trial/getTrialList"], //demo
|
||||
"EndpointWhitelist": [
|
||||
"post:/study/archivestudy/*"
|
||||
],
|
||||
"IpWhitelist": [],
|
||||
//"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
|
||||
"GeneralRules": [
|
||||
{
|
||||
"Endpoint": "*",
|
||||
@@ -48,7 +43,6 @@
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
"easycaching": {
|
||||
"inmemory": {
|
||||
"MaxRdSecond": 120,
|
||||
@@ -63,32 +57,20 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"IRaCISImageStore": {
|
||||
"SwitchingMode": "RemainingDiskCapacity",
|
||||
"SwitchingRatio": 80,
|
||||
"NotificationEmail": "872297557@qq.com"
|
||||
},
|
||||
"IRaCISBasicConfig": {
|
||||
|
||||
"DoctorCodePrefix": "RE",
|
||||
|
||||
"UserCodePrefix": "U",
|
||||
|
||||
"QCChallengeCodePrefix": "Q",
|
||||
|
||||
"NoneDicomStudyCodePrefix": "NST",
|
||||
|
||||
"DicomStudyCodePrefix": "ST",
|
||||
|
||||
"SystemSiteCodePrefix": "S",
|
||||
|
||||
"DefaultPassword": "123456",
|
||||
|
||||
"DefaultInternalOrganizationName": "ExtImaging",
|
||||
|
||||
"ImageShareExpireDays": 10,
|
||||
|
||||
"BlindTaskPrefix": "Follow Up "
|
||||
"ImageShareExpireDays": 10
|
||||
}
|
||||
|
||||
//网站根地址,为了访问文件 dicom 和上传的文档... 实测发现不用将域名拼接返回,浏览器会自动加上当前ip,避免了多环境读取环境配置文件
|
||||
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0} ,
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Extimaging has added an account for you. The account information is as follows:
|
||||
</div>
|
||||
<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>
|
||||
User name: {1}
|
||||
</div>
|
||||
<div>
|
||||
Role: {2}
|
||||
</div>
|
||||
<div>
|
||||
Before logging in for the first time, please modify your account information by this link:
|
||||
<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;'>
|
||||
Initialize the account information
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,37 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0} ,
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Extimaging has reset your account password, and the account information is as follows:
|
||||
</div>
|
||||
<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>
|
||||
User name: {1}
|
||||
</div>
|
||||
<div>
|
||||
Role: {2}
|
||||
</div>
|
||||
<div>
|
||||
Password: {3}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Thank you for using Extensive Imaging Cloud System.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
{0}。
|
||||
</div>
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,27 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Thank you for using Extensive Imaging Cloud System.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
{0}。
|
||||
</div>
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,7 +11,7 @@
|
||||
尊敬的 {0} ,您好:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
展影医疗作为 [{1} (实验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
This project adopts electronic workflow. The system and your account information are as follows:
|
||||
</div>
|
||||
<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>
|
||||
Trial ID: {3}
|
||||
</div>
|
||||
<div>
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {1}
|
||||
</div>
|
||||
<div>
|
||||
User name: {4}
|
||||
</div>
|
||||
<div>
|
||||
Role: {5}
|
||||
</div>
|
||||
<div>
|
||||
System login address:{6}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,7 +11,7 @@
|
||||
尊敬的 {0} ,您好:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
展影医疗作为 [{1} (实验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC阅片相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
This project adopts electronic workflow. The system and your account information are as follows:
|
||||
</div>
|
||||
<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>
|
||||
Trial ID: {3}
|
||||
</div>
|
||||
<div>
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {1}
|
||||
</div>
|
||||
<div>
|
||||
User name: {4}
|
||||
</div>
|
||||
<div>
|
||||
Role: {5}
|
||||
</div>
|
||||
<div>
|
||||
Before logging in for the first time, please modify your account information by this link:
|
||||
<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;'>
|
||||
Initialize the account information
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,49 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0} ,
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, the center survey form you filled in has been rejected. The details are as follows:
|
||||
</div>
|
||||
<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>
|
||||
Trial ID: {1}
|
||||
</div>
|
||||
<div>
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {3}
|
||||
</div>
|
||||
<div>
|
||||
Site ID: {4}
|
||||
</div>
|
||||
<div>
|
||||
Site name: {5}
|
||||
</div>
|
||||
<div>
|
||||
Reason for rejection: {6}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<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 and view
|
||||
</a>
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,7 +11,7 @@
|
||||
尊敬的 {0} ,您好:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
展影医疗作为 [{1} (实验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
This project adopts electronic workflow. The system and your account information are as follows:
|
||||
</div>
|
||||
<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>
|
||||
Trial ID: {3}
|
||||
</div>
|
||||
<div>
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {1}
|
||||
</div>
|
||||
<div>
|
||||
User name: {4}
|
||||
</div>
|
||||
<div>
|
||||
Role: {5}
|
||||
</div>
|
||||
<div>
|
||||
System login address:{6}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -11,7 +11,7 @@
|
||||
尊敬的 {0} ,您好:
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
展影医疗作为 [{1} (实验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
展影医疗作为 [{1} (试验方案号:{2 })] 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
该项目采用电子化工作流,系统及您的账号信息如下:
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Hello, as the IRC supplier of [ {1} (Protocol ID is {2}) ] project,Extiming sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
This project adopts electronic workflow. The system and your account information are as follows:
|
||||
</div>
|
||||
<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>
|
||||
Trial ID: {3}
|
||||
</div>
|
||||
<div>
|
||||
Protocol ID: {2}
|
||||
</div>
|
||||
<div>
|
||||
Study name: {1}
|
||||
</div>
|
||||
<div>
|
||||
User name: {4}
|
||||
</div>
|
||||
<div>
|
||||
Role: {5}
|
||||
</div>
|
||||
<div>
|
||||
Before logging in for the first time, please modify your account information by this link:
|
||||
<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;'>
|
||||
Initialize the account information
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -8,7 +8,7 @@
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
{0}您好:
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
感谢您使用展影云平台。
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang='en'>
|
||||
<head>
|
||||
<meta charset='UTF-8'>
|
||||
<title>Title</title>
|
||||
</head>
|
||||
<body style='font-family: 微软雅黑;padding: 0;margin: 0;'>
|
||||
<div style='padding-left: 40px;background: #f6f6f6'>
|
||||
<div style='padding-top: 20px;'>
|
||||
<div style='line-height: 40px;font-size: 18px'>
|
||||
Dear {0},
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
Thank you for using Extensive Imaging Cloud System.
|
||||
</div>
|
||||
<div style='line-height: 40px;padding-left: 40px;margin-bottom: 10px;'>
|
||||
{1}, the verification code is {2}. Enter the verification code within 3 minutes for subsequent operations. Please ignore this email if not by yourself.
|
||||
</div>
|
||||
|
||||
|
||||
<div style='line-height: 24px;font-size: 14px;color:#333;margin-top: 20px;padding-bottom: 40px;'>
|
||||
<div>Best Regards</div>
|
||||
<div style="font-size: 14px;">Shanghai Extensive Imaging Medical Technology Co., LTD</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -20,6 +20,8 @@ namespace IRaCIS.Core.Application.Auth
|
||||
|
||||
public int IsAdmin { get; }
|
||||
|
||||
public bool IsTestUser { get; set; }
|
||||
|
||||
public string Phone { get; set; } = String.Empty;
|
||||
|
||||
public static IRaCISClaims Create(UserBasicInfo user)
|
||||
@@ -31,6 +33,7 @@ namespace IRaCIS.Core.Application.Auth
|
||||
RealName = user.RealName,
|
||||
UserTypeEnum=user.UserTypeEnum,
|
||||
UserTypeId=user.UserTypeId,
|
||||
IsTestUser=user.IsTestUser,
|
||||
Code = user.Code,
|
||||
PermissionStr = user.PermissionStr,
|
||||
|
||||
|
||||
@@ -35,7 +35,9 @@ namespace IRaCIS.Core.Application.Auth
|
||||
new Claim(JwtIRaCISClaimType.UserTypeEnum,user.UserTypeEnum.ToString()),
|
||||
new Claim(JwtIRaCISClaimType.UserTypeEnumInt,((int)user.UserTypeEnum).ToString()),
|
||||
new Claim(JwtIRaCISClaimType.UserTypeShortName,user.UserTypeShortName),
|
||||
new Claim(JwtIRaCISClaimType.PermissionStr,user.PermissionStr)
|
||||
new Claim(JwtIRaCISClaimType.PermissionStr,user.PermissionStr),
|
||||
|
||||
new Claim(JwtIRaCISClaimType.IsTestUser,user.IsTestUser.ToString())
|
||||
};
|
||||
|
||||
////创建令牌
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using EasyCaching.Core;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.EntityFrameworkCore.SqlServer.Query.Internal;
|
||||
using Microsoft.Extensions.Logging;
|
||||
|
||||
namespace IRaCIS.Application.Services.BackGroundJob
|
||||
@@ -7,7 +8,13 @@ namespace IRaCIS.Application.Services.BackGroundJob
|
||||
|
||||
public interface IIRaCISCacheHangfireJob
|
||||
{
|
||||
|
||||
Task ProjectStartCache();
|
||||
Task MemoryCacheTrialStatus();
|
||||
|
||||
Task MemoryCacheAnonymizeData();
|
||||
|
||||
Task CacheUserTypePermission(Guid? cacheUserTypeId);
|
||||
}
|
||||
public class IRaCISCacheHangfireJob: IIRaCISCacheHangfireJob
|
||||
{
|
||||
@@ -16,50 +23,77 @@ namespace IRaCIS.Application.Services.BackGroundJob
|
||||
private readonly ILogger<IRaCISCacheHangfireJob> _logger;
|
||||
private readonly IRepository<SystemAnonymization> _systemAnonymizationRepository;
|
||||
|
||||
public IRaCISCacheHangfireJob(IRepository<Trial> trialRepository, IRepository<SystemAnonymization> systemAnonymizationRepository, IEasyCachingProvider provider,ILogger<IRaCISCacheHangfireJob> logger)
|
||||
private readonly IRepository<UserTypeMenu> _userTypeMenuRepository;
|
||||
|
||||
public IRaCISCacheHangfireJob(IRepository<Trial> trialRepository,
|
||||
IRepository<SystemAnonymization> systemAnonymizationRepository, IRepository<UserTypeMenu> userTypeMenuRepository,
|
||||
IEasyCachingProvider provider,ILogger<IRaCISCacheHangfireJob> logger)
|
||||
{
|
||||
_trialRepository = trialRepository;
|
||||
_provider = provider;
|
||||
_logger = logger;
|
||||
_systemAnonymizationRepository = systemAnonymizationRepository;
|
||||
_userTypeMenuRepository = userTypeMenuRepository;
|
||||
}
|
||||
public async Task MemoryCacheTrialStatus()
|
||||
|
||||
|
||||
public async Task ProjectStartCache()
|
||||
{
|
||||
_logger.LogInformation("hangfire 定时任务开始~");
|
||||
_logger.LogInformation("hangfire 定时缓存项目状态任务开始~");
|
||||
try
|
||||
{
|
||||
await CacheTrialStatusAsync();
|
||||
await MemoryCacheTrialStatus();
|
||||
|
||||
await CacheAnonymizeAsync();
|
||||
await MemoryCacheAnonymizeData();
|
||||
|
||||
await CacheUserTypePermission();
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
_logger.LogError("hangfire 定时任务执行失败"+e.Message);
|
||||
_logger.LogError("hangfire 定时任务执行失败" + e.Message);
|
||||
|
||||
}
|
||||
|
||||
_logger.LogInformation("hangfire 定时任务执行结束");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private async Task CacheTrialStatusAsync()
|
||||
public async Task MemoryCacheTrialStatus()
|
||||
{
|
||||
var list = await _trialRepository.Select(t => new { TrialId = t.Id, TrialStatusStr = t.TrialStatusStr })
|
||||
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)));
|
||||
|
||||
}
|
||||
|
||||
private async Task CacheAnonymizeAsync()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task MemoryCacheAnonymizeData()
|
||||
{
|
||||
var systemAnonymizationList = await _systemAnonymizationRepository.Where(t => t.IsEnable).ToListAsync();
|
||||
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));
|
||||
}
|
||||
|
||||
public async Task CacheUserTypePermission(Guid? cacheUserTypeId=null)
|
||||
{
|
||||
|
||||
var permissionList = await _userTypeMenuRepository.Where(t => t.Menu.MenuType == "F")
|
||||
.WhereIf(cacheUserTypeId != null, t => t.UserTypeId == cacheUserTypeId.Value).Select(t => new { t.UserTypeId, t.Menu.PermissionStr }).ToListAsync();
|
||||
|
||||
foreach (var userTypeGroup in permissionList.GroupBy(t => t.UserTypeId))
|
||||
{
|
||||
_provider.Set($"{StaticData.CacheKey.UserTypeId}_{userTypeGroup.Key}", userTypeGroup.Select(t => t.PermissionStr).ToList(), TimeSpan.FromDays(7));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -11,7 +11,7 @@ namespace IRaCIS.Core.Application.Filter;
|
||||
|
||||
|
||||
|
||||
public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
|
||||
public class LimitUserRequestAuthorization :BaseService, IAsyncAuthorizationFilter
|
||||
{
|
||||
|
||||
|
||||
@@ -50,7 +50,8 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
|
||||
{
|
||||
context.HttpContext.Response.ContentType = "application/json";
|
||||
context.HttpContext.Response.StatusCode = StatusCodes.Status200OK;
|
||||
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("当前请求未从Header/Url取到用户Token,请联系开发者")));
|
||||
//---当前请求未从Header/Url取到用户Token,请联系开发者
|
||||
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["LimitUser_AuthTokenMissing"])));
|
||||
}
|
||||
|
||||
//2、在这里取缓存 进行比较 看是否有其他人进行了登陆,如果其他人登陆了,就把之前用户挤掉
|
||||
@@ -76,7 +77,8 @@ public class LimitUserRequestAuthorization : IAsyncAuthorizationFilter
|
||||
|
||||
context.HttpContext.Response.ContentType = "application/json";
|
||||
context.HttpContext.Response.StatusCode = StatusCodes.Status403Forbidden;
|
||||
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk("您的账户在其他地方已登陆,您被迫下线。", ApiResponseCodeEnum.LoginInOtherPlace)));
|
||||
//---您的账户在其他地方已登陆,您被迫下线。
|
||||
await context.HttpContext.Response.WriteAsync(JsonConvert.SerializeObject(ResponseOutput.NotOk(_localizer["LimitUser_AccountLoggedInElsewhere"], ApiResponseCodeEnum.LoginInOtherPlace)));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,15 +1,18 @@
|
||||
using IRaCIS.Core.Infrastructure.Extention;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using Newtonsoft.Json;
|
||||
|
||||
|
||||
namespace IRaCIS.Core.Application.Filter
|
||||
{
|
||||
|
||||
|
||||
public class ModelActionFilter : ActionFilterAttribute, IActionFilter
|
||||
{
|
||||
public override void OnActionExecuting(ActionExecutingContext context)
|
||||
{
|
||||
public override void OnActionExecuting(ActionExecutingContext context)
|
||||
{
|
||||
if (!context.ModelState.IsValid)
|
||||
{
|
||||
|
||||
@@ -19,7 +22,8 @@ namespace IRaCIS.Core.Application.Filter
|
||||
.Select(e => e.ErrorMessage)
|
||||
.ToArray();
|
||||
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("提供给接口的参数无效。" +JsonConvert.SerializeObject( validationErrors)));
|
||||
//---提供给接口的参数无效。
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("Invalid parameters provided for the API." + JsonConvert.SerializeObject( validationErrors)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,8 @@ namespace IRaCIS.Core.Application.Filter
|
||||
{
|
||||
if (context.Exception.GetType().Name == "DbUpdateConcurrencyException")
|
||||
{
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("并发更新,当前不允许该操作" + context.Exception.Message));
|
||||
//---并发更新,当前不允许该操作
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("Concurrent update, operation not allowed at this time." + context.Exception.Message));
|
||||
}
|
||||
|
||||
if (context.Exception.GetType() == typeof(BusinessValidationFailedException))
|
||||
@@ -35,7 +36,7 @@ namespace IRaCIS.Core.Application.Filter
|
||||
}
|
||||
else
|
||||
{
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(" 程序异常,请联系开发人员。 " + (context.Exception.InnerException is null ? (context.Exception.Message /*+ context.Exception.StackTrace*/)
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("程序异常,请联系开发人员。" + (context.Exception.InnerException is null ? (context.Exception.Message /*+ context.Exception.StackTrace*/)
|
||||
: (context.Exception.InnerException?.Message /*+ context.Exception.InnerException?.StackTrace*/)), ApiResponseCodeEnum.ProgramException));
|
||||
}
|
||||
|
||||
|
||||
@@ -3,6 +3,8 @@ using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Microsoft.Extensions.Localization;
|
||||
using System.Text.RegularExpressions;
|
||||
using static IRaCIS.Core.Domain.Share.StaticData;
|
||||
|
||||
namespace IRaCIS.Core.Application.Filter
|
||||
@@ -15,29 +17,49 @@ namespace IRaCIS.Core.Application.Filter
|
||||
private readonly IEasyCachingProvider _provider;
|
||||
private readonly IUserInfo _userInfo;
|
||||
|
||||
private readonly string _trialOpt;
|
||||
public IStringLocalizer _localizer;
|
||||
private readonly List<string> _trialOptList=new List<string>();
|
||||
|
||||
|
||||
|
||||
|
||||
public TrialResourceFilter(IEasyCachingProvider provider, IUserInfo userInfo, string trialOpt)
|
||||
public TrialResourceFilter(IEasyCachingProvider provider, IStringLocalizer localizer , IUserInfo userInfo, string trialOpt = null, string trialOpt2 = null, string trialOpt3 = null)
|
||||
{
|
||||
_provider = provider;
|
||||
_userInfo = userInfo;
|
||||
_trialOpt = trialOpt;
|
||||
_localizer = localizer;
|
||||
//_trialOpt = trialOpt;
|
||||
|
||||
if (!string.IsNullOrWhiteSpace(trialOpt)) _trialOptList.Add(trialOpt.Trim());
|
||||
if (!string.IsNullOrWhiteSpace(trialOpt2)) _trialOptList.Add(trialOpt2.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)
|
||||
{
|
||||
// var typeFilter = context.ActionDescriptor.EndpointMetadata.Where(t => t.GetType() == typeof(TypeFilterAttribute)).Select(t => (TypeFilterAttribute)t).ToList().FirstOrDefault();
|
||||
//var _trialOptList= typeFilter.Arguments.Select(t => t.ToString()).ToList();
|
||||
|
||||
#region 处理新的用户类型,不能操作项目相关接口
|
||||
|
||||
// 后期列举出具体的类型,其他任何用户类型,都不允许操作
|
||||
if (_userInfo.UserTypeEnumInt == (int)UserTypeEnum.CRA)
|
||||
{
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("对不起,您的账户没有操作权限。"));
|
||||
//---对不起,您的账户没有操作权限。
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_NoAccessPermission"]));
|
||||
|
||||
return;
|
||||
}
|
||||
@@ -60,6 +82,26 @@ namespace IRaCIS.Core.Application.Filter
|
||||
var index = context.RouteData.Values.Keys.ToList().IndexOf("trialId");
|
||||
trialIdStr = context.RouteData.Values.Values.ToList()[index] as string;
|
||||
}
|
||||
else if (context.HttpContext.Request.Headers["Referer"].ToString().Contains("trialId"))
|
||||
{
|
||||
var headerStr = context.HttpContext.Request.Headers["Referer"].ToString();
|
||||
|
||||
var trialIdIndex = headerStr.IndexOf("trialId");
|
||||
|
||||
|
||||
var matchResult = Regex.Match(headerStr.Substring(trialIdIndex), @"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
|
||||
|
||||
if (matchResult.Success)
|
||||
{
|
||||
trialIdStr = matchResult.Value;
|
||||
}
|
||||
else
|
||||
{
|
||||
//---正则取请求Refer 中trialId 失败,请联系开发人员核查
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_ReferTrialIdFailed"]));
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
#region body 中取数据
|
||||
@@ -77,14 +119,41 @@ namespace IRaCIS.Core.Application.Filter
|
||||
|
||||
if (trialIdIndex > -1)
|
||||
{
|
||||
trialIdStr = contentFromBody.Substring(trialIdIndex + "TrialId".Length + 4, 36);
|
||||
// (?<="trialId" *: *").*?(?=",)
|
||||
|
||||
//使用正则 [0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}
|
||||
|
||||
var matchResult = Regex.Match(contentFromBody.Substring(trialIdIndex), @"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
|
||||
|
||||
if (matchResult.Success)
|
||||
{
|
||||
//有可能匹配错误 "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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
//---正则取请求Refer 中trialId 失败,请联系开发人员核查
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_ReferTrialIdFailed"]));
|
||||
}
|
||||
|
||||
//使用字符串取 如果是swagger 可能有时取的不对 因为空格的原因
|
||||
//trialIdStr = contentFromBody.Substring(trialIdIndex + "TrialId".Length + 4, 3
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
//通过path 或者body 找到trialId 了
|
||||
if (trialIdStr != string.Empty)
|
||||
if ( !string.IsNullOrWhiteSpace(trialIdStr))
|
||||
{
|
||||
|
||||
//如果没缓存数据,可能定时任务没执行或者缓存丢失 在此重新缓存
|
||||
@@ -101,10 +170,17 @@ namespace IRaCIS.Core.Application.Filter
|
||||
|
||||
var cacheResultDic = _provider.GetAll<string>(new[] { trialIdStr });
|
||||
|
||||
var trialStatusStr = cacheResultDic[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)还有 项目添加和更新,不走这里,特殊处理,不然在这里显得很乱,判断是哪个接口)
|
||||
if (trialStatusStr.Value == StaticData.TrialState.TrialOngoing || _trialOpt==TrialOpt.BeforeOngoingCantOpt)
|
||||
if (trialStatusStr == StaticData.TrialState.TrialOngoing || _trialOptList.Any(t=>t== TrialOpt.BeforeOngoingCantOpt) )
|
||||
{
|
||||
|
||||
await next.Invoke();
|
||||
@@ -113,17 +189,24 @@ namespace IRaCIS.Core.Application.Filter
|
||||
// 项目停止、或者完成 不允许操作
|
||||
else
|
||||
{
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("本次请求被配置规则拦截:项目状态处于进行中时,才允许操作,若此处逻辑有误,请联系开发人员修改"));
|
||||
//---本次请求被配置规则拦截:项目状态处于进行中时,才允许操作,若此处逻辑有误,请联系开发人员修改
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_InterceptedProjectStatusRule"]));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
//添加项目 签名系统文档的时候 不做拦截 但是更新项目 签名项目文档的时候需要拦截
|
||||
else if (_trialOptList.Any(t => t == TrialOpt.AddOrUpdateTrial ||t ==TrialOpt.SignSystemDocNoTrialId))
|
||||
{
|
||||
await next.Invoke();
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
//如果项目相关接口没有传递trialId 会来到这里,提醒,以便修改
|
||||
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk("该接口参数中,没有传递项目编号,请核对。"));
|
||||
//---该接口参数中,没有传递项目编号,请核对。
|
||||
context.Result = new JsonResult(ResponseOutput.NotOk(_localizer["TrialResource_MissingProjectNumber"]));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using Microsoft.AspNetCore.Mvc.Filters;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
|
||||
namespace IRaCIS.Application.Services.BusinessFilter
|
||||
{
|
||||
@@ -74,7 +75,8 @@ namespace IRaCIS.Application.Services.BusinessFilter
|
||||
|
||||
else if(statusCode != 200&&!(objectResult.Value is IResponseOutput))
|
||||
{
|
||||
var apiResponse = ResponseOutput.NotOk("程序错误,请联系开发人员。");
|
||||
//---程序错误,请联系开发人员。
|
||||
var apiResponse = ResponseOutput.NotOk(StaticData.International("UnifiedAPI_ProgramError"));
|
||||
|
||||
objectResult.Value = apiResponse;
|
||||
objectResult.DeclaredType = apiResponse.GetType();
|
||||
|
||||
@@ -17,17 +17,52 @@ namespace IRaCIS.Core.Application.Helper
|
||||
|
||||
public CriterionType? CriterionType { get; set; }
|
||||
|
||||
|
||||
//是否翻译依赖其他属性
|
||||
public bool IsTranslateDenpendOtherProperty =>!string.IsNullOrWhiteSpace(DependPropertyName);
|
||||
|
||||
public string DependPropertyName { get; set; }=string.Empty;
|
||||
|
||||
public string DependPropertyValueStr { get; set; } = string.Empty;
|
||||
|
||||
// 普通翻译的字典
|
||||
public DictionaryTranslateAttribute(string dicParentCode)
|
||||
{
|
||||
DicParentCode = dicParentCode;
|
||||
|
||||
}
|
||||
|
||||
//针对不同的标准 翻译的字典不一样
|
||||
public DictionaryTranslateAttribute(string dicParentCode, CriterionType criterionType )
|
||||
{
|
||||
DicParentCode = dicParentCode;
|
||||
|
||||
CriterionType = criterionType;
|
||||
}
|
||||
|
||||
//针对业务某个属性的值 不一样 用的翻译字典不一样
|
||||
|
||||
public DictionaryTranslateAttribute(string dicParentCode,string dependPropertyName, string dependPropertyValueStr)
|
||||
{
|
||||
DicParentCode = dicParentCode;
|
||||
|
||||
DependPropertyName = dependPropertyName;
|
||||
|
||||
DependPropertyValueStr = dependPropertyValueStr;
|
||||
|
||||
}
|
||||
|
||||
public DictionaryTranslateAttribute(string dicParentCode, CriterionType criterionType, string dependPropertyName, string dependPropertyValueStr)
|
||||
{
|
||||
DicParentCode = dicParentCode;
|
||||
|
||||
DependPropertyName = dependPropertyName;
|
||||
|
||||
CriterionType = criterionType;
|
||||
|
||||
DependPropertyValueStr = dependPropertyValueStr;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
using IRaCIS.Application.Interfaces;
|
||||
using DocumentFormat.OpenXml.Drawing.Diagrams;
|
||||
using IRaCIS.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.Helper;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
@@ -30,7 +31,8 @@ public static class ExcelExportHelper
|
||||
//一个值 对应不同的字典翻译
|
||||
var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true))
|
||||
.SelectMany(c =>
|
||||
c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false).Select(f => (DictionaryTranslateAttribute?)f).Where(t => t.CriterionType == criterionType || t.CriterionType == null).Select(k => new { c.Name, k.DicParentCode })
|
||||
c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false).Select(f => (DictionaryTranslateAttribute?)f).Where(t => t?.CriterionType == criterionType || t?.CriterionType == null)
|
||||
.Select(k => new { c.Name, k.DicParentCode ,k.IsTranslateDenpendOtherProperty, k.DependPropertyName,k.DependPropertyValueStr})
|
||||
).ToList();
|
||||
|
||||
|
||||
@@ -58,19 +60,36 @@ public static class ExcelExportHelper
|
||||
|
||||
foreach (var needTranslateProperty in needTranslatePropertyList)
|
||||
{
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
//翻译的属性依赖其他属性
|
||||
if(needTranslateProperty.IsTranslateDenpendOtherProperty)
|
||||
{
|
||||
if (item[needTranslateProperty.DependPropertyName]?.ToString().ToLower() == needTranslateProperty.DependPropertyValueStr.ToLower())
|
||||
{
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
}
|
||||
}
|
||||
//普通翻译 或者某一标准翻译
|
||||
else
|
||||
{
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
itemDic.Add("No", no++);
|
||||
|
||||
|
||||
newObjList.Add(itemDic);
|
||||
}
|
||||
|
||||
dic[key] = newObjList;
|
||||
dic[key] = newObjList ;
|
||||
|
||||
}
|
||||
}
|
||||
@@ -127,22 +146,32 @@ public static class ExcelExportHelper
|
||||
|
||||
|
||||
|
||||
public static async Task<MemoryStream> DataExport_NpoiTestAsync(string code, object data, IRepository<CommonDocument> _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null)
|
||||
public static async Task<(MemoryStream,string)> DataExport_NpoiTestAsync(string code, object data, IRepository<CommonDocument> _commonDocumentRepository, IWebHostEnvironment _hostEnvironment, IDictionaryService? _dictionaryService = null, Type? translateType = null, CriterionType? criterionType = null)
|
||||
{
|
||||
//判断是否有字典翻译
|
||||
|
||||
if (_dictionaryService != null && translateType != null)
|
||||
{
|
||||
|
||||
////只标注单个的时候
|
||||
//var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true))
|
||||
// .Select(c => new { c.Name, DicParentCode = ((DictionaryTranslateAttribute?)c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false)[0])?.DicParentCode }).ToList();
|
||||
|
||||
|
||||
//一个值 对应不同的字典翻译
|
||||
var needTranslatePropertyList = translateType.GetProperties().Where(t => t.IsDefined(typeof(DictionaryTranslateAttribute), true))
|
||||
.SelectMany(c =>
|
||||
c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false).Select(f => (DictionaryTranslateAttribute?)f).Where(t => t.CriterionType == criterionType || t.CriterionType == null).Select(k => new { c.Name, k.DicParentCode })
|
||||
c.GetCustomAttributes(typeof(DictionaryTranslateAttribute), false).Select(f => (DictionaryTranslateAttribute?)f).Where(t => t.CriterionType == criterionType || t.CriterionType == null)
|
||||
.Select(k => new { c.Name, k.DicParentCode, k.IsTranslateDenpendOtherProperty, k.DependPropertyName, k.DependPropertyValueStr })
|
||||
).ToList();
|
||||
|
||||
|
||||
|
||||
//字典表查询出所有需要翻译的数据
|
||||
|
||||
var translateDataList = await _dictionaryService.GetBasicDataSelect(needTranslatePropertyList.Select(t => t.DicParentCode).Distinct().ToArray());
|
||||
|
||||
|
||||
var dic = JsonConvert.DeserializeObject<IDictionary<string, object>>(data.ToJsonNotIgnoreNull());
|
||||
|
||||
foreach (var key in dic.Keys)
|
||||
@@ -158,11 +187,30 @@ public static class ExcelExportHelper
|
||||
{
|
||||
var itemDic = JsonConvert.DeserializeObject<IDictionary<string, object>>(item.ToJsonNotIgnoreNull());
|
||||
|
||||
|
||||
foreach (var needTranslateProperty in needTranslatePropertyList)
|
||||
{
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
//翻译的属性依赖其他属性
|
||||
if (needTranslateProperty.IsTranslateDenpendOtherProperty)
|
||||
{
|
||||
if (item[needTranslateProperty.DependPropertyName]?.ToString().ToLower() == needTranslateProperty.DependPropertyValueStr.ToLower())
|
||||
{
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
}
|
||||
}
|
||||
//普通翻译 或者某一标准翻译
|
||||
else
|
||||
{
|
||||
var beforeValue = itemDic[needTranslateProperty.Name]?.ToString();
|
||||
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
}
|
||||
|
||||
|
||||
|
||||
itemDic[needTranslateProperty.Name] = translateDataList[needTranslateProperty.DicParentCode].Where(t => t.Code.ToLower() == beforeValue?.ToLower()).FirstOrDefault()?.ValueCN ?? String.Empty;
|
||||
}
|
||||
|
||||
itemDic.Add("No", no++);
|
||||
@@ -181,10 +229,7 @@ public static class ExcelExportHelper
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
var (physicalPath, fileNmae) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code);
|
||||
var (physicalPath, fileName) = await FileStoreHelper.GetCommonDocPhysicalFilePathAsync(_hostEnvironment, _commonDocumentRepository, code);
|
||||
|
||||
|
||||
//模板路径
|
||||
@@ -204,9 +249,9 @@ public static class ExcelExportHelper
|
||||
memoryStream.Seek(0, SeekOrigin.Begin);
|
||||
|
||||
|
||||
return memoryStream;
|
||||
return (memoryStream, fileName);
|
||||
|
||||
//var wb = new HSSFWorkbook(memoryStream);
|
||||
//var wb = new HSSFWorkbook(memoryStream);
|
||||
|
||||
//var sheet = wb.GetSheetAt(0);
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
using DocumentFormat.OpenXml.Bibliography;
|
||||
using NPOI.XWPF.UserModel;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.Application.Helper
|
||||
{
|
||||
public class FileFormatConvertHelper
|
||||
{
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -3,6 +3,7 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace IRaCIS.Core.Application.Helper;
|
||||
|
||||
@@ -11,7 +12,7 @@ public static class FileStoreHelper
|
||||
|
||||
|
||||
//处理文件名 压缩包,或者目录类的 会带上相对路径
|
||||
public static (string TrustedFileNameForFileStorage, string RealName) GetStoreFileName(string fileName)
|
||||
public static (string TrustedFileNameForFileStorage, string RealName) GetStoreFileName(string fileName,bool isChangeToPdfFormat=false)
|
||||
{
|
||||
|
||||
//带目录层级,需要后端处理前端的路径
|
||||
@@ -25,7 +26,26 @@ public static class FileStoreHelper
|
||||
fileName = fileName.Split("/").Last();
|
||||
}
|
||||
|
||||
var trustedFileNameForFileStorage = Guid.NewGuid().ToString() + fileName;
|
||||
var matchResult = Regex.Match(fileName, @"[0-9a-fA-F]{8}(-[0-9a-fA-F]{4}){3}-[0-9a-fA-F]{12}");
|
||||
|
||||
//如果有guid
|
||||
if (matchResult.Success)
|
||||
{
|
||||
fileName = fileName.Replace($"{matchResult.Value}", "");
|
||||
}
|
||||
|
||||
|
||||
var trustedFileNameForFileStorage = string.Empty;
|
||||
|
||||
if (isChangeToPdfFormat==false)
|
||||
{
|
||||
trustedFileNameForFileStorage= Guid.NewGuid().ToString() + fileName;
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
trustedFileNameForFileStorage=Guid.NewGuid().ToString() + Path.GetFileNameWithoutExtension(fileName) + ".pdf";
|
||||
}
|
||||
|
||||
return (trustedFileNameForFileStorage, fileName);
|
||||
}
|
||||
@@ -73,14 +93,16 @@ public static class FileStoreHelper
|
||||
|
||||
if (systemClinicalData == null || systemClinicalData.Path == string.Empty)
|
||||
{
|
||||
throw new BusinessValidationFailedException("数据库没有找到对应的数据模板文件,请联系系统运维人员。");
|
||||
//---数据库没有找到对应的数据模板文件,请联系系统运维人员。
|
||||
throw new BusinessValidationFailedException(StaticData.International("FileStore_TemplateFileNotFound"));
|
||||
}
|
||||
|
||||
var filePath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, systemClinicalData.Path);
|
||||
|
||||
if (!System.IO.File.Exists(filePath))
|
||||
{
|
||||
throw new BusinessValidationFailedException("数据模板文件存储路径上未找对应文件,请联系系统运维人员。");
|
||||
//---数据模板文件存储路径上未找对应文件,请联系系统运维人员。
|
||||
throw new BusinessValidationFailedException(StaticData.International("FileStore_TemplateFileStoragePathInvalid"));
|
||||
}
|
||||
|
||||
return (filePath, systemClinicalData.FileName);
|
||||
@@ -101,14 +123,16 @@ public static class FileStoreHelper
|
||||
|
||||
if (trialClinicalData == null|| trialClinicalData.Path==string.Empty)
|
||||
{
|
||||
throw new BusinessValidationFailedException("数据库没有找到对应的数据模板文件,请联系系统运维人员。");
|
||||
//---数据库没有找到对应的数据模板文件,请联系系统运维人员。
|
||||
throw new BusinessValidationFailedException(StaticData.International("FileStore_TemplateFileNotFound"));
|
||||
}
|
||||
|
||||
var filePath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, trialClinicalData.Path);
|
||||
|
||||
if (!System.IO.File.Exists(filePath))
|
||||
{
|
||||
throw new BusinessValidationFailedException("数据模板文件存储路径上未找对应文件,请联系系统运维人员。");
|
||||
//---数据模板文件存储路径上未找对应文件,请联系系统运维人员。
|
||||
throw new BusinessValidationFailedException(StaticData.International("FileStore_TemplateFileStoragePathInvalid"));
|
||||
}
|
||||
|
||||
return (filePath, trialClinicalData.FileName);
|
||||
@@ -123,14 +147,16 @@ public static class FileStoreHelper
|
||||
|
||||
if (doc == null)
|
||||
{
|
||||
throw new BusinessValidationFailedException("数据库没有找到对应的数据模板文件,请联系系统运维人员。");
|
||||
//---数据库没有找到对应的数据模板文件,请联系系统运维人员。
|
||||
throw new BusinessValidationFailedException(StaticData.International("FileStore_TemplateFileNotFound"));
|
||||
}
|
||||
|
||||
var filePath = FileStoreHelper.GetPhysicalFilePath(_hostEnvironment, doc.Path);
|
||||
|
||||
if (!System.IO.File.Exists(filePath))
|
||||
{
|
||||
throw new BusinessValidationFailedException("数据模板文件存储路径上未找对应文件,请联系系统运维人员。");
|
||||
//---数据模板文件存储路径上未找对应文件,请联系系统运维人员。
|
||||
throw new BusinessValidationFailedException(StaticData.International("FileStore_TemplateFileStoragePathInvalid"));
|
||||
}
|
||||
|
||||
return (filePath, doc.Name.Trim('/'));
|
||||
@@ -345,6 +371,36 @@ public static class FileStoreHelper
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 上传截图
|
||||
/// </summary>
|
||||
/// <param name="_hostEnvironment"></param>
|
||||
/// <param name="fileName"></param>
|
||||
/// <param name="trialId"></param>
|
||||
/// <param name="siteid"></param>
|
||||
/// <param name="subjectId"></param>
|
||||
/// <param name="type"></param>
|
||||
/// <returns></returns>
|
||||
public static (string PhysicalPath, string RelativePath, string FileRealName) GetUploadPrintscreenFilePath(IWebHostEnvironment _hostEnvironment, string fileName, Guid trialId, Guid siteid, Guid subjectId)
|
||||
{
|
||||
var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);
|
||||
|
||||
string uploadFolderPath = Path.Combine(rootPath, StaticData.Folder.TrialDataFolder, trialId.ToString(), siteid.ToString(), subjectId.ToString());
|
||||
|
||||
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
|
||||
|
||||
var (trustedFileNameForFileStorage, fileRealName) = FileStoreHelper.GetStoreFileName(fileName);
|
||||
|
||||
|
||||
var relativePath = $"/{StaticData.Folder.IRaCISDataFolder}/{StaticData.Folder.TrialDataFolder}/{trialId}/{siteid}/{subjectId}/{trustedFileNameForFileStorage}";
|
||||
|
||||
var serverFilePath = Path.Combine(uploadFolderPath, trustedFileNameForFileStorage);
|
||||
|
||||
return (serverFilePath, relativePath, fileRealName);
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 通用获取文件路径
|
||||
/// </summary>
|
||||
@@ -409,6 +465,26 @@ public static class FileStoreHelper
|
||||
return (serverFilePath, relativePath, fileRealName);
|
||||
}
|
||||
|
||||
// 获取 入组确认 PD 进展发送邮件Word|PDF 存放路径
|
||||
|
||||
public static (string PhysicalPath, string RelativePath, string FileRealName) GetSubjectEnrollConfirmOrPDEmailPath(IWebHostEnvironment _hostEnvironment, string fileName, Guid trialId, Guid siteId, Guid subjectId,bool isChangeToPdfFormat=false)
|
||||
{
|
||||
var rootPath = FileStoreHelper.GetIRaCISRootDataFolder(_hostEnvironment);
|
||||
|
||||
string uploadFolderPath = Path.Combine(rootPath, StaticData.Folder.TrialDataFolder, trialId.ToString(), siteId.ToString(), subjectId.ToString());
|
||||
|
||||
if (!Directory.Exists(uploadFolderPath)) Directory.CreateDirectory(uploadFolderPath);
|
||||
|
||||
var (trustedFileNameForFileStorage, fileRealName) = FileStoreHelper.GetStoreFileName(fileName, isChangeToPdfFormat);
|
||||
|
||||
|
||||
var relativePath = $"/{StaticData.Folder.IRaCISDataFolder}/{StaticData.Folder.TrialDataFolder}/{trialId}/{siteId}/{subjectId}/{trustedFileNameForFileStorage}";
|
||||
|
||||
var serverFilePath = Path.Combine(uploadFolderPath, trustedFileNameForFileStorage);
|
||||
|
||||
return (serverFilePath, relativePath, fileRealName);
|
||||
}
|
||||
|
||||
|
||||
public static string GetSubjectVisitDicomFolderPhysicalPath(IWebHostEnvironment _hostEnvironment,Guid trialId, Guid siteId, Guid subjectId, Guid subjectVisitId)
|
||||
{
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using DocumentFormat.OpenXml.Spreadsheet;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using MailKit;
|
||||
using MailKit.Security;
|
||||
using MimeKit;
|
||||
using NPOI.HPSF;
|
||||
|
||||
|
||||
namespace IRaCIS.Core.Application.Helper;
|
||||
@@ -40,7 +42,8 @@ public static class SendEmailHelper
|
||||
catch (Exception ex)
|
||||
{
|
||||
|
||||
throw new Exception("邮件发送失败,您进行的操作未能成功,请检查邮箱或联系维护人员") ;
|
||||
//---邮件发送失败,您进行的操作未能成功,请检查邮箱或联系维护人员
|
||||
throw new Exception(StaticData.International("SendEmail_SendFail"));
|
||||
}
|
||||
|
||||
|
||||
@@ -60,7 +63,8 @@ public static class SendEmailHelper
|
||||
|
||||
if (sMTPEmailConfig.ToMailAddressList.Count == 0)
|
||||
{
|
||||
throw new ArgumentException("没有收件人");
|
||||
//---没有收件人
|
||||
throw new ArgumentException(StaticData.International("SendEmail_NoRecipient"));
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -88,10 +92,19 @@ public static class SendEmailHelper
|
||||
{
|
||||
//builder.Attachments.Add(item.FileName, item.FileData);
|
||||
|
||||
builder.Attachments.Add(item.FileName, item.FileStream);
|
||||
var attachment = builder.Attachments.Add(item.FileName, item.FileStream);
|
||||
|
||||
//解决附件名过长 奇怪的名字
|
||||
foreach (var param in attachment.ContentDisposition.Parameters)
|
||||
param.EncodingMethod = ParameterEncodingMethod.Rfc2047;
|
||||
foreach (var param in attachment.ContentType.Parameters)
|
||||
param.EncodingMethod = ParameterEncodingMethod.Rfc2047;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
messageToSend.Body = builder.ToMessageBody();
|
||||
|
||||
using (var smtp = new MailKit.Net.Smtp.SmtpClient())
|
||||
|
||||
@@ -74,17 +74,18 @@
|
||||
</PackageReference>
|
||||
<PackageReference Include="fo-dicom.Drawing" Version="4.0.8" />
|
||||
<PackageReference Include="fo-dicom.Imaging.ImageSharp" Version="5.0.3" />
|
||||
<PackageReference Include="FreeSpire.Doc" Version="10.8.0" />
|
||||
<PackageReference Include="Hangfire" Version="1.7.31">
|
||||
<TreatAsUsed>true</TreatAsUsed>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Magicodes.IE.Core" Version="2.6.9" />
|
||||
<PackageReference Include="Magicodes.IE.Csv" Version="2.6.9">
|
||||
<PackageReference Include="Magicodes.IE.Core" Version="2.7.4.2" />
|
||||
<PackageReference Include="Magicodes.IE.Csv" Version="2.7.4.2">
|
||||
<TreatAsUsed>true</TreatAsUsed>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Magicodes.IE.Excel" Version="2.6.9">
|
||||
<PackageReference Include="Magicodes.IE.Excel" Version="2.7.4.2">
|
||||
<TreatAsUsed>true</TreatAsUsed>
|
||||
</PackageReference>
|
||||
<PackageReference Include="Magicodes.IE.Excel.AspNetCore" Version="2.6.9" />
|
||||
<PackageReference Include="Magicodes.IE.Excel.AspNetCore" Version="2.7.4.2" />
|
||||
<PackageReference Include="MailKit" Version="3.4.2" />
|
||||
<PackageReference Include="MediatR" Version="11.0.0" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.JsonPatch" Version="6.0.10" />
|
||||
@@ -92,7 +93,7 @@
|
||||
<TreatAsUsed>true</TreatAsUsed>
|
||||
</PackageReference>
|
||||
<PackageReference Include="MimeKit" Version="3.4.2" />
|
||||
<PackageReference Include="MiniExcel" Version="1.28.1" />
|
||||
<PackageReference Include="MiniExcel" Version="1.30.1" />
|
||||
<PackageReference Include="MiniWord" Version="0.6.1" />
|
||||
<PackageReference Include="My.Extensions.Localization.Json" Version="3.0.0">
|
||||
<TreatAsUsed>true</TreatAsUsed>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -2,235 +2,549 @@
|
||||
"test{0}{1}": "英文本地化{0}{1}",
|
||||
"RequiredAttribute": "{0} is required",
|
||||
|
||||
// SiteSurvey 服务--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// TrialSiteEquipmentSurveyService
|
||||
"CPMNotOperation": "CPM/APM Disallow operation", //CPM/APM 不允许操作
|
||||
"IsLockNotOperation": "The operation cannot be performed if it is locked", //已锁定 不允许操作
|
||||
|
||||
// TrialSiteSurveyService
|
||||
"ValidationEmail": "Please input a legal email", // 验证邮箱
|
||||
"ValidationPhone": "Please input a legal phone", // 验证手机号
|
||||
"SiteNotExistUpdateDisable": "The project Site does not have the survey record of the handover person, so it is not allowed to choose to update", // site不存在禁止更新
|
||||
"RecordLockUpdateDisable": "Your record is not locked, you are not allowed to choose to update, if submitted, can be rejected after operation", //记录锁定禁止更新
|
||||
"SiteLockUpdateDisableOther": "At the current Site, your survey record has been locked, and it is not allowed to update other people's email survey record", //Site锁定禁止更新其他人
|
||||
"SiteLockUpdateDisableSelf": "At the current Site, your survey record has been locked, and there are other unlocked records, so you are not allowed to update your own survey record", //Site锁定禁止更新自己
|
||||
"SiteLockUpdateDisableEmail": "Currently, there are unlocked survey records in the Site, and the survey records of the locked mailbox are not allowed to be updated", //Site锁定禁止更新邮箱调研记录
|
||||
"EmailNotLatestDisableEmail{0}": "The questionnaire corresponding to this mailbox {0} is not the latest locked record and is not allowed to be updated!", //邮箱调研表不是最新 不允许更新
|
||||
"SiteExistOtherUpdateDisable": "Other users have already filled in the survey form under this Site, you are not allowed to continue to fill in", //存在其他用户调研表不允许填写
|
||||
"IsLockUpdateDisable": "The operation is not allowed because it has been locked", //已锁定,不允许操作
|
||||
"OnlyAbolishNotFiled": "Only uncommitted records are allowed to be annulled", //只允许废除未提交的记录
|
||||
"AdminOperateDisable": "The Admin operation is not allowed", // 不允许Admin操作
|
||||
"UserWrongNotSubmit": "Personnel information is not allowed to be submitted because there are incorrect items", // 人员信息有不正确项,不允许提交
|
||||
"FillInTheType{0}": "Please enter the type of account to be generated. Name of person {0}", // 请填写生成账号的类型。人员姓名
|
||||
|
||||
// TrialSiteUserSurveyService
|
||||
"InfoInconformity": "The user name in the system is {0}, which is inconsistent with the entered information. You can modify the information to be consistent with the system and save the information", // 信息不一致 修改一致进行保存
|
||||
|
||||
|
||||
// TrialSiteUser 服务------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// TrialConfigService
|
||||
"NoDataDound": "No data for the signature scenario was found in the system", //未在系统中找到该签名场景的数据
|
||||
"PasswordError": "password error", //密码错误
|
||||
"UserBeDisabled": "The user has been disabled!",
|
||||
"ProjSetDisable": "The project is not Initializing/Ongoing and configuration confirmation is not allowed", //不允许确认配置
|
||||
"QCRepate": "The serial number of QC problem display is not allowed to repeat", // QC问题显示序号不允许重复
|
||||
"ParentNumToLow": "Please confirm that the parent problem number is smaller than the child problem number", // 父问题的序号要比子问题序号小,请确认
|
||||
"ExistUnconfirmedItems": "Project, basic configuration, process configuration, urgent configuration, visit plan, unconfirmed items", // 存在未确认项
|
||||
"NotAllCanOperate": "only in Initializing or Ongoing State can operate", //只有“初始化中”和“正在进行中”才能进行操作
|
||||
|
||||
// TrialExternalUserService
|
||||
"InfoDoNotAgree{0}{1}": "The user account name in the system is {0} Phone number: {1}. The information is inconsistent with the entered information. Now, modify the page information to be consistent with the system information and save the information", // 用户信息不一致
|
||||
"UserExist": "The email address and user type already exist", //该邮箱和用户类型,已存在该账户
|
||||
|
||||
// TrialMaintenanceService
|
||||
"OneTrial": "Only one pm is allowed in a trial",
|
||||
"Participant": "Participant has participated in site maintenance",
|
||||
|
||||
// TrialService
|
||||
"OnlyPMAPM": "Only PM/APM can perform this operation!",
|
||||
"TrialIDExist": "Same Trial ID already exists.",
|
||||
"ProjNot": "Operations are allowed only when the project is initialized or in progress",
|
||||
"TrialConfirm": "The Trial visit schedule has been confirmed and cannot be deleted",
|
||||
"TrialIntoTheGroup": "The Trial cannot be deleted because a doctor has been enrolled in the Trial or is in the enrollment process",
|
||||
"TrialHaveSite": "There is a Site under this Trial and it cannot be deleted",
|
||||
"TrialHaveParticipants": "There are participants under this Trial and they cannot be deleted",
|
||||
"NotRevertEditable": "VisitPlan has been generated for some subjects,can not revert editable state",
|
||||
|
||||
// TrialSiteService
|
||||
"CodeRepeated": "Code is not allowed to be repeated",
|
||||
"CRCCanNotDeleted": "The site has been associated with CRC, and couldn't be deleted",
|
||||
"SiteCanNotDeleted": "The subjects has been added to this site, and couldn't be deleted",
|
||||
"StudyCanNotDeleted": "The site has been uploaded study, and couldn't be deleted.",
|
||||
|
||||
// Visit -------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// SubjectService
|
||||
"VisitNotConfirmed": "The trial visit plan has not been confirmed yet.Please contact the project manager to confirm the visit plan before adding subject",
|
||||
"ExistedTrial": "A subjects with the same subject ID already existed in this trial.",
|
||||
"TheLastVisit": "The subject is not allowed to set this visit as the last visit since there is already an visit set as the last visit",
|
||||
"ImagesUploaded": "The subject uploaded the image after this visit, and this visit is not allowed to be set as the last visit",
|
||||
"StudyImagesCanBotDeleted": "This subject has executed a visit with uploading study images,and couldn't be deleted",
|
||||
|
||||
// SubjectVisitService
|
||||
"ContainsVisitnum": "This subject's visit plan already contains a visit with the same visitnum",
|
||||
"LastEvaluationNotAllowed": "After setting the last evaluation, you are not allowed to add scheduled outbound visits",
|
||||
"CRCSubmit": "PD confirmation status cannot be modified after CRC submission",
|
||||
"BacktrackingVisits": "After the CRC is submitted, the PD confirmation status cannot be changed",
|
||||
"ImageUpload": "The subject uploaded the image after this visit, and this visit is not allowed to be set as the last visit",
|
||||
"AssociatedUploaded": "This visit is associated with the uploaded study images and couldn't be deleted",
|
||||
"InPlanCanNotDeleted": "This visit is InPlan and couldn't be deleted",
|
||||
|
||||
// VisitPlanService
|
||||
"OnlyInitializing": "only in Initializing or Ongoing State can operate",
|
||||
"AccordWithVisitNum": "For the visit plan, the VisitDay with a larger VisitNum should be larger than the VisitDay with a smaller VisitNum",
|
||||
"same/VisitName": "A visit with the same VisitName/VisitNum already existed in the current visit plan",
|
||||
"AlreadyBaseline": "A visit already is baseline in the current visit plan",
|
||||
"IsUploadVideo": "A CRC has uploaded image data for the baseline and is not allowed to modify the baseline",
|
||||
"VisitHasBeenExecuted": "The visit plan has been assigned to the subjects and executed",
|
||||
"OnlyProgressCanEdit": "Modification validation is allowed only during project initialization or in progress",
|
||||
"NoBaselineNoConfirmation": "No baseline, no confirmation allowed",
|
||||
"NotConfirmedCanNotVisit": "If the project configuration is not confirmed, the visit plan is not allowed to be confirmed",
|
||||
"VisitDayNotMinimum": "Baseline VisitDay is not minimum and confirmation is not allowed",
|
||||
|
||||
//Document-----------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
//SystemDocumentService
|
||||
"ExistsFileName": "The filename of the same type already exists",
|
||||
"SignedUser": "A user has signed the document",
|
||||
|
||||
//TrialDocumentService
|
||||
|
||||
//同类型已存在该文件名 上面存在 ExistsFileName
|
||||
"ExistsSignedUser": "This document, which has been signed by the user, cannot be deleted",
|
||||
//password error 上面存在 PasswordError
|
||||
//The user has been disabled 上面存在 UserBeDisabled
|
||||
"DocumentsSigned": "The document has been signed",
|
||||
"FileBeDelete": "File deleted or cancelled, signing failed",
|
||||
|
||||
//QC--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// ClinicalDataService
|
||||
|
||||
// NoneDicomStudyService
|
||||
|
||||
// QCListService
|
||||
"NotFirstTrial": "The current user is not a preliminary user and cannot perform this operation",
|
||||
"NotReviewUser": "The current user is not a review user and cannot perform this operation",
|
||||
|
||||
// QCOperationService
|
||||
"AuditQuestionMust": "The audit question must be filled out and saved, otherwise no challenge is allowed to be added",
|
||||
"VisitNoClose": "The current viewer has unclosed query for CRC upload permission. No further query is allowed",
|
||||
"NotFinish": "CRC retransmission request /QC agrees to retransmission challenge and is not allowed to close the challenge until CRC setup retransmission is complete",
|
||||
"QCHasBeenReplied": "This QC inquiry has been answered",
|
||||
"OperationUserMustBeCRC/PM": "Only CRC and PM are allowed",
|
||||
"CanNotCloseQuery": "Visits that perform conformance checks are not allowed to close queries",
|
||||
"OnlyPMCanSet": "Only PM manual Settings are allowed to pass the consistency check",
|
||||
"CanNotSettingConsistency": "Currently, the PM approves the rollback and does not allow the consistency check to pass",
|
||||
"ConsistencyNotClose": "Compliance check challenge unclosed/audit status is not passed, setting conformance check is not allowed to pass",
|
||||
"PassDataNotFallback": "The data that passes the verification is not allowed to apply for rollback",
|
||||
"OnlyPMFallback": "Only PM rollback is allowed",
|
||||
"UnderDetectionNotFallback": "Data to be verified/verified is not allowed to be rolled back",
|
||||
"OnlyPMCanOperation": "Only PM operations are allowed",
|
||||
"OnlyExcelCSV": "Only Excel and CSV are allowed!",
|
||||
"ExcelVerificationFailed": "Please upload an Excel file in the specified format to ensure valid data",
|
||||
"QCUnconfirmed": "The QC problem is not confirmed, it is not allowed to receive the task",
|
||||
"MustBeFinish": "You are not allowed to pick up new subjects until you have already picked up other subjects",
|
||||
"BeReceive": "It is currently claimed and not allowed to be claimed",
|
||||
"CancelQCTask": "The project is configured to not review, not receive or cancel the QC Task",
|
||||
"FirstTriaPassed": "The first examination has been passed, can not continue to receive",
|
||||
"CanNotReceive": "The item is configured as single audit and cannot be collected if SubmmitState: submitted or AuditState: to be audited/audited is not met. Please refresh the interface",
|
||||
"MustBeDifferent": "The retrial cannot be the same person as the first trial",
|
||||
"IsNotSatisfied": "The project is configured for review and does not meet the submission status: Submitted or reviewed status: pending review /QC, it is not allowed to receive, please refresh the interface",
|
||||
"VisitNotUploaded": "Visitors who have not uploaded any Dicom/ non-DICOM data are not allowed to submit",
|
||||
"MandatoryFailed": "The project is configured to require filling in the date of first administration, but subjects do not fill in the date of first administration, which is not allowed to submit",
|
||||
"YouBeenRemoved": "You have been removed from the project and are not allowed to do this",
|
||||
"QuestionsNotClosed": "The operation is not allowed if it is not closed",
|
||||
"CanNotSetQCPassed": "QC Passed cannot be set if the value is not Passed",
|
||||
"MustSetQuestion": "The audit question must be filled out and saved, otherwise submission will not be allowed",
|
||||
"CanNotChangeQCPassed": "The audit status of the item is not InPrimaryQC and cannot be changed to QCPassed",
|
||||
// "必须填写审核问题,并保存,否则不允许提交" 上面 MustSetQuestion
|
||||
"TrialIsDoubleCheck{0}": "The audit status of the item is {0} and cannot be changed to QCPassed",
|
||||
"CanNotSetQCFailed": "QC Failed cannot be set in the unchecked state",
|
||||
"NotInPrimaryQCQCFailed": "The project is configured as a single audit. The current audit status is not InPrimaryQC and cannot be changed to QCFailed",
|
||||
"TrialIsDoubleCheckCanNotQCFailed{0}": "The project is configured with double audit. The current audit status is {0} and cannot be changed to QCFailed",
|
||||
"CRCHasBeenSubmitted": "CRC has submitted an unmodified group confirmation status",
|
||||
"CannotBeChangedPD": "PD confirmation status cannot be modified for rollback visits",
|
||||
"OtherQCProcessAudit": "Other QC is conducting audit, current operation is not allowed",
|
||||
"ForwardFailed": "Forward failure",
|
||||
|
||||
// QCQuestionService
|
||||
|
||||
// TrialQCQuestionService
|
||||
"QCHasConfirmed": "QC has confirmed that operation is not allowed",
|
||||
"BeforeClearSubproblem": "The parent problem can only be deleted if the child problem is cleared",
|
||||
"HasQCAuditRecord": "There is QC audit record, it is not allowed to delete the problem item",
|
||||
|
||||
//ImageAndDoc -----------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
//DicomArchiveService
|
||||
|
||||
//ImageShareService
|
||||
"NoImage": "There is no image in the current study and cannot be shared!",
|
||||
"ResourceNotExist": "The resource does not exist! ",
|
||||
"PasswordIsError": "Shared password error!",
|
||||
"ResourceExpired": "Resource sharing has expired!",
|
||||
|
||||
//InstanceService
|
||||
|
||||
//SeriesService
|
||||
|
||||
//StudyListService
|
||||
|
||||
"TimeTooLow": "当前访视检查时间不能小于该访视之前检查的时间,请核对检查数据是否有误",
|
||||
"SomeoneLoading": "当前有人正在上传归档该检查!",
|
||||
"VisitEnd": "受试者访视结束,不允许上传!",
|
||||
"DICOMUploaded{0}{1}{2}{3}": "{0}: This DICOM images have been uploaded and allocate to the {1} of the subject {2} (Study ID: {3}), which cannot continue to upload and assign it to others.",
|
||||
|
||||
//StudyService
|
||||
|
||||
//SystemAnonymizationService
|
||||
// ------------------------------------------------------------Controllers--------------------------------------------------------------------
|
||||
//FinancialChangeController
|
||||
"Financial_ChargeSettled": "Expenses have been settled and workload can not be reset.",
|
||||
"Financial_InvalidParameter": "Invalid parameter.",
|
||||
//UploadDownLoadController
|
||||
"UploadDownLoad_UnsupportedMedia": "Unsupported media type.",
|
||||
"UploadDownLoad_ArchiveInProgress": "Another user is uploading or archiving this inspection.",
|
||||
"UploadDownLoad_InvalidData": "Please ensure that the uploaded data conforms to the style of the template file and contains valid data.",
|
||||
"UploadDownLoad_RequestError": "Request error.",
|
||||
"UploadDownLoad_SupportedFormats": "Supports upload of .xlsx, .xls, and .csv formats.",
|
||||
|
||||
//-------------------------------------------------------------------------------------Reading-----------------------------------------------------------------
|
||||
//ClinicalDataSetService
|
||||
"ClinicalDataSet_DupTypeFail": "There are duplicate clinical data of the same type. The operation failed.",
|
||||
//ReadingClinicalDataService
|
||||
"ReadingClinicalData_DupTypeFail": "There are duplicate clinical data of the same type. The operation failed.",
|
||||
"ReadingClinicalData_Unchecked": "The current clinical data status is not verified and signing is not allowed!",
|
||||
//ReadingGlobalTaskService
|
||||
"ReadingGlobal_NotGlobal": "The current task is not a global reading task",
|
||||
"ReadingGlobal_NotGlobal": "System call error. The current read is not a global review read.",
|
||||
//ReadingImageTaskService
|
||||
"ReadingImage_NotVisit": "The current task is not a visit task",
|
||||
"ReadingImage_CantSplit": "This is currently a baseline task and cannot be split and combined",
|
||||
"ReadingImage_BeSigned": "The current task has been signed!",
|
||||
"ReadingImage_Beinvalid": "The current task is invalid!",
|
||||
"ReadingImage_NotaTask": "The combined lesions were not the same visiting task",
|
||||
"ReadingImage_DeleteError": "The current lesion splits into other lesions or other lesions merge into the current lesion, and deletion fails",
|
||||
"ReadingImage_Idnotcorrespond": "InstanceId and SeriesId do not correspond !",
|
||||
"ReadingImage_Twice": "The same question is passed in twice",
|
||||
"ReadingImage_MaxQuestion": "The maximum number of problems currently submitted is {0}!",
|
||||
"ReadingImage_Maxlesion": "According to the relevant rules of RECIST1.1, the number of target lesions in the same organ does not exceed {0}!",
|
||||
"ReadingImage_Maximum": "Problems {0} The maximum number of the same problems is {1}, and {2} already exist",
|
||||
"ReadingImage_RequiredQuestion": "The answer to the required question {0} is empty or not saved",
|
||||
"ReadingImage_ClinicalRead": "Clinical data not read!",
|
||||
"ReadingImage_IDMust": "When there is no task Id, the standard Id must be passed",
|
||||
"ReadingImage_TaskFinish": "The current subject has completed all the task of reading the film!",
|
||||
"ReadingImage_NeedRest": "You have read the video continuously for {0} hours, please rest for {1} minutes before continuing to read the video.",
|
||||
"ReadingImage_NotVisit": "System call error. The current read is not a timepoint read.",
|
||||
"ReadingImage_CantSplit": "The current read is a baseline read, and lesion split is not allowed.",
|
||||
"ReadingImage_BeSigned": "The current read has already been signed off. Please do not submit it again.",
|
||||
"ReadingImage_Beinvalid": "The current read has already been invalidated, and reading is not allowed anymore.",
|
||||
"ReadingImage_PresenceReview": "The current subject has a review request that has not been processed and is not allowed to operate",
|
||||
"ReadingImage_NotaTask": "The coalesced lesions are not from the same timepoint. ",
|
||||
"ReadingImage_DeleteError": "Other lesions have split from or coalesced into the current lesion. Deletion failed.",
|
||||
"ReadingImage_Idnotcorrespond": "Failed to add the lesion mark. The Instance ID and Series ID of the image do not match.",
|
||||
"ReadingImage_IsLymphNotbigger": "The short diameter of this nodal non-target lesion on the current visit is smaller than the value on the previous visit, and the state cannot be set to 'Unequivocal progression'.",
|
||||
"ReadingImage_NotLymphNotbigger": "The long diameter of this non-nodal non-target lesion on the current visit is smaller than the value on the previous visit, and the state cannot be set to 'Unequivocal progression'.",
|
||||
"ReadingImage_Twice": "System call error. Questions & answers submitted are duplicated.",
|
||||
"ReadingImage_MaxQuestion": "According to the imaging charter, the number of the current type of lesion cannot exceed {0}.",
|
||||
"ReadingImage_Maxlesion": "According to the imaging charter, the number of target lesions in the same organ cannot exceed {0}. Please confirm.",
|
||||
"ReadingImage_Maximum": "{0} can only be repeated {1} times, and it has been repeated {2} times so far.",
|
||||
"ReadingImage_PCWGMaximum": "According to the imaging charter, the number of baseline lesions at the same location should enter only {0} time. Please confirm.",
|
||||
"ReadingImage_NotNewFocus": "There should be no new lesions in the converted task",
|
||||
"ReadingImage_RequiredQuestion": "Before submission, please fill in {0}.",
|
||||
"ReadingImage_ClinicalRead": "The clinical data has not been read. Please confirm!",
|
||||
"ReadingImage_IDMust": "System call failed. When there is no Read ID, the standard ID must be passed.",
|
||||
"ReadingImage_TaskFinish": "Please note that all reads of the current subject have been completed.",
|
||||
"ReadingImage_NeedRest": "You have been continuously reading for {0} hours. Please take a break of {1} minutes before resumption.",
|
||||
//ReadingJudgeTaskService
|
||||
"ReadingJudge_SouceIdNull": "The SouceId of the current referee global task is null",
|
||||
"ReadingJudge_SouceIdNull": "System call failed. The Source ID of the global review which is being adjudicated currently is 'null'. ",
|
||||
//ReadingOncologyTaskService
|
||||
"ReadingOncology_TaskError": "The current task is not an oncology task",
|
||||
"ReadingOncology_Abnormal": "Abnormal, the referee result is null",
|
||||
"ReadingOncology_TaskError": "System call error. The current read is not an oncology read.",
|
||||
"ReadingOncology_Abnormal": "System call exception. The result of adjudication is null",
|
||||
//ReadingCalculate
|
||||
"ReadingCalculate_Abnormal": "The PCWG3 standard configuration is abnormal!",
|
||||
"ReadingCalculate_Questionable": "The lesions have the following problems:",
|
||||
"ReadingCalculate_NoMarker": "Lesion {0} no marker exists,",
|
||||
"ReadingCalculate_StatusIsEmpty": "Lesion {0} status is empty,",
|
||||
"ReadingCalculate_NoMarkerEmpty": "Lesion {0} is unmarked and the status is empty,",
|
||||
"ReadingCalculate_NoDeveloped": "The current standard calculation is not well developed!",
|
||||
"ReadingCalculate_Abnormal": "Configuration error of PCWG3 criteria. Data verification failed.",
|
||||
"ReadingCalculate_questionable": "Problems with the lesions are as follows:",
|
||||
"ReadingCalculate_NoMarker": "Lesion {0} lacks mark.",
|
||||
"ReadingCalculate_StatusIsEmpty": "The state of Lesion {0} is empty.",
|
||||
"ReadingCalculate_NoMarkerEmpty": "Lesion {0} is not marked, and its state is empty.",
|
||||
"ReadingCalculate_NoDeveloped": "Please note that the current standard automatic calculation has not been developed.",
|
||||
//ReadingMedicalReviewService
|
||||
"MedicalReview_invalid": "The medical audit was invalid and the operation failed",
|
||||
"MedicalReview_SaveQuestion": "Please save the medical review question first",
|
||||
"MedicalReview_NeedSave": "Save the question and conclusion first",
|
||||
"MedicalReview_NotClosed": "Dialogue not closed"
|
||||
"MedicalReview_invalid": "This medical review read has already been invalidated, and the operation failed.",
|
||||
"MedicalReview_SaveQuestion": "Unable to perform the current operation. Please save the medical review questions first.",
|
||||
"MedicalReview_NeedSave": "Unable to perform the current operation. Please save the medical review questions and conclusions first.",
|
||||
"MedicalReview_NotClosed": "Unable to perform the current operation. The current medical inquiry conversation has not been closed.",
|
||||
"MedicalReview_Finish": "The current medical review is the last one.",
|
||||
//ReadingMedicineQuestionService
|
||||
"ReadingMed_QNumDup": "Current problem number has duplicates",
|
||||
"ReadingMed_HasSubQ": "This problem has sub-problems, please delete them first",
|
||||
"ReadingMed_NoMedQ": "Medical review question has not been added yet. Please add it first before confirming",
|
||||
"ReadingMed_MedQNumDup": "The display number of the medical imaging review question cannot be duplicated",
|
||||
"ReadingMed_ParentNumSmall": "The display number of the parent problem should be smaller than that of the child problem, please confirm",
|
||||
"ReadingMed_GlobalQNotConfig": "The global reading is enabled in the current standard, but the global medical review question has not been configured",
|
||||
"ReadingMed_ArbitrateQNotConfig": "Arbitration reading is enabled in the current standard, but the arbitration medical review question has not been configured",
|
||||
"ReadingMed_TumorQNotConfig": "Oncology reading is enabled in the current standard, but the oncology medical review question has not been configured",
|
||||
//UserService
|
||||
"User_CheckNameOrPw": "Please check the username or password.",
|
||||
//Repository
|
||||
"Repository_UpdateError": "Updated data does not exist in the database. ",
|
||||
"Repository_DeleteError": "Deleted data does not exist in the database.",
|
||||
//OrganInfoService
|
||||
"OrganInfo_DuplicateData": "There are duplicate data, operation failed.",
|
||||
//ReadingCriterionService
|
||||
"ReadingCriterion_Referenced": "The current standard has been referenced and cannot be deleted.",
|
||||
"ReadingCriterion_InUse": "This standard has been used in the project and cannot be deleted.",
|
||||
"ReadingCriterion_ArbitratorWithoutJudgment": "There is no referee problem but there is an arbitration object, operation failed.",
|
||||
//ReadingQuestionService
|
||||
"ReadingQuestion_IdDup": "Duplicate problem ID.",
|
||||
"ReadingQuestion_ChildrenExist": "This problem has sub-problems, please delete the sub-problems first.",
|
||||
"ReadingQuestion_GroupReferenced": "This grouping has been referenced, please delete the referenced problems first.",
|
||||
"ReadingQuestion_JudgmentSet": "The current problem already has a referee standard set, modification failed.",
|
||||
"ReadingQuestion_ExcludeWithDependency": "The displayed dependent parent problem and the required dependent problem are the same, but the answers are mutually exclusive, operation failed.",
|
||||
"ReadingQuestion_CircularDependency": "Calculation dependency has looped!",
|
||||
//ReadingPeriodSetService
|
||||
"ReadingPeriodSet_AlreadyAdded": "{0} has already added the review period, cannot set it effective.",
|
||||
"ReadingPeriodSet_TaskCompletedCannotRevoke": "The current standard review has generated tasks and the review is completed, revoke failed.",
|
||||
"ReadingPeriodSet_LastVisit": "Last visit.",
|
||||
//ReadModuleService
|
||||
"ReadModule_AlreadyAdded": "The current visit has already added a review period.",
|
||||
"ReadModule_AddGlobalFirst": "Please add global review first.",
|
||||
"ReadModule_VisitNotFound": "No visits found that meet the criteria.",
|
||||
"ReadModule_SignedDataCannotDelete": "Clinical data has been signed and cannot be deleted.",
|
||||
"ReadModule_TumorExists": "The current visit has a tumor review, please delete the tumor review first.",
|
||||
"ReadModule_TaskGenerated": "The current review has generated tasks, operation failed.",
|
||||
|
||||
// ------------------------------------------------------------Allocation--------------------------------------------------------------------
|
||||
//TaskAllocationRuleService
|
||||
"TaskAllocation_DoctorIdNotFound": "Error, the doctor is account Id was not found in the enrollment table.",
|
||||
"TaskAllocation_DoctorConfigExists": "The doctor configuration is already available, and continued additions cannot be allowed.",
|
||||
"TaskAllocation_TaskAssigned": "A task has been assigned to the doctor and it cannot be deleted.",
|
||||
//TaskConsistentRuleService
|
||||
"TaskConsistent_ConsistencyConfigExists": "Please configure the doctor for consistency analysis.",
|
||||
"TaskConsistent_TaskGenerated": "The trial configuration is already available, and no continued additions are allowed.",
|
||||
"TaskConsistent_MedicalAuditTaskExists": "The standard already has tasks generated by the Subject, and configuration modification is not allowed.",
|
||||
"TaskConsistent_SignedTaskCannotBeInvalidated": "This standard has generated a consistency analysis task and cannot be deleted.",
|
||||
//TaskMedicalReviewRuleService
|
||||
"TaskMedicalRule_TaskAlreadyAssigned": "The doctor configuration is already available, and continued additions cannot be allowed.",
|
||||
"TaskMedicalRule_TaskStarted": "A medical review task has been generated.",
|
||||
//TaskMedicalReviewService
|
||||
"TaskMedical_DirtyData": "Signed files cannot be set to invalid.",
|
||||
"TaskMedical_SubjectInOtherArm": "A task is currently assigned to someone else,and it cannot be assigned. Please refresh the list.",
|
||||
//VisitTaskService
|
||||
"VisitTask_VisitTask_TaskAlreadyApplied": "The project has not confirmed any of the reading criteria.",
|
||||
"VisitTask_DoctorConfigNotFound": "The current doctor has begun to do the task of this standard of subject, so assignment cannot be canceled.",
|
||||
"VisitTask_BackendDataError": "One of the tasks has been assigned to the doctor and is not allowed to be assigned.",
|
||||
"VisitTask_DirtyData": "Dirty data appears, and the task source field has no value.",
|
||||
"VisitTask_MissingTaskSource": "The subject had a visit and entered the return process, which has not been verified for consistency and is not allowed to be assigned.",
|
||||
"VisitTask_InconsistentSubjectStatus": "There is a subject that already has the doctor in another Arm group, it is not allowed to add the doctor to a new group.",
|
||||
"VisitTask_DuplicateDoctorInArm": "There is a subject that already has the doctor in another Arm group, so the futher assignment is not allowed. Please refresh the page to confirm whether the data on the page is expired.",
|
||||
"VisitTask_DoctorAlreadyInArm": "The assignment of a Subject task cannot be canceled because it has been applied.",
|
||||
"VisitTask_TaskAlreadyApplied": "The configured doctor cannot be found in the configuration table, and the binding cannot be applied. Please check the data.",
|
||||
"VisitTask_DoctorConfiguration": "",
|
||||
"VisitTask_BackendData": "Tasks that have not been completed or have not taken effect are not allowed to request re-reading.",
|
||||
"VisitTask_UnreadTask": "Tasks that re-read has been applied or approved are not allowed to apply for re-read.",
|
||||
"VisitTask_NoPMRecheck": "",
|
||||
"VisitTask_Reapply": "PM does not allow apply for re-read of consistency analysis tasks.",
|
||||
"VisitTask_ConsistencyAnalysis": "PM only allows apply for re-read that the view type is visit.",
|
||||
"VisitTask_VisitTypeRestriction": "It is currently an ordered read type, and the subject has visit that has applied for re-read, but has not been processed (project team apply for), so it cannot been applied for continuing re-read at this time.",
|
||||
"VisitTask_SequentialReading": "It is currently an ordered read type, and the subject has visit that has applied for re-read, but has not been processed, so it cannot been applied for re-read for now.",
|
||||
"VisitTask_ImageProblem": "It is currently an ordered read type that there is something wrong with the image. The trial team has applied for returning, so it cannot been applied for re-read for now.",
|
||||
"VisitTask_LastReading": "It is an ordered read type, and only the request for re-readinng by the subject reader after completing the global task for the last time is allowed.",
|
||||
"VisitTask_LastOncologistRecheck": "",
|
||||
"VisitTask_LastAdjudicatorRecheck": "",
|
||||
"VisitTask_IRGlobalRecheck": "",
|
||||
"VisitTask_IRReapply": "It is an disordered read type, only tasks that IR applies for global and visit read type to re-read are allowed.",
|
||||
"VisitTask_InvalidReapplyStatus": "The current re-read task state is not in the requested state and cannot be processed. Please refresh the page.",
|
||||
"VisitTask_ReapplyStatusConflict": "The status of the current task requested to be re-read has been affected by another re-read task. The re-read yes/no operation is not allowed for the task in this state",
|
||||
"VisitTask_ReReadTaskNotApplied": "Only tasks the read type is visit are allowed to be approved of re-read.",
|
||||
"VisitTask_ReReadTaskAlreadyAffected": "Do not conform to the PM request and SPM / CPM approve | IR request and PM approve.",
|
||||
"VisitTask_TaskTypeNotApproved": "The current re-read task state is not in the requested state and cannot be processed. Please refresh the page.",
|
||||
"VisitTask_NoImageReturn": "",
|
||||
"VisitTask_NonEffectiveTaskCannotBeReturned": "Only effective and unfinished visit tasks can be returned. Please refresh the page data.",
|
||||
"VisitTask_NoFurtherReturn": "",
|
||||
"VisitTask_ConsistencyTaskCannotBeReturned": "The consistency analysis task is not allowed to be set return back.",
|
||||
"VisitTask_PMOnlyAllowedForReturn": "Only the PM can perform the rollback.",
|
||||
"VisitTask_UnsupportedTaskType": "Re-read task types are not supported.",
|
||||
"VisitTask_UndefinedList": "The current user view list is not defined.",
|
||||
"VisitTask_NoConsistencyReturn": "",
|
||||
"VisitTask_VisitTypeTaskAllowedForPMOnly": "Only visit task type can be returned by PM.",
|
||||
|
||||
// ------------------------------------------------------------Common--------------------------------------------------------------------
|
||||
//CommonDocumentService
|
||||
"Document_CodeDuplication": "The Code of the document cannot be repeated.",
|
||||
"Document_SingleTemplate": "Only one template document is allowed per scenario and standard.",
|
||||
"Document_ TemplateRead": "Failed to read the template content, please try saving the file as docx format!",
|
||||
//DictionaryService
|
||||
"Dictionary_DictionaryName": "There is already a dictionary with the name {0}.",
|
||||
"Dictionary_DictionaryDeletion": "The current dictionary is referenced in the standard and cannot be deleted!",
|
||||
"Dictionary_SubitemDeletion": "There is child data, direct deletion is not allowed!",
|
||||
"Dictionary_ResumeReference": "The current entry has been referenced in the reader resume.",
|
||||
"Dictionary_ProjectReference": "The current entry has been referenced in the project information.",
|
||||
"Dictionary_StandardReference": "The current entry has been referenced in the reading standard.",
|
||||
//ExcelExportService
|
||||
"ExcelExport_UnsupportedExport": "Currently the standard export is not supported.",
|
||||
//MailService
|
||||
"Mail_EmailResetReminder": "[from Extensive Imaging IRC] A reminder about resetting email.",
|
||||
"Mail_Dear": "Dear {0},",
|
||||
"Mail_ResettingEmail": "You are resetting an email address.",
|
||||
"Mail_IRCResettingPassword ": "[from Extensive Imaging IRC] A reminder about resetting your password",
|
||||
"Mail_ResettingPassword ": "You are resetting the email password ",
|
||||
"Mail_ImagingIRCReminder": "[from Extensive Imaging IRC] A reminder",
|
||||
"Mail_IRCProject": "You are participating in the Extensive Imaging IRC project",
|
||||
"Mail_ProjectParticipationReminder": "[from Extensive Imaging IRC] [{0}] A reminder of the site info collection",
|
||||
"Mail_CenterResearchReminder": "You are participating in the Site information collection of the IRC Program for Extensive Imaging.",
|
||||
"Mail_AccountCreationReminder": "[from Extensive Imaging IRC] A reminder about creating an account",
|
||||
"Mail_AccountPasswordResetReminder": "[from Film IRC] A reminder about resetting account passwords",
|
||||
"Mail_InvitationEmail": "[from Extensive Imaging IRC][{0}]Invitation",
|
||||
|
||||
// ------------------------------------------------------------Doctor--------------------------------------------------------------------
|
||||
//DoctorService
|
||||
"Doctor_DupPhoneOrEmail": "current phone or email number already existed",
|
||||
"Doctor_DupPhone": "The current phone number already existed!",
|
||||
"Doctor_DupEmail": "The current email already existed!",
|
||||
"Doctor_StandardDuplicateFileTypeError": "This type of file has already been added to the current criterion.",
|
||||
"Doctor_RequiredDocumentsError": "Resume & Consultant Agreement must be upload ",
|
||||
|
||||
// ------------------------------------------------------------Document--------------------------------------------------------------------
|
||||
//SystemDocumentService
|
||||
"SystemD_DuplicateFile": "A file of the same type and name already exists in the system.",
|
||||
"SystemD_CannotDeleteSignedFile": "The document has already been read and signed by a user, and not allowed to be deleted.",
|
||||
//TrialDocumentService
|
||||
"TrialD_DuplicateFileInProject": "A file of the same type with the same name already exists in the trial project .",
|
||||
"TrialD_DocumentHasAlready": "The document has already been read and signed by a user, and not allowed to be deleted.",
|
||||
"TrialD_FileAlreadySigned": "The file has been signed.",
|
||||
"TrialD_ObsoleteFile": "Document has been annulled. Signature failed!",
|
||||
//TrialEmailNoticeConfigService
|
||||
"TrialEmailN_TaskNotSigned": "Before sending the email, the task must have been signed and triggered to complete the corresponding task generation.",
|
||||
"TrialEmailN_NoRecipient": "The message cannot be sent without the recipient.",
|
||||
"TrialEmailN_InvalidEmailConfig": "The configuration of the sender mailbox of the trial is wrong, please check it.",
|
||||
"TrialEmailN_EmailTemplateNotFound": "The email template in the standard scenario of this project cannot be found.",
|
||||
"TrialEmailN_EnrollmentConfirmation": "[Enrollment Confirmation Report] About {0} item {1}Subject",
|
||||
"TrialEmailN_Enrollment": "The attachment is the enrollment confirmation report, please check it.",
|
||||
"TrialEmailN_PDReport": "[PD Report] About {0} item {1}Subject",
|
||||
"TrialEmailN_SubjectDiseaseProgression": "The attachment is the confirmation report of disease progress, please check it.",
|
||||
"TrialEmailN_SingleBlindedSet": "The configuration of the single and ordered reading is incorrect (there should be no adjudicator configuration), please check!",
|
||||
"TrialEmailN_SingleBlindedSequenced": "The single and ordered reading, this type of task should not enter the logic here, please contact the background developers to check!",
|
||||
"TrialEmailN_PDProgressEmailTask": "Send PD progress email found problem with the task data!",
|
||||
"TrialEmailN_DoubleBlindedError": "The adjudication rule processing logic for double and ordered reading is not defined, please contact the business and background developers to check!",
|
||||
"TrialEmailN_InCons": "",
|
||||
"TrialEmailN_NoBaseLine": "",
|
||||
"TrialEmailN_IncompBase": "",
|
||||
"TrialEmailN_EmailFail": "",
|
||||
"TrialEmailN_NoReader": "",
|
||||
"TrialEmailN_NoPDConfig": "",
|
||||
"TrialEmailN_NoPDTasks": "",
|
||||
"TrialEmailN_PDNotFinished": "",
|
||||
"TrialEmailN_PDNoImaging": "",
|
||||
"TrialEmailN_PDPhaseNotFinished": "",
|
||||
"TrialEmailN_NoRuleDefined": "",
|
||||
"TrialEmailN_NoDoubleOrder": "",
|
||||
"TrialEmailN_NoSendLogicDefined": "",
|
||||
"TrialEmailN_BlindedSequencedReading": "The configuration of the ordered reading is wrong (should be single or double reading), please check!",
|
||||
"TrialEmailN_UnblindedSequencedReading": "The configuration of unordered reading is wrong (should be single reading without adjudication, or double reading with adjudication for visiting ), please check!",
|
||||
"TrialEmailN_InvalidTaskTypeForEmailSending": "Do not send emails for other types of tasks except visit, adjudication and global read. Please check the business logic.",
|
||||
"TrialEmailN_PDLogicNotDefined": "The standard task has not yet defined the PD acquisition logic, please supplement it after consultation with the business and background developer.",
|
||||
"TrialEmailN_MailboxWrong": "The configuration of the sender mailbox of the trial is wrong, please check it.",
|
||||
"TrialEmailN_InvalidRecipient": "The trial does not have a valid recipient and the message cannot be sent.",
|
||||
"TrialEmailN_EmailTestMessage": "Trial mail test",
|
||||
"TrialEmailN_ConfigurationCorrect": "If this email is received, the email configuration is correct.",
|
||||
"TrialEmailN_InvalidSenderEmailConfig": "The sender configuration is incorrect. Please check whether the server address or authorization code is correct or not.",
|
||||
|
||||
// ------------------------------------------------------------Financial--------------------------------------------------------------------
|
||||
//CalculateService
|
||||
"Cal_VolDataErr": "Volume reward data error.",
|
||||
//ExchangeRateService
|
||||
"ExR_SameMthExist": "The exchange rate of the same month already existed.",
|
||||
"ExR_MthPymtRate": "The exchange rate has been used in monthly payment",
|
||||
//PaymentAdjustmentService
|
||||
"PayAdj_DocPymtLock": "Doctor payment has confirmed lock",
|
||||
//RankPriceService
|
||||
"RP_TitleUsedByRev": "This title has been used by reviewer payment information",
|
||||
//TrialRevenuesPriceService
|
||||
"TRP_AddMeaningful": "Please add meaningful data",
|
||||
|
||||
// ------------------------------------------------------------ImageAndDoc--------------------------------------------------------------------
|
||||
//DicomArchiveService
|
||||
"DAS_NoAnonCacheData": "The cache data for anonymous config is not obtained, and the upload stops. Please contact the developer for verification.",
|
||||
//ImageShareService
|
||||
"ISS_NoImgToShare": "There are no images to share for the current check.",
|
||||
"ISS_ResNotExists": " The request resource wasn’t found.",
|
||||
"ISS_SharePwdError": "The shared password is incorrect",
|
||||
"ISS_ShareExpiration": "Resource sharing expires",
|
||||
//StudyService
|
||||
"Study_VisitBeforePrevError": "The current visit check time {0} cannot be earlier than the previous visit check time {1}. Please check whether the check data is correct.",
|
||||
"Study_VisitAfterSubseqError": "The current visit check time {0} cannot be later than the visit check time {1} .Please check whether the check data is correct.",
|
||||
"Study_UploadArchiving": "Someone is currently uploading and archiving this visit!",
|
||||
"Study_VisitEndedNotAllowed": "Subject visit is over, and uploading is not allowed!",
|
||||
"Study_ImgAlreadyUploaded": "Uploading is not allowed above here.The current image check has been uploaded to {1} of subject {0}",
|
||||
|
||||
// ------------------------------------------------------------Inspection--------------------------------------------------------------------
|
||||
//FrontAuditConfigService
|
||||
"FrontAudit_IdDup": "The identifier is duplicated.",
|
||||
"FrontAudit_NameDup": "The name is duplicated .",
|
||||
"FrontAudit_CannotDelSub": "Subclasses exist,do not delete.",
|
||||
//InspectionService
|
||||
"Inspection_UserDisabled": "The current user has been disabled.",
|
||||
|
||||
// ------------------------------------------------------------Institution--------------------------------------------------------------------
|
||||
//CROService
|
||||
"CRO_DupName": "CRO with the same name already exists.Please confirm",
|
||||
"CRO_InProject": "The CRO has participated in the project and cannot be deleted.",
|
||||
//HospitalService
|
||||
"Hospital_DupName": "Hospital with the same name already exists.Please confirm",
|
||||
"Hospital_SiteAdded": "The current Site has been added to another Hospital",
|
||||
"Hospital_HasDoctors": "There are already doctors registered under the hospital's account and cannot be deleted.",
|
||||
//SiteService
|
||||
"Site_DupName": "Site with the same name already exists.Please confirm",
|
||||
"Site_InProject": "This site has been added to the project and cannot be deleted.",
|
||||
//SponsorService
|
||||
"Sponsor_DupName": "Sponsor with the same name already exists.Please confirm.",
|
||||
"Sponsor_InProject": "The sponsor has been added to the project and it is not allowed to delete.",
|
||||
|
||||
// ------------------------------------------------------------Management--------------------------------------------------------------------
|
||||
//MenuService
|
||||
"Menu_ParentDupChild": "A child node with the same name already exists under the parent node.",
|
||||
"Menu_ChildExist": " Child nodes already exists under this node . Delete the child nodes before deleting the node.",
|
||||
//UserService
|
||||
"User_UsernameExist": "The user name already exists.",
|
||||
"User_PhoneDup": "A user with the same phone number already exists in this user type.",
|
||||
"User_EmailDup": "A user with the same email already exists in this user type.",
|
||||
"User_NewOldPwdSame": "The new password is the same as the old one.",
|
||||
"User_OldPwdInvalid": "Failed to verify the old password. ",
|
||||
"User_LegalEmail": "Please input a legal email",
|
||||
"User_VerificationCodeError": "The verification code is wrong.",
|
||||
"User_VerificationCodeExpired": "The verification code has expired.",
|
||||
"User_CreateFailed": "Check the email address or contact maintainers. The email fails to be sent and the account cannot be created",
|
||||
"User_InvalidEmail": "Please enter a correct E-mail address.",
|
||||
"User_EmailError": "The email adress is wrong.",
|
||||
"User_InProject": "The user has participated in the project and cannot be deleted.",
|
||||
"User_Disabled": "The user has been disabled.",
|
||||
//UserTypeService
|
||||
"UserType_InUse": "User already exists in that user type, and it cannot be deleted.",
|
||||
|
||||
// ------------------------------------------------------------QC--------------------------------------------------------------------
|
||||
//QCCommon
|
||||
"QCCommon_CannotOperate": "CRC has submitted the image and it cannot be operated.",
|
||||
"QCCommon_NoPermission": "You are not the current recipient of the quality control task, so no operation authority!",
|
||||
"QCCommon_CheckTimeEarly": "The current visit check time {0} cannot be earlier than the previous visit check time {1}. Please check whether the check data is correct.",
|
||||
"QCCommon_CheckTimeLate": "The current visit check time {0} cannot be later than the visit check time {1} .Please check whether the check data is correct.",
|
||||
//QCOperationService
|
||||
"QCOperation_CheckFirst": "Please check the image first and save review questions before inquiry.",
|
||||
"QCOperation_QuestionExist": "The current visit with unclosed inquiry has been set to allow CRC to reupload the image. After CRC has reuploaded image, please close the original inquiry first and then add a new inquiry.",
|
||||
"QCOperation_QuestionCannotClose": "CRC has applied for reuploading or QC has agreed to reuploading and to close the inquiry is not allowed. Please do not close the inquiry until the QC rejects the reuploading request or the CRC reuploads the image.",
|
||||
"QCOperation_CloseReason": "Reason for closing:",
|
||||
"QCOperation_QuestionReplied": "The QC inquiry has been answered.",
|
||||
"QCOperation_NoPermissionReply": "You do not have permission to reply to the data reconciliation conversation.",
|
||||
"QCOperation_CannotClose": "The current visit is in the request fallback state, and the inquiry is not allowed to be closed.",
|
||||
"QCOperation_Reason": "Reason:",
|
||||
"QCOperation_CannotPass": "The current visit is in the rollback state, and the data reconciliation cannot be set.",
|
||||
"QCOperation_PassAfterClose": "Please close the data reconciliation inquiry first, and then set the data reconciliation pass.",
|
||||
"QCOperation_Cannotback": "The current visit has passed the consistency check and cannot be applied for rollback.",
|
||||
"QCOperation_CRCRollback": "CRC Apples for rollback.",
|
||||
"QCOperation_OtherCRC": "Other CRCs have applied for processing. Please refresh the page.",
|
||||
"QCOperation_PMReject": "PM/APM rejected the data reconciliation rollback.",
|
||||
"QCOperation_NoPermission": "You do not have operation permission.",
|
||||
"QCOperation_CannotRollback": "If the current visit has not been studied or study has passed, setbacks are not allowed.",
|
||||
"QCOperation_PMAPMConsistency": "PM/APM agrees to the data reconciliation rollback.",
|
||||
"QCOperation_NoModifyAfterSubmit": "Once submitted, no modifications are allowed.",
|
||||
"QCOperation_UnresolvedQCQuery": "This operation is not allowed, because the inquiry of the current visitis is not closed. ",
|
||||
"QCOperation_CrcNoDelete": "The CRC has been committed and cannot be deleted.",
|
||||
"QCOperation_NoRecipient": "You are not the current recipient of the quality control task, no operation authority!",
|
||||
"QCOperation_QCImageTaskAlreadyReleased": "The image quality control task of the current visit has been released by the original recipient. You can get it by 'pick up'.",
|
||||
"QCOperation_QCTaskNoAccess": "The image quality control task of the current visit has been claimed by other QC, so it is not allowed to pick up.",
|
||||
"QCOperation_QCConfigFirst": "Please configure the image quality control review question before receiving the image quality control task.",
|
||||
"QCOperation_NoQC": "The project configuration of image QC process was not check, and the QC Task was not picked up.",
|
||||
"QCOperation_InitialAuditPassed": "The first review has passed, continue to receive can not be allowed.",
|
||||
"QCOperation_NoSingleAudit": "The project is configured for single check, does not meet Submmit State: Submitted or Audit State: pending review/ in review, not allowed to collect.Please refresh the page.",
|
||||
"QCOperation_NoSameReviewer": "The secondary QC cannot be the same person as the primary QC.",
|
||||
"QCOperation_NoSecondaryAudit": "The project is configured for double check, does not meet Submmit State: Submitted or Audit State: pending review/ in QC review, not allowed to collect.Please refresh the page.",
|
||||
"QCOperation_NoTaskAccess": "You are not the current recipient of the quality control task, no operation authority!",
|
||||
"QCOperation_NoQCFunction": "The project configuration of image QC process was not check, so there is no need to cancel the task function.",
|
||||
"QCOperation_NoTaskOwner": "The current visiting image QC task has not been claimed by anyone,and cannot been released.",
|
||||
"QCOperation_DiseaseProgressConfirmation": "Current visit required confirmation of PD. Please process the unsubmitted prior visit before submitting the current visit: {0}.",
|
||||
"QCOperation_UnsubmittedVisits": " After submitting the current visit, please as soon as possible process any prior visits that have not been submitted: {0}.",
|
||||
"QCOperation_NoBaselineData": "No clinical data at baseline, confirm submission?",
|
||||
"QCOperation_NoImageData": "Dicom/ non-dicom image data has not been uploaded. Submission is not allowed.",
|
||||
"QCOperation_ImagesSubmitted": "The image data for the current visit has been submitted by another CRC.",
|
||||
"QCOperation_BatchImagesSubmitted": "The image data for visiting is currently submitted in batches, part of which has been submitted by other CRCS.",
|
||||
"QCOperation_MissingBaselineDate": "The project is configured with the visit base time. However, the subject did not fill in the visit base time, which is not allowed to submit.",
|
||||
"QCOperation_RemoveItem": "You have been removed from the project and have no operation rights.",
|
||||
"QCOperation_QCNotClosed": "This operation cannot be performed because the image quality control inquiry has not been closed for the current visit.",
|
||||
"QCOperation_NoQCNeeded": "The project configuration of image QC process was not check, and no need to set to image quality control pass.",
|
||||
"QCOperation_QCNotSaved": "Image quality control review question is not saved, and cannot be performed.",
|
||||
"QCOperation_NotChangePass": "The project configuration of image QC process was double check, so the current image QC task cannot change from the current state to pass.",
|
||||
"QCOperation_CannotChangeToPass": "The project configuration of image QC process was double check. The current audit state is {0}, which cannot be changed to approved.",
|
||||
"QCOperation_NoQCNeededNotEnd": "The project configuration of image QC process was not check, and setting image quality control termination is not allowed.",
|
||||
"QCOperation_CannotChangeToStop": "The project configuration of image QC process was single check, and the current review state is not In Primary QC and cannot be changed to the QC termination.",
|
||||
"QCOperation_CannotChangeStop": "The project configuration of image QC process was double check, and the current review state is {0} and cannot be changed to the QC termination.",
|
||||
"QCOperation_InvalidResend": "The current reupload state is not QC agree, so reuploading is not allowed.",
|
||||
"QCOperation_NoResendNeeded": "No check operation, there will be no need to reupload!",
|
||||
"QCOperation_InvalidAgreeResend": "The current reuploading state is not CRC requested and the approve of reuploading cannot be set.",
|
||||
"QCOperation_CannotAgreeResend": "At the current visit, there is an unclosed inquiry that QC set to agree to reupload, CRC has not completed the upload, currently is not allowed to set again.",
|
||||
"QCOperation_AgreeResend": "QC agrees to reupload.",
|
||||
"QCOperation_InvalidCompleteResend": "The current reupload state is not QC agree, setting reuploading completion is not allowed.",
|
||||
"QCOperation_NoImageNotAllowed": "No image is currently available, setting reuploading completion is not allowed.",
|
||||
"QCOperation_CRCTransferCompleted": "CRC reuploading has been completed. ",
|
||||
"QCOperation_InvalidTransferStatus": "The current inquiry reupload state is not the initial state| CRC reupload completed state, and requests for reuploading are not allowed",
|
||||
"QCOperation_CRCTransfer": "CRC requests to reupload/upload images.",
|
||||
"QCOperation_CannotModifyConfirmation": "The visit has been submitted, and the enrollment confirmation state cannot be modified.",
|
||||
"QCOperation_CannotModifyPDStatus": "This visit is regarded as a rollback visit, and modification of PD confirmation status is not allowed.",
|
||||
"QCOperation_ForwardingFailed": "Failed to forward the image:",
|
||||
//QCQuestionService
|
||||
"QCQuestion_DuplicateIndexFailed": "Operation failed because the serial number is repeated.",
|
||||
"QCQuestion_HasChildQuestion": "The current task has a sub-question and the deletion fails.",
|
||||
//TrialQCQuestionService
|
||||
"TrialQCQuestion_TemplateConfirmed": "Image quality control review question template has been confirmed, and no operation is allowed.",
|
||||
"TrialQCQuestion_DuplicateIndexFailed": "Operation failed because the serial number is repeated.",
|
||||
"TrialQCQuestion_DeleteChildFirst": "Before deleting the parent question, delete the child question that references the parent question.",
|
||||
"TrialQCQuestion_ReferencedByQCProcess": "This review question has been cited by the image quality control process and is not allowed to be deleted.",
|
||||
|
||||
// ------------------------------------------------------------QC--------------------------------------------------------------------
|
||||
|
||||
// ------------------------------------------------------------SiteSurvey--------------------------------------------------------------------
|
||||
//TrialSiteEquipmentSurveyService
|
||||
"TrialSiteEquipment_Locked": "Locked and not allowed to operate.",
|
||||
//TrialSiteSurveyService
|
||||
"TrialSiteSurvey_InvalidEmail": "Please enter the correct email address.",
|
||||
"TrialSiteSurvey_WrongVerificationCode": "The verification code is incorrect.",
|
||||
"TrialSiteSurvey_ExpiredVerificationCode": "The verification code has expired.",
|
||||
"TrialSiteSurvey_NoRecordToUpdate": "The site does not have a site survey record for the transferor , so it is not allowed to choose to update.",
|
||||
"TrialSiteSurvey_RecordUnderReview": "Your site survey record is in review and cannot be updated. If you need to update, please do so after rejection.",
|
||||
"TrialSiteSurvey_LockedByCurrentUser": "In the current site, the survey record form you submitted has been locked, and it is not allowed to update other people's email survey records.",
|
||||
"TrialSiteSurvey_LockedByOtherUsers": "In the current site, the survey record you submitted has been locked, Currently, the survey record form submitted by other personnel is not locked, so it is not allowed to update the survey record submitted by you before.",
|
||||
"TrialSiteSurvey_UnlockedRecordsExist": "The current site has unlocked survey records. Locked survey records cannot be updated.",
|
||||
"TrialSiteSurvey_NonLatestLockedRecord": "The site survey corresponding to the mailbox {0} is not the latest locked record and is not allowed to be updated!",
|
||||
"TrialSiteSurvey_AlreadyFilledByOtherUsers": "There are already survey forms filled out by other users under this site, and you are not allowed to fill them out",
|
||||
"TrialSiteSurvey_Locked": "The site survey has been locked, and no operation is allowed.",
|
||||
"TrialSiteSurvey_IRCNotification": "[from Extensive Imaging IRC] A reminder about the site survey approval.",
|
||||
"TrialSiteSurvey_CancelUnsubmittedRecord": "Only unsubmitted records are allowed to be repealed.",
|
||||
"TrialSiteSurvey_NoAdminAcces": "The operation is not allowed by the administrator.",
|
||||
"TrialSiteSurvey_FailedToGenerateAccountId": "If no value is obtained for the generated account Id, please check.",
|
||||
"TrialSiteSurvey_IRCInvitation": "[from Extensive Imaging IRC][{0}] Invitation letter",
|
||||
"TrialSiteSurvey_IRCInvitationContent": "Hello, as the IRC supplier of experiment plan No. {0} project, Extensive Imaging sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.",
|
||||
"TrialSiteSurvey_ViewAndConfirm": "Check and confirm",
|
||||
//TrialSiteUserSurveyService
|
||||
"TrialSiteUser_Locked": "Locked and not allowed to operate.",
|
||||
"TrialSiteUser_InconsistentInfo": "The user's account name in the system is{0}, and there are inconsistent items with the information filled in. Now modify the interface information to be consistent with the system and save it.",
|
||||
"TrialSiteUser_NoTestUserForFormal": "It is Formal and training projects that are not allowed to add test users.",
|
||||
"TrialSiteUser_NoFormalUserForTest": "It is the test project that regular users are not allowed in.",
|
||||
|
||||
// ------------------------------------------------------------Stat--------------------------------------------------------------------
|
||||
|
||||
// ------------------------------------------------------------TrialSiteUser--------------------------------------------------------------------
|
||||
//TrialConfigService
|
||||
"TrialConfig_JudgeTaskFail": "There are judge questions that the conditions for generating judge reading task are not configured, and the operation has failed!",
|
||||
"TrialConfig_StdConfigMissing": "Questions are not configured under the current standard.",
|
||||
"TrialConfig_SignTemplateMissing": "This operation requires electronic signature confirmation, but the signature template for this scenario is not found in the system.",
|
||||
"TrialConfig_ProjectEnded": "The trial project has ended or stopped, and configuration changes are not allowed.",
|
||||
"TrialConfig_NoImageAuditQuestion": "No image quality control review question is currently added. Please add the image quality control review question first, and then confirm.",
|
||||
"TrialConfig_DuplicateAuditQuestionId": "Image quality control review question display number cannot be repeated.",
|
||||
"TrialConfig_InvalidParentQuestionId": "Make sure that the display sequence number of the parent question is smaller than that of the child question.",
|
||||
"TrialConfig_AuditQuestionConfirmed": "The question of image quality control review has been confirmed by other personnel, and it is not allowed to be confirmed again.",
|
||||
"TrialConfig_ProjectNotInitialized": "This operation is not allowed because the current state of the project is not initialized.",
|
||||
"TrialConfig_UnconfirmedConfiguration": "There are unconfirmed items in the project configuration (logical configuration, process configuration, expedite configuration) and visit management, so the project state cannot be set to start.",
|
||||
"TrialConfig_UnconfirmedUNACKD": "Unable to change project status. There are unconfirmed items in the project configuration and visit management.",
|
||||
"TrialConfig_ProjectNotStarted": "The project is not in the start state and cannot be set to stop or complete.",
|
||||
//TrialExternalUserService
|
||||
"TrialExternalUser_Inconsistency": "The user's account name in the system is{0}, and there are inconsistent items with the information filled in. Now modify the interface information to be consistent with the system and save it.",
|
||||
"TrialExternalUser_EmailTypeDuplicate": "Please confirm that the system already has an account with the same email address and user type as the one entered in the list.",
|
||||
"TrialExternalUser_TestUserNotAllowed": "It is Formal and training projects that are not allowed to add test users.",
|
||||
"TrialExternalUser_FormalUserNotAllowed": "It is the test project that regular users are not allowed in.",
|
||||
"TrialExternalUser_NotEditable": "Personnel information cannot be edited. Please delete it and add it again.",
|
||||
"TrialExternalUser_CannotDelete": "The current user has participated in the project and cannot be deleted.",
|
||||
"TrialExternalUser_IRCInvitation": "Hello, as the IRC supplier of experiment plan No. {0} project, Extensive Imaging sincerely invites you to participate in the IRC related work of this project. Your guidance and suggestions are welcome.",
|
||||
"TrialExternalUser_ViewAndConfirm": "Check and confirm",
|
||||
"TrialExternalUser_InvitationExpired": "The invitation time has expired. You can only confirm it after you are invited again.",
|
||||
"TrialExternalUser_AccountInfo": "[from Extensive Imaging IRC][{0}] account information",
|
||||
"TrialExternalUser_Welcome": "Hello, welcome to participate in the relevant work of trial scheme No. {0}IRC of the project. This project adopts electronic workflow. The system and your account information are as follows:",
|
||||
"TrialExternalUser_ProjectNumber": "Trial ID: {0}",
|
||||
"TrialExternalUser_ExperimentPlanNumber": "Protocol ID: {0}",
|
||||
"TrialExternalUser_ExperimentName": "Study Name: {0}",
|
||||
"TrialExternalUser_Username": "User name: {0}",
|
||||
"TrialExternalUser_Password": "Password: {0}(Please modify it after login): ***(You already have your account. If you forget your password, please find it by email)",
|
||||
"TrialExternalUser_Role": "User role: {0}",
|
||||
"TrialExternalUser_LoginUrl": "System login address: {0} ",
|
||||
"TrialExternalUser_ReinvitationRequired": "The invitation time has expired. You can only confirm it after you are invited again.",
|
||||
"TrialExternalUser_UserIdStorageProblem": "There is a problem with the system user Id storage of the survey table. ",
|
||||
"TrialExternalUser_IRCAccountInfo": "[from Extensive Imaging IRC][{0}] account information",
|
||||
//TrialMaintenanceService
|
||||
"TrialMaint_PersonnelJoined": "Participant has participated in site maintenance",
|
||||
//TrialService
|
||||
"Trial_PMApmPermission": "Only PM/APM has the operation permission!",
|
||||
"Trial_TestUserCreateOnlyNonFormal": "Test users can only create informal projects",
|
||||
"Trial_DuplicateProjectNumber": "The same project ID already exists.",
|
||||
"Trial_InvalidProjectStatus": "Operations are allowed only when the project state is: initializing or ongoing.",
|
||||
"Trial_CannotDeleteProject": "Deleting project data is not allowed in the current running environment.",
|
||||
//TrialSiteService
|
||||
"TrialSite_ParticipantJoined": "The subjects has been added to this site, and couldn't be disable.",
|
||||
"TrialSite_CodeDuplicate": "Code is not allowed to be repeated",
|
||||
"TrialSite_CannotDeleteAssociatedCRC": "The site has been associated with CRC, and couldn't be deleted.",
|
||||
"TrialSite_CannotDeleteAssociatedSubject": "The subjects has been added to this site, and couldn't be deleted.",
|
||||
"TrialSite_CannotDeleteUploadedData": "The site has been uploaded study, and couldn't be deleted.",
|
||||
|
||||
// ------------------------------------------------------------Visit--------------------------------------------------------------------
|
||||
//SubjectService
|
||||
"Subject_NoConfirmedPlan": "The visit plan of the project is not confirmed. Please contact the program Manager to confirm the visit plan before adding subjects.",
|
||||
"Subject_DuplicateSubjectNum": "Subjects with the relevant subject ID already exists.",
|
||||
"Subject_UploadedVisitNoDelete": "The subject has visit that has uploaded the image, so deletion is not allowed.",
|
||||
//SubjectVisitService
|
||||
"Visit_DuplicateVisitNo": "The subject's visit schedule already includes a visit with the same visit ID.",
|
||||
"Visit_LastVisitNoChange": "The subject has already had a visit set as the last visit, and the current visit is not allowed to be set as the last visit.",
|
||||
"Visit_DuplicateVisitName": "The subject's visit schedule already includes a visit with the same visit name.",
|
||||
"Visit_NoExtraVisitAfterLast": "Unplanned visits are not allowed after the last evaluation is set.",
|
||||
"Visit_FinishedTasksNoAdd": "The subject has already completed the task of reading ( ordered reading standard ) in follow-up visit, which is not allowed to be added here. If necessary, please return.",
|
||||
"Visit_NoPDStatusChangeAfterSubmission": "The PD confirmation status cannot be modified after the current visit image is submitted.",
|
||||
"Visit_UploadedNoLost": "The current visit has already uploaded images and cannot be set as visit lost to follow-up.",
|
||||
"Visit_UploadedNoDelete": "The current visit has already uploaded images and deletion is not allowed.",
|
||||
"Visit_PlanVisitNoDelete": "Planned visits are not allowed to be deleted.",
|
||||
"Visit_PreviousVisitNoDelete": "The current visit has been set to the previous visit of another visit and cannot be deleted.",
|
||||
//VisitPlanService
|
||||
"VisitPlan_OnlyInitOrOngoing": "Can be operated only when the project state is: Initialization or ongoing.",
|
||||
"VisitPlan_LargerVisitNumLargerInterval": "In the visit plan, the interval between visits with a large number should also be larger than that of a visit with a smaller number.",
|
||||
"VisitPlan_LargerPlanNumLargerInterval": "In the visit plan, the planned visit with a large number should also have a larger interval than the planned visit with a smaller event number.",
|
||||
"VisitPlan_ExistNameOrNumTemplate": "A plan visit template with visit name or visit ID of project already exists in the visit plan.",
|
||||
"VisitPlan_ExistBaseline": "A baseline already exists in the visit plan.",
|
||||
"VisitPlan_ExistBaselineImgNoModify": "Subjects’ baseline image data has been uploaded, so modification of baseline visits is not allowed.",
|
||||
"VisitPlan_OnlyInitOrOngoingModifyConfirm": "Modification validation is allowed only when the project is initialized or ongoing.",
|
||||
"VisitPlan_NoBaselineNotConfirm": "No baseline, no validation allowed.",
|
||||
"VisitPlan_ConfigNotConfirmNotConfirm": "If the project configuration is not confirmed, the visit plan cannot be confirmed.",
|
||||
"VisitPlan_BaselineNotMinDayNotConfirm": "Baseline VisitDay is not minimal and does not allow validation.",
|
||||
"VisitPlan_CheckExport": "Check and export _{0}.xlsx",
|
||||
"VisitPlan_Assigned": "The visit plan has been assigned to the subjects and executed.",
|
||||
|
||||
// ------------------------------------------------------------WorkLoad--------------------------------------------------------------------
|
||||
//DoctorWorkloadService
|
||||
"DoctorWorkload_AssignType": "A task has been assigned and does not allow you to reduce the reading type.",
|
||||
"DoctorWorkload_Unique": "This type of data can only have one",
|
||||
"DoctorWorkload_FeeSettled": "Expenses have been settled and workload cannot be modified.",
|
||||
//EnrollService
|
||||
"Enroll_NotFound": "Cannot find trial {0}",
|
||||
"Enroll_EmailFormat": "The {0} mailbox format is faulty.",
|
||||
"Enroll_CannotRollback": "Reviewers with workload cannot go back",
|
||||
|
||||
// ------------------------------------------------------------Triggers--------------------------------------------------------------------
|
||||
//AddlTrialUserTrigger
|
||||
"AddlTrialUser_NoTestUser": "It is Formal and training projects that are not allowed to add test users.",
|
||||
"AddlTrialUser_NoFormalUser": "It is the test project that regular users are not allowed in.",
|
||||
//SubjectStateTrigger
|
||||
"SubjectState_CannotSetCurrentAsLastVisit": "The subject has already had a visit set as the last visit, and the current visit is not allowed to be set as the last visit.",
|
||||
"SubjectState_CannotSetAsLastVisitWithImage": "The image of the subject's visit after the current visit has been uploaded, and the current visit is not allowed to be set as the last visit.",
|
||||
//SubjectVisitFinalVisitTrigger
|
||||
"SubjectVisit_CannotSetAsLastVisit": "The subject's follow-up visits has uploaded images or submitted , and the current visit is not allowed to be set as the last visit.",
|
||||
|
||||
// ------------------------------------------------------------BusinessFilter--------------------------------------------------------------------
|
||||
//LimitUserRequestAuthorization
|
||||
"LimitUser_AuthTokenMissing": "User token was not retrieved from Header/URL, please contact developer",
|
||||
"LimitUser_AccountLoggedInElsewhere": "User token was not retrieved from Header/URL, please contact developer",
|
||||
//ModelActionFilter
|
||||
"ModelAction_InvalidAPIParameter": "Invalid parameters provided for the API.",
|
||||
//ProjectExceptionFilter
|
||||
"ProjectException_ConcurrentUpdateNotAllowed": "Concurrent update, operation not allowed at this time.",
|
||||
"Project_ExceptionContactDeveloper": "Program exception, please contact developer.",
|
||||
//TrialResourceFilter
|
||||
"TrialResource_NoAccessPermission": "Sorry, your account does not have operation permissions.",
|
||||
"TrialResource_ReferTrialIdFailed": "Regular expression failed to fetch trialId from request Refer, please contact developer to check",
|
||||
"TrialResource_InterceptedProjectStatusRule": "This request was blocked by configured rules: only operations allowed when project status is in progress, please contact developer if this logic is incorrect and needs to be modified",
|
||||
"TrialResource_MissingProjectNumber": "Project number not passed in the API parameters, please verify.",
|
||||
//UnifiedApiResultFilter
|
||||
"UnifiedAPI_ProgramError": "Program error, please contact developer.",
|
||||
|
||||
// ------------------------------------------------------------Helper--------------------------------------------------------------------
|
||||
//FileStoreHelper
|
||||
"FileStore_TemplateFileNotFound": "Database did not find the corresponding data template file for FileStoreHelper, please contact system maintenance personnel.",
|
||||
"FileStore_TemplateFileStoragePathInvalid": "No corresponding file was found on the storage path for the data template file of FileStoreHelper, please contact system maintenance personnel.",
|
||||
//SendEmailHelper
|
||||
"SendEmail_SendFail": "Failed to send email in SendEmailHelper. Your operation was unsuccessful, please check your email or contact maintenance personnel.",
|
||||
"SendEmail_NoRecipient": "No recipient in SendEmailHelper.",
|
||||
|
||||
// ------------------------------------------------------------IRaCIS.Core.Domain--------------------------------------------------------------------
|
||||
//Trial
|
||||
"Trial_number": "The serial number consists of five digits. The first two digits are the center number and the last three digits are the serial number. The serial number must be the same as that recorded by the EDC"
|
||||
|
||||
}
|
||||
|
||||
@@ -1,199 +1,24 @@
|
||||
{
|
||||
"test{0}{1}": "中文本地化{0}{1}",
|
||||
"RequiredAttribute": "{0} 字段是必须的",
|
||||
// SiteSurvey 服务--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// TrialSiteEquipmentSurveyService
|
||||
"CPMNotOperation": "CPM/APM 不允许操作", //CPM/APM 不允许操作
|
||||
"IsLockNotOperation": "已锁定 不允许操作", //已锁定 不允许操作
|
||||
|
||||
// TrialSiteSurveyService
|
||||
"ValidationEmail": "请输入正确的邮箱", // 验证邮箱
|
||||
"ValidationPhone": "请输入正确的手机号", // 验证手机号
|
||||
"SiteNotExistUpdateDisable": "该项目Site不存在该交接人的调研记录,不允许选择更新", // site不存在禁止更新
|
||||
"RecordLockUpdateDisable": "您的记录未锁定,不允许选择更新,若已经提交,可被驳回后进行操作", //记录锁定禁止更新
|
||||
"SiteLockUpdateDisableOther": "当前Site 您的调研记录已锁定,不允许更新其他人邮箱调研记录", //Site锁定禁止更新其他人
|
||||
"SiteLockUpdateDisableSelf": "当前Site 您的调研记录已锁定,也存在其他未锁定的记录,不允许更新自己的调研记录", //Site锁定禁止更新自己
|
||||
"SiteLockUpdateDisableEmail": "当前Site 存在未锁定的调研记录,不允许更新已锁定邮箱的调研记录", //Site锁定禁止更新邮箱调研记录
|
||||
"EmailNotLatestDisableEmail{0}": "该邮箱{0}对应的调查表不是最新锁定的记录,不允许更新!", //邮箱调研表不是最新 不允许更新
|
||||
"SiteExistOtherUpdateDisable": "该Site下已经有其他用户已填写的调研表,您不被允许继续填写", //存在其他用户调研表不允许填写
|
||||
"IsLockUpdateDisable": "已锁定,不允许操作", //已锁定,不允许操作
|
||||
"OnlyAbolishNotFiled": "只允许废除未提交的记录", //只允许废除未提交的记录
|
||||
"AdminOperateDisable": "不允许Admin操作", // 不允许Admin操作
|
||||
"UserWrongNotSubmit": "人员信息有不正确项,不允许提交", // 人员信息有不正确项,不允许提交
|
||||
"FillInTheType{0}": "请填写生成账号的类型。人员姓名{0}", // 请填写生成账号的类型。人员姓名
|
||||
|
||||
// TrialSiteUserSurveyService
|
||||
"InfoInconformity{0}": "该用户在系统中账户名为:{0} ,与填写信息存在不一致项, 现将界面信息修改为与系统一致,可进行保存", // 信息不一致 修改一致进行保存
|
||||
|
||||
|
||||
// TrialSiteUser 服务------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// TrialConfigService
|
||||
"NoDataDound": "未在系统中找到该签名场景的数据", //未在系统中找到该签名场景的数据
|
||||
"PasswordError": "密码错误", //密码错误
|
||||
"UserBeDisabled": "用户被禁用", // 用户被禁用
|
||||
"ProjSetDisable": "项目不在Initializing/Ongoing,不允许确认配置", //不允许确认配置
|
||||
"QCRepate": "QC问题显示序号不允许重复", // QC问题显示序号不允许重复
|
||||
"ParentNumToLow": "父问题的序号要比子问题序号小,请确认", // 父问题的序号要比子问题序号小,请确认
|
||||
"ExistUnconfirmedItems": "项目、基础配置、流程配置、加急配置、访视计划,有未确认项", // 存在未确认项
|
||||
"NotAllCanOperate": "只有“初始化中”和“正在进行中”才能进行操作", //只有“初始化中”和“正在进行中”才能进行操作
|
||||
|
||||
// TrialExternalUserService
|
||||
"InfoDoNotAgree{0}{1}": "该用户在系统中账户名为:{0} 电话:{1},与填写信息存在不一致项, 现将界面信息修改为与系统一致,可进行保存", // 用户信息不一致
|
||||
"UserExist": "该邮箱和用户类型,已存在该账户", //该邮箱和用户类型,已存在该账户
|
||||
|
||||
// TrialMaintenanceService
|
||||
"OneTrial": "一次验证中只能一个PM",
|
||||
"Participant": "参与过现场维护工作",
|
||||
|
||||
// TrialService
|
||||
"OnlyPMAPM": "仅PM/APM可以操作!",
|
||||
"TrialIDExist": "相同的试用ID已经存在。",
|
||||
"ProjNot": "项目初始化或者进行中时,才允许操作",
|
||||
"TrialConfirm": "Trial访视计划已经确认,无法删除",
|
||||
"TrialIntoTheGroup": "该Trial有医生入组或在入组流程中,无法删除",
|
||||
"TrialHaveSite": "该Trial下面有Site,无法删除",
|
||||
"TrialHaveParticipants": "该Trial下面有参与者,无法删除",
|
||||
"NotRevertEditable": "部分主题已生成VisitPlan,无法恢复编辑状态",
|
||||
|
||||
// TrialSiteService
|
||||
"CodeRepeated": "编码不允许重复",
|
||||
"CRCCanNotDeleted": "该站点已与CRC关联,无法删除",
|
||||
"SiteCanNotDeleted": "主题已添加到本网站,无法删除",
|
||||
"StudyCanNotDeleted": "该网站已上传研究,无法删除",
|
||||
|
||||
// Visit -------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// SubjectService
|
||||
"VisitNotConfirmed": "试访计划尚未确定。添加主题前请联系项目经理确认访问计划",
|
||||
"ExistedTrial": "在本试验中已经存在一个具有相同受试者ID的受试者.",
|
||||
"TheLastVisit": "该受试者已经有访视设置为末次访视,不允许将该访视设置为末次访视",
|
||||
"ImagesUploaded": "该受试者此访视后有影像上传,该访视不允许设置为末次访视",
|
||||
"StudyImagesCanBotDeleted": "本课题已上传研究图像进行访问,无法删除",
|
||||
|
||||
// SubjectVisitService
|
||||
"ContainsVisitnum": "这个主题的访问计划已经包含了一个访问次数相同的访问",
|
||||
//该受试者已经有访视设置为末次访视,不允许将该访视设置为末次访视 这个在上面有 TheLastVisit
|
||||
"LastEvaluationNotAllowed": "设置末次评估后,不允许添加计划外访视",
|
||||
"CRCSubmit": "CRC提交后,不允许修改PD确认状态",
|
||||
"BacktrackingVisits": "回退的访视,不允许修改PD确认状态",
|
||||
"ImageUpload": "该受试者此访视后有影像上传,该访视不允许设置为末次访视",
|
||||
"AssociatedUploaded": "本次访问与上传的研究图片有关,无法删除",
|
||||
"InPlanCanNotDeleted": "此访问为InPlan,不能删除",
|
||||
|
||||
// VisitPlanService
|
||||
"OnlyInitializing": "只有“初始化中”和“正在进行中”才能进行操作",
|
||||
"AccordWithVisitNum": "对于访问计划,具有较大VisitNum的VisitDay应该大于具有较小VisitNum的VisitDay",
|
||||
"same/VisitName": "当前访问计划中已经存在具有相同VisitName/VisitNum的访问",
|
||||
"AlreadyBaseline": "已访视是当前访视计划的基线",
|
||||
"IsUploadVideo": "有CRC已经为基线上传了影像数据,不允许修改基线",
|
||||
"VisitHasBeenExecuted": "访问计划已分配给受试者并执行",
|
||||
"OnlyProgressCanEdit": "仅仅在项目初始化或者进行中时,才允许修改确认",
|
||||
"NoBaselineNoConfirmation": "没有基线,不允许确认",
|
||||
"NotConfirmedCanNotVisit": "项目配置未确认,不允许确认访视计划",
|
||||
"VisitDayNotMinimum": "基线VisitDay 不是最小的, 不允许确认",
|
||||
|
||||
|
||||
//Document-----------------------------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
//SystemDocumentService
|
||||
"ExistsFileName": "同类型已存在该文件名",
|
||||
"SignedUser": "该文档下已有签名的用户",
|
||||
|
||||
//TrialDocumentService
|
||||
|
||||
//同类型已存在该文件名 上面存在 ExistsFileName
|
||||
"ExistsSignedUser": "该文档,已有用户签名,不允许删除",
|
||||
//password error 上面存在 PasswordError
|
||||
//The user has been disabled 上面存在 UserBeDisabled
|
||||
"DocumentsSigned": "该文档已经签名",
|
||||
"FileBeDelete": "文件已删除或者废除,签署失败",
|
||||
|
||||
//QC--------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
// ClinicalDataService
|
||||
|
||||
// NoneDicomStudyService
|
||||
|
||||
// QCListService
|
||||
"NotFirstTrial": "当前用户不是初审用户,不允许操作",
|
||||
"NotReviewUser": "当前用户不是复审用户,不允许操作",
|
||||
|
||||
// QCOperationService
|
||||
"AuditQuestionMust": "必须填写审核问题,并保存,否则不允许添加质疑",
|
||||
"VisitNoClose": "当前访视有未关闭的 同意CRC上传的质疑,不允许再次添加质疑",
|
||||
"NotFinish": "CRC申请重传的/QC同意重传的质疑,在CRC设置重传完成前不允许关闭质疑",
|
||||
"QCHasBeenReplied": "此QC质询已回复",
|
||||
"OperationUserMustBeCRC/PM": "一致性核查对话操作用户 只允许 CRC/PM",
|
||||
"CanNotCloseQuery": "执行一致性核查的访视 不允许关闭质疑",
|
||||
"OnlyPMCanSet": "只允许PM 手动设置一致性核查通过",
|
||||
"CanNotSettingConsistency": "当前是PM同意回退,不允许设置一致性核查通过",
|
||||
"ConsistencyNotClose": "致性核查质疑未关闭/审核状态不是通过,不允许设置一致性核查通过",
|
||||
"PassDataNotFallback": "核查通过的数据不允许申请回退",
|
||||
"OnlyPMFallback": "只允许PM 回退",
|
||||
"UnderDetectionNotFallback": "待核查/核查通过的数据不允许回退",
|
||||
"OnlyPMCanOperation": "只允许PM 操作",
|
||||
"OnlyExcelCSV": "只允许Excel、 CSV!",
|
||||
"ExcelVerificationFailed": "请上传规定格式的Excel文件,保证有有效数据",
|
||||
"QCUnconfirmed": "QC问题未确认,不允许领取任务",
|
||||
"MustBeFinish": "您已经领取了其他受试者,完成后才允许领取新的受试者",
|
||||
"BeReceive": "当前已被领取,不允许领取",
|
||||
"CancelQCTask": "项目配置为不审,没有领取或者取消QC Task",
|
||||
"FirstTriaPassed": "初审已通过,不能继续领取",
|
||||
"CanNotReceive": "项目配置为单审,不满足SubmmitState:已提交 或者 AuditState:待审核/审核中, 不允许领取,请刷新界面",
|
||||
"MustBeDifferent": "复审不能和初审是同一个人",
|
||||
"IsNotSatisfied": "项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面",
|
||||
"VisitNotUploaded": "有访视未上传任何Dicom/非Dicom数据 不允许提交",
|
||||
"MandatoryFailed": "项目配置了需要填写首次给药日期 但是受试者没有填写首次给药日期,不允许提交",
|
||||
"YouBeenRemoved": "您已经被移出项目,不允许该操作",
|
||||
"QuestionsNotClosed": "有质疑未关闭,不允许该操作",
|
||||
"CanNotSetQCPassed": "不审状态下,不允许设置为QC Passed",
|
||||
"MustSetQuestion": "必须填写审核问题,并保存,否则不允许提交",
|
||||
"CanNotChangeQCPassed": "项目配置为单审 当前审核状态不为 InPrimaryQC,不能变更到 QCPassed",
|
||||
// "必须填写审核问题,并保存,否则不允许提交" 上面 MustSetQuestion
|
||||
"TrialIsDoubleCheck{0}": "项目配置为双审 当前审核状态为 {0},不能变更到 QCPassed",
|
||||
"CanNotSetQCFailed": "不审状态下,不允许设置为QC Failed",
|
||||
"NotInPrimaryQCQCFailed": "项目配置为单审 当前审核状态不为 InPrimaryQC,不能变更到 QCFailed",
|
||||
"TrialIsDoubleCheckCanNotQCFailed{0}": "项目配置为双审 当前审核状态为 {0},不能变更到 QCFailed",
|
||||
"CRCHasBeenSubmitted": "CRC已提交了 不能修改入组确认状态",
|
||||
"CannotBeChangedPD": "回退的访视,不允许修改PD确认状态",
|
||||
"OtherQCProcessAudit": "其他QC正在进行审核,当前操作不允许",
|
||||
"ForwardFailed": "转发失败",
|
||||
|
||||
// QCQuestionService
|
||||
|
||||
// TrialQCQuestionService
|
||||
"QCHasConfirmed": "QC已确认,不允许操作",
|
||||
"BeforeClearSubproblem": "清除子问题 才允许删除父问题",
|
||||
"HasQCAuditRecord": "已有QC审核记录,不允许删除问题项",
|
||||
|
||||
|
||||
//ImageAndDoc -----------------------------------------------------------------------------------------------------------------------------
|
||||
|
||||
//DicomArchiveService
|
||||
|
||||
//ImageShareService
|
||||
"NoImage": "目前研究中没有图片,不能分享!",
|
||||
"ResourceNotExist": "资源不存在!",
|
||||
"PasswordIsError": "共享密码错误!",
|
||||
"ResourceExpired": "资源共享过期!",
|
||||
|
||||
//InstanceService
|
||||
|
||||
//SeriesService
|
||||
|
||||
//StudyListService
|
||||
|
||||
"TimeTooLow": "当前访视检查时间不能小于该访视之前检查的时间,请核对检查数据是否有误",
|
||||
"SomeoneLoading": "当前有人正在上传归档该检查!",
|
||||
"VisitEnd": "受试者访视结束,不允许上传!",
|
||||
"DICOMUploaded{0}{1}{2}{3}": "{0}:此DICOM图片已上传并分配给课题{2}(研究ID:{3})的{1},课题{2}无法继续上传并分配给他人。",
|
||||
|
||||
//StudyService
|
||||
|
||||
//SystemAnonymizationService
|
||||
// ------------------------------------------------------------Controllers--------------------------------------------------------------------
|
||||
//FinancialChangeController
|
||||
"Financial_ChargeSettled": "费用已经结算,无法重置工作量",
|
||||
"Financial_InvalidParameter": "无效的参数。",
|
||||
//UploadDownLoadController
|
||||
"UploadDownLoad_UnsupportedMedia": "不支持的MediaType",
|
||||
"UploadDownLoad_ArchiveInProgress": "当前已有人正在上传和归档该检查!",
|
||||
"UploadDownLoad_InvalidData": "请保证上传数据符合模板文件中的样式,且存在有效数据。",
|
||||
"UploadDownLoad_RequestError": "请求异常,请重试!",
|
||||
"UploadDownLoad_SupportedFormats": "支持.xlsx、.xls、.csv格式的文件上传。",
|
||||
|
||||
// ------------------------------------------------------------Reading--------------------------------------------------------------------
|
||||
//ClinicalDataSetService
|
||||
"ClinicalDataSet_DupTypeFail": "存在同类型的临床数据,操作失败",
|
||||
//ReadingClinicalDataService
|
||||
"ReadingClinicalData_DupTypeFail": "存在同类型的临床数据,操作失败",
|
||||
"ReadingClinicalData_Unchecked": "当前临床数据状态不是已核查状态,不允许签名!",
|
||||
//ReadingGlobalTaskService
|
||||
"ReadingGlobal_NotGlobal": "系统调用错误,当前任务不是全局阅片任务。",
|
||||
//ReadingImageTaskService
|
||||
@@ -201,14 +26,19 @@
|
||||
"ReadingImage_CantSplit": "当前任务是基线任务,不能执行分裂病灶的操作。",
|
||||
"ReadingImage_BeSigned": "当前任务已经签名,请勿重复提交。",
|
||||
"ReadingImage_Beinvalid": "当前任务已失效,不能执行阅片。",
|
||||
"ReadingImage_PresenceReview": "当前受试者存在重阅申请还未处理,不允许操作",
|
||||
"ReadingImage_NotaTask": "合并的病灶并非同一个访视任务",
|
||||
"ReadingImage_DeleteError": "当前病灶分裂出其他病灶或者其他病灶合并到了当前病灶,删除失败。",
|
||||
"ReadingImage_Idnotcorrespond": "病灶标记添加失败,影像的InstanceId和SeriesId不对应。",
|
||||
"ReadingImage_Idnotcorrespond": "病灶标记添加失败,影像的Instance ID和Series ID不对应。",
|
||||
"ReadingImage_IsLymphNotbigger": "当前访视该淋巴结非靶病灶的短径小于上一访视的值,不能设置为显著增大。",
|
||||
"ReadingImage_NotLymphNotbigger": "当前访视该非淋巴结非靶病灶的长径小于上一访视的值,不能设置为显著增大。",
|
||||
"ReadingImage_Twice": "系统调用错误,提交的问题及答案重复。",
|
||||
"ReadingImage_MaxQuestion": "按照《独立影像评估章程》的相关规则,当前病灶类型的病灶数量不超过{0}个。",
|
||||
"ReadingImage_Maxlesion": "按照《独立影像评估章程》的相关规则,同一器官的靶病灶数量不超过{0}个,请确认",
|
||||
"ReadingImage_Maximum": "\"{0}\"的重复次数限制为{1},目前已重复{2}次。",
|
||||
"ReadingImage_RequiredQuestion": "\"{0}\"已设置为必填,当前答案为空或未保存。",
|
||||
"ReadingImage_Maximum": "{0}的重复次数限制为{1},目前已重复{2}次。",
|
||||
"ReadingImage_PCWGMaximum": "按照《独立影像评估章程》的相关规则,同一部位的基线病灶只需录入{0}次,请确认。",
|
||||
"ReadingImage_NotNewFocus": "转换后的任务不应该存在新病灶",
|
||||
"ReadingImage_RequiredQuestion": "提交前,请完成{0}",
|
||||
"ReadingImage_ClinicalRead": "临床数据未阅读,请确认!",
|
||||
"ReadingImage_IDMust": "系统调用失败,当没有任务ID的时候,标准ID必传。",
|
||||
"ReadingImage_TaskFinish": "当前受试者所有阅片任务已完成,请知悉。",
|
||||
@@ -220,7 +50,7 @@
|
||||
"ReadingOncology_Abnormal": "系统调用异常,裁判结果为null。",
|
||||
//ReadingCalculate
|
||||
"ReadingCalculate_Abnormal": "PCWG3标准配置错误,数据验证失败。",
|
||||
"ReadingCalculate_Questionable": "病灶存在以下问题:",
|
||||
"ReadingCalculate_questionable": "病灶存在以下问题:",
|
||||
"ReadingCalculate_NoMarker": "病灶{0}缺少标记",
|
||||
"ReadingCalculate_StatusIsEmpty": "病灶{0}状态为空",
|
||||
"ReadingCalculate_NoMarkerEmpty": "病灶{0}未做标记,且状态为空",
|
||||
@@ -229,10 +59,492 @@
|
||||
"MedicalReview_invalid": "该医学审核任务已失效,操作失败。",
|
||||
"MedicalReview_SaveQuestion": "无法执行当前操作,请先保存医学审核问题。",
|
||||
"MedicalReview_NeedSave": "无法执行当前操作,请先保存医学审核问题和结论。",
|
||||
"MedicalReview_NotClosed": "无法执行当前操作,当前医学质询对话未关闭。"
|
||||
"MedicalReview_NotClosed": "无法执行当前操作,当前医学质询对话未关闭。",
|
||||
"MedicalReview_Finish": "当前医学审核任务为最后一个任务。",
|
||||
//ReadingMedicineQuestionService
|
||||
"ReadingMed_QNumDup": "当前问题序号存在重复",
|
||||
"ReadingMed_HasSubQ": "此问题存在子问题,请先删除子问题",
|
||||
"ReadingMed_NoMedQ": "当前未添加医学审核问题。请先添加医学审核问题,再进行确认。",
|
||||
"ReadingMed_MedQNumDup": "影像医学审核问题显示序号不能重复。",
|
||||
"ReadingMed_ParentNumSmall": "父问题的显示序号要比子问题的显示序号小,请确认。",
|
||||
"ReadingMed_GlobalQNotConfig": "当前标准启用了全局阅片,但未配置全局医学审核问题",
|
||||
"ReadingMed_ArbitrateQNotConfig": "当前标准启用了仲裁阅片,但未配置仲裁医学审核问题",
|
||||
"ReadingMed_TumorQNotConfig": "当前标准启用了肿瘤学阅片,但未配置肿瘤学医学审核问题",
|
||||
//UserService
|
||||
"User_CheckNameOrPw": "请检查用户名或者密码。",
|
||||
//Repository
|
||||
"Repository_UpdateError": "修改的数据在数据库不存在。",
|
||||
"Repository_DeleteError": "删除的数据在数据库不存在。",
|
||||
//OrganInfoService
|
||||
"OrganInfo_DuplicateData": "存在相同的数据,操作失败",
|
||||
//ReadingCriterionService
|
||||
"ReadingCriterion_Referenced": "当前标准被引用过了,不可以删除",
|
||||
"ReadingCriterion_InUse": "此标准在项目里面已被使用,操作失败",
|
||||
"ReadingCriterion_ArbitratorWithoutJudgment": "无裁判问题却有仲裁对象,操作失败",
|
||||
//ReadingQuestionService
|
||||
"ReadingQuestion_IdDup": "问题编号重复",
|
||||
"ReadingQuestion_ChildrenExist": "此问题存在子问题,请先删除子问题",
|
||||
"ReadingQuestion_GroupReferenced": "此分组已被引用,请先删除被引用的问题",
|
||||
"ReadingQuestion_JudgmentSet": "当前问题已经设置了裁判标准了,修改失败",
|
||||
"ReadingQuestion_ExcludeWithDependency": "显示依赖父问题和必填依赖的问题为同一个,但答案互斥,操作失败",
|
||||
"ReadingQuestion_CircularDependency": "计算依赖循环了!",
|
||||
//ReadingPeriodSetService
|
||||
"ReadingPeriodSet_AlreadyAdded": "{0}已经添加过阅片期,无法设置生效",
|
||||
"ReadingPeriodSet_TaskCompletedCannotRevoke": "当前标准阅片已生成任务并且阅片完成,撤销失败。",
|
||||
"ReadingPeriodSet_LastVisit": "末次访视",
|
||||
//ReadModuleService
|
||||
"ReadModule_AlreadyAdded": "当前访视已经添加过阅片期",
|
||||
"ReadModule_AddGlobalFirst": "请先添加全局阅片",
|
||||
"ReadModule_VisitNotFound": "未找到符合要求的访视",
|
||||
"ReadModule_SignedDataCannotDelete": "临床资料已签名,不允许删除",
|
||||
"ReadModule_TumorExists": "当前访视存在肿瘤学阅片,请先删除肿瘤学阅片",
|
||||
"ReadModule_TaskGenerated": "当前阅片已生成任务,操作失败。",
|
||||
|
||||
// ------------------------------------------------------------Allocation--------------------------------------------------------------------
|
||||
//TaskAllocationRuleService
|
||||
"TaskAllocation_DoctorIdNotFound": "错误,未在入组表中找到该医生的账号Id",
|
||||
"TaskAllocation_DoctorConfigExists": "已有该医生配置,不允许继续增加",
|
||||
"TaskAllocation_TaskAssigned": "已分配任务给该医生,不允许删除",
|
||||
//TaskConsistentRuleService
|
||||
"TaskConsistent_ConsistencyConfigExists": "请配置一致性分析的医生",
|
||||
"TaskConsistent_TaskGenerated": "已有该项目配置,不允许继续增加",
|
||||
"TaskConsistent_MedicalAuditTaskExists": "该标准已有Subject 生成了任务,不允许修改配置",
|
||||
"TaskConsistent_SignedTaskCannotBeInvalidated": "该标准已产生一致性分析任务,不允许删除",
|
||||
//TaskMedicalReviewRuleService
|
||||
"TaskMedicalRule_TaskAlreadyAssigned": "已有该医生配置,不允许继续增加",
|
||||
"TaskMedicalRule_TaskStarted": "已产生医学审核任务",
|
||||
//TaskMedicalReviewService
|
||||
"TaskMedical_DirtyData": "已签名的不允许设置为失效",
|
||||
"TaskMedical_SubjectInOtherArm": "当前有任务已分配给其他人,不允许分配,请刷新列表",
|
||||
//VisitTaskService
|
||||
"VisitTask_VisitTask_TaskAlreadyApplied": "该项目还未确认任何一个阅片标准",
|
||||
"VisitTask_DoctorConfigNotFound": "当前医生已开始做该Subject 该标准的任务,不允许取消分配",
|
||||
"VisitTask_BackendDataError": "其中一个任务已分配给该医生,不允许分配",
|
||||
"VisitTask_DirtyData": "出现脏数据 任务来源字段没有值",
|
||||
"VisitTask_MissingTaskSource": "该受试者有访视进入了退回流程,还未经过一致性核查通过,不允许分配",
|
||||
"VisitTask_InconsistentSubjectStatus": "有Subject 在其他Arm组已有该医生,不允许在新的组添加该医生",
|
||||
"VisitTask_DuplicateDoctorInArm": "有Subject 已有该Arm组的医生,不允许继续分配,请刷新页面,确认页面数据是否过期",
|
||||
"VisitTask_DoctorAlreadyInArm": "有Subject任务已应用,不允许取消分配",
|
||||
"VisitTask_TaskAlreadyApplied": "在配置表中未找到配置的医生,无法应用绑定,请核对数据",
|
||||
"VisitTask_DoctorConfiguration": "后台数据有错误",
|
||||
"VisitTask_BackendData": "未阅片完成,或者未生效的任务不允许申请重阅",
|
||||
"VisitTask_UnreadTask": "重阅已申请,或者重阅已同意状态下不允许申请重阅",
|
||||
"VisitTask_NoPMRecheck": "手动生成任务的不允许PM 申请影像重阅",
|
||||
"VisitTask_Reapply": "PM 不允许对一致性分析任务进行申请重阅",
|
||||
"VisitTask_ConsistencyAnalysis": "PM 仅仅允许对访视类型的任务申请重阅",
|
||||
"VisitTask_VisitTypeRestriction": "当前为有序阅片,该受试者已有访视已申请重阅还未处理(项目组申请),暂不能继续申请重阅",
|
||||
"VisitTask_SequentialReading": "当前为有序阅片,该受试者已有访视已申请重阅还未处理,暂不能继续申请重阅",
|
||||
"VisitTask_ImageProblem": "当前为有序阅片,影像存在问题,项目组已申请回退,暂不能申请重阅",
|
||||
"VisitTask_LastReading": "有序阅片,只允许申请该受试者阅片人最后一次完成全局任务重阅",
|
||||
"VisitTask_LastOncologistRecheck": "有序阅片,只允许申请该受试者阅片人最后一次完成肿瘤学任务重阅",
|
||||
"VisitTask_LastAdjudicatorRecheck": "有序阅片,只允许申请该受试者阅片人最后一次完成裁判的任务重阅",
|
||||
"VisitTask_IRGlobalRecheck": "无序阅片,仅仅允许IR 申请 全局和访视类型类别的任务进行重阅",
|
||||
"VisitTask_IRReapply": "无序阅片,仅仅允许IR申请全局和访视类型类别的任务进行重阅",
|
||||
"VisitTask_InvalidReapplyStatus": "当前重阅任务状态不为已申请状态,不允许进行处理,请刷新页面",
|
||||
"VisitTask_ReapplyStatusConflict": "当前申请重阅任务的状态,已被其他任务重阅已影响,不允许对该状态下的任务进行重阅同意与否操作",
|
||||
"VisitTask_ReReadTaskNotApplied": "仅允许同意访视类型的任务重阅",
|
||||
"VisitTask_ReReadTaskAlreadyAffected": "不符合 PM申请 SPM / CPM审批 | IR申请 PM 审批 ",
|
||||
"VisitTask_TaskTypeNotApproved": "当前重阅任务状态不为已申请状态,不允许进行处理,请刷新页面",
|
||||
"VisitTask_NoImageReturn": "手动生成任务的不允许在此入口影像退回",
|
||||
"VisitTask_NonEffectiveTaskCannotBeReturned": "仅仅允许针对生效、未完成的访视任务进行退回操作,请刷新页面数据",
|
||||
"VisitTask_NoFurtherReturn": "当前访视已回退到影像上传,不允许继续回退!",
|
||||
"VisitTask_ConsistencyTaskCannotBeReturned": "一致性分析的任务,不允许设置退回",
|
||||
"VisitTask_PMOnlyAllowedForReturn": "仅PM 可以进行回退操作",
|
||||
"VisitTask_UnsupportedTaskType": "不支持重阅的任务类型",
|
||||
"VisitTask_UndefinedList": "当前用户查看列表未定义",
|
||||
"VisitTask_NoConsistencyReturn": "不允许退回一致性分析任务",
|
||||
"VisitTask_VisitTypeTaskAllowedForPMOnly": "仅仅访视类型的任务支持PM退回",
|
||||
|
||||
// ------------------------------------------------------------Common--------------------------------------------------------------------
|
||||
//CommonDocumentService
|
||||
"Document_CodeDuplication": "文档的Code不能够重复。",
|
||||
"Document_SingleTemplate": "一个场景一个标准只允许有一个模板文档",
|
||||
"Document_ TemplateRead": "读取模板内容失败, 请将文件另存为docx格式尝试!",
|
||||
//DictionaryService
|
||||
"Dictionary_DictionaryName": "已有{0}名称的字典",
|
||||
"Dictionary_DictionaryDeletion": "当前字典在标准中被引用,不允许删除!",
|
||||
"Dictionary_SubitemDeletion": "有子项数据,不允许直接删除!",
|
||||
"Dictionary_ResumeReference": "当前条目已经在阅片人的简历中被引用。",
|
||||
"Dictionary_ProjectReference": "当前条目已经在项目信息中被引用。",
|
||||
"Dictionary_StandardReference": "当前条目已经在阅片标准中被引用。",
|
||||
//ExcelExportService
|
||||
"ExcelExport_UnsupportedExport": "当前标准导出还未支持",
|
||||
//MailService
|
||||
"Mail_EmailResetReminder": "[来自展影IRC] 关于重置邮箱的提醒",
|
||||
"Mail_Dear": " 尊敬的 {0} , ",
|
||||
"Mail_ResettingEmail": "您正在进行邮箱重置操作",
|
||||
"Mail_IRCResettingPassword ": "[来自展影IRC] 关于重置密码的提醒",
|
||||
"Mail_ResettingPassword ": "您正在进行邮箱重置密码操作",
|
||||
"Mail_ImagingIRCReminder": "[来自展影IRC]的提醒",
|
||||
"Mail_IRCProject": "您正在参与展影医疗IRC项目",
|
||||
"Mail_ProjectParticipationReminder": "[来自展影IRC] [{0}] 关于中心调研的提醒",
|
||||
"Mail_CenterResearchReminder": "您正在参与展影医疗IRC项目中心调研工作",
|
||||
"Mail_AccountCreationReminder": "[来自展影IRC] 关于创建账户的提醒",
|
||||
"Mail_AccountPasswordResetReminder": "[来自展影IRC] 关于重置账户密码的提醒",
|
||||
"Mail_InvitationEmail": "[来自展影IRC] [{0}]邀请信",
|
||||
|
||||
// ------------------------------------------------------------Doctor--------------------------------------------------------------------
|
||||
//DoctorService
|
||||
"Doctor_DupPhoneOrEmail": "当前的电话或电子邮件号码已经存在",
|
||||
"Doctor_DupPhone": "当前的电话号码已经存在!",
|
||||
"Doctor_DupEmail": "当前的邮箱已经存在!",
|
||||
"Doctor_StandardDuplicateFileTypeError": "当前标准已添加过此类型文件",
|
||||
"Doctor_RequiredDocumentsError": "简历及顾问协议必须上传",
|
||||
|
||||
// ------------------------------------------------------------Document--------------------------------------------------------------------
|
||||
//SystemDocumentService
|
||||
"SystemD_DuplicateFile": "系统中已存在同类型的同名文件。",
|
||||
"SystemD_CannotDeleteSignedFile": "已有用户阅读该文档,并签名,不允许删除。",
|
||||
//TrialDocumentService
|
||||
"TrialD_DuplicateFileInProject": "该项目中已经存在同类型的同名文件。",
|
||||
"TrialD_DocumentHasAlready": "已有用户阅读该文档,并签名,不允许删除。",
|
||||
"TrialD_FileAlreadySigned": "该文件已经签名",
|
||||
"TrialD_ObsoleteFile": "文件已废除,签署失败!",
|
||||
//TrialEmailNoticeConfigService
|
||||
"TrialEmailN_TaskNotSigned": "进行邮件发送前,该任务必须已签名完成并已经触发完成相应的任务生成",
|
||||
"TrialEmailN_NoRecipient": "没有收件人,无法发送邮件",
|
||||
"TrialEmailN_InvalidEmailConfig": "项目发件邮箱配置有误,请核实",
|
||||
"TrialEmailN_EmailTemplateNotFound": "找不到该项目标准场景下邮件模板",
|
||||
"TrialEmailN_EnrollmentConfirmation": "【入组确认报告】关于{0}项目{1}受试者",
|
||||
"TrialEmailN_Enrollment": " 附件为入组确认报告,请查收",
|
||||
"TrialEmailN_PDReport": "【疾病进展确认报告】关于{0}项目{1}受试者",
|
||||
"TrialEmailN_SubjectDiseaseProgression": " 附件为疾病进展确认报告,请查收 ",
|
||||
"TrialEmailN_SingleBlindedSet": "单重有序阅片配置有误(不应该有仲裁对象配置),请核查!",
|
||||
"TrialEmailN_SingleBlindedSequenced": "单重有序阅片 该类型的任务不应进入此处逻辑,请联系后台开发核查!",
|
||||
"TrialEmailN_PDProgressEmailTask": "发送PD 进展邮件中发现任务数据有问题!",
|
||||
"TrialEmailN_DoubleBlindedError": "双重有序阅片 没有定义该仲裁规则处理逻辑,请联系业务和后台开发核查!",
|
||||
"TrialEmailN_InCons": "项目未配置入组确认!",
|
||||
"TrialEmailN_NoBaseLine": "不存在配置了入组确认的并且生成任务的基线访视",
|
||||
"TrialEmailN_IncompBase": "做入组确认的阅片人基线任务没有阅片完!",
|
||||
"TrialEmailN_EmailFail": "邮件手动生成失败,请联系开发核实该场景失败原因",
|
||||
"TrialEmailN_NoReader": "当前未有阅片人读完基线任务!",
|
||||
"TrialEmailN_NoPDConfig": "项目未配置PD进展!",
|
||||
"TrialEmailN_NoPDTasks": "不存在配置了PD进展的并且生成任务的访视",
|
||||
"TrialEmailN_PDNotFinished": "当前受试者最新PD访视阅片任务完成状态不符合发送条件",
|
||||
"TrialEmailN_PDNoImaging": "项目配置了阅片期仲裁,但是当前受试者最新PD访视没有影像学阅片期",
|
||||
"TrialEmailN_PDPhaseNotFinished": "当前受试者最新PD访视阅片期任务完成状态不符合发送条件",
|
||||
"TrialEmailN_NoRuleDefined": "未定义该仲裁规则发送业务逻辑!",
|
||||
"TrialEmailN_NoDoubleOrder": "当前项目配置,不满足双重有序阅片,不满足发送条件!",
|
||||
"TrialEmailN_NoSendLogicDefined": "当前项目配置,未定义发送业务逻辑!",
|
||||
"TrialEmailN_BlindedSequencedReading": "有序阅片配置有误(应为单重或者双重阅片),请核查!",
|
||||
"TrialEmailN_UnblindedSequencedReading": "无序阅片配置有误(应为单重无仲裁对象,双重针对访视仲裁),请核查!",
|
||||
"TrialEmailN_InvalidTaskTypeForEmailSending": "不应有 除访视、裁判、全局其他类型的任务进行发送邮件,请核查业务逻辑",
|
||||
"TrialEmailN_PDLogicNotDefined": "该标准任务还未定义PD获取逻辑,联系业务和后台开发协商后补充",
|
||||
"TrialEmailN_MailboxWrong": "项目发件邮箱配置有误,请核实",
|
||||
"TrialEmailN_InvalidRecipient": "项目没有有效的收件人,无法发送邮件",
|
||||
"TrialEmailN_EmailTestMessage": "项目邮件测试",
|
||||
"TrialEmailN_ConfigurationCorrect": " 收到此邮件,代表邮件配置正确",
|
||||
"TrialEmailN_InvalidSenderEmailConfig": "发件人配置错误,请核对服务器地址或者授权码是否填写有误",
|
||||
|
||||
// ------------------------------------------------------------Financial--------------------------------------------------------------------
|
||||
//CalculateService
|
||||
"Cal_VolDataErr": "体积数据错误",
|
||||
//ExchangeRateService
|
||||
"ExR_SameMthExist": "同月的汇率已存在",
|
||||
"ExR_MthPymtRate": "按月付款采用汇率",
|
||||
//PaymentAdjustmentService
|
||||
"PayAdj_DocPymtLock": "医生付款已确认锁定",
|
||||
//RankPriceService
|
||||
"RP_TitleUsedByRev": "此标题已被审稿人付款信息所使用",
|
||||
//TrialRevenuesPriceService
|
||||
"TRP_AddMeaningful": "请添加有意义的数据",
|
||||
|
||||
// ------------------------------------------------------------ImageAndDoc--------------------------------------------------------------------
|
||||
//DicomArchiveService
|
||||
"DAS_NoAnonCacheData": "未取到缓存匿名化配置数据,上传停止,请联系开发人员核实",
|
||||
//ImageShareService
|
||||
"ISS_NoImgToShare": "当前检查没有影像可以分享。 ",
|
||||
"ISS_ResNotExists": "资源不存在。",
|
||||
"ISS_SharePwdError": "分享密码错误。",
|
||||
"ISS_ShareExpiration": "资源分享过期。",
|
||||
//StudyService
|
||||
"Study_VisitBeforePrevError": "当前访视检查时间{0}不能早于前序访视检查时间{1},请核对检查数据是否有误",
|
||||
"Study_VisitAfterSubseqError": "当前访视检查时间{0}不能晚于该访视之后的检查时间{1},请核对检查数据是否有误",
|
||||
"Study_UploadArchiving": "当前有人正在上传归档该检查!",
|
||||
"Study_VisitEndedNotAllowed": "受试者访视结束,不允许上传!",
|
||||
"Study_ImgAlreadyUploaded": "此处不可以上传。当前影像检查已经上传给受试者{0}的{1}",
|
||||
|
||||
// ------------------------------------------------------------Inspection--------------------------------------------------------------------
|
||||
//FrontAuditConfigService
|
||||
"FrontAudit_IdDup": "标识重复",
|
||||
"FrontAudit_NameDup": "名称重复",
|
||||
"FrontAudit_CannotDelSub": "存在子类 不能删除",
|
||||
//InspectionService
|
||||
"Inspection_UserDisabled": "当前用户已被禁用。",
|
||||
|
||||
// ------------------------------------------------------------Institution--------------------------------------------------------------------
|
||||
//CROService
|
||||
"CRO_DupName": "已经存在同名的CRO,请确认。",
|
||||
"CRO_InProject": "该CRO已经参与项目,不能被删除。",
|
||||
//HospitalService
|
||||
"Hospital_DupName": "已经存在同名的医院,请确认。",
|
||||
"Hospital_SiteAdded": "当前Site已经添加到其他Hospital了",
|
||||
"Hospital_HasDoctors": "该医院下已经注册有医生,不可以删除。",
|
||||
//SiteService
|
||||
"Site_DupName": "已经存在同名的中心,请确认。",
|
||||
"Site_InProject": "该中心已经加入项目,不可以被删除。",
|
||||
//SponsorService
|
||||
"Sponsor_DupName": "已经存在同名的申办方,请确认。",
|
||||
"Sponsor_InProject": "该申办方已经加入项目,不允许删除。",
|
||||
|
||||
// ------------------------------------------------------------Management--------------------------------------------------------------------
|
||||
//MenuService
|
||||
"Menu_ParentDupChild": "该父节点下已经存在同名的子节点。",
|
||||
"Menu_ChildExist": "该节点存在子节点,请在删除子节点后,再删除该节点。",
|
||||
//UserService
|
||||
"User_UsernameExist": "用户名已经存在。",
|
||||
"User_PhoneDup": "该用户类型中已存在具有相同的电话的用户。",
|
||||
"User_EmailDup": "该用户类型中已存在具有相同邮箱的用户。",
|
||||
"User_NewOldPwdSame": "新密码与旧密码相同。",
|
||||
"User_OldPwdInvalid": "旧密码验证失败。",
|
||||
"User_LegalEmail": "请输入合法的电子邮件",
|
||||
"User_VerificationCodeError": "验证码错误。",
|
||||
"User_VerificationCodeExpired": "验证码已经过期。",
|
||||
"User_CreateFailed": "请检查邮箱地址或者联系维护人员, 邮件发送失败, 未能创建账户成功",
|
||||
"User_InvalidEmail": "请输入一个正确的邮箱。",
|
||||
"User_EmailError": "邮箱错误。",
|
||||
"User_InProject": "该用户已经参加项目,不能够删除。",
|
||||
"User_Disabled": "该用户已经被禁用。",
|
||||
//UserTypeService
|
||||
"UserType_InUse": "该用户类型中已存在用户,不能删除。",
|
||||
|
||||
// ------------------------------------------------------------QC--------------------------------------------------------------------
|
||||
//QCCommon
|
||||
"QCCommon_CannotOperate": "CRC 已提交影像,不能进行操作。",
|
||||
"QCCommon_NoPermission": "您不是该质控任务当前领取人,没有操作权限!",
|
||||
"QCCommon_CheckTimeEarly": "当前访视检查时间{0}不能早于前序访视检查时间{1},请核对检查数据是否有误",
|
||||
"QCCommon_CheckTimeLate": "当前访视检查时间{0}不能晚于该访视之后的检查时间{1},请核对检查数据是否有误",
|
||||
//QCOperationService
|
||||
"QCOperation_CheckFirst": "请先核查图像,并保存审核问题,然后再发质疑。",
|
||||
"QCOperation_QuestionExist": "当前访视未关闭的质疑已设置了同意CRC重传影像。请在CRC完成影像重传后,先关闭原质疑,再添加新的质疑。",
|
||||
"QCOperation_QuestionCannotClose": "CRC已申请重传或者QC同意重传,不允许关闭该质疑。请在QC拒绝重传申请或者CRC设置重传影像后,再关闭质疑。",
|
||||
"QCOperation_CloseReason": "关闭原因: ",
|
||||
"QCOperation_QuestionReplied": "当前QC质疑已经回复。",
|
||||
"QCOperation_NoPermissionReply": "您没有权限回复一致性核查对话。",
|
||||
"QCOperation_CannotClose": "当前访视处于申请回退状态, 不允许关闭质疑。",
|
||||
"QCOperation_Reason": "原因:",
|
||||
"QCOperation_CannotPass": "当前访视处于回退状态,不允许设置一致性核查通过",
|
||||
"QCOperation_PassAfterClose": "请先关闭一致性核查质疑后,再设置一致性核查通过。",
|
||||
"QCOperation_Cannotback": "当前访视已通过一致性核查,不允许申请回退",
|
||||
"QCOperation_CRCRollback": "CRC申请回退",
|
||||
"QCOperation_OtherCRC": "其他CRC已申请处理,请刷新页面",
|
||||
"QCOperation_PMReject": "PM/APM拒绝一致性核查回退",
|
||||
"QCOperation_NoPermission": "您不具备操作权限。",
|
||||
"QCOperation_CannotRollback": "当前访视还未进行核查或者核查已通过,不允许设置回退。",
|
||||
"QCOperation_PMAPMConsistency": "PM/APM同意一致性核查回退。",
|
||||
"QCOperation_NoModifyAfterSubmit": "提交之后,不允许修改!",
|
||||
"QCOperation_UnresolvedQCQuery": "当前访视有质疑未关闭,不允许该操作",
|
||||
"QCOperation_CrcNoDelete": "CRC已经提交,不允许删除。",
|
||||
"QCOperation_NoRecipient": "您不是该质控任务当前领取人,没有操作权限!",
|
||||
"QCOperation_QCImageTaskAlreadyReleased": "当前访视的影像质控任务已被原领取人释放。您可以通过“领取”获得",
|
||||
"QCOperation_QCTaskNoAccess": "当前访视的影像质控任务已被其他QC领取,不允许领取",
|
||||
"QCOperation_QCConfigFirst": "请先配置影像质控审核问题,再领取影像质控任务",
|
||||
"QCOperation_NoQC": "项目配置为不审,没有领取QC Task",
|
||||
"QCOperation_InitialAuditPassed": "初审已通过,不能继续领取",
|
||||
"QCOperation_NoSingleAudit": "项目配置为单审,不满足Submmit State:已提交 或者 Audit State:待审核/审核中, 不允许领取,请刷新界面",
|
||||
"QCOperation_NoSameReviewer": "复审不能和初审是同一个人",
|
||||
"QCOperation_NoSecondaryAudit": "项目配置为复审,不满足提交状态:已提交 或者 审核状态:待审核/QC中, 不允许领取,请刷新界面",
|
||||
"QCOperation_NoTaskAccess": "您不是该质控任务当前领取人,没有操作权限!",
|
||||
"QCOperation_NoQCFunction": "项目配置影像质控为不审,不需要取消任务功能",
|
||||
"QCOperation_NoTaskOwner": "当前访视影像质控任务没有当前领取人,不能释放。",
|
||||
"QCOperation_DiseaseProgressConfirmation": "当前访视要求进行疾病进展确认。请在提交当前访视前,先处理未提交的前序访视:{0}。",
|
||||
"QCOperation_UnsubmittedVisits": "在提交当前访视后,请尽快处理尚未提交的前序访视:{0}。",
|
||||
"QCOperation_NoBaselineData": "基线没有临床数据,确认提交?",
|
||||
"QCOperation_NoImageData": "有访视未上传任何Dicom/非Dicom影像数据,不允许提交",
|
||||
"QCOperation_ImagesSubmitted": "当前访视的影像数据,已经由其他CRC提交。",
|
||||
"QCOperation_BatchImagesSubmitted": "当前批量提交访视的影像数据,其中部分已由其他CRC提交。",
|
||||
"QCOperation_MissingBaselineDate": "项目配置了需要填写访视基准日期。但是受试者没有填写访视基准日期,不允许提交",
|
||||
"QCOperation_RemoveItem": "您已经被移出项目,没有操作权限。",
|
||||
"QCOperation_QCNotClosed": "当前访视有影像质控质疑未关闭,不能进行此操作。",
|
||||
"QCOperation_NoQCNeeded": "项目配置影像质控为不审,不需要设置为影像质控通过。",
|
||||
"QCOperation_QCNotSaved": "影像质控审核问题没有保存,不能进行此操作。",
|
||||
"QCOperation_NotChangePass": "项目配置影像质控为单审,当前访视影像质控任务不能从当前审核状态变更到 审核通过。",
|
||||
"QCOperation_CannotChangeToPass": "项目配置影像质控为双审。当前审核状态为 {0},不能变更到 审核通过。",
|
||||
"QCOperation_NoQCNeededNotEnd": "项目配置影像质控为不审,不允许设置影像质控终止。",
|
||||
"QCOperation_CannotChangeToStop": "项目配置影像质控为单审,当前审核状态不为 In Primary QC,不能变更到 审核终止",
|
||||
"QCOperation_CannotChangeStop": "项目配置影像质控为双审,当前审核状态为 {0},不能变更到 审核终止",
|
||||
"QCOperation_InvalidResend": "当前重传状态不为QC同意重传,不允许重传",
|
||||
"QCOperation_NoResendNeeded": "不审操作,不会有需要重传的操作!",
|
||||
"QCOperation_InvalidAgreeResend": "当前重传状态不为CRC申请重传,不允许设置同意重传",
|
||||
"QCOperation_CannotAgreeResend": "当前访视,有一个未关闭的质疑 QC设置了同意重传,CRC还未完成上传,当前不允许再次设置",
|
||||
"QCOperation_AgreeResend": "QC同意重传",
|
||||
"QCOperation_InvalidCompleteResend": "当前重传状态不为QC同意重传,不允许设置重传完成",
|
||||
"QCOperation_NoImageNotAllowed": "当前没有影像,不允许设置重传完成",
|
||||
"QCOperation_CRCTransferCompleted": "CRC已重传完成",
|
||||
"QCOperation_InvalidTransferStatus": "当前质疑重传状态不为初始状态|CRC重传完成状态,不允许申请重传",
|
||||
"QCOperation_CRCTransfer": "CRC申请重传/上传影像",
|
||||
"QCOperation_CannotModifyConfirmation": "该访视已提交,不能修改入组确认状态",
|
||||
"QCOperation_CannotModifyPDStatus": "该访视为回退访视,不允许修改PD确认状态",
|
||||
"QCOperation_ForwardingFailed": "转发影像失败。",
|
||||
//QCQuestionService
|
||||
"QCQuestion_DuplicateIndexFailed": "序号重复,操作失败",
|
||||
"QCQuestion_HasChildQuestion": "当前任务存在子问题,删除失败",
|
||||
//TrialQCQuestionService
|
||||
"TrialQCQuestion_TemplateConfirmed": "影像质控审核问题模板已经确认,不允许操作。",
|
||||
"TrialQCQuestion_DuplicateIndexFailed": "序号重复,操作失败",
|
||||
"TrialQCQuestion_DeleteChildFirst": "请在删除父问题前,请先删除引用该父问题的子问题。",
|
||||
"TrialQCQuestion_ReferencedByQCProcess": "该审核问题已被影像质控过程引用,不允许删除",
|
||||
|
||||
// ------------------------------------------------------------QC--------------------------------------------------------------------
|
||||
|
||||
// ------------------------------------------------------------SiteSurvey--------------------------------------------------------------------
|
||||
//TrialSiteEquipmentSurveyService
|
||||
"TrialSiteEquipment_Locked": "已锁定,不允许操作",
|
||||
//TrialSiteSurveyService
|
||||
"TrialSiteSurvey_InvalidEmail": "请输入正确的邮箱地址。",
|
||||
"TrialSiteSurvey_WrongVerificationCode": "验证码错误。",
|
||||
"TrialSiteSurvey_ExpiredVerificationCode": "验证码已经过期。",
|
||||
"TrialSiteSurvey_NoRecordToUpdate": "该中心不存在该交接人的中心调研记录表,不允许选择更新。",
|
||||
"TrialSiteSurvey_RecordUnderReview": "您的中心调研记录正在审核中,不允许进行更新操作。若需要更新,请在驳回后进行操作。",
|
||||
"TrialSiteSurvey_LockedByCurrentUser": "当前中心中,您提交调研记录表已锁定,不允许更新其他人邮箱调研记录。",
|
||||
"TrialSiteSurvey_LockedByOtherUsers": "当前中心,您提交的调研记录表已锁定。当前存在其他人员提交的调研记录表未锁定,不允许更新您之前提交的调研记录。",
|
||||
"TrialSiteSurvey_UnlockedRecordsExist": "当前中心存在未锁定的调研记录,不允许更新已锁定的调研记录。",
|
||||
"TrialSiteSurvey_NonLatestLockedRecord": "该邮箱{0}对应的调查表不是最新锁定的记录,不允许更新!",
|
||||
"TrialSiteSurvey_AlreadyFilledByOtherUsers": "该中心下已经有其他用户已填写的调研表,您不被允许继续填写",
|
||||
"TrialSiteSurvey_Locked": "中心调研已锁定,不允许操作。",
|
||||
"TrialSiteSurvey_IRCNotification": "[来自展影IRC] [{0}] 关于中心调研审批的提醒",
|
||||
"TrialSiteSurvey_CancelUnsubmittedRecord": "只允许废除未提交的记录。",
|
||||
"TrialSiteSurvey_NoAdminAcces": "不允许管理员操作。",
|
||||
"TrialSiteSurvey_FailedToGenerateAccountId": "生成账户Id 未取到值,请排查",
|
||||
"TrialSiteSurvey_IRCInvitation": "[来自展影IRC] [{0}] 邀请信",
|
||||
"TrialSiteSurvey_IRCInvitationContent": " 您好,展影医疗作为 实验方案号:{0} 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!",
|
||||
"TrialSiteSurvey_ViewAndConfirm": "查看并确认",
|
||||
//TrialSiteUserSurveyService
|
||||
"TrialSiteUser_Locked": "已锁定,不允许操作",
|
||||
"TrialSiteUser_InconsistentInfo": "该用户在系统中账户名为:{0} ,与填写信息存在不一致项, 现将界面信息修改为与系统一致,可进行保存",
|
||||
"TrialSiteUser_NoTestUserForFormal": "正式类型 、培训类型的项目 不允许加入测试用户",
|
||||
"TrialSiteUser_NoFormalUserForTest": "测试项目 不允许加入正式用户",
|
||||
|
||||
// ------------------------------------------------------------Stat--------------------------------------------------------------------
|
||||
|
||||
// ------------------------------------------------------------TrialSiteUser--------------------------------------------------------------------
|
||||
//TrialConfigService
|
||||
"TrialConfig_JudgeTaskFail": "有裁判问题未配置产生裁判阅片任务的条件,操作失败!",
|
||||
"TrialConfig_StdConfigMissing": "当前标准下未配置问题",
|
||||
"TrialConfig_SignTemplateMissing": "该操作需要电子签名确认,但未在系统中找到该场景的签名模板。",
|
||||
"TrialConfig_ProjectEnded": "该项目已结束或停止,不允许修改配置。",
|
||||
"TrialConfig_NoImageAuditQuestion": "当前未添加影像质控审核问题。请先添加影像质控审核问题,再进行确认。",
|
||||
"TrialConfig_DuplicateAuditQuestionId": "影像质控审核问题显示序号不能重复。",
|
||||
"TrialConfig_InvalidParentQuestionId": "父问题的显示序号要比子问题的显示序号小,请确认。",
|
||||
"TrialConfig_AuditQuestionConfirmed": "影像质控审核问题已被其他人员确认,不允许再次确认。",
|
||||
"TrialConfig_ProjectNotInitialized": "该项目当前状态不是初始化,不允许进行该操作。",
|
||||
"TrialConfig_UnconfirmedConfiguration": "该项目的项目配置(基础配置、流程配置、加急配置) 、访视管理,有配置未确认,不能设置项目状态为启动。",
|
||||
"TrialConfig_UnconfirmedUNACKD": "无法变更项目状态。该项目的项目配置、访视管理中,有未确认项",
|
||||
"TrialConfig_ProjectNotStarted": "项目没有进入启动状态,不能设置为停止或完成状态",
|
||||
//TrialExternalUserService
|
||||
"TrialExternalUser_Inconsistency": "该用户在系统中的用户名为:{0} 电话:{1},与填写信息存在不一致项, 请将界面信息修改为与系统一致,再进行保存",
|
||||
"TrialExternalUser_EmailTypeDuplicate": "系统已经存在与列表中填写的邮箱和用户类型相同的账户,请确认。",
|
||||
"TrialExternalUser_TestUserNotAllowed": "正式类型 、培训类型的项目 不允许加入测试用户 ",
|
||||
"TrialExternalUser_FormalUserNotAllowed": "测试项目 不允许加入正式用户 ",
|
||||
"TrialExternalUser_NotEditable": "人员信息不支持编辑,请删除后重新添加。",
|
||||
"TrialExternalUser_CannotDelete": "当前用户已参与到项目,不允许删除",
|
||||
"TrialExternalUser_IRCInvitation": " 您好,展影医疗作为 实验方案号:{0} 项目的IRC供应商,诚邀您参加该项目IRC相关工作,欢迎您提供指导和建议,非常感谢!",
|
||||
"TrialExternalUser_ViewAndConfirm": "查看并确认",
|
||||
"TrialExternalUser_InvitationExpired": "邀请加入时间已过期,重新被邀请后才可以进行确认操作",
|
||||
"TrialExternalUser_AccountInfo": "[来自展影IRC] [{0}] 账户信息",
|
||||
"TrialExternalUser_Welcome": "您好,欢迎您参加项目 实验方案号:{0}IRC相关工作。该项目采用电子化工作流,系统及您的账号信息如下:",
|
||||
"TrialExternalUser_ProjectNumber": "项目编号: {0}",
|
||||
"TrialExternalUser_ExperimentPlanNumber": "试验方案号: {0}",
|
||||
"TrialExternalUser_ExperimentName": "试验名称: {0}",
|
||||
"TrialExternalUser_Username": "用户名: {0}",
|
||||
"TrialExternalUser_Password": "密码: ({0})(请在登录后进行修改) : ***(您已有账号, 若忘记密码, 请通过邮箱找回)",
|
||||
"TrialExternalUser_Role": "角色: {0}",
|
||||
"TrialExternalUser_LoginUrl": "系统登录地址: {0} ",
|
||||
"TrialExternalUser_ReinvitationRequired": "邀请加入时间已过期,重新被邀请后才可以进行确认操作",
|
||||
"TrialExternalUser_UserIdStorageProblem": "调研表系统用户Id 存储有问题",
|
||||
"TrialExternalUser_IRCAccountInfo": "[来自展影IRC] [{0}] 账户信息",
|
||||
//TrialMaintenanceService
|
||||
"TrialMaint_PersonnelJoined": "人员已加入现场维护",
|
||||
//TrialService
|
||||
"Trial_PMApmPermission": "只有PM/APM拥有操作权限!",
|
||||
"Trial_TestUserCreateOnlyNonFormal": "测试用户 只能创建非正式项目",
|
||||
"Trial_DuplicateProjectNumber": "已经存在相同的项目编号。",
|
||||
"Trial_InvalidProjectStatus": "项目状态只有处于:初始化或者进行中时,才允许操作。",
|
||||
"Trial_CannotDeleteProject": "当前运行环境下,不允许删除项目数据。",
|
||||
//TrialSiteService
|
||||
"TrialSite_ParticipantJoined": "已有受试者加入中心,无法禁用",
|
||||
"TrialSite_CodeDuplicate": "代码不能重复",
|
||||
"TrialSite_CannotDeleteAssociatedCRC": "中心已经和CRC关联,不能删除",
|
||||
"TrialSite_CannotDeleteAssociatedSubject": "受试者已经添加,不能删除",
|
||||
"TrialSite_CannotDeleteUploadedData": "中心已经上传调研,无法删除",
|
||||
|
||||
// ------------------------------------------------------------Visit--------------------------------------------------------------------
|
||||
//SubjectService
|
||||
"Subject_NoConfirmedPlan": "项目访视计划没有确认。请联系项目经理确认项目访视计划后,再添加受试者。",
|
||||
"Subject_DuplicateSubjectNum": "已存在具有相关受试者编号的受试者。",
|
||||
"Subject_UploadedVisitNoDelete": "该受试者已经有访视已经上传影像,不允许删除。",
|
||||
//SubjectVisitService
|
||||
"Visit_DuplicateVisitNo": "该受试者的访视计划中已经包含一个具有相同访视号的访视。",
|
||||
"Visit_LastVisitNoChange": "该受试者已经有访视设置为末次访视,不允许将当前访视设置为末次访视。",
|
||||
"Visit_DuplicateVisitName": "该受试者的访视计划中已经包含一个具有相同访视名称的访视。",
|
||||
"Visit_NoExtraVisitAfterLast": "设置末次评估后,不允许添加计划外访视。",
|
||||
"Visit_FinishedTasksNoAdd": "该受试者后续访视已有任务完成阅片(有序阅片标准),不允许在此添加,如果确实需要,请回退",
|
||||
"Visit_NoPDStatusChangeAfterSubmission": "当前访视影像提交后,不允许修改PD确认状态。",
|
||||
"Visit_UploadedNoLost": "当前访视已经有影像上传,不允许设置为失访。",
|
||||
"Visit_UploadedNoDelete": "当前访视已经有影像上传,不允许删除。",
|
||||
"Visit_PlanVisitNoDelete": "计划内的访视不允许删除。",
|
||||
"Visit_PreviousVisitNoDelete": "当前访视已经被设置为另一访视的上一访视,不允许删除。",
|
||||
//VisitPlanService
|
||||
"VisitPlan_OnlyInitOrOngoing": "只有当项目状态为:初始化或进行中时,可以操作。",
|
||||
"VisitPlan_LargerVisitNumLargerInterval": "访视计划中,访视号大的访视,其访视间隔也应该比访视号小的访视大。",
|
||||
"VisitPlan_LargerPlanNumLargerInterval": "访视计划中,访视号大的计划访视,其访视间隔也应该比访视号小的计划访视大。",
|
||||
"VisitPlan_ExistNameOrNumTemplate": "访视计划中已经存在具有项目访视名称或者访视号的计划访视模板。",
|
||||
"VisitPlan_ExistBaseline": "访视计划中已经存在基线。",
|
||||
"VisitPlan_ExistBaselineImgNoModify": "有受试者的基线已经上传了影像数据,不允许修改基线访视。",
|
||||
"VisitPlan_OnlyInitOrOngoingModifyConfirm": "仅仅在项目初始化或者进行中时,才允许修改确认",
|
||||
"VisitPlan_NoBaselineNotConfirm": "没有基线,不允许确认",
|
||||
"VisitPlan_ConfigNotConfirmNotConfirm": "项目配置未确认,不允许确认访视计划",
|
||||
"VisitPlan_BaselineNotMinDayNotConfirm": "基线VisitDay 不是最小的, 不允许确认",
|
||||
"VisitPlan_CheckExport": "检查导出_{0}.xlsx",
|
||||
"VisitPlan_Assigned": "访问计划已分配给受试者并已执行",
|
||||
|
||||
// ------------------------------------------------------------WorkLoad--------------------------------------------------------------------
|
||||
//DoctorWorkloadService
|
||||
"DoctorWorkload_AssignType": "已分配任务,不允许减少阅片类型",
|
||||
"DoctorWorkload_Unique": "此类数据唯一",
|
||||
"DoctorWorkload_FeeSettled": "费用已结算,工作量无法修改",
|
||||
//EnrollService
|
||||
"Enroll_NotFound": "无法找到项目{0}",
|
||||
"Enroll_EmailFormat": "{0}邮箱格式存在问题",
|
||||
"Enroll_CannotRollback": "已有分配的审核人员不能回退",
|
||||
|
||||
// ------------------------------------------------------------Triggers--------------------------------------------------------------------
|
||||
//AddlTrialUserTrigger
|
||||
"AddlTrialUser_NoTestUser": "正式类型 、培训类型的项目 不允许加入测试用户",
|
||||
"AddlTrialUser_NoFormalUser": "测试项目 不允许加入正式用户",
|
||||
//SubjectStateTrigger
|
||||
"SubjectState_CannotSetCurrentAsLastVisit": "该受试者已经有访视被设置为末次访视,不允许将当前访视设置为末次访视。",
|
||||
"SubjectState_CannotSetAsLastVisitWithImage": "该受试者当前访视后有访视的影像已上传,当前访视不允许设置为末次访视。",
|
||||
//SubjectVisitFinalVisitTrigger
|
||||
"SubjectVisit_CannotSetAsLastVisit": "该受试者已有后续访视已上传影像或已提交,当前访视不允许设置为末次访视。",
|
||||
|
||||
// ------------------------------------------------------------BusinessFilter--------------------------------------------------------------------
|
||||
//LimitUserRequestAuthorization
|
||||
"LimitUser_AuthTokenMissing": "当前请求未从Header/Url取到用户Token,请联系开发者",
|
||||
"LimitUser_AccountLoggedInElsewhere": "您的账户在其他地方已登陆,您被迫下线。",
|
||||
//ModelActionFilter
|
||||
"ModelAction_InvalidAPIParameter": "提供给接口的参数无效。",
|
||||
//ProjectExceptionFilter
|
||||
"ProjectException_ConcurrentUpdateNotAllowed": "并发更新,当前不允许该操作",
|
||||
"Project_ExceptionContactDeveloper": "程序异常,请联系开发人员。 ",
|
||||
//TrialResourceFilter
|
||||
"TrialResource_NoAccessPermission": "对不起,您的账户没有操作权限。",
|
||||
"TrialResource_ReferTrialIdFailed": "正则取请求Refer 中trialId 失败,请联系开发人员核查",
|
||||
"TrialResource_InterceptedProjectStatusRule": "本次请求被配置规则拦截:项目状态处于进行中时,才允许操作,若此处逻辑有误,请联系开发人员修改",
|
||||
"TrialResource_MissingProjectNumber": "该接口参数中,没有传递项目编号,请核对。",
|
||||
//UnifiedApiResultFilter
|
||||
"UnifiedAPI_ProgramError": "程序错误,请联系开发人员。",
|
||||
|
||||
// ------------------------------------------------------------Helper--------------------------------------------------------------------
|
||||
//FileStoreHelper
|
||||
"FileStore_TemplateFileNotFound": "数据库没有找到对应的数据模板文件,请联系系统运维人员。",
|
||||
"FileStore_TemplateFileStoragePathInvalid": "数据模板文件存储路径上未找对应文件,请联系系统运维人员。",
|
||||
//SendEmailHelper
|
||||
"SendEmail_SendFail": "邮件发送失败,您进行的操作未能成功,请检查邮箱或联系维护人员",
|
||||
"SendEmail_NoRecipient": "没有收件人",
|
||||
|
||||
// ------------------------------------------------------------IRaCIS.Core.Domain--------------------------------------------------------------------
|
||||
//Trial
|
||||
"Trial_number": "编号由5位数字组成,前2位为中心编号,后3位为顺序号,请与EDC录入的编号保持一致"
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -205,6 +205,10 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public List<ReadingCategory> ReadingCategoryList { get; set; }
|
||||
}
|
||||
|
||||
public class ConvertedRowInfo : ReadingTableAnswerRowInfo
|
||||
{
|
||||
public Guid OriginalId { get; set; }
|
||||
}
|
||||
public class GenerateTaskCommand
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
@@ -288,7 +292,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public String VisitName { get; set; }
|
||||
|
||||
public String BlindName { get; set; }
|
||||
public bool IsBaseLine { get; set; }
|
||||
|
||||
public DateTime? CheckPassedTime { get; set; }
|
||||
|
||||
|
||||
@@ -137,6 +137,9 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public string BlindSubjectCode { get; set; } = string.Empty;
|
||||
public string BlindTrialSiteCode { get; set; } = string.Empty;
|
||||
|
||||
public bool IsNeedClinicalDataSign { get; set; }
|
||||
public bool IsClinicalDataSign { get; set; }
|
||||
}
|
||||
|
||||
public class VisitTaskSimpleDTO :VisitTaskGroupSimpleDTO
|
||||
|
||||
@@ -59,6 +59,11 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
//读片时间差
|
||||
public TimeSpan? ReadingDurationTimeSpan { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 全局是否有更新
|
||||
/// </summary>
|
||||
public bool? IsGlobalHaveUpdate { get; set; } = false;
|
||||
|
||||
//时间差 换成字符串
|
||||
public string ReadingDuration
|
||||
{
|
||||
@@ -79,6 +84,11 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public UserSimpleInfo DoctorUser { get; set; }
|
||||
}
|
||||
|
||||
public class GetNextMedicalReviewTaskInDto
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid MedicalReviewId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
///<summary>TaskMedicalReviewQuery 列表查询参数模型</summary>
|
||||
@@ -87,8 +97,16 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public Guid TrialId { get; set; }
|
||||
public Guid? SiteId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 传了Id 就不查询这条数据
|
||||
/// </summary>
|
||||
public Guid? Id { get; set; }
|
||||
|
||||
public Guid? SubjectId { get; set; }
|
||||
|
||||
|
||||
public bool IsGetBeRead { get; set; } = false;
|
||||
|
||||
public string SubjectCode { get; set; } = String.Empty;
|
||||
|
||||
public string TrialSiteCode { get; set; } = String.Empty;
|
||||
|
||||
@@ -24,6 +24,16 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public decimal VisitTaskNum { get; set; }
|
||||
|
||||
public bool IsUrgent { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 加急类型
|
||||
/// </summary>
|
||||
public TaskUrgentType? TaskUrgentType { get; set; }
|
||||
|
||||
|
||||
public string TaskUrgentRemake { get; set; } = string.Empty;
|
||||
|
||||
public ReadingCategory ReadingCategory { get; set; }
|
||||
|
||||
public TaskAllocationState TaskAllocationState { get; set; }
|
||||
@@ -34,7 +44,6 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public DateTime? AllocateTime { get; set; }
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
public bool IsUrgent { get; set; }
|
||||
public Arm ArmEnum { get; set; }
|
||||
public Guid? DoctorUserId { get; set; }
|
||||
|
||||
@@ -56,6 +65,17 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public string TrialReadingCriterionName { get; set; }
|
||||
|
||||
public bool IsAutoCreate { get; set; }
|
||||
|
||||
|
||||
public bool IsNeedClinicalDataSign { get; set; }
|
||||
|
||||
public bool IsClinicalDataSign { get; set; }
|
||||
|
||||
|
||||
public CompleteClinicalDataEnum CompleteClinicalDataEnum =>
|
||||
(IsNeedClinicalDataSign && IsClinicalDataSign) ? CompleteClinicalDataEnum.Complete : (IsNeedClinicalDataSign && IsClinicalDataSign == false) ? CompleteClinicalDataEnum.NotComplete : CompleteClinicalDataEnum.NA;
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -128,8 +148,9 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public string UserTypeShortName { get; set; }
|
||||
|
||||
public bool IsCanEditUrgentState { get; set; }
|
||||
|
||||
|
||||
public bool IsClinicalDataSigned { get; set; } = false;
|
||||
}
|
||||
|
||||
public class UserSimpleInfo
|
||||
@@ -159,7 +180,11 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public ReReadingApplyState ReReadingApplyState { get; set; }
|
||||
public DateTime? SuggesteFinishedTime { get; set; }
|
||||
|
||||
//任务来源访视Id 方便回更访视读片状态
|
||||
public Guid? SourceSubjectVisitId { get; set; }
|
||||
public Guid? SouceReadModuleId { get; set; }
|
||||
|
||||
//public bool IsAfterConvertedTask { get; set; }
|
||||
}
|
||||
|
||||
|
||||
@@ -236,9 +261,17 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public int UnReadTaskCount { get; set; }
|
||||
|
||||
public int UnReadCanReadTaskCount { get; set; }
|
||||
|
||||
public int HaveReadTaskCount { get; set; }
|
||||
|
||||
public int TotalTaskCount { get; set; }
|
||||
|
||||
public bool ExistReadingApply { get; set; }
|
||||
|
||||
public DateTime? SuggesteFinishedTime => UnReadTaskList.Max(t => t.SuggesteFinishedTime);
|
||||
public DateTime? SuggesteFinishedTime { get; set; }
|
||||
|
||||
public List<IRUnreadTaskView> UnReadCanReadTaskList => UnReadTaskList.Where(y => y.IsFrontTaskNeedSignButNotSign == false && (y.IsNeedClinicalDataSign == false || y.IsClinicalDataSign == true)).ToList();
|
||||
|
||||
public List<IRUnreadTaskView> UnReadTaskList { get; set; } = new List<IRUnreadTaskView>();
|
||||
}
|
||||
@@ -260,13 +293,18 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public string TaskBlindName { get; set; }
|
||||
|
||||
public Arm ArmEnum { get; set; }
|
||||
|
||||
public Guid? VisistId { get; set; }
|
||||
public DateTime? SuggesteFinishedTime { get; set; }
|
||||
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
public bool IsClinicalDataSigned { get; set; } = false;
|
||||
public bool IsNeedClinicalDataSign { get; set; }
|
||||
|
||||
public bool IsClinicalDataSign { get; set; }
|
||||
|
||||
public bool IsFrontTaskNeedSignButNotSign { get; set; }
|
||||
}
|
||||
|
||||
|
||||
@@ -329,6 +367,8 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public ReReadingApplyState? ReReadingApplyState { get; set; }
|
||||
|
||||
public RequestReReadingType? RequestReReadingType { get; set; }
|
||||
|
||||
|
||||
public bool? IsSelfAnalysis { get; set; }
|
||||
|
||||
@@ -336,6 +376,10 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public Guid? TrialReadingCriterionId { get; set; }
|
||||
|
||||
public CompleteClinicalDataEnum? CompleteClinicalDataEnum { get; set; }
|
||||
|
||||
public RequestReReadingResult? RequestReReadingResultEnum { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -688,6 +732,17 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
}
|
||||
|
||||
|
||||
|
||||
public class AIRReReadingCommand
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
[NotDefault]
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class ApplyReReadingCommand
|
||||
{
|
||||
|
||||
|
||||
@@ -15,6 +15,9 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
Task AddTaskAsync(GenerateTaskCommand generateTaskCommand);
|
||||
|
||||
Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId);
|
||||
|
||||
Task AddConvertedTask(Guid taskId);
|
||||
|
||||
Task BaseCritrionGenerateVisitTask(Guid trialId, Guid confirmedTrialReadingCriterionId,bool? isManualSelectVisit=null,List<Guid>? subjectVisitIdList=null);
|
||||
}
|
||||
}
|
||||
@@ -10,6 +10,7 @@ using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
@@ -59,6 +60,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
public async Task<IResponseOutput> AddOrUpdateTaskAllocationRule(TaskAllocationRuleAddOrEdit addOrEditTaskAllocationRule)
|
||||
{
|
||||
@@ -70,7 +72,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (enrollId == Guid.Empty)
|
||||
{
|
||||
return ResponseOutput.NotOk("错误,未在入组表中找到该医生得账号Id");
|
||||
//"错误,未在入组表中找到该医生得账号Id"
|
||||
return ResponseOutput.NotOk(_localizer["TaskAllocation_DoctorIdNotFound"]);
|
||||
}
|
||||
|
||||
addOrEditTaskAllocationRule.EnrollId = enrollId;
|
||||
@@ -78,7 +81,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
var verifyExp1 = new EntityVerifyExp<TaskAllocationRule>()
|
||||
{
|
||||
VerifyExp = t => t.DoctorUserId == addOrEditTaskAllocationRule.DoctorUserId && t.TrialId == addOrEditTaskAllocationRule.TrialId,
|
||||
VerifyMsg = "已有该医生配置,不允许继续增加"
|
||||
// "已有该医生配置,不允许继续增加"
|
||||
VerifyMsg = _localizer["TaskAllocation_DoctorConfigExists"]
|
||||
};
|
||||
|
||||
var entity = await _taskAllocationRuleRepository.InsertOrUpdateAsync(addOrEditTaskAllocationRule, true, verifyExp1);
|
||||
@@ -87,13 +91,15 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
}
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[HttpDelete("{taskAllocationRuleId:guid}")]
|
||||
public async Task<IResponseOutput> DeleteTaskAllocationRule(Guid taskAllocationRuleId)
|
||||
{
|
||||
if (await _taskAllocationRuleRepository.Where(t => t.Id == taskAllocationRuleId).AnyAsync(t => t.DoctorUser.VisitTaskList.Where(u => u.TrialId == t.TrialId).Any()))
|
||||
{
|
||||
return ResponseOutput.NotOk("已分配任务给该医生,不允许删除");
|
||||
//"已分配任务给该医生,不允许删除"
|
||||
return ResponseOutput.NotOk(_localizer["TaskAllocation_TaskAssigned"]);
|
||||
}
|
||||
|
||||
var success = await _taskAllocationRuleRepository.DeleteFromQueryAsync(t => t.Id == taskAllocationRuleId, true);
|
||||
|
||||
@@ -15,6 +15,7 @@ using IRaCIS.Core.Infra.EFCore.Common;
|
||||
using System.Linq;
|
||||
using Nito.AsyncEx;
|
||||
using IRaCIS.Core.Application.Contracts;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
@@ -86,7 +87,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
.WhereIf(queryVisitTask.ArmEnum != null, t => t.ArmEnum == queryVisitTask.ArmEnum)
|
||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TrialSiteCode), t => (t.BlindTrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate) || (t.Subject.TrialSite.TrialSiteCode.Contains(queryVisitTask.TrialSiteCode!) && t.IsAnalysisCreate == false))
|
||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.TaskName), t => t.TaskName.Contains(queryVisitTask.TaskName) || t.TaskBlindName.Contains(queryVisitTask.TaskName))
|
||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => t.Subject.Code.Contains(queryVisitTask.SubjectCode))
|
||||
.WhereIf(!string.IsNullOrEmpty(queryVisitTask.SubjectCode), t => (t.Subject.Code.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate == false) || (t.BlindSubjectCode.Contains(queryVisitTask.SubjectCode) && t.IsAnalysisCreate))
|
||||
.WhereIf(queryVisitTask.BeginAllocateDate != null, t => t.AllocateTime > queryVisitTask.BeginAllocateDate)
|
||||
.WhereIf(queryVisitTask.EndAllocateDate != null, t => t.AllocateTime < queryVisitTask.EndAllocateDate!.Value.AddDays(1))
|
||||
.ProjectTo<AnalysisTaskView>(_mapper.ConfigurationProvider);
|
||||
@@ -125,6 +126,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[UnitOfWork]
|
||||
//[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
public async Task<IResponseOutput> ConfirmGenerateSelfConsistentTask(ConsistentConfirmGenerateCommand inCommand, [FromServices] IVisitTaskHelpeService _visitTaskCommonService)
|
||||
{
|
||||
|
||||
@@ -269,6 +272,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
[UnitOfWork]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
public async Task<IResponseOutput> ConfirmGenerateGroupConsistentTask(GroupConsistentConfirmGenrateCommand inCommand, [FromServices] IVisitTaskHelpeService _visitTaskCommonService)
|
||||
{
|
||||
var trialId = inCommand.TrialId;
|
||||
@@ -332,7 +337,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (needAddDoctorUserIdList.Count == 0)
|
||||
{
|
||||
throw new BusinessValidationFailedException("请配置一致性分析的医生");
|
||||
//"请配置一致性分析的医生"
|
||||
throw new BusinessValidationFailedException(_localizer["TaskConsistent_ConsistencyConfigExists"]);
|
||||
}
|
||||
|
||||
|
||||
@@ -514,7 +520,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
SouceReadModuleId = c.SouceReadModuleId,
|
||||
|
||||
|
||||
|
||||
TrialReadingCriterionId=c.TrialReadingCriterionId,
|
||||
IsClinicalDataSign = c.IsClinicalDataSign,
|
||||
IsNeedClinicalDataSign = c.IsNeedClinicalDataSign,
|
||||
|
||||
//自身一致性才有意义
|
||||
//IsHaveGeneratedTask = c.Subject.SubjectVisitTaskList.Any(t => t.ConsistentAnalysisOriginalTaskId == c.Id),
|
||||
@@ -534,6 +543,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
TrialId = c.TrialId,
|
||||
SourceSubjectVisitId = c.SourceSubjectVisitId,
|
||||
SouceReadModuleId = c.SouceReadModuleId,
|
||||
|
||||
TrialReadingCriterionId = c.TrialReadingCriterionId,
|
||||
IsClinicalDataSign = c.IsClinicalDataSign,
|
||||
IsNeedClinicalDataSign = c.IsNeedClinicalDataSign,
|
||||
}).ToList(),
|
||||
|
||||
}).ToList()
|
||||
@@ -624,7 +637,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
SourceSubjectVisitId = c.SourceSubjectVisitId,
|
||||
SouceReadModuleId = c.SouceReadModuleId,
|
||||
|
||||
TrialReadingCriterionId = c.TrialReadingCriterionId,
|
||||
IsClinicalDataSign = c.IsClinicalDataSign,
|
||||
IsNeedClinicalDataSign = c.IsNeedClinicalDataSign,
|
||||
|
||||
}).ToList()
|
||||
|
||||
@@ -655,7 +671,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
var trialId = inQuery.TrialId;
|
||||
|
||||
var taskConsistentRuleQueryable = from enroll in _repository.Where<Enroll>(t => t.TrialId == trialId)
|
||||
var taskConsistentRuleQueryable = from enroll in _repository.Where<Enroll>(t => t.TrialId == trialId && t.EnrollStatus==EnrollStatus.ConfirmIntoGroup)
|
||||
join user in _repository.Where<User>() on enroll.DoctorId equals user.DoctorId
|
||||
join taskConsistentRule in _repository.Where<TaskConsistentRule>(t => t.TrialId == trialId &&t.TrialReadingCriterionId==inQuery.TrialReadingCriterionId && t.IsSelfAnalysis) on enroll.TrialId equals taskConsistentRule.TrialId
|
||||
select new TaskConsistentRuleView()
|
||||
@@ -709,6 +725,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
public async Task<IResponseOutput> AddOrUpdateTaskConsistentRule(TaskConsistentRuleAddOrEdit addOrEditTaskConsistentRule)
|
||||
{
|
||||
@@ -716,12 +733,14 @@ namespace IRaCIS.Core.Application.Service
|
||||
var verifyExp1 = new EntityVerifyExp<TaskConsistentRule>()
|
||||
{
|
||||
VerifyExp = t => t.TrialId == addOrEditTaskConsistentRule.TrialId && t.IsSelfAnalysis == addOrEditTaskConsistentRule.IsSelfAnalysis && t.TrialReadingCriterionId==addOrEditTaskConsistentRule.TrialReadingCriterionId,
|
||||
VerifyMsg = "已有该项目配置,不允许继续增加"
|
||||
//"已有该项目配置,不允许继续增加"
|
||||
VerifyMsg = _localizer["TaskConsistent_TaskGenerated"]
|
||||
};
|
||||
|
||||
if (await _visitTaskRepository.AnyAsync(t => t.IsSelfAnalysis == addOrEditTaskConsistentRule.IsSelfAnalysis && t.TrialId == addOrEditTaskConsistentRule.TrialId && t.TrialReadingCriterionId == addOrEditTaskConsistentRule.TrialReadingCriterionId))
|
||||
{
|
||||
return ResponseOutput.NotOk("该标准已有Subject 生成了任务,不允许修改配置");
|
||||
//"该标准已有Subject 生成了任务,不允许修改配置"
|
||||
return ResponseOutput.NotOk(_localizer["TaskConsistent_MedicalAuditTaskExists"]);
|
||||
}
|
||||
|
||||
var entity = await _taskConsistentRuleRepository.InsertOrUpdateAsync(addOrEditTaskConsistentRule, true, verifyExp1);
|
||||
@@ -730,6 +749,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
}
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
[HttpDelete("{taskConsistentRuleId:guid}")]
|
||||
public async Task<IResponseOutput> DeleteTaskConsistentRule(Guid taskConsistentRuleId)
|
||||
@@ -739,7 +759,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (await _visitTaskRepository.AnyAsync(t => t.IsAnalysisCreate && t.TrialId == config.TrialId && t.IsSelfAnalysis == config.IsSelfAnalysis && t.TrialReadingCriterionId==config.TrialReadingCriterionId))
|
||||
{
|
||||
throw new BusinessValidationFailedException("该标准已产生一致性分析任务,不允许删除");
|
||||
//"该标准已产生一致性分析任务,不允许删除"
|
||||
throw new BusinessValidationFailedException(_localizer["TaskConsistent_SignedTaskCannotBeInvalidated"]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -8,6 +8,8 @@ using IRaCIS.Core.Domain.Models;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
/// <summary>
|
||||
@@ -40,12 +42,16 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
public async Task<IResponseOutput> AddOrUpdateTaskMedicalReviewRule(TaskMedicalReviewRuleAddOrEdit addOrEditTaskTaskMedicalReviewRule)
|
||||
{
|
||||
var verifyExp1 = new EntityVerifyExp<TaskMedicalReviewRule>()
|
||||
{
|
||||
|
||||
VerifyExp = t => t.DoctorUserId == addOrEditTaskTaskMedicalReviewRule.DoctorUserId && t.TrialId == addOrEditTaskTaskMedicalReviewRule.TrialId,
|
||||
VerifyMsg = "已有该医生配置,不允许继续增加"
|
||||
//"已有该医生配置,不允许继续增加"
|
||||
VerifyMsg = _localizer["TaskMedicalRule_TaskAlreadyAssigned"]
|
||||
};
|
||||
|
||||
var entity = await _taskMedicalReviewRuleRepository.InsertOrUpdateAsync(addOrEditTaskTaskMedicalReviewRule, true, verifyExp1);
|
||||
@@ -56,12 +62,15 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
[HttpDelete("{taskMedicalReviewRuleId:guid}")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
public async Task<IResponseOutput> DeleteTaskMedicalReviewRule(Guid taskMedicalReviewRuleId)
|
||||
{
|
||||
|
||||
if(await _taskMedicalReviewRuleRepository.Where(t=>t.Id== taskMedicalReviewRuleId).AnyAsync(t => t.TaskMedicalReviewList.Any()))
|
||||
{
|
||||
return ResponseOutput.NotOk("已产生医学审核任务");
|
||||
//"已产生医学审核任务"
|
||||
return ResponseOutput.NotOk(_localizer["TaskMedicalRule_TaskStarted"]);
|
||||
}
|
||||
|
||||
var success = await _taskMedicalReviewRuleRepository.DeleteFromQueryAsync(t => t.Id == taskMedicalReviewRuleId,true);
|
||||
|
||||
@@ -10,6 +10,7 @@ using IRaCIS.Core.Application.Interfaces;
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
@@ -82,7 +83,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
public async Task<PageOutput<GenerateMedicalReviewTaskView>> GetGenerateMedicalReviewTaskList(GenerateMedicalReviewTaskQuery inQuery)
|
||||
{
|
||||
var visitTaskQueryable = _visitTaskRepository.Where(t => t.TrialId == inQuery.TrialId)
|
||||
.Where(t => t.IsAnalysisCreate == false && t.TaskState == TaskState.Effect && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||||
.Where(t => t.IsAnalysisCreate == false && (t.TaskState == TaskState.Effect||t.TaskState==TaskState.Freeze) && t.ReadingTaskState == ReadingTaskState.HaveSigned)
|
||||
|
||||
.WhereIf(inQuery.SiteId != null, t => t.Subject.SiteId == inQuery.SiteId)
|
||||
.WhereIf(inQuery.SubjectId != null, t => t.SubjectId == inQuery.SubjectId)
|
||||
@@ -111,6 +112,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// </summary>
|
||||
/// <param name="command"></param>
|
||||
/// <returns></returns>
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> ManuallyGeneratedAndAssignedMedicalReview(ManuallyGeneratedAndAssignedMedicalReviewCommand command)
|
||||
{
|
||||
|
||||
@@ -125,6 +127,56 @@ namespace IRaCIS.Core.Application.Service
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取下一个医学审核任务
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
/// <exception cref="BusinessValidationFailedException"></exception>
|
||||
[HttpPost]
|
||||
public async Task<TaskMedicalReviewView> GetNextMedicalReviewTask(GetNextMedicalReviewTaskInDto inDto)
|
||||
{
|
||||
var medicalReview = await _taskMedicalReviewRepository.Where(x => x.Id == inDto.MedicalReviewId).Include(x=>x.VisitTask).FirstNotNullAsync();
|
||||
|
||||
var subjectReview = await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery()
|
||||
{
|
||||
|
||||
TrialId = medicalReview.TrialId,
|
||||
IsGetBeRead = true,
|
||||
Id=inDto.MedicalReviewId,
|
||||
SubjectId= medicalReview.VisitTask.SubjectId,
|
||||
TrialReadingCriterionId = medicalReview.VisitTask.TrialReadingCriterionId,
|
||||
PageIndex=1,
|
||||
PageSize=1,
|
||||
});
|
||||
|
||||
if (subjectReview.Item1.CurrentPageData.Count == 1)
|
||||
{
|
||||
return subjectReview.Item1.CurrentPageData[0];
|
||||
}
|
||||
|
||||
var data = await GetMIMMedicalReviewTaskList(new TaskMedicalReviewQuery()
|
||||
{
|
||||
|
||||
TrialId = medicalReview.TrialId,
|
||||
IsGetBeRead = true,
|
||||
Id = inDto.MedicalReviewId,
|
||||
TrialReadingCriterionId = medicalReview.VisitTask.TrialReadingCriterionId,
|
||||
PageIndex = 1,
|
||||
PageSize = 1,
|
||||
});
|
||||
|
||||
if (data.Item1.CurrentPageData.Count == 1)
|
||||
{
|
||||
return data.Item1.CurrentPageData[0];
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new BusinessValidationFailedException(_localizer["MedicalReview_Finish"]);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -138,14 +190,17 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
|
||||
var taskMedicalReviewQueryable = _taskMedicalReviewRepository.Where(t => t.VisitTask.TrialId == inQuery.TrialId && t.MedicalManagerUserId == _userInfo.Id&&t.VisitTask.TrialReadingCriterionId==inQuery.TrialReadingCriterionId)
|
||||
|
||||
.WhereIf(inQuery.SubjectId != null, t => t.VisitTask.SubjectId == inQuery.SubjectId)
|
||||
.WhereIf(inQuery.SiteId != null, t => t.VisitTask.Subject.SiteId == inQuery.SiteId)
|
||||
.WhereIf(!string.IsNullOrEmpty(inQuery.SubjectCode), t => t.VisitTask.Subject.Code.Contains(inQuery.SubjectCode))
|
||||
.WhereIf(inQuery.Id != null, t => t.Id != inQuery.Id)
|
||||
.WhereIf(inQuery.IsUrgent != null, t => t.VisitTask.IsUrgent == inQuery.IsUrgent)
|
||||
.WhereIf(inQuery.AuditState != null, t => t.AuditState == inQuery.AuditState)
|
||||
.WhereIf(inQuery.TaskState != null, t => t.VisitTask.TaskState == inQuery.TaskState)
|
||||
.WhereIf(inQuery.DoctorUserId != null, t => t.VisitTask.DoctorUserId == inQuery.DoctorUserId)
|
||||
.WhereIf(inQuery.ReadingCategory != null, t => t.VisitTask.ReadingCategory == inQuery.ReadingCategory)
|
||||
.WhereIf(inQuery.ReadingTaskState != null, t => t.VisitTask.ReadingTaskState == inQuery.ReadingTaskState)
|
||||
|
||||
.WhereIf(inQuery.IsGetBeRead,x=>!x.IsInvalid&&x.AuditState!= MedicalReviewAuditState.HaveSigned)
|
||||
.WhereIf(inQuery.TrialReadingCriterionId != null, t => t.VisitTask.TrialReadingCriterionId == inQuery.TrialReadingCriterionId)
|
||||
.ProjectTo<TaskMedicalReviewView>(_mapper.ConfigurationProvider);
|
||||
|
||||
@@ -170,7 +225,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
if (await _taskMedicalReviewRepository.Where(t => command.MedicalReviewIdList.Contains(t.Id)).AnyAsync(t => t.AuditState == MedicalReviewAuditState.HaveSigned))
|
||||
{
|
||||
return ResponseOutput.NotOk("已签名的不允许设置为失效");
|
||||
//"已签名的不允许设置为失效"
|
||||
return ResponseOutput.NotOk(_localizer["TaskMedical_DirtyData"]);
|
||||
}
|
||||
|
||||
await _taskMedicalReviewRepository.UpdatePartialFromQueryAsync(t => command.MedicalReviewIdList.Contains(t.Id), c => new TaskMedicalReview() { IsInvalid = true },true);
|
||||
@@ -190,6 +246,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
/// <returns></returns>
|
||||
[UnitOfWork]
|
||||
[HttpPost]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "AfterStopCannNotOpt" })]
|
||||
|
||||
public async Task<IResponseOutput> AssignMedicalReviewTask(AssignMedicalReviewTaskCommand command)
|
||||
{
|
||||
|
||||
@@ -201,7 +259,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
if (task.MedicalManagerUserId != null && task.MedicalManagerUserId != command.MedicalManagerUserId)
|
||||
{
|
||||
throw new BusinessValidationFailedException("当前有任务已分配给其他人,不允许分配,请刷新列表");
|
||||
//"当前有任务已分配给其他人,不允许分配,请刷新列表"
|
||||
throw new BusinessValidationFailedException(_localizer["TaskMedical_SubjectInOtherArm"]);
|
||||
}
|
||||
|
||||
task.MedicalManagerUserId = command.MedicalManagerUserId;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -12,6 +12,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
public AllocationConfig()
|
||||
{
|
||||
|
||||
CreateMap<ReadingTableAnswerRowInfo, ConvertedRowInfo>()
|
||||
.ForMember(d => d.OriginalId, u => u.MapFrom(s => s.Id));
|
||||
|
||||
CreateMap<ConvertedRowInfo, ReadingTableAnswerRowInfo>();
|
||||
|
||||
|
||||
CreateMap<TaskAllocationRule, TaskAllocationRuleView>()
|
||||
.ForMember(o => o.UserCode, t => t.MapFrom(u => u.DoctorUser.UserCode))
|
||||
@@ -99,13 +104,14 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
CreateMap<SubjectUser, SubjectUserDTO>().IncludeBase<SubjectUser, SubjectUserView>()
|
||||
.ForMember(o => o.IsHaveReading, t => t.MapFrom(u => u.Subject.SubjectVisitTaskList.Any(t => t.ReadingTaskState != ReadingTaskState.WaitReading && t.TrialReadingCriterionId==u.TrialReadingCriterionId)));
|
||||
.ForMember(o => o.IsHaveReading, t => t.MapFrom(u => u.Subject.SubjectVisitTaskList.Any(t => t.ReadingTaskState != ReadingTaskState.WaitReading && t.TrialReadingCriterionId==u.TrialReadingCriterionId && t.DoctorUserId==u.DoctorUserId)));
|
||||
|
||||
|
||||
CreateMap<SubjectVisit, VisitGenerataTaskDTO>();
|
||||
|
||||
|
||||
CreateMap<VisitTask, VisitTaskViewBasic>()
|
||||
.ForMember(o => o.IsAutoCreate, t => t.MapFrom(u => u.TrialReadingCriterion.IsAutoCreate))
|
||||
.ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName))
|
||||
.ForMember(o => o.ReadingTool, t => t.MapFrom(u => u.TrialReadingCriterion.ReadingTool))
|
||||
.ForMember(o => o.IsReadingTaskViewInOrder, t => t.MapFrom(u => u.TrialReadingCriterion.IsReadingTaskViewInOrder))
|
||||
@@ -125,7 +131,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
.ForMember(o => o.UserName, t => t.MapFrom(u => u.DoctorUser.UserName))
|
||||
.ForMember(o => o.FullName, t => t.MapFrom(u => u.DoctorUser.FullName))
|
||||
.ForMember(o => o.UserTypeShortName, t => t.MapFrom(u => u.DoctorUser.UserTypeRole.UserTypeShortName))
|
||||
.ForMember(o => o.IsClinicalDataSigned, t => t.MapFrom(u => u.Subject.ClinicalDataList.Any(c => c.IsSign && (c.ReadingId == u.SouceReadModuleId || c.ReadingId == u.SourceSubjectVisitId))))
|
||||
//.ForMember(o => o.IsClinicalDataSigned, t => t.MapFrom(u => u.Subject.ClinicalDataList.Any(c => c.IsSign && (c.ReadingId == u.SouceReadModuleId || c.ReadingId == u.SourceSubjectVisitId))))
|
||||
;
|
||||
|
||||
|
||||
@@ -203,6 +209,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
.ForMember(o => o.FullName, t => t.MapFrom(u => u.FullName));
|
||||
|
||||
CreateMap<TaskMedicalReview, TaskMedicalReviewView>().IncludeMembers(t => t.VisitTask)
|
||||
.ForMember(o => o.IsAutoCreate, t => t.MapFrom(u => u.VisitTask.TrialReadingCriterion.IsAutoCreate))
|
||||
.ForMember(o => o.TrialReadingCriterionId, t => t.MapFrom(u => u.VisitTask.TrialReadingCriterion.Id))
|
||||
.ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.VisitTask.TrialReadingCriterion.CriterionName))
|
||||
.ForMember(o => o.ReadingTool, t => t.MapFrom(u => u.VisitTask.TrialReadingCriterion.ReadingTool))
|
||||
@@ -296,8 +303,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
CreateMap<VisitTask, InfluenceTaskInfo>()
|
||||
.ForMember(o => o.TrialReadingCriterionName, t => t.MapFrom(u => u.TrialReadingCriterion.CriterionName))
|
||||
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.Subject.TrialSite.TrialSiteCode))
|
||||
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.Subject.Code))
|
||||
.ForMember(o => o.TrialSiteCode, t => t.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindTrialSiteCode : u.Subject.TrialSite.TrialSiteCode))
|
||||
.ForMember(o => o.SubjectCode, t => t.MapFrom(u => u.IsAnalysisCreate == true ? u.BlindSubjectCode : u.Subject.Code))
|
||||
.ForMember(o => o.OptType, t => t.Ignore());
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//--------------------------------------------------------------------
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2022-03-31 13:18:56
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
@@ -49,7 +49,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
var verifyExp1 = new EntityVerifyExp<CommonDocument>()
|
||||
{
|
||||
VerifyExp = t => t.Code == addOrEditCommonDocument.Code,
|
||||
VerifyMsg = "文档的Code不能够重复。"
|
||||
//---文档的Code不能够重复。
|
||||
VerifyMsg = _localizer["Document_CodeDuplication"]
|
||||
};
|
||||
|
||||
//var verifyExp3 = new EntityVerifyExp<CommonDocument>()
|
||||
@@ -61,10 +62,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
var verifyExp2 = new EntityVerifyExp<CommonDocument>()
|
||||
{
|
||||
VerifyExp = t => t.CriterionTypeEnum == addOrEditCommonDocument.CriterionTypeEnum && t.BusinessScenarioEnum==addOrEditCommonDocument.BusinessScenarioEnum &&
|
||||
t.IsDeleted==addOrEditCommonDocument.IsDeleted,
|
||||
VerifyMsg = "一个场景一个标准只允许有一个模板文档",
|
||||
IsVerify=addOrEditCommonDocument.CriterionTypeEnum !=null && addOrEditCommonDocument.IsDeleted==false
|
||||
VerifyExp = t => t.CriterionTypeEnum == addOrEditCommonDocument.CriterionTypeEnum && t.BusinessScenarioEnum == addOrEditCommonDocument.BusinessScenarioEnum &&
|
||||
t.IsDeleted == addOrEditCommonDocument.IsDeleted,
|
||||
//---一个场景一个标准只允许有一个模板文档
|
||||
VerifyMsg = _localizer["Document_SingleTemplate"],
|
||||
IsVerify = addOrEditCommonDocument.CriterionTypeEnum != null && addOrEditCommonDocument.IsDeleted == false
|
||||
};
|
||||
|
||||
|
||||
@@ -91,10 +93,11 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
}
|
||||
catch (Exception )
|
||||
catch (Exception)
|
||||
{
|
||||
|
||||
return ResponseOutput.NotOk("读取模板内容失败, 请将文件另存为docx格式尝试!");
|
||||
//---读取模板内容失败, 请将文件另存为docx格式尝试!
|
||||
return ResponseOutput.NotOk(_localizer["Document_ TemplateRead"]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -78,19 +78,48 @@ namespace IRaCIS.Application.Contracts
|
||||
|
||||
}
|
||||
|
||||
public class GetCriterionDictionaryInDto
|
||||
{
|
||||
public Guid? ReadingCriterionId { get; set; }
|
||||
|
||||
public string DictionaryCode { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public List<string> DictionaryCodeList { get; set; } = new List<string>();
|
||||
}
|
||||
|
||||
public class GetBasicDataAllSelectInDto
|
||||
{
|
||||
public Guid? TrialReadingCriterionId { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class GetTrialCriterionDictionaryListInDto
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid TrialCriterionId { get; set; }
|
||||
}
|
||||
public class GetCriterionDictionaryListInDto
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid SystemCriterionId { get; set; }
|
||||
}
|
||||
public class GetCriterionDictionaryListOutDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Code { get; set; } = string.Empty;
|
||||
|
||||
public int Count { get; set; }
|
||||
public int ShowOrder { get; set; }
|
||||
|
||||
public string Description { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
|
||||
public class BasicDicSelectCopy:BasicDicSelect
|
||||
{
|
||||
|
||||
}
|
||||
public class BasicDicSelect
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
@@ -99,6 +128,8 @@ namespace IRaCIS.Application.Contracts
|
||||
public string ValueCN { get; set; } = string.Empty;
|
||||
public string Value { get; set; } = string.Empty;
|
||||
|
||||
public string Description { get; set; } = string.Empty;
|
||||
|
||||
public int ShowOrder { get; set; }
|
||||
|
||||
public Guid? ParentId { get; set; }
|
||||
@@ -110,7 +141,9 @@ namespace IRaCIS.Application.Contracts
|
||||
|
||||
public DicDataTypeEnum DataTypeEnum { get; set; }
|
||||
|
||||
public bool IsEnumInt => System.Text.RegularExpressions.Regex.IsMatch(Code, @"^[-+]?\d*$") && DataTypeEnum== DicDataTypeEnum.Enum;
|
||||
public CrterionDictionaryGroup CrterionDictionaryGroup { get; set; } = IRaCIS.Core.Domain.Share.CrterionDictionaryGroup.General;
|
||||
|
||||
public bool IsEnumInt => System.Text.RegularExpressions.Regex.IsMatch(Code, @"^[-+]?\d*$") && DataTypeEnum== DicDataTypeEnum.Enum;
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -151,7 +151,6 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public string Code { get; set; } = string.Empty;
|
||||
public Guid? ParentId { get; set; }
|
||||
public bool IsEnable { get; set; }
|
||||
public bool IsConfig { get; set; }
|
||||
public Guid? ModuleTypeId { get; set; }
|
||||
public Guid? OptTypeId { get; set; }
|
||||
public Guid? ChildrenTypeId { get; set; }
|
||||
@@ -164,7 +163,6 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public string EnumList { get; set; } = string.Empty;
|
||||
|
||||
public string DictionaryKey { get; set; } = string.Empty;
|
||||
|
||||
public string EnumType { get; set; } = string.Empty;
|
||||
|
||||
@@ -172,7 +170,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public bool? IsShowByTrialConfig { get; set; }
|
||||
|
||||
public string ByTrialConfig { get; set; } = string.Empty;
|
||||
public string TrialConfigRelyFieldName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -228,11 +226,6 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public string ChildDataValue { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 是否为特殊类型
|
||||
/// </summary>
|
||||
|
||||
public bool? IsSpecialType { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
@@ -284,8 +277,19 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 是否为特殊类型
|
||||
/// </summary>
|
||||
|
||||
public bool? IsSpecialType { get; set; }
|
||||
public bool IsConfig { get; set; }
|
||||
public string DictionaryKey { get; set; } = string.Empty;
|
||||
|
||||
|
||||
|
||||
|
||||
//byzhouahng
|
||||
|
||||
public string TableConfigJsonStr { get; set; } = String.Empty;
|
||||
public string UrlConfigJsonStr { get; set; } = String.Empty;
|
||||
|
||||
|
||||
@@ -25,7 +25,6 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
public string Name { get; set; } = string.Empty;
|
||||
public string ValueCN { get; set; } = string.Empty;
|
||||
public string Value { get; set; } = string.Empty;
|
||||
public string Code { get; set; } = string.Empty;
|
||||
|
||||
|
||||
@@ -20,12 +20,24 @@ namespace IRaCIS.Application.Services
|
||||
private readonly IRepository<TrialDictionary> _trialDictionaryRepository;
|
||||
private readonly IRepository<Doctor> _doctorRepository;
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
private readonly IRepository<ReadingCriterionDictionary> _readingCriterionDictionaryRepository;
|
||||
private readonly IRepository<SystemCriterionDictionaryCode> _systemCriterionDictionaryCodeRepository;
|
||||
private readonly IRepository<TrialCriterionDictionaryCode> _trialCriterionDictionaryCodeRepository;
|
||||
private readonly IRepository<ReadingTrialCriterionDictionary> _readingTrialCriterionDictionaryRepository;
|
||||
|
||||
private readonly IRepository<ReadingSystemCriterionDictionary> _readingCriterionDictionaryRepository;
|
||||
private readonly IRepository<ReadingQuestionCriterionSystem> _readingQuestionCriterionSystem;
|
||||
private readonly IRepository<ReadingQuestionCriterionTrial> _readingQuestionCriterionTrial;
|
||||
private readonly IReadingQuestionService _readingQuestionService;
|
||||
|
||||
public DictionaryService(IRepository<Dictionary> sysDicRepository, IRepository<DoctorDictionary> doctorDictionaryRepository, IRepository<TrialDictionary> trialDictionaryRepository,
|
||||
IRepository<Doctor> doctorRepository, IRepository<Trial> trialRepository,
|
||||
IRepository<ReadingCriterionDictionary> readingCriterionDictionaryRepository,
|
||||
|
||||
IRepository<SystemCriterionDictionaryCode> systemCriterionDictionaryCodeRepository,
|
||||
IRepository<TrialCriterionDictionaryCode> trialCriterionDictionaryCodeRepository,
|
||||
IRepository<ReadingTrialCriterionDictionary> readingTrialCriterionDictionaryRepository,
|
||||
IRepository<ReadingSystemCriterionDictionary> readingCriterionDictionaryRepository,
|
||||
IRepository<ReadingQuestionCriterionSystem> readingQuestionCriterionSystem,
|
||||
IRepository<ReadingQuestionCriterionTrial> readingQuestionCriterionTrial,
|
||||
IReadingQuestionService readingQuestionService
|
||||
|
||||
|
||||
@@ -36,7 +48,12 @@ namespace IRaCIS.Application.Services
|
||||
_trialDictionaryRepository = trialDictionaryRepository;
|
||||
_doctorRepository = doctorRepository;
|
||||
_trialRepository = trialRepository;
|
||||
this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository;
|
||||
this._systemCriterionDictionaryCodeRepository = systemCriterionDictionaryCodeRepository;
|
||||
this._trialCriterionDictionaryCodeRepository = trialCriterionDictionaryCodeRepository;
|
||||
this._readingTrialCriterionDictionaryRepository = readingTrialCriterionDictionaryRepository;
|
||||
this._readingCriterionDictionaryRepository = readingCriterionDictionaryRepository;
|
||||
this._readingQuestionCriterionSystem = readingQuestionCriterionSystem;
|
||||
this._readingQuestionCriterionTrial = readingQuestionCriterionTrial;
|
||||
this._readingQuestionService = readingQuestionService;
|
||||
}
|
||||
|
||||
@@ -108,9 +125,10 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
var verifyExp1 = new EntityVerifyExp<Dictionary>()
|
||||
{
|
||||
VerifyExp = t => t.Code == addOrEditBasic.Code&&t.ParentId== addOrEditBasic.ParentId,
|
||||
VerifyMsg = $"已有{addOrEditBasic.Code}名称的字典",
|
||||
IsVerify= addOrEditBasic.ParentId ==null
|
||||
VerifyExp = t => t.Code == addOrEditBasic.Code && t.ParentId == addOrEditBasic.ParentId,
|
||||
//---------- $"已有{addOrEditBasic.Code}名称的字典"
|
||||
VerifyMsg = _localizer["Dictionary_DictionaryName", addOrEditBasic.Code],
|
||||
IsVerify = addOrEditBasic.ParentId == null
|
||||
};
|
||||
|
||||
|
||||
@@ -125,7 +143,7 @@ namespace IRaCIS.Application.Services
|
||||
//}
|
||||
|
||||
|
||||
if (addOrEditBasic.Id != null && addOrEditBasic.ParentId==null)
|
||||
if (addOrEditBasic.Id != null && addOrEditBasic.ParentId == null)
|
||||
{
|
||||
await _dicRepository.UpdatePartialFromQueryAsync(t => t.ParentId == addOrEditBasic.Id, c => new Dictionary() { DataTypeEnum = addOrEditBasic.DataTypeEnum });
|
||||
|
||||
@@ -158,9 +176,24 @@ namespace IRaCIS.Application.Services
|
||||
[HttpDelete("{id:guid}")]
|
||||
public async Task<IResponseOutput> DeleteDictionary(Guid id)
|
||||
{
|
||||
if (await _dicRepository.AnyAsync(t => t.ParentId == id))
|
||||
if (await _readingCriterionDictionaryRepository.AnyAsync(x => x.DictionaryId == id))
|
||||
{
|
||||
return ResponseOutput.NotOk("有子项数据,不允许直接删除!");
|
||||
await _readingCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.DictionaryId == id);
|
||||
//---当前字典在标准中被引用,不允许删除!
|
||||
//return ResponseOutput.NotOk(_localizer["Dictionary_DictionaryDeletion"]);
|
||||
}
|
||||
|
||||
if (await _readingTrialCriterionDictionaryRepository.AnyAsync(x => x.DictionaryId == id))
|
||||
{
|
||||
await _readingTrialCriterionDictionaryRepository.BatchDeleteNoTrackingAsync(t => t.DictionaryId == id);
|
||||
//---当前字典在标准中被引用,不允许删除!
|
||||
//return ResponseOutput.NotOk(_localizer["Dictionary_DictionaryDeletion"]);
|
||||
}
|
||||
|
||||
if (await _dicRepository.AnyAsync(t => t.ParentId == id))
|
||||
{
|
||||
//---有子项数据,不允许直接删除!
|
||||
return ResponseOutput.NotOk(_localizer["Dictionary_SubitemDeletion"]);
|
||||
}
|
||||
|
||||
if ((await _doctorDictionaryRepository.AnyAsync(t => t.DictionaryId == id)) ||
|
||||
@@ -168,15 +201,18 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
)
|
||||
{
|
||||
return ResponseOutput.NotOk("当前条目已经在阅片人的简历中被引用。");
|
||||
//---当前条目已经在阅片人的简历中被引用。
|
||||
return ResponseOutput.NotOk(_localizer["Dictionary_ResumeReference"]);
|
||||
}
|
||||
|
||||
if (await _trialDictionaryRepository.AnyAsync(t => t.DictionaryId == id) ||
|
||||
await _trialRepository.AnyAsync(t => t.ReviewModeId == id))
|
||||
{
|
||||
return ResponseOutput.NotOk("当前条目已经在项目信息中被引用。");
|
||||
//---当前条目已经在项目信息中被引用。
|
||||
return ResponseOutput.NotOk(_localizer["Dictionary_ProjectReference"]);
|
||||
}
|
||||
|
||||
|
||||
var success = await _dicRepository.BatchDeleteNoTrackingAsync(t => t.Id == id);
|
||||
return ResponseOutput.Result(success);
|
||||
}
|
||||
@@ -187,10 +223,10 @@ namespace IRaCIS.Application.Services
|
||||
/// <param name="searchArray"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<Dictionary<string, List<BasicDicSelect>>> GetBasicDataSelect(string[] searchArray)
|
||||
public async Task<Dictionary<string, List<BasicDicSelectCopy>>> GetBasicDataSelect(string[] searchArray)
|
||||
{
|
||||
|
||||
var searchList = await _dicRepository.Where(t => searchArray.Contains(t.Parent.Code) && t.ParentId != null && t.IsEnable).ProjectTo<BasicDicSelect>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var searchList = await _dicRepository.Where(t => searchArray.Contains(t.Parent.Code) && t.ParentId != null && t.IsEnable).ProjectTo<BasicDicSelectCopy>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
return searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
|
||||
|
||||
@@ -209,6 +245,8 @@ namespace IRaCIS.Application.Services
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 根据父亲字典分组 获取子项
|
||||
/// </summary>
|
||||
@@ -216,7 +254,7 @@ namespace IRaCIS.Application.Services
|
||||
/// <returns></returns>
|
||||
public async Task<List<BasicDicSelect>> GetBasicConfigSelect(string searchKey)
|
||||
{
|
||||
var searchList = await _dicRepository.Where(t => t.ConfigDictionary.Code == searchKey && t.ParentId == null && t.IsEnable).ProjectTo<BasicDicSelect>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var searchList = await _dicRepository.Where(t => t.ConfigDictionary.Code == searchKey && t.ParentId == null && t.IsEnable).ProjectTo<BasicDicSelect>(_mapper.ConfigurationProvider).OrderBy(x => x.ShowOrder).ToListAsync();
|
||||
|
||||
return searchList;
|
||||
}
|
||||
@@ -225,20 +263,164 @@ namespace IRaCIS.Application.Services
|
||||
/// 获取标准字典
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<GetCriterionDictionaryListOutDto>> GetCriterionDictionaryList()
|
||||
public async Task<List<GetCriterionDictionaryListOutDto>> GetCriterionDictionaryList(GetCriterionDictionaryListInDto inDto)
|
||||
{
|
||||
var dictionaryList = await _dicRepository.Where(x => ReadingCommon.CriterionDictionary.CriterionDictionaryCodeList.Contains(x.Code))
|
||||
var criterionCodes = await _systemCriterionDictionaryCodeRepository.Where(x => x.SystemCriterionId == inDto.SystemCriterionId).ToListAsync();
|
||||
|
||||
var parentCodes = await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.SystemCriterionId).Select(x => x.ParentCode).ToListAsync();
|
||||
|
||||
|
||||
var codes = criterionCodes.Select(x => x.Code).ToList();
|
||||
|
||||
var dictionaryList = await _dicRepository.Where(x => codes.Contains(x.Code) && x.ParentId == null)
|
||||
.OrderBy(x => x.ShowOrder).Select(x => new GetCriterionDictionaryListOutDto()
|
||||
{
|
||||
Code = x.Code,
|
||||
ShowOrder = x.ShowOrder,
|
||||
Description = x.Description
|
||||
|
||||
}).ToListAsync();
|
||||
|
||||
dictionaryList.ForEach(x =>
|
||||
{
|
||||
x.Count = parentCodes.Count(y => y == x.Code);
|
||||
x.Id = criterionCodes.Where(y => y.Code == x.Code).Select(x => x.Id).FirstOrDefault();
|
||||
});
|
||||
|
||||
return dictionaryList;
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取标准字典
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public async Task<List<GetCriterionDictionaryListOutDto>> GetTrialCriterionDictionaryList(GetTrialCriterionDictionaryListInDto inDto)
|
||||
{
|
||||
var criterionCodes = await _trialCriterionDictionaryCodeRepository.Where(x => x.TrialCriterionId == inDto.TrialCriterionId).ToListAsync();
|
||||
|
||||
var parentCodes = await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialCriterionId).Select(x => x.ParentCode).ToListAsync();
|
||||
|
||||
|
||||
var codes = criterionCodes.Select(x => x.Code).ToList();
|
||||
|
||||
var dictionaryList = await _dicRepository.Where(x => codes.Contains(x.Code) && x.ParentId == null)
|
||||
.OrderBy(x => x.ShowOrder).Select(x => new GetCriterionDictionaryListOutDto()
|
||||
{
|
||||
Code = x.Code,
|
||||
ShowOrder = x.ShowOrder,
|
||||
Description = x.Description
|
||||
}).ToListAsync();
|
||||
|
||||
dictionaryList.ForEach(x =>
|
||||
{
|
||||
x.Count = parentCodes.Count(y => y == x.Code);
|
||||
x.Id = criterionCodes.Where(y => y.Code == x.Code).Select(x => x.Id).FirstOrDefault();
|
||||
});
|
||||
|
||||
return dictionaryList;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取标准指定字典
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[AllowAnonymous]
|
||||
[HttpPost]
|
||||
public async Task<Dictionary<string, List<BasicDicSelect>>> GetCriterionDictionary(GetCriterionDictionaryInDto inDto)
|
||||
{
|
||||
var searchList = await _dicRepository.Where(t => t.ParentId != null && t.IsEnable)
|
||||
.WhereIf(!inDto.DictionaryCode.IsNullOrEmpty(), x => x.Parent.Code == inDto.DictionaryCode)
|
||||
.WhereIf(inDto.DictionaryCodeList.Count() > 0, x => inDto.DictionaryCodeList.Contains(x.Parent.Code))
|
||||
.ProjectTo<BasicDicSelect>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var result = searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
|
||||
if (inDto.ReadingCriterionId == null)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
List<string> selectCode = new List<string>();
|
||||
List<BasicDicSelect> criterionDictionList = new List<BasicDicSelect>();
|
||||
|
||||
var isSystemCriterion = await _readingQuestionCriterionSystem.AnyAsync(x => x.Id == inDto.ReadingCriterionId);
|
||||
if (isSystemCriterion)
|
||||
{
|
||||
selectCode = await _systemCriterionDictionaryCodeRepository.Where(x => x.SystemCriterionId == inDto.ReadingCriterionId).Select(x => x.Code).ToListAsync();
|
||||
|
||||
criterionDictionList = await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.ReadingCriterionId).Select(x => new BasicDicSelect()
|
||||
{
|
||||
ChildGroup = x.Dictionary.ChildGroup,
|
||||
Code = x.Dictionary.Code,
|
||||
DataTypeEnum = x.Dictionary.DataTypeEnum,
|
||||
ParentChildCodeEnum = x.Dictionary.Parent.ChildCodeEnum,
|
||||
ShowOrder = x.Dictionary.ShowOrder,
|
||||
ParentCode = x.ParentCode,
|
||||
CrterionDictionaryGroup = x.CrterionDictionaryGroup,
|
||||
Id = x.DictionaryId,
|
||||
ParentId = x.Dictionary.ParentId,
|
||||
Value = x.Dictionary.Value,
|
||||
ValueCN = x.Dictionary.ValueCN
|
||||
|
||||
}).ToListAsync();
|
||||
}
|
||||
else
|
||||
{
|
||||
selectCode = await _trialCriterionDictionaryCodeRepository.Where(x => x.TrialCriterionId == inDto.ReadingCriterionId).Select(x => x.Code).ToListAsync();
|
||||
|
||||
criterionDictionList = await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.ReadingCriterionId).Select(x => new BasicDicSelect()
|
||||
{
|
||||
ChildGroup = x.Dictionary.ChildGroup,
|
||||
Code = x.Dictionary.Code,
|
||||
DataTypeEnum = x.Dictionary.DataTypeEnum,
|
||||
ParentChildCodeEnum = x.Dictionary.Parent.ChildCodeEnum,
|
||||
ShowOrder = x.Dictionary.ShowOrder,
|
||||
ParentCode = x.ParentCode,
|
||||
CrterionDictionaryGroup = x.CrterionDictionaryGroup,
|
||||
Id = x.DictionaryId,
|
||||
ParentId = x.Dictionary.ParentId,
|
||||
Value = x.Dictionary.Value,
|
||||
ValueCN = x.Dictionary.ValueCN
|
||||
|
||||
}).ToListAsync();
|
||||
}
|
||||
|
||||
|
||||
var criterionCode = await _dicRepository.Where(x => x.ConfigDictionary.Code == "Reading_eCRF_Criterion").Select(x => x.Code).ToListAsync();
|
||||
|
||||
|
||||
foreach (var item in criterionCode)
|
||||
{
|
||||
if (result.ContainsKey(item))
|
||||
{
|
||||
result[item] = new List<BasicDicSelect>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
criterionDictionList = criterionDictionList.Where(x => selectCode.Contains(x.ParentCode)).ToList();
|
||||
|
||||
var criterionDic = criterionDictionList.GroupBy(x => x.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
|
||||
|
||||
foreach (var item in criterionDic)
|
||||
{
|
||||
if (result.ContainsKey(item.Key))
|
||||
{
|
||||
result[item.Key] = item.Value;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有下拉框 枚举 bool 数据
|
||||
/// </summary>
|
||||
@@ -246,7 +428,7 @@ namespace IRaCIS.Application.Services
|
||||
[AllowAnonymous]
|
||||
public async Task<Dictionary<string, List<BasicDicSelect>>> GetBasicDataAllSelect(GetBasicDataAllSelectInDto inDto)
|
||||
{
|
||||
var searchList = await _dicRepository.Where(t => t.ParentId != null && t.IsEnable ).ProjectTo<BasicDicSelect>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var searchList = await _dicRepository.Where(t => t.ParentId != null && t.IsEnable).ProjectTo<BasicDicSelect>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
|
||||
var result = searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
|
||||
|
||||
@@ -256,21 +438,49 @@ namespace IRaCIS.Application.Services
|
||||
}
|
||||
else
|
||||
{
|
||||
var criterionDictionList = await _readingCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialReadingCriterionId).Select(x => new BasicDicSelect()
|
||||
var trialCriterionType = await _readingQuestionCriterionTrial.Where(x => x.Id == inDto.TrialReadingCriterionId).Select(x => x.CriterionType).FirstOrDefaultAsync();
|
||||
if (trialCriterionType == CriterionType.SelfDefine)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
List<string> selectCode = await _trialCriterionDictionaryCodeRepository.Where(x => x.TrialCriterionId == inDto.TrialReadingCriterionId).Select(x => x.Code).ToListAsync();
|
||||
|
||||
|
||||
var criterionCode = await _dicRepository.Where(x => x.ConfigDictionary.Code == "Reading_eCRF_Criterion").Select(x => x.Code).ToListAsync();
|
||||
|
||||
|
||||
foreach (var item in criterionCode)
|
||||
{
|
||||
if (result.ContainsKey(item))
|
||||
{
|
||||
result[item] = new List<BasicDicSelect>();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
var criterionDictionList = await _readingTrialCriterionDictionaryRepository.Where(x => x.CriterionId == inDto.TrialReadingCriterionId).Select(x => new BasicDicSelect()
|
||||
{
|
||||
ChildGroup = x.Dictionary.ChildGroup,
|
||||
Code = x.Dictionary.Code,
|
||||
Description = x.Dictionary.Description,
|
||||
DataTypeEnum = x.Dictionary.DataTypeEnum,
|
||||
ParentChildCodeEnum = x.Dictionary.Parent.ChildCodeEnum,
|
||||
ShowOrder = x.Dictionary.ShowOrder,
|
||||
ParentCode = x.ParentCode,
|
||||
Id = x.DictionaryId,
|
||||
CrterionDictionaryGroup = x.CrterionDictionaryGroup,
|
||||
ParentId = x.Dictionary.ParentId,
|
||||
Value = x.Dictionary.Value,
|
||||
ValueCN = x.Dictionary.ValueCN
|
||||
|
||||
}).ToListAsync();
|
||||
|
||||
criterionDictionList = criterionDictionList.Where(x => selectCode.Contains(x.ParentCode)).ToList();
|
||||
|
||||
var criterionDic = criterionDictionList.GroupBy(x => x.ParentCode).ToDictionary(g => g.Key, g => g.OrderBy(t => t.ShowOrder).ToList());
|
||||
|
||||
foreach (var item in criterionDic)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -33,7 +33,7 @@ namespace IRaCIS.Application.Interfaces
|
||||
/// <returns></returns>
|
||||
Task<string> GetBasicDataTranslateItem<T>(string parentCode, T childCode);
|
||||
|
||||
Task<Dictionary<string, List<BasicDicSelect>>> GetBasicDataSelect(string[] searchArray);
|
||||
Task<Dictionary<string, List<BasicDicSelectCopy>>> GetBasicDataSelect(string[] searchArray);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,6 +16,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
Task AnolymousSendEmail(string researchProgramNo, string emailAddress, int verificationCode);
|
||||
|
||||
Task SendEmailVerification(string emailAddress, int verificationCode);
|
||||
|
||||
Task SiteSurveyRejectEmail(MimeMessage messageToSend);
|
||||
|
||||
Task SendMailEditEmail(Guid userId, string userName, string emailAddress, int verificationCode);
|
||||
@@ -35,7 +37,7 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
}
|
||||
|
||||
public class MailVerificationService : IMailVerificationService
|
||||
public class MailVerificationService : BaseService, IMailVerificationService
|
||||
{
|
||||
private readonly IRepository<VerificationCode> _verificationCodeRepository;
|
||||
|
||||
@@ -98,7 +100,8 @@ namespace IRaCIS.Application.Services
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(userName, emailAddress));
|
||||
//主题
|
||||
messageToSend.Subject = "[来自展影IRC] 关于重置邮箱的提醒";
|
||||
//---[来自展影IRC] 关于重置邮箱的提醒
|
||||
messageToSend.Subject = _localizer["Mail_EmailResetReminder"];
|
||||
|
||||
var builder = new BodyBuilder();
|
||||
|
||||
@@ -107,7 +110,8 @@ namespace IRaCIS.Application.Services
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "UserOptCommon.html";
|
||||
//+ "UserOptCommon.html";
|
||||
+(_userInfo.IsEn_Us ? "UserOptCommon_US.html" : "UserOptCommon.html");
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
@@ -115,8 +119,11 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
|
||||
builder.HtmlBody = string.Format(templateInfo,
|
||||
$" 尊敬的 {userName} , ",
|
||||
"您正在进行邮箱重置操作",
|
||||
|
||||
//---尊敬的
|
||||
_localizer["Mail_Dear", userName],
|
||||
//---您正在进行邮箱重置操作
|
||||
_localizer["Mail_ResettingEmail"],
|
||||
verificationCode
|
||||
);
|
||||
}
|
||||
@@ -159,7 +166,8 @@ namespace IRaCIS.Application.Services
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress));
|
||||
//主题
|
||||
messageToSend.Subject = "[来自展影IRC] 关于重置密码的提醒";
|
||||
//---[来自展影IRC] 关于重置密码的提醒
|
||||
messageToSend.Subject = _localizer["Mail_IRCResettingPassword "];
|
||||
|
||||
|
||||
|
||||
@@ -169,7 +177,8 @@ namespace IRaCIS.Application.Services
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "UserOptCommon.html";
|
||||
//+ "UserOptCommon.html";
|
||||
+ (_userInfo.IsEn_Us ? "UserOptCommon_US.html" : "UserOptCommon.html");
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
@@ -178,7 +187,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
builder.HtmlBody = string.Format(templateInfo,
|
||||
"",
|
||||
"您正在进行邮箱重置密码操作",
|
||||
//---您正在进行邮箱重置密码操作
|
||||
_localizer["Mail_ResettingPassword "],
|
||||
verificationCode
|
||||
);
|
||||
}
|
||||
@@ -208,6 +218,77 @@ namespace IRaCIS.Application.Services
|
||||
await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, sucessHandle);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送验证码
|
||||
/// </summary>
|
||||
/// <param name="emailAddress"></param>
|
||||
/// <param name="verificationCode"></param>
|
||||
/// <returns></returns>
|
||||
public async Task SendEmailVerification(string emailAddress, int verificationCode)
|
||||
{
|
||||
|
||||
|
||||
var messageToSend = new MimeMessage();
|
||||
//发件地址
|
||||
messageToSend.From.Add(new MailboxAddress(_systemEmailConfig.FromName, _systemEmailConfig.FromEmail));
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress));
|
||||
//主题
|
||||
//---[来自展影IRC]的提醒
|
||||
messageToSend.Subject = _localizer["Mail_ImagingIRCReminder"];
|
||||
|
||||
|
||||
|
||||
|
||||
var builder = new BodyBuilder();
|
||||
|
||||
var pathToFile = _hostEnvironment.WebRootPath
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ (_userInfo.IsEn_Us ? "UserOptCommon_US.html": "UserOptCommon.html" );
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
var templateInfo = SourceReader.ReadToEnd();
|
||||
|
||||
|
||||
builder.HtmlBody = string.Format(templateInfo,
|
||||
"",
|
||||
//---您正在参与展影医疗IRC项目
|
||||
_localizer["Mail_IRCProject"],
|
||||
verificationCode
|
||||
);
|
||||
}
|
||||
|
||||
messageToSend.Body = builder.ToMessageBody();
|
||||
|
||||
|
||||
|
||||
EventHandler<MessageSentEventArgs> sucessHandle = (sender, args) =>
|
||||
{
|
||||
// args.Response
|
||||
var code = verificationCode.ToString();
|
||||
_ = _verificationCodeRepository.AddAsync(new VerificationCode()
|
||||
{
|
||||
CodeType = VerifyType.Email,
|
||||
HasSend = true,
|
||||
Code = code,
|
||||
UserId = Guid.Empty,//此时不知道用户
|
||||
EmailOrPhone = emailAddress,
|
||||
ExpirationTime = DateTime.Now.AddMinutes(3)
|
||||
}).Result;
|
||||
_ = _verificationCodeRepository.SaveChangesAsync().Result;
|
||||
};
|
||||
|
||||
|
||||
|
||||
await SendEmailHelper.SendEmailAsync(messageToSend, _systemEmailConfig, sucessHandle);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
//中心调研 登陆
|
||||
public async Task AnolymousSendEmail(string researchProgramNo, string emailAddress, int verificationCode)
|
||||
{
|
||||
@@ -219,7 +300,8 @@ namespace IRaCIS.Application.Services
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(String.Empty, emailAddress));
|
||||
//主题
|
||||
messageToSend.Subject = $"[来自展影IRC] [{researchProgramNo}] 关于中心调研的提醒";
|
||||
//$"[来自展影IRC] [{researchProgramNo}] 关于中心调研的提醒";
|
||||
messageToSend.Subject = _localizer["Mail_ProjectParticipationReminder", researchProgramNo];
|
||||
|
||||
|
||||
|
||||
@@ -230,7 +312,8 @@ namespace IRaCIS.Application.Services
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "UserOptCommon.html";
|
||||
//+ "UserOptCommon.html";
|
||||
+ (_userInfo.IsEn_Us ? "UserOptCommon_US.html" : "UserOptCommon.html");
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
@@ -239,7 +322,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
builder.HtmlBody = string.Format(templateInfo,
|
||||
"",
|
||||
"您正在参与展影医疗IRC项目中心调研工作",
|
||||
//---您正在参与展影医疗IRC项目中心调研工作
|
||||
_localizer["Mail_CenterResearchReminder"],
|
||||
verificationCode
|
||||
);
|
||||
}
|
||||
@@ -296,7 +380,8 @@ namespace IRaCIS.Application.Services
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail));
|
||||
//主题
|
||||
messageToSend.Subject = "[来自展影IRC] 关于创建账户的提醒";
|
||||
//---[来自展影IRC] 关于创建账户的提醒
|
||||
messageToSend.Subject = _localizer["Mail_AccountCreationReminder"];
|
||||
|
||||
|
||||
|
||||
@@ -306,7 +391,8 @@ namespace IRaCIS.Application.Services
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "AdminAddUser.html";
|
||||
//+ "AdminAddUser.html";
|
||||
+ (_userInfo.IsEn_Us ? "AdminAddUser_US.html" : "AdminAddUser.html");
|
||||
|
||||
var token = _tokenService.GetToken(IRaCISClaims.Create(_mapper.Map<UserBasicInfo>(sysUserInfo)));
|
||||
|
||||
@@ -350,7 +436,8 @@ namespace IRaCIS.Application.Services
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail));
|
||||
//主题
|
||||
messageToSend.Subject = "[来自展影IRC] 关于重置账户密码的提醒";
|
||||
//---[来自展影IRC] 关于重置账户密码的提醒
|
||||
messageToSend.Subject = _localizer["Mail_AccountPasswordResetReminder"];
|
||||
|
||||
|
||||
|
||||
@@ -360,7 +447,8 @@ namespace IRaCIS.Application.Services
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "AdminResetUser.html";
|
||||
//+ "AdminResetUser.html";
|
||||
+ (_userInfo.IsEn_Us ? "AdminResetUser_US.html" : "AdminResetUser.html");
|
||||
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
@@ -398,7 +486,8 @@ namespace IRaCIS.Application.Services
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(sysUserInfo.FullName, sysUserInfo.EMail));
|
||||
//主题
|
||||
messageToSend.Subject = $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信";
|
||||
// $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信";
|
||||
messageToSend.Subject = _localizer["Mail_InvitationEmail", trialInfo.ResearchProgramNo];
|
||||
|
||||
|
||||
|
||||
@@ -417,7 +506,7 @@ namespace IRaCIS.Application.Services
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ (sysUserInfo.IsFirstAdd ? "TrialUserFirstJoin.html" : "TrialUserExistJoin.html");
|
||||
+ (sysUserInfo.IsFirstAdd ? (_userInfo.IsEn_Us ? "TrialUserFirstJoin_US.html" : "TrialUserFirstJoin.html") : (_userInfo.IsEn_Us ? "TrialUserExistJoin_US.html" : "TrialUserExistJoin.html"));
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
@@ -461,7 +550,8 @@ namespace IRaCIS.Application.Services
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(String.Empty, sysUserInfo.EMail));
|
||||
//主题
|
||||
messageToSend.Subject = $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信";
|
||||
// $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信";
|
||||
messageToSend.Subject = _localizer["Mail_InvitationEmail", trialInfo.ResearchProgramNo];
|
||||
|
||||
|
||||
var builder = new BodyBuilder();
|
||||
@@ -478,7 +568,7 @@ namespace IRaCIS.Application.Services
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ (sysUserInfo.IsFirstAdd ? "TrialUserFirstJoin.html" : "TrialUserExistJoin.html");
|
||||
+ (sysUserInfo.IsFirstAdd ? (_userInfo.IsEn_Us ? "TrialUserFirstJoin_US.html" : "TrialUserFirstJoin.html") : (_userInfo.IsEn_Us ? "TrialUserExistJoin_US.html" : "TrialUserExistJoin.html") );
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
@@ -529,6 +619,14 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
var saveItem = new User() { FirstName = doctor.FirstName, LastName = doctor.LastName, EMail = doctor.EMail };
|
||||
|
||||
var trialType = await _trialRepository.Where(t => t.Id == trialId).Select(t => t.TrialType).FirstOrDefaultAsync();
|
||||
|
||||
if (trialType == TrialType.NoneOfficial)
|
||||
{
|
||||
saveItem.IsTestUser = true;
|
||||
}
|
||||
|
||||
|
||||
saveItem.Code = _userRepository.Select(t => t.Code).DefaultIfEmpty().Max() + 1;
|
||||
|
||||
saveItem.UserCode = AppSettings.GetCodeStr(saveItem.Code, nameof(User));
|
||||
@@ -565,7 +663,8 @@ namespace IRaCIS.Application.Services
|
||||
//收件地址
|
||||
messageToSend.To.Add(new MailboxAddress(doctor.FullName, doctor.EMail));
|
||||
//主题
|
||||
messageToSend.Subject = $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信";
|
||||
// $"[来自展影IRC] [{trialInfo.ResearchProgramNo}]邀请信";
|
||||
messageToSend.Subject = _localizer["Mail_InvitationEmail", trialInfo.ResearchProgramNo];
|
||||
|
||||
|
||||
var builder = new BodyBuilder();
|
||||
@@ -589,7 +688,7 @@ namespace IRaCIS.Application.Services
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ "EmailTemplate"
|
||||
+ Path.DirectorySeparatorChar.ToString()
|
||||
+ (sysUserInfo.IsFirstAdd ? "TrialDoctorFirstJoin.html" : "TrialDoctorExistJoin.html");
|
||||
+ (sysUserInfo.IsFirstAdd ? (_userInfo.IsEn_Us ? "TrialDoctorFirstJoin_US.html" : "TrialDoctorFirstJoin.html") : (_userInfo.IsEn_Us ? "TrialDoctorExistJoin_US.html" : "TrialDoctorExistJoin.html") );
|
||||
|
||||
using (StreamReader SourceReader = System.IO.File.OpenText(pathToFile))
|
||||
{
|
||||
|
||||
@@ -99,7 +99,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
public async Task<Dictionary<string, List<SystemBasicDataSelect>>> GetBasicDataSelect(string[] searchArray)
|
||||
{
|
||||
|
||||
var searchList = await _systemBasicDataRepository.Where(t => searchArray.Contains(t.Parent.Code) && t.ParentId != null).ProjectTo<SystemBasicDataSelect>(_mapper.ConfigurationProvider).ToListAsync();
|
||||
var searchList = await _systemBasicDataRepository.Where(t => searchArray.Contains(t.Parent.Code) && t.ParentId != null).ProjectTo<SystemBasicDataSelect>(_mapper.ConfigurationProvider,new { _userInfo.IsEn_Us}).ToListAsync();
|
||||
|
||||
return searchList.GroupBy(t => t.ParentCode).ToDictionary(g => g.Key, g => g.ToList());
|
||||
|
||||
|
||||
@@ -0,0 +1,160 @@
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Configuration;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.Extensions.Configuration.Json;
|
||||
using IRaCIS.Core.Infrastructure.Extention;
|
||||
using SharpCompress.Common;
|
||||
using System.Text.Json;
|
||||
using System.Text.Json.Nodes;
|
||||
using System.Text.Encodings.Web;
|
||||
using Newtonsoft.Json.Linq;
|
||||
using Newtonsoft.Json;
|
||||
using IRaCIS.Core.Infrastructure;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service.Common
|
||||
{
|
||||
[ApiExplorerSettings(GroupName = "Common")]
|
||||
public class SystemMonitor : BaseService
|
||||
{
|
||||
|
||||
public void GetDiskInfo()
|
||||
{
|
||||
// Get all drives
|
||||
var drives = DriveInfo.GetDrives();
|
||||
|
||||
// Loop through each drive and get info
|
||||
foreach (var drive in drives)
|
||||
{
|
||||
if (drive.IsReady && drive.DriveType == DriveType.Fixed)
|
||||
{
|
||||
long totalSize = drive.TotalSize;
|
||||
long availableSpace = drive.AvailableFreeSpace;
|
||||
long usedSpace = totalSize - availableSpace;
|
||||
double usedSpacePercent = (double)usedSpace / totalSize * 100;
|
||||
|
||||
Console.WriteLine($"Drive {drive.Name}: Total size = {totalSize / (1024 * 1024)} MB, Available space = {availableSpace / (1024 * 1024)} MB, Used space = {usedSpace / (1024 * 1024)} MB ({usedSpacePercent:F2}%)");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public string GetBestStoreDisk()
|
||||
{
|
||||
|
||||
var json = File.ReadAllText("appsettings.json");
|
||||
|
||||
JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load });
|
||||
|
||||
int switchingRatio = 80;
|
||||
|
||||
try
|
||||
{
|
||||
switchingRatio = (int)jsonObject["IRaCISImageStore"]["SwitchingRatio"];
|
||||
}
|
||||
catch (Exception e)
|
||||
{
|
||||
|
||||
throw new BusinessValidationFailedException("解析Json文件配置出现问题:"+e.Message);
|
||||
}
|
||||
|
||||
//默认存储的路径
|
||||
var defaultStoreRootFolder = Path.Combine((Directory.GetParent(_hostEnvironment.ContentRootPath.TrimEnd('\\'))).IfNullThrowException().FullName, StaticData.Folder.IRaCISDataFolder);
|
||||
|
||||
|
||||
DriveInfo defaultDrive = new DriveInfo(Path.GetPathRoot(defaultStoreRootFolder));
|
||||
|
||||
var drives = DriveInfo.GetDrives().Where(t => !t.Name.Contains("C") && !t.Name.Contains("c"))
|
||||
.Where(d => d.DriveType == DriveType.Fixed && d.IsReady)
|
||||
//剩余空间最多的
|
||||
.OrderByDescending(d => d.AvailableFreeSpace)
|
||||
|
||||
//存储空间相同,则按照按照总空间从大到小排序
|
||||
.ThenByDescending(d => d.TotalSize - d.TotalFreeSpace);
|
||||
|
||||
var bestDrive = drives.FirstOrDefault();
|
||||
var bestStoreRootFolder = string.Empty;
|
||||
|
||||
//仅仅只有C 盘
|
||||
if (bestDrive == null || ((double)(defaultDrive.TotalSize - defaultDrive.TotalFreeSpace) / defaultDrive.TotalSize) * 100 < switchingRatio)
|
||||
{
|
||||
bestStoreRootFolder = defaultStoreRootFolder;
|
||||
}
|
||||
else
|
||||
{
|
||||
bestStoreRootFolder = Path.Combine(bestDrive?.RootDirectory.FullName, _hostEnvironment.EnvironmentName);
|
||||
}
|
||||
|
||||
|
||||
//找到最优驱动器
|
||||
DriveInfo drive = new DriveInfo(Path.GetPathRoot(bestStoreRootFolder));
|
||||
|
||||
//最优盘符使用率超过百分之80
|
||||
if (((double)(drive.TotalSize - drive.TotalFreeSpace) / drive.TotalSize) * 100 > switchingRatio)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
if (!Directory.Exists(bestStoreRootFolder))
|
||||
{
|
||||
Directory.CreateDirectory(bestStoreRootFolder);
|
||||
}
|
||||
|
||||
return bestStoreRootFolder;
|
||||
|
||||
}
|
||||
public class GeneralRule
|
||||
{
|
||||
public string Endpoint { get; set; }
|
||||
public string Period { get; set; }
|
||||
public int Limit { get; set; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
public void UpdateAppSettings(string key, string newValue)
|
||||
{
|
||||
|
||||
|
||||
|
||||
List<GeneralRule> generalRules = new List<GeneralRule>()
|
||||
{
|
||||
new GeneralRule() { Endpoint = "*", Period = "1s", Limit = 3 },
|
||||
new GeneralRule() { Endpoint = "*", Period = "15m", Limit = 100 },
|
||||
new GeneralRule() { Endpoint = "*", Period = "12h", Limit = 1000 },
|
||||
new GeneralRule() { Endpoint = "*", Period = "7d", Limit = 10000 }
|
||||
};
|
||||
|
||||
// 读取 Json 文件
|
||||
string jsonFilePath = "appsettings.json";
|
||||
|
||||
var json = File.ReadAllText("appsettings.json");
|
||||
|
||||
JObject jsonObject = JObject.Parse(json, new JsonLoadSettings() { CommentHandling = CommentHandling.Load });
|
||||
|
||||
|
||||
// 操作UpdateConfig对象
|
||||
jsonObject["UpdateConfig"][key] = newValue;
|
||||
|
||||
jsonObject["UpdateConfig"]["testArray"] = JArray.FromObject(generalRules);
|
||||
|
||||
// 将更改保存回 Json 文件
|
||||
File.WriteAllText(jsonFilePath, jsonObject.ToString());
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -25,8 +25,10 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
CreateMap<SystemBasicData, SystemBasicDataView>();
|
||||
|
||||
var isEn_Us = false;
|
||||
CreateMap<SystemBasicData, SystemBasicDataSelect>()
|
||||
.ForMember(o => o.ParentCode, t => t.MapFrom(u => u.Parent.Code));
|
||||
.ForMember(o => o.ParentCode, t => t.MapFrom(u => u.Parent.Code))
|
||||
.ForMember(o => o.Value, t => t.MapFrom(u => isEn_Us? u.Value:u.ValueCN));
|
||||
|
||||
CreateMap<SystemBasicDataAddOrEdit, SystemBasicData>().ReverseMap();
|
||||
|
||||
@@ -37,10 +39,13 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
CreateMap<AddOrEditBasicDic, Dictionary>().ReverseMap();
|
||||
|
||||
CreateMap<Dictionary, BasicDicSelectCopy>()
|
||||
.ForMember(o => o.ParentChildCodeEnum, t => t.MapFrom(u => u.Parent.ChildCodeEnum))
|
||||
.ForMember(o => o.Value, t => t.MapFrom(u => u.MappedValue))
|
||||
.ForMember(o => o.ParentCode, t => t.MapFrom(u => u.Parent.Code));
|
||||
|
||||
CreateMap<Dictionary, BasicDicSelect>()
|
||||
.ForMember(o => o.ParentChildCodeEnum, t => t.MapFrom(u => u.Parent.ChildCodeEnum))
|
||||
|
||||
.ForMember(o => o.ParentCode, t => t.MapFrom(u => u.Parent.Code));
|
||||
|
||||
var token = "";
|
||||
|
||||
@@ -26,6 +26,9 @@
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public class TrialSOWPathDTO
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
@@ -33,7 +33,7 @@ namespace IRaCIS.Application.Contracts
|
||||
public List<Guid> ReadingTypeIds => DictionaryList.Where(t => t.ParentCode == StaticData.ReadingType).OrderBy(t => t.ShowOrder).Select(t => t.Id).ToList();
|
||||
|
||||
|
||||
|
||||
public string AccountUserName { get; set; }
|
||||
|
||||
|
||||
|
||||
@@ -52,6 +52,8 @@ namespace IRaCIS.Application.Contracts
|
||||
public string Phone { get; set; } = string.Empty;
|
||||
public string Introduction { get; set; } = string.Empty;
|
||||
public string EMail { get; set; } = string.Empty;
|
||||
|
||||
public ReviewerInformationConfirmStatus ReviewStatus { get; set; } = ReviewerInformationConfirmStatus.ConfirmRefuse;
|
||||
public string WeChat { get; set; } = string.Empty;
|
||||
|
||||
//部门
|
||||
@@ -120,6 +122,8 @@ namespace IRaCIS.Application.Contracts
|
||||
public int? Submitted { get; set; }
|
||||
|
||||
public int? Finished { get; set; }
|
||||
|
||||
public bool IsVirtual { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -677,6 +681,125 @@ namespace IRaCIS.Application.Contracts
|
||||
public string BlindPublications { get; set; }
|
||||
|
||||
}
|
||||
public class DeleteDoctorCriterionFile
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
}
|
||||
|
||||
public class AddDoctorCriterionFileDto
|
||||
{
|
||||
public Guid? Id { get; set; }
|
||||
|
||||
public Guid? TrialId { get; set; }
|
||||
|
||||
public Guid? TrialReadingCriterionId { get; set; }
|
||||
|
||||
public string CriterionName { get; set; }
|
||||
|
||||
public bool IsEnable { get; set; } = true;
|
||||
|
||||
/// <summary>
|
||||
/// 文件名称
|
||||
/// </summary>
|
||||
public string FileName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件路径
|
||||
/// </summary>
|
||||
public string FilePath { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 标准类型
|
||||
/// </summary>
|
||||
public CriterionType CriterionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 医生Id
|
||||
/// </summary>
|
||||
public Guid DoctorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 文件类型
|
||||
/// </summary>
|
||||
public CriterionFileType FileType { get; set; }
|
||||
}
|
||||
|
||||
|
||||
public class GetDoctorCriterionFileOutDto
|
||||
{
|
||||
public Guid Id { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件名称
|
||||
/// </summary>
|
||||
public string FileName { get; set; }
|
||||
|
||||
public bool IsEnable { get; set; }
|
||||
|
||||
public string CriterionName { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件路径
|
||||
/// </summary>
|
||||
public string FilePath { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 标准类型
|
||||
/// </summary>
|
||||
public CriterionType CriterionType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 医生Id
|
||||
/// </summary>
|
||||
public Guid DoctorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 备注
|
||||
/// </summary>
|
||||
public string Remark { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件类型
|
||||
/// </summary>
|
||||
public CriterionFileType FileType { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// CreateUserId
|
||||
/// </summary>
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// CreateTime
|
||||
/// </summary>
|
||||
public DateTime CreateTime { get; set; }
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class GetDoctorCriterionFileInDto
|
||||
{
|
||||
public Guid DoctorId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 文件类型
|
||||
/// </summary>
|
||||
public CriterionFileType? FileType { get; set; }
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 标准类型
|
||||
/// </summary>
|
||||
public CriterionType? CriterionType { get; set; }
|
||||
}
|
||||
|
||||
public class ResumeConfirmDTO
|
||||
{
|
||||
|
||||
@@ -7,6 +7,11 @@
|
||||
public Guid DoctorId { get; set; }
|
||||
|
||||
public Guid? PhaseId { get; set; }
|
||||
|
||||
public DateTime? StartTime { get; set; }
|
||||
|
||||
public DateTime? EndTime { get; set; }
|
||||
|
||||
public string EvaluationContent { get; set; } = String.Empty;
|
||||
|
||||
public int VisitReadingCount { get; set; }
|
||||
|
||||
@@ -82,6 +82,7 @@ namespace IRaCIS.Application.Services
|
||||
.WhereIf(selectionQuery.DepartmentId != null, t => t.DepartmentId == selectionQuery.DepartmentId)
|
||||
.WhereIf(selectionQuery.SpecialityId != null, t => t.SpecialityId == selectionQuery.SpecialityId)
|
||||
.WhereIf(trialConfig.TrialType == TrialType.NoneOfficial, t => t.IsVirtual ==true)
|
||||
.WhereIf(trialConfig.TrialType != TrialType.NoneOfficial, t => t.IsVirtual == false)
|
||||
.WhereIf(selectionQuery.HospitalId != null, t => t.HospitalId == selectionQuery.HospitalId)
|
||||
.WhereIf(selectionQuery.PositionId != null, t => t.PositionId == selectionQuery.PositionId)
|
||||
.WhereIf(selectionQuery.RankId != null, t => t.RankId == selectionQuery.RankId)
|
||||
@@ -91,7 +92,7 @@ namespace IRaCIS.Application.Services
|
||||
.WhereIf(!string.IsNullOrWhiteSpace(selectionQuery.Name), t => t.ChineseName.Contains(selectionQuery.Name) || (t.LastName + t.FirstName).Contains(selectionQuery.Name))
|
||||
.WhereIf(evaluationCriteriaCount > 0, t => t.TrialExperienceCriteriaList.Count(t => selectionQuery.EvaluationCriteriaIdList.Contains(t.EvaluationCriteriaId)) == evaluationCriteriaCount)
|
||||
//用户类型 看到简历的范围这里需要确认
|
||||
.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ReviewerCoordinator, t => t.UserList.Any(u => u.UserId == _userInfo.Id))
|
||||
//.WhereIf(_userInfo.UserTypeEnumInt == (int)UserTypeEnum.ReviewerCoordinator, t => t.UserList.Any(u => u.UserId == _userInfo.Id))
|
||||
.WhereIf(count > 0, t => t.DoctorDicRelationList.Count(u => guidList.Contains(u.DictionaryId)) == count)
|
||||
.WhereIf(selectionQuery.EnrollStatus != null && selectionQuery.EnrollStatus == (int)ReviewerEnrollStatus.Yes, t => t.EnrollList.Any(u => u.EnrollStatus == EnrollStatus.DoctorReading))
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ namespace IRaCIS.Application.Services
|
||||
private readonly IRepository<Enroll> _enrollRepository;
|
||||
private readonly IRepository<DoctorDictionary> _doctorDictionaryRepository;
|
||||
private readonly IRepository<Attachment> _attachmentRepository;
|
||||
private readonly IRepository<DoctorCriterionFile> _doctorCriterionFileRepository;
|
||||
private readonly IRepository<UserDoctor> _userDoctorRepository;
|
||||
private readonly IRepository<Trial> _trialRepository;
|
||||
private readonly IRepository<TrialPaymentPrice> _trialExtRepository;
|
||||
@@ -28,6 +29,7 @@ namespace IRaCIS.Application.Services
|
||||
IRepository<Message> sysMessageRepository, IRepository<Enroll> intoGroupRepository,
|
||||
IRepository<DoctorDictionary> doctorDictionaryRepository,
|
||||
IRepository<Attachment> attachmentRepository,
|
||||
IRepository<DoctorCriterionFile> doctorCriterionFileRepository,
|
||||
IRepository<UserDoctor> userDoctorRepository,
|
||||
IRepository<Trial> trialRepository,
|
||||
IRepository<TrialPaymentPrice> trialExtRepository, IRepository<Vacation> vacationRepository)
|
||||
@@ -37,6 +39,7 @@ namespace IRaCIS.Application.Services
|
||||
_enrollRepository = intoGroupRepository;
|
||||
_doctorDictionaryRepository = doctorDictionaryRepository;
|
||||
_attachmentRepository = attachmentRepository;
|
||||
this._doctorCriterionFileRepository = doctorCriterionFileRepository;
|
||||
_userDoctorRepository = userDoctorRepository;
|
||||
_trialRepository = trialRepository;
|
||||
_trialExtRepository = trialExtRepository;
|
||||
@@ -57,7 +60,8 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
Expression<Func<Doctor, bool>> verifyExp = t => t.Phone == basicInfoModel.Phone || t.EMail == basicInfoModel.EMail;
|
||||
|
||||
var verifyPair = new KeyValuePair<Expression<Func<Doctor, bool>>, string>(verifyExp, "current phone or email number already existed");
|
||||
//---current phone or email number already existed
|
||||
var verifyPair = new KeyValuePair<Expression<Func<Doctor, bool>>, string>(verifyExp, _localizer["Doctor_DupPhoneOrEmail"]);
|
||||
|
||||
if (basicInfoModel.Id == Guid.Empty || basicInfoModel.Id == null)
|
||||
{
|
||||
@@ -67,17 +71,19 @@ namespace IRaCIS.Application.Services
|
||||
//验证用户手机号
|
||||
if (await _doctorRepository.AnyAsync(t => t.Phone == doctor.Phone))
|
||||
{
|
||||
return ResponseOutput.NotOk("The current phone number already existed!", new DoctorBasicInfoCommand());
|
||||
//---The current phone number already existed!
|
||||
return ResponseOutput.NotOk(_localizer["Doctor_DupPhone"], new DoctorBasicInfoCommand());
|
||||
}
|
||||
|
||||
if (await _doctorRepository.AnyAsync(t => t.EMail == doctor.EMail))
|
||||
{
|
||||
return ResponseOutput.NotOk("The current email already existed!", new DoctorBasicInfoCommand());
|
||||
//---The current email already existed!
|
||||
return ResponseOutput.NotOk(_localizer["Doctor_DupEmail"], new DoctorBasicInfoCommand());
|
||||
}
|
||||
|
||||
doctor.Code = (await _doctorRepository.MaxAsync(t => t.Code)) + 1;
|
||||
|
||||
doctor.ReviewerCode = AppSettings.GetCodeStr(doctor.Code,nameof(Doctor)) ;
|
||||
doctor.ReviewerCode = AppSettings.GetCodeStr(doctor.Code, nameof(Doctor));
|
||||
|
||||
doctor.Password = MD5Helper.Md5(doctor.Phone);
|
||||
|
||||
@@ -88,7 +94,7 @@ namespace IRaCIS.Application.Services
|
||||
await _doctorRepository.AddAsync(doctor);
|
||||
//_doctorRepository.Add(doctor);
|
||||
|
||||
await _repository.AddAsync(new UserDoctor() { DoctorId = doctor.Id, UserId = _userInfo.Id });
|
||||
//await _repository.AddAsync(new UserDoctor() { DoctorId = doctor.Id, UserId = _userInfo.Id });
|
||||
//_userDoctorRepository.Add(new UserDoctor() { DoctorId = doctor.Id, UserId = _userInfo.Id });
|
||||
|
||||
var success = await _repository.SaveChangesAsync();
|
||||
@@ -100,23 +106,25 @@ namespace IRaCIS.Application.Services
|
||||
var updateModel = basicInfoModel;
|
||||
|
||||
var phone = updateModel.Phone.Trim();
|
||||
if ((await _doctorRepository.FirstOrDefaultAsync(t => t.Phone == phone && t.Id != updateModel.Id) )!= null)
|
||||
if ((await _doctorRepository.FirstOrDefaultAsync(t => t.Phone == phone && t.Id != updateModel.Id)) != null)
|
||||
{
|
||||
return ResponseOutput.NotOk("The current phone number already existed!", new DoctorBasicInfoCommand());
|
||||
//---The current phone number already existed!
|
||||
return ResponseOutput.NotOk(_localizer["Doctor_DupPhone"], new DoctorBasicInfoCommand());
|
||||
}
|
||||
var email = updateModel.EMail.Trim();
|
||||
if (await _doctorRepository.AnyAsync(t => t.EMail == email && t.Id != updateModel.Id))
|
||||
{
|
||||
return ResponseOutput.NotOk("The current email already existed!", new DoctorBasicInfoCommand());
|
||||
//---The current email already existed!
|
||||
return ResponseOutput.NotOk(_localizer["Doctor_DupEmail"], new DoctorBasicInfoCommand());
|
||||
}
|
||||
|
||||
var doctor = await _doctorRepository.FirstOrDefaultAsync(t => t.Id == updateModel.Id).IfNullThrowException();
|
||||
|
||||
//删除中间表 Title对应的记录
|
||||
await _repository.BatchDeleteAsync<DoctorDictionary>(t => t.DoctorId == updateModel.Id && t.KeyName == StaticData.Title);
|
||||
await _repository.BatchDeleteAsync<DoctorDictionary>(t => t.DoctorId == updateModel.Id && t.KeyName == StaticData.Title);
|
||||
|
||||
|
||||
var adddata=new List<DoctorDictionary>();
|
||||
var adddata = new List<DoctorDictionary>();
|
||||
//重新插入新的 Title记录
|
||||
updateModel.TitleIds.ForEach(titleId => adddata.Add(new DoctorDictionary() { DoctorId = updateModel.Id.Value, KeyName = StaticData.Title, DictionaryId = titleId }));
|
||||
|
||||
@@ -428,7 +436,8 @@ namespace IRaCIS.Application.Services
|
||||
.Select(u => u.Type).ToListAsync();
|
||||
if (auditResumeParam.ResumeStatus == ResumeStatusEnum.Pass && ((!attachmentList.Contains("Resume")) || (!attachmentList.Contains("Consultant Agreement"))))
|
||||
{
|
||||
return ResponseOutput.NotOk("Resume & Consultant Agreement must be upload ");
|
||||
//---Resume & Consultant Agreement must be upload
|
||||
return ResponseOutput.NotOk(_localizer["Doctor_RequiredDocumentsError"]);
|
||||
}
|
||||
var success = await _doctorRepository.BatchUpdateNoTrackingAsync(o => o.Id == auditResumeParam.Id, u => new Doctor()
|
||||
{
|
||||
@@ -438,8 +447,8 @@ namespace IRaCIS.Application.Services
|
||||
ReviewStatus = auditResumeParam.ReviewStatus,
|
||||
AcceptingNewTrial = auditResumeParam.AcceptingNewTrial,
|
||||
ActivelyReading = auditResumeParam.ActivelyReading,
|
||||
IsVirtual=auditResumeParam.IsVirtual,
|
||||
BlindName=auditResumeParam.BlindName,
|
||||
IsVirtual = auditResumeParam.IsVirtual,
|
||||
BlindName = auditResumeParam.BlindName,
|
||||
BlindNameCN = auditResumeParam.BlindNameCN,
|
||||
BlindPublications = auditResumeParam.BlindPublications,
|
||||
AuditTime = DateTime.Now,
|
||||
@@ -467,6 +476,64 @@ namespace IRaCIS.Application.Services
|
||||
return ResponseOutput.Result(success);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 添加修改医生标准文件
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> AddDoctorCriterionFile(AddDoctorCriterionFileDto inDto)
|
||||
{
|
||||
|
||||
if (await _doctorCriterionFileRepository.AnyAsync(x => inDto.IsEnable && x.DoctorId == inDto.DoctorId && x.FileType == inDto.FileType && x.TrialId==inDto.TrialId &&x.TrialReadingCriterionId==inDto.TrialReadingCriterionId && x.IsEnable && x.CriterionType == inDto.CriterionType && x.Id != inDto.Id))
|
||||
{
|
||||
//-----------当前标准已添加过此类型文件
|
||||
throw new BusinessValidationFailedException(_localizer["Doctor_StandardDuplicateFileTypeError"]);
|
||||
}
|
||||
|
||||
|
||||
var entity = await _doctorCriterionFileRepository.InsertOrUpdateAsync(inDto);
|
||||
|
||||
if (inDto.TrialId != null)
|
||||
{
|
||||
entity.Remark = await _trialRepository.Where(t => t.Id == inDto.TrialId).Select(t => t.TrialCode).FirstOrDefaultAsync();
|
||||
}
|
||||
|
||||
|
||||
await _doctorCriterionFileRepository.SaveChangesAsync();
|
||||
|
||||
return ResponseOutput.Ok(entity.Id.ToString());
|
||||
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除医生标准文件
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<IResponseOutput> DeleteDoctorCriterionFile(DeleteDoctorCriterionFile inDto)
|
||||
{
|
||||
var result = await _doctorCriterionFileRepository.DeleteFromQueryAsync(inDto.Id, true);
|
||||
return ResponseOutput.Ok(result.Id.ToString());
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取医生标准文件
|
||||
/// </summary>
|
||||
/// <param name="inDto"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<List<GetDoctorCriterionFileOutDto>> GetDoctorCriterionFile(GetDoctorCriterionFileInDto inDto)
|
||||
{
|
||||
var result = await _doctorCriterionFileRepository.Where(x => x.DoctorId == inDto.DoctorId)
|
||||
.WhereIf(inDto.CriterionType != null, x => x.CriterionType == inDto.CriterionType)
|
||||
.WhereIf(inDto.FileType != null, x => x.FileType == inDto.FileType)
|
||||
.ProjectTo<GetDoctorCriterionFileOutDto>(_mapper.ConfigurationProvider)
|
||||
.ToListAsync();
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
[HttpGet("{doctorId:guid}")]
|
||||
public async Task<ResumeConfirmDTO> GetAuditState(Guid doctorId)
|
||||
@@ -474,7 +541,7 @@ namespace IRaCIS.Application.Services
|
||||
var doctor = (await _doctorRepository
|
||||
.ProjectTo<ResumeConfirmDTO>(_mapper.ConfigurationProvider).FirstOrDefaultAsync(t => t.Id == doctorId)).IfNullThrowException();
|
||||
|
||||
doctor.InHoliday = (await _repository.CountAsync<Vacation>(x=>x.DoctorId==doctorId&&x.EndDate<=DateTime.Now&&x.StartDate<=DateTime.Now)) > 0;
|
||||
doctor.InHoliday = (await _repository.CountAsync<Vacation>(x => x.DoctorId == doctorId && x.EndDate <= DateTime.Now && x.StartDate <= DateTime.Now)) > 0;
|
||||
|
||||
return doctor;
|
||||
}
|
||||
|
||||
@@ -33,7 +33,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
CreateMap<ReviewerAckDTO, Attachment>().EqualityComparison((odto, o) => odto.Id == o.Id);
|
||||
|
||||
|
||||
CreateMap<AddDoctorCriterionFileDto, DoctorCriterionFile>();
|
||||
CreateMap<DoctorCriterionFile, GetDoctorCriterionFileOutDto>();
|
||||
CreateMap<Doctor, DoctorBasicInfoCommand>();
|
||||
CreateMap<Education, EducationInfoViewModel>();
|
||||
|
||||
@@ -81,6 +82,7 @@ namespace IRaCIS.Core.Application.Service
|
||||
#region 医生基本信息
|
||||
CreateMap<Doctor, SelectionReviewerDTO>();
|
||||
CreateMap<Doctor, DoctorDTO>().IncludeMembers(t => t.Hospital).Include<Doctor, SelectionReviewerDTO>()
|
||||
.ForMember(d => d.AccountUserName, u => u.MapFrom(s => s.EnrollList.Where(t=>t.DoctorUserId!=null).Select(c=>c.DoctorUser.UserName).FirstOrDefault()))
|
||||
.ForMember(d => d.Department, u => u.MapFrom(s => s.Department.Value))
|
||||
.ForMember(d => d.DepartmentCN, u => u.MapFrom(s => s.Department.ValueCN))
|
||||
.ForMember(d => d.Position, u => u.MapFrom(s => s.Position.Value))
|
||||
|
||||
@@ -48,6 +48,8 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
public string RealName { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public Guid UserTypeId { get; set; }
|
||||
public string UserTypeShortName { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
|
||||
@@ -23,6 +23,8 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public Guid CreateUserId { get; set; }
|
||||
|
||||
public string TrialCriterionName { get; set; }
|
||||
|
||||
|
||||
public List<EmailUserInfoDto> TrialEmailNoticeUserList { get; set; }
|
||||
|
||||
@@ -48,7 +50,49 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
}
|
||||
|
||||
|
||||
public class GetTrialEmailSetOutDto
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 发件箱账号
|
||||
/// </summary>
|
||||
public string EmailFromEmail { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 发件人
|
||||
/// </summary>
|
||||
public string EmailFromName { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// 密码/授权码
|
||||
/// </summary>
|
||||
public string EmailAuthorizationCode { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// SMTP服务器
|
||||
/// </summary>
|
||||
public string EmailSMTPServerAddress { get; set; } = string.Empty;
|
||||
|
||||
/// <summary>
|
||||
/// SMTP端口
|
||||
/// </summary>
|
||||
public int? EmailSMTPServerPort { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 是否配置过邮箱
|
||||
/// </summary>
|
||||
public bool IsConfigureEmail { get; set; } = false;
|
||||
}
|
||||
|
||||
public class SetTrialEmailInDto : GetTrialEmailSetOutDto
|
||||
{
|
||||
|
||||
}
|
||||
public class GetTrialEmailSetInDto
|
||||
{
|
||||
public Guid TrialId { get; set; }
|
||||
}
|
||||
|
||||
///<summary>TrialEmailNoticeConfigQuery 列表查询参数模型</summary>
|
||||
public class TrialEmailNoticeConfigQuery
|
||||
@@ -58,8 +102,22 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public CommonDocumentBusinessScenario? BusinessScenarioEnum { get; set; }
|
||||
|
||||
public CriterionType? CriterionTypeEnum { get; set; }
|
||||
//public CriterionType? CriterionTypeEnum { get; set; }
|
||||
|
||||
public Guid? TrialReadingCriterionId { get; set; }
|
||||
|
||||
public bool IsDistinguishCriteria { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class GenerateEmailCommand
|
||||
{
|
||||
public Guid SubjectId { get; set; }
|
||||
|
||||
public Guid TrialReadingCriterionId { get; set; }
|
||||
|
||||
public CommonDocumentBusinessScenario BusinessScenarioEnum { get; set; }
|
||||
}
|
||||
|
||||
///<summary> TrialEmailNoticeConfigAddOrEdit 列表查询参数模型</summary>
|
||||
@@ -71,6 +129,8 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
|
||||
public string Code { get; set; } = string.Empty;
|
||||
|
||||
public Guid? TrialReadingCriterionId { get; set; }
|
||||
|
||||
public Guid TrialId { get; set; }
|
||||
|
||||
public string AuthorizationCode { get; set; } = string.Empty;
|
||||
@@ -86,7 +146,7 @@ namespace IRaCIS.Core.Application.ViewModel
|
||||
public string FromEmail { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public List<UserTypeEnum> ToUserTypeList { get; set; }
|
||||
public List<UserTypeEnum>? ToUserTypeList { get; set; }
|
||||
public List<UserTypeEnum> CopyUserTypeList { get; set; }
|
||||
|
||||
|
||||
|
||||
+13
-5
@@ -6,6 +6,7 @@
|
||||
|
||||
using IRaCIS.Core.Application.ViewModel;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Domain.Share.Common;
|
||||
|
||||
namespace IRaCIS.Core.Application.Interfaces
|
||||
{
|
||||
@@ -13,16 +14,23 @@ namespace IRaCIS.Core.Application.Interfaces
|
||||
/// ITrialEmailNoticeConfigService
|
||||
/// </summary>
|
||||
public interface ITrialEmailNoticeConfigService
|
||||
{
|
||||
{
|
||||
|
||||
|
||||
Task<List<TrialEmailNoticeConfigView>> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery);
|
||||
Task<List<TrialEmailNoticeConfigView>> GetTrialEmailNoticeConfigList(TrialEmailNoticeConfigQuery inQuery);
|
||||
|
||||
Task<IResponseOutput> AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig);
|
||||
Task<IResponseOutput> AddOrUpdateTrialEmailNoticeConfig(TrialEmailNoticeConfigAddOrEdit addOrEditTrialEmailNoticeConfig);
|
||||
|
||||
Task<IResponseOutput> DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId);
|
||||
Task<IResponseOutput> DeleteTrialEmailNoticeConfig(Guid trialEmailNoticeConfigId);
|
||||
|
||||
Task BaseBusinessScenarioSendEmailAsync( Guid visitTaskId);
|
||||
Task<string> BaseBusinessScenarioSendEmailAsync(Guid visitTaskId, bool? isMedicalReviewAndSuggestApplyReReading = null, EmailStoreSendMode emailStoreMode = EmailStoreSendMode.StoreLocalSend, string sendFileRelativePath="");
|
||||
|
||||
}
|
||||
|
||||
public class EmailStoreSendDto
|
||||
{
|
||||
public EmailStoreSendMode EmailStoreSendMode { get; set; } = EmailStoreSendMode.StoreLocalSend;
|
||||
|
||||
public string SendFileRelativePath { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//--------------------------------------------------------------------
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2022-01-05 09:17:03
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
@@ -55,7 +55,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if (await _systemDocumentRepository.AnyAsync(t => t.FileTypeId == addOrEditSystemDocument.FileTypeId && t.Name == addOrEditSystemDocument.Name,true))
|
||||
{
|
||||
return ResponseOutput.NotOk("系统中已存在同类型的同名文件。");
|
||||
//---系统中已存在同类型的同名文件。
|
||||
return ResponseOutput.NotOk(_localizer["SystemD_DuplicateFile"]);
|
||||
}
|
||||
|
||||
await _systemDocumentRepository.AddAsync(entity, true);
|
||||
@@ -70,7 +71,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if (await _systemDocumentRepository.AnyAsync(t => t.FileTypeId == addOrEditSystemDocument.FileTypeId && t.Name == addOrEditSystemDocument.Name && t.Id != addOrEditSystemDocument.Id, true))
|
||||
{
|
||||
return ResponseOutput.NotOk("系统中已存在同类型的同名文件。");
|
||||
//---系统中已存在同类型的同名文件。
|
||||
return ResponseOutput.NotOk(_localizer["SystemD_DuplicateFile"]);
|
||||
}
|
||||
|
||||
|
||||
@@ -114,7 +116,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if (await _repository.Where<SystemDocument>(t => t.Id == systemDocumentId).AnyAsync(u => u.SystemDocConfirmedUserList.Any()))
|
||||
{
|
||||
return ResponseOutput.NotOk("已有用户阅读该文档,并签名,不允许删除。");
|
||||
//---已有用户阅读该文档,并签名,不允许删除。
|
||||
return ResponseOutput.NotOk(_localizer["SystemD_CannotDeleteSignedFile"]);
|
||||
}
|
||||
|
||||
var success = await _systemDocumentRepository.DeleteFromQueryAsync(t => t.Id == systemDocumentId,true,true);
|
||||
@@ -128,7 +131,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[HttpPost]
|
||||
public async Task<PageOutput<UnionDocumentWithConfirmInfoView>> GetWaitSignSysDocList(SystemDocumentQuery querySystemDocument)
|
||||
public async Task<PageOutput<UnionDocumentWithConfirmInfoView>> getWaitSignSysDocList(SystemDocumentQuery querySystemDocument)
|
||||
{
|
||||
var query = from sysDoc in _systemDocumentRepository.Where(t => t.NeedConfirmedUserTypeList.Any(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId))
|
||||
.WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name))
|
||||
@@ -148,15 +151,16 @@ namespace IRaCIS.Core.Application.Services
|
||||
SignViewMinimumMinutes = sysDoc.SignViewMinimumMinutes,
|
||||
Name = sysDoc.Name,
|
||||
Path = sysDoc.Path,
|
||||
FileType = sysDoc.FileType.Value,
|
||||
FileType = sysDoc.FileType.MappedValue,
|
||||
UpdateTime = sysDoc.UpdateTime,
|
||||
|
||||
FullFilePath = sysDoc.Path + "?access_token=" + _userInfo.UserToken,
|
||||
FullFilePath = sysDoc.Path ,
|
||||
|
||||
ConfirmUserId = confirm.ConfirmUserId,
|
||||
ConfirmTime = confirm.ConfirmTime,
|
||||
RealName = user.LastName + " / " + user.FirstName,
|
||||
UserName = user.UserName,
|
||||
UserTypeId = user.UserTypeId,
|
||||
UserTypeShortName = user.UserTypeRole.UserTypeShortName
|
||||
};
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//--------------------------------------------------------------------
|
||||
//--------------------------------------------------------------------
|
||||
// 此代码由T4模板自动生成 byzhouhang 20210918
|
||||
// 生成时间 2022-01-05 09:17:03
|
||||
// 对此文件的更改可能会导致不正确的行为,并且如果重新生成代码,这些更改将会丢失。
|
||||
@@ -10,6 +10,7 @@ using IRaCIS.Core.Application.Contracts;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using IRaCIS.Core.Application.Auth;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Application.Filter;
|
||||
|
||||
namespace IRaCIS.Core.Application.Services
|
||||
{
|
||||
@@ -127,7 +128,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
#endregion
|
||||
|
||||
var trialInfo = (await _repository.Where<Trial>(t => t.Id == querySystemDocument.TrialId).Select(t => new { t.TrialFinishedTime,t.TrialStatusStr } ).FirstOrDefaultAsync());
|
||||
var trialInfo = await (_repository.Where<Trial>(t => t.Id == querySystemDocument.TrialId).Select(t => new { t.TrialFinishedTime,t.TrialStatusStr } ).FirstOrDefaultAsync());
|
||||
|
||||
//系统文档查询
|
||||
var systemDocumentQueryable = from needConfirmedUserType in _repository.Where<SystemDocNeedConfirmedUserType>(t => t.NeedConfirmUserTypeId == _userInfo.UserTypeId)
|
||||
@@ -150,7 +151,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
Name = needConfirmedUserType.SystemDocument.Name,
|
||||
Path = needConfirmedUserType.SystemDocument.Path,
|
||||
FileTypeId = needConfirmedUserType.SystemDocument.FileTypeId,
|
||||
FileType = needConfirmedUserType.SystemDocument.FileType.Value,
|
||||
FileType = needConfirmedUserType.SystemDocument.FileType.MappedValue,
|
||||
UpdateTime = needConfirmedUserType.SystemDocument.UpdateTime,
|
||||
|
||||
FullFilePath = needConfirmedUserType.SystemDocument.Path ,
|
||||
@@ -159,6 +160,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
ConfirmTime = confirm.ConfirmTime,
|
||||
RealName = trialUser.User.FullName,
|
||||
UserName = trialUser.User.UserName,
|
||||
UserTypeId = trialUser.User.UserTypeId,
|
||||
UserTypeShortName = trialUser.User.UserTypeRole.UserTypeShortName
|
||||
};
|
||||
|
||||
@@ -181,7 +183,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
Name = trialDoc.Name,
|
||||
Path = trialDoc.Path,
|
||||
FileTypeId = trialDoc.FileTypeId,
|
||||
FileType = trialDoc.FileType.Value,
|
||||
FileType = trialDoc.FileType.MappedValue,
|
||||
UpdateTime = trialDoc.UpdateTime,
|
||||
SignViewMinimumMinutes = trialDoc.SignViewMinimumMinutes,
|
||||
|
||||
@@ -189,6 +191,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
ConfirmTime = confirm.ConfirmTime,
|
||||
RealName = trialUser.User.FullName,
|
||||
UserName = trialUser.User.UserName,
|
||||
UserTypeId = trialUser.User.UserTypeId,
|
||||
UserTypeShortName = trialUser.User.UserTypeRole.UserTypeShortName
|
||||
|
||||
};
|
||||
@@ -197,8 +200,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
var unionQuery = systemDocumentQueryable.Union(trialDocQueryable)
|
||||
.WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name))
|
||||
.WhereIf(querySystemDocument.FileTypeId != null, t => t.FileTypeId == querySystemDocument.FileTypeId)
|
||||
.WhereIf(querySystemDocument.IsSign == true, t => t.ConfirmUserId != null)
|
||||
.WhereIf(querySystemDocument.IsSign == false, t => t.ConfirmUserId == null);
|
||||
.WhereIf(querySystemDocument.IsSign == true, t => t.ConfirmTime != null)
|
||||
.WhereIf(querySystemDocument.IsSign == false, t => t.ConfirmTime == null);
|
||||
|
||||
var result = await unionQuery.ToPagedListAsync(querySystemDocument.PageIndex, querySystemDocument.PageSize, querySystemDocument.SortField, querySystemDocument.Asc);
|
||||
|
||||
@@ -286,7 +289,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
Name = trialDocumentNeedConfirmedUserType.TrialDocument.Name,
|
||||
Path = trialDocumentNeedConfirmedUserType.TrialDocument.Path,
|
||||
FileTypeId = trialDocumentNeedConfirmedUserType.TrialDocument.FileTypeId,
|
||||
FileType = trialDocumentNeedConfirmedUserType.TrialDocument.FileType.Value,
|
||||
FileType = trialDocumentNeedConfirmedUserType.TrialDocument.FileType.MappedValue,
|
||||
UpdateTime = trialDocumentNeedConfirmedUserType.TrialDocument.UpdateTime,
|
||||
|
||||
|
||||
@@ -295,6 +298,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
ConfirmTime = confirm.ConfirmTime,
|
||||
RealName = trialUser.User.FullName,
|
||||
UserName = trialUser.User.UserName,
|
||||
UserTypeId = trialUser.User.UserTypeId,
|
||||
UserTypeShortName = trialUser.User.UserTypeRole.UserTypeShortName,
|
||||
|
||||
FullFilePath = trialDocumentNeedConfirmedUserType.TrialDocument.Path
|
||||
@@ -319,7 +323,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
SignViewMinimumMinutes = needConfirmEdUserType.SystemDocument.SignViewMinimumMinutes,
|
||||
Name = needConfirmEdUserType.SystemDocument.Name,
|
||||
Path = needConfirmEdUserType.SystemDocument.Path,
|
||||
FileType = needConfirmEdUserType.SystemDocument.FileType.Value,
|
||||
FileType = needConfirmEdUserType.SystemDocument.FileType.MappedValue,
|
||||
FileTypeId = needConfirmEdUserType.SystemDocument.FileTypeId,
|
||||
UpdateTime = needConfirmEdUserType.SystemDocument.UpdateTime,
|
||||
|
||||
@@ -328,6 +332,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
ConfirmTime = confirm.ConfirmTime,
|
||||
RealName = trialUser.User.FullName,
|
||||
UserName = trialUser.User.UserName,
|
||||
UserTypeId = trialUser.User.UserTypeId,
|
||||
UserTypeShortName = trialUser.User.UserTypeRole.UserTypeShortName,
|
||||
|
||||
FullFilePath = needConfirmEdUserType.SystemDocument.Path
|
||||
@@ -335,7 +340,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
var unionQuery = trialDocQuery.Union(systemDocQuery)
|
||||
.WhereIf(!string.IsNullOrEmpty(querySystemDocument.Name), t => t.Name.Contains(querySystemDocument.Name))
|
||||
.WhereIf(querySystemDocument.FileTypeId != null, t => t.FileTypeId == querySystemDocument.FileTypeId);
|
||||
.WhereIf(querySystemDocument.FileTypeId != null, t => t.FileTypeId == querySystemDocument.FileTypeId)
|
||||
.WhereIf(querySystemDocument.UserTypeId != null, t => t.UserTypeId == querySystemDocument.UserTypeId);
|
||||
|
||||
var result = await unionQuery.ToPagedListAsync(querySystemDocument.PageIndex, querySystemDocument.PageSize, querySystemDocument.SortField, querySystemDocument.Asc);
|
||||
|
||||
@@ -383,7 +389,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
return ResponseOutput.Ok(result);
|
||||
}
|
||||
|
||||
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
|
||||
[Authorize(Policy = IRaCISPolicy.PM)]
|
||||
public async Task<IResponseOutput> AddOrUpdateTrialDocument(AddOrEditTrialDocument addOrEditTrialDocument)
|
||||
{
|
||||
@@ -394,7 +400,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if (await _trialDocumentRepository.AnyAsync(t => t.FileTypeId == addOrEditTrialDocument.FileTypeId && t.Name == addOrEditTrialDocument.Name && t.TrialId == addOrEditTrialDocument.TrialId, true))
|
||||
{
|
||||
return ResponseOutput.NotOk("该项目中已经存在同类型的同名文件。");
|
||||
//---该项目中已经存在同类型的同名文件。
|
||||
return ResponseOutput.NotOk(_localizer["TrialD_DuplicateFileInProject"]);
|
||||
}
|
||||
|
||||
//entity.Id = NewId.NextGuid();
|
||||
@@ -405,7 +412,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
{
|
||||
if (await _trialDocumentRepository.AnyAsync(t => t.FileTypeId == addOrEditTrialDocument.FileTypeId && t.Name == addOrEditTrialDocument.Name && t.Id != addOrEditTrialDocument.Id && t.TrialId == addOrEditTrialDocument.TrialId, true))
|
||||
{
|
||||
return ResponseOutput.NotOk("该项目中已经存在同类型的同名文件。");
|
||||
//---该项目中已经存在同类型的同名文件。
|
||||
return ResponseOutput.NotOk(_localizer["TrialD_DuplicateFileInProject"]);
|
||||
}
|
||||
|
||||
var document = (await _trialDocumentRepository.Where(t => t.Id == addOrEditTrialDocument.Id, true).Include(t => t.NeedConfirmedUserTypeList).FirstOrDefaultAsync()).IfNullThrowException();
|
||||
@@ -453,11 +461,13 @@ namespace IRaCIS.Core.Application.Services
|
||||
/// <returns></returns>
|
||||
[HttpDelete("{trialId:guid}/{trialDocumentId:guid}")]
|
||||
[Authorize(Policy = IRaCISPolicy.PM)]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> DeleteTrialDocument(Guid trialDocumentId, Guid trialId)
|
||||
{
|
||||
if (await _trialDocumentRepository.AsQueryable(true).Where(t => t.Id == trialDocumentId).AnyAsync(t => t.TrialDocConfirmedUserList.Any()))
|
||||
{
|
||||
return ResponseOutput.NotOk("已有用户阅读该文档,并签名,不允许删除。");
|
||||
//---已有用户阅读该文档,并签名,不允许删除。
|
||||
return ResponseOutput.NotOk(_localizer["TrialD_DocumentHasAlready"]);
|
||||
}
|
||||
|
||||
var success = await _trialDocumentRepository.BatchDeleteNoTrackingAsync(t => t.Id == trialDocumentId);
|
||||
@@ -537,6 +547,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
/// 用户 签名某个文档 可能是系统的,也可能是项目的
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> UserConfirm(UserConfirmCommand userConfirmCommand)
|
||||
{
|
||||
|
||||
@@ -547,12 +558,14 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if(sysDocConfirm.ConfirmTime != null)
|
||||
{
|
||||
return ResponseOutput.NotOk("该文件已经签名");
|
||||
//---该文件已经签名
|
||||
return ResponseOutput.NotOk(_localizer["TrialD_FileAlreadySigned"]);
|
||||
}
|
||||
|
||||
if (sysDocConfirm.IsDeleted)
|
||||
{
|
||||
return ResponseOutput.NotOk("文件已废除,签署失败!");
|
||||
//---文件已废除,签署失败!
|
||||
return ResponseOutput.NotOk(_localizer["TrialD_ObsoleteFile"]);
|
||||
}
|
||||
|
||||
|
||||
@@ -572,12 +585,14 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if (trialDocConfirm.ConfirmTime != null)
|
||||
{
|
||||
return ResponseOutput.NotOk("该文件已经签名");
|
||||
//---该文件已经签名
|
||||
return ResponseOutput.NotOk(_localizer["TrialD_FileAlreadySigned"]);
|
||||
}
|
||||
|
||||
if (trialDocConfirm.IsDeleted)
|
||||
{
|
||||
return ResponseOutput.NotOk("文件已废除,签署失败!");
|
||||
//---文件已废除,签署失败!
|
||||
return ResponseOutput.NotOk(_localizer["TrialD_ObsoleteFile"]);
|
||||
}
|
||||
|
||||
trialDocConfirm.ConfirmTime = DateTime.Now;
|
||||
@@ -599,6 +614,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
/// <param name="isSystemDoc"></param>
|
||||
/// <returns></returns>
|
||||
[HttpPut("{documentId:guid}/{isSystemDoc:bool}")]
|
||||
[TypeFilter(typeof(TrialResourceFilter), Arguments = new object[] { "BeforeOngoingCantOpt", "AfterStopCannNotOpt" })]
|
||||
public async Task<IResponseOutput> UserAbandonDoc(Guid documentId, bool isSystemDoc)
|
||||
{
|
||||
if (isSystemDoc)
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -19,8 +19,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
.ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path));
|
||||
|
||||
CreateMap<TrialDocument, TrialDocumentView>()
|
||||
.ForMember(d => d.FileType, u => u.MapFrom(s => s.FileType.Value))
|
||||
.ForMember(d => d.IsSomeUserSigned, u => u.MapFrom(s => s.TrialDocConfirmedUserList.Any()))
|
||||
.ForMember(d => d.FileType, u => u.MapFrom(s => s.FileType.MappedValue))
|
||||
.ForMember(d => d.IsSomeUserSigned, u => u.MapFrom(s => s.TrialDocConfirmedUserList.Any(t=>t.ConfirmTime!=null)))
|
||||
.ForMember(d => d.FullFilePath, u => u.MapFrom(s => s.Path ));
|
||||
|
||||
|
||||
@@ -70,6 +70,8 @@ namespace IRaCIS.Core.Application.Service
|
||||
|
||||
|
||||
CreateMap<TrialEmailNoticeConfig, TrialEmailNoticeConfigView>()
|
||||
|
||||
.ForMember(d => d.TrialCriterionName, c => c.MapFrom(t => t.TrialReadingCriterion.CriterionName))
|
||||
.ForMember(d => d.TrialEmailNoticeUserList, c => c.MapFrom(t => t.TrialEmailNoticeUserList));
|
||||
|
||||
CreateMap<TrialEmailNoticeConfigAddOrEdit, TrialEmailNoticeConfig>();
|
||||
|
||||
@@ -11,7 +11,7 @@ using Panda.DynamicWebApi.Attributes;
|
||||
|
||||
namespace IRaCIS.Application.Services
|
||||
{
|
||||
public class CalculateService : ICalculateService
|
||||
public class CalculateService :BaseService, ICalculateService
|
||||
{
|
||||
private readonly IRepository<Payment> _paymentRepository;
|
||||
private readonly IRepository<TrialPaymentPrice> _trialPaymentRepository;
|
||||
@@ -135,12 +135,14 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
if (i == 0 && volumeRewardPriceList[i].Min != 0)
|
||||
{
|
||||
return ResponseOutput.NotOk("Volume reward data error.");
|
||||
//---Volume reward data error.
|
||||
return ResponseOutput.NotOk(_localizer["Cal_VolDataErr"]);
|
||||
}
|
||||
if (i > 0)
|
||||
{
|
||||
if (volumeRewardPriceList[i - 1].Max + 1 != volumeRewardPriceList[i].Min)
|
||||
return ResponseOutput.NotOk("Volume reward data error.");
|
||||
//---Volume reward data error.
|
||||
return ResponseOutput.NotOk(_localizer["Cal_VolDataErr"]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,7 +30,8 @@ namespace IRaCIS.Application.Services
|
||||
var existItem = await _exchangeRateRepository.FirstOrDefaultAsync(u => u.YearMonth == model.YearMonth);
|
||||
if (existItem != null)
|
||||
{
|
||||
return ResponseOutput.NotOk("The exchange rate of the same month already existed.");
|
||||
//---The exchange rate of the same month already existed.
|
||||
return ResponseOutput.NotOk(_localizer["ExR_SameMthExist"]);
|
||||
}
|
||||
var rate = _mapper.Map<ExchangeRate>(model);
|
||||
rate = await _exchangeRateRepository.AddAsync(rate);
|
||||
@@ -68,7 +69,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
if (await _paymentRepository.AnyAsync(t => t.YearMonth == monthInfo.YearMonth))
|
||||
{
|
||||
return ResponseOutput.NotOk("The exchange rate has been used in monthly payment");
|
||||
//---The exchange rate has been used in monthly payment
|
||||
return ResponseOutput.NotOk(_localizer["ExR_MthPymtRate"]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -61,7 +61,8 @@ namespace IRaCIS.Application.Services
|
||||
{
|
||||
if (payment.IsLock)
|
||||
{
|
||||
return ResponseOutput.NotOk("Doctor payment has confirmed lock");
|
||||
//---Doctor payment has confirmed lock
|
||||
return ResponseOutput.NotOk(_localizer["PayAdj_DocPymtLock"]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -73,7 +73,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
if (await _reviewerPayInfoRepository.AnyAsync(t => t.RankId == id))
|
||||
{
|
||||
return ResponseOutput.NotOk("This title has been used by reviewer payment information");
|
||||
//---This title has been used by reviewer payment information
|
||||
return ResponseOutput.NotOk(_localizer["RP_TitleUsedByRev"]);
|
||||
}
|
||||
|
||||
var success = await _rankPriceRepository.BatchDeleteNoTrackingAsync(t => t.Id == id);
|
||||
|
||||
@@ -44,7 +44,8 @@ namespace IRaCIS.Application.Services
|
||||
|
||||
if (count <= 0)
|
||||
{
|
||||
return ResponseOutput.NotOk("Please add meaningful data");
|
||||
//---Please add meaningful data
|
||||
return ResponseOutput.NotOk(_localizer["TRP_AddMeaningful"]);
|
||||
}
|
||||
var trialExistedItem = await _trialRevenuesPriceRepository.FirstOrDefaultAsync(u => u.TrialId == model.TrialId);
|
||||
if (trialExistedItem == null)//insert
|
||||
|
||||
@@ -0,0 +1,97 @@
|
||||
using IRaCIS.Core.Application.Service.Reading.Dto;
|
||||
using IRaCIS.Core.Domain.Share;
|
||||
using IRaCIS.Core.Domain.Share.Reading;
|
||||
using MassTransit;
|
||||
using NPOI.POIFS.NIO;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace IRaCIS.Core.Application.Service
|
||||
{
|
||||
|
||||
|
||||
public class CriterionAdditionalAssessment
|
||||
{
|
||||
public CriterionType CriterionType { get; set; }
|
||||
|
||||
public AdditionalAssessmentType AdditionalAssessmentType { get; set; }
|
||||
|
||||
//附加评估问题
|
||||
public List<ReadingQuestionTrial> AdditionalQuestionList { get; set; }=new List<ReadingQuestionTrial>();
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class AdditionalAssessment
|
||||
{
|
||||
|
||||
public List<CriterionAdditionalAssessment> SystemDefeaultAdditionalAssessmentList { get; set; } = new List<CriterionAdditionalAssessment>();
|
||||
public AdditionalAssessment()
|
||||
{
|
||||
|
||||
var gropId = NewId.NextGuid();
|
||||
//Resist1.1 脑转移 默认评估问题
|
||||
SystemDefeaultAdditionalAssessmentList.Add(new CriterionAdditionalAssessment()
|
||||
{
|
||||
CriterionType = CriterionType.RECIST1Point1,
|
||||
AdditionalAssessmentType = AdditionalAssessmentType.BrainMetastasis,
|
||||
AdditionalQuestionList = new List<ReadingQuestionTrial>(){
|
||||
|
||||
new ReadingQuestionTrial()
|
||||
{
|
||||
LimitEdit=LimitEdit.OnlyBaseLine,
|
||||
Id=gropId,
|
||||
IsJudgeQuestion=false,
|
||||
IsShowInDicom=false,
|
||||
GlobalReadingShowType=GlobalReadingShowType.NotShow,
|
||||
|
||||
QuestionName="脑转移评估",
|
||||
QuestionEnName="Brain Metastasis Assessment",
|
||||
GroupName="脑转移评估",
|
||||
GroupEnName="Brain Metastasis Assessment",
|
||||
Type="group",
|
||||
QuestionGenre=TableQuestionType.Customize,
|
||||
DataSource=DataSources.ManualEntry,
|
||||
ShowQuestion=ShowQuestion.Show,
|
||||
|
||||
|
||||
IsAdditional=true
|
||||
} ,
|
||||
|
||||
new ReadingQuestionTrial()
|
||||
{
|
||||
GroupId=gropId,
|
||||
LimitEdit=LimitEdit.OnlyBaseLine,
|
||||
DictionaryCode="YesOrNoOrNa",
|
||||
IsJudgeQuestion=false,
|
||||
IsShowInDicom=false,
|
||||
GlobalReadingShowType=GlobalReadingShowType.NotShow,
|
||||
QuestionEnName="Brain metastases present",
|
||||
QuestionName="存在脑转移",
|
||||
Type="radio",
|
||||
QuestionGenre=TableQuestionType.Dictionary,
|
||||
DataSource=DataSources.ManualEntry,
|
||||
ShowQuestion=ShowQuestion.Show,
|
||||
|
||||
|
||||
IsAdditional=true
|
||||
} ,
|
||||
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
public List<CriterionAdditionalAssessment> GetSystemDefeaultAdditionalAssessmentList(CriterionType criterionType, AdditionalAssessmentType? additionalAssessmentType=null)
|
||||
{
|
||||
|
||||
return SystemDefeaultAdditionalAssessmentList.Where(t => t.CriterionType == criterionType)
|
||||
.WhereIf(additionalAssessmentType!=null,t=>t.AdditionalAssessmentType==additionalAssessmentType).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -45,11 +45,9 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public string ResearchProgramNo { get; set; } = string.Empty;
|
||||
public string TrialIndication { get; set; } = string.Empty;
|
||||
|
||||
public CheckStateEnum CheckState { get; set; }
|
||||
|
||||
|
||||
public decimal VisitNum { get; set; }
|
||||
public string SVUPDES { get; set; } = string.Empty;
|
||||
public string VisitName { get; set; } = string.Empty;
|
||||
public string Sponsor { get; set; } = string.Empty;
|
||||
public Guid TrialId { get; set; }
|
||||
@@ -57,10 +55,15 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public Guid SubjectId { get; set; }
|
||||
public Guid SubjectVisitId { get; set; }
|
||||
|
||||
public SubmitStateEnum SubmitState { get; set; }
|
||||
|
||||
public AuditStateEnum AuditState { get; set; }
|
||||
public ForwardStateEnum ForwardState { get; set; }
|
||||
//public string SVUPDES { get; set; } = string.Empty;
|
||||
|
||||
//public CheckStateEnum CheckState { get; set; }
|
||||
|
||||
//public SubmitStateEnum SubmitState { get; set; }
|
||||
|
||||
//public AuditStateEnum AuditState { get; set; }
|
||||
//public ForwardStateEnum ForwardState { get; set; }
|
||||
|
||||
//public string SubjectName => LastName + " / " + FirstName;
|
||||
//public string FirstName { get; set; } = string.Empty;
|
||||
|
||||
@@ -36,6 +36,10 @@
|
||||
public List<Guid> InstanceList { get; set; } = new List<Guid>();
|
||||
|
||||
public List<string> InstancePathList { get; set; } = new List<string>();
|
||||
|
||||
//存放在instance 上面
|
||||
public string WindowCenter { get; set; } = string.Empty;
|
||||
public string WindowWidth { get; set; } = string.Empty;
|
||||
}
|
||||
|
||||
public class DicomSeriesWithLabelDTO : DicomSeriesDTO
|
||||
|
||||
@@ -34,7 +34,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
public DateTime UploadTime { get; set; }
|
||||
|
||||
public string StudyCode { get; set; }
|
||||
public string StudyCode { get; set; }
|
||||
|
||||
|
||||
//[JsonIgnore]
|
||||
@@ -54,10 +54,31 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
|
||||
public string UploadStartTimeStr => UploadStartTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
||||
public string UploadFinishedTimeStr => UploadFinishedTime.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
||||
public string UploadFinishedTimeStr => UploadFinishedTime?.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
||||
|
||||
public string ArchiveFinishedTimeStr => ArchiveFinishedTime?.ToString("yyyy-MM-dd HH:mm:ss.fff");
|
||||
|
||||
|
||||
public double TotalMillisecondsInterval { get; set; }
|
||||
public string UploadIntervalStr
|
||||
{
|
||||
get
|
||||
{
|
||||
var uploadTimeSpan = UploadFinishedTime - UploadStartTime;
|
||||
|
||||
return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}";
|
||||
}
|
||||
}
|
||||
|
||||
public string ArchiveIntervalStr
|
||||
{
|
||||
get
|
||||
{
|
||||
var uploadTimeSpan = ArchiveFinishedTime - UploadFinishedTime;
|
||||
|
||||
return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public string TimeInterval
|
||||
@@ -65,9 +86,11 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
get
|
||||
{
|
||||
|
||||
var uploadTimeSpan = UploadFinishedTime - UploadStartTime;
|
||||
var uploadTimeSpan = ArchiveFinishedTime - UploadStartTime;
|
||||
|
||||
return $" {uploadTimeSpan.Hours}:{uploadTimeSpan.Minutes}:{uploadTimeSpan.Seconds}.{uploadTimeSpan.Milliseconds}";
|
||||
return $" {uploadTimeSpan?.Hours}:{uploadTimeSpan?.Minutes}:{uploadTimeSpan?.Seconds}.{uploadTimeSpan?.Milliseconds}";
|
||||
|
||||
#region 废弃
|
||||
//if (uploadTimeSpan.Seconds == 0 && uploadTimeSpan.Minutes==0 && uploadTimeSpan.Hours == 0)
|
||||
//{
|
||||
// return $"{uploadTimeSpan.Milliseconds}毫秒";
|
||||
@@ -84,13 +107,17 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
//{
|
||||
// return $" {uploadTimeSpan.Hours} 小时 {uploadTimeSpan.Minutes} 分钟 {uploadTimeSpan.Seconds} 秒 {uploadTimeSpan.Milliseconds}毫秒";
|
||||
//}
|
||||
#endregion
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
public DateTime UploadStartTime { get; set; }
|
||||
|
||||
|
||||
public DateTime UploadFinishedTime { get; set; }
|
||||
public DateTime? UploadFinishedTime { get; set; }
|
||||
|
||||
public DateTime? ArchiveFinishedTime { get; set; }
|
||||
|
||||
|
||||
public decimal FileSize { get; set; }
|
||||
@@ -103,14 +130,14 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
public int FileCount { get; set; }
|
||||
|
||||
public bool IsSuccess = true;
|
||||
public bool IsSuccess { get; set; }
|
||||
|
||||
public string Note = string.Empty;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class UnionStudyViewModel:UnionStudyBaseModel
|
||||
public class UnionStudyViewModel : UnionStudyBaseModel
|
||||
{
|
||||
|
||||
public Guid Id { get; set; }
|
||||
@@ -131,7 +158,7 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
|
||||
|
||||
|
||||
public class StudyQuery:PageInput
|
||||
public class StudyQuery : PageInput
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid TrialId { get; set; }
|
||||
@@ -147,4 +174,139 @@ namespace IRaCIS.Core.Application.Contracts
|
||||
public string[]? VisitPlanArray { get; set; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class PreArchiveDicomStudyCommand
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid TrialId { get; set; }
|
||||
[NotDefault]
|
||||
public Guid SiteId { get; set; }
|
||||
[NotDefault]
|
||||
public Guid SubjectId { get; set; }
|
||||
[NotDefault]
|
||||
public Guid SubjectVisitId { get; set; }
|
||||
|
||||
|
||||
public decimal FileSize { get; set; }
|
||||
|
||||
public bool IsDicomReUpload { get; set; }
|
||||
|
||||
|
||||
|
||||
|
||||
public int FileCount { get; set; }
|
||||
}
|
||||
|
||||
public class NewArchiveStudyCommand
|
||||
{
|
||||
[NotDefault]
|
||||
public Guid TrialId { get; set; }
|
||||
[NotDefault]
|
||||
public Guid SiteId { get; set; }
|
||||
[NotDefault]
|
||||
public Guid SubjectId { get; set; }
|
||||
[NotDefault]
|
||||
public Guid SubjectVisitId { get; set; }
|
||||
[NotDefault]
|
||||
public Guid StudyMonitorId { get; set; }
|
||||
|
||||
public int FailedFileCount { get; set; }
|
||||
|
||||
public AddOrUpdateStudyDto Study { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class AddOrUpdateStudyDto
|
||||
{
|
||||
|
||||
|
||||
public string StudyId { get; set; } = string.Empty;
|
||||
|
||||
//public int Code { get; set; } = 0;
|
||||
|
||||
//public string StudyCode { get; set; } = string.Empty;
|
||||
|
||||
|
||||
public string StudyInstanceUid { get; set; } = string.Empty;
|
||||
public DateTime? StudyTime { get; set; }
|
||||
public string Modalities { get; set; } = string.Empty;
|
||||
|
||||
public string Description { get; set; } = string.Empty;
|
||||
public int SeriesCount { get; set; } = 0;
|
||||
public int InstanceCount { get; set; } = 0;
|
||||
|
||||
public string InstitutionName { get; set; } = string.Empty;
|
||||
public string PatientId { get; set; } = string.Empty;
|
||||
public string PatientName { get; set; } = string.Empty;
|
||||
public string PatientAge { get; set; } = string.Empty;
|
||||
public string PatientSex { get; set; } = string.Empty;
|
||||
|
||||
public string AccessionNumber { get; set; } = string.Empty;
|
||||
public string PatientBirthDate { get; set; } = string.Empty;
|
||||
public string AcquisitionTime { get; set; } = string.Empty;
|
||||
public string AcquisitionNumber { get; set; } = string.Empty;
|
||||
public string TriggerTime { get; set; } = string.Empty;
|
||||
|
||||
public string BodyPartExamined { get; set; } = string.Empty;
|
||||
|
||||
public List<AddOrUpdateSeriesDto> SeriesList { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class AddOrUpdateSeriesDto
|
||||
{
|
||||
public string StudyInstanceUid { get; set; }
|
||||
public string SeriesInstanceUid { get; set; }
|
||||
public int SeriesNumber { get; set; }
|
||||
public DateTime? SeriesTime { get; set; }
|
||||
public string Modality { get; set; }
|
||||
public string Description { get; set; }
|
||||
public int InstanceCount { get; set; }
|
||||
public string SliceThickness { get; set; }
|
||||
|
||||
public string ImagePositionPatient { get; set; }
|
||||
public string ImageOrientationPatient { get; set; }
|
||||
public string BodyPartExamined { get; set; }
|
||||
public string SequenceName { get; set; }
|
||||
public string ProtocolName { get; set; }
|
||||
public string ImagerPixelSpacing { get; set; }
|
||||
|
||||
public string AcquisitionTime { get; set; } = string.Empty;
|
||||
public string AcquisitionNumber { get; set; } = string.Empty;
|
||||
public string TriggerTime { get; set; } = string.Empty;
|
||||
|
||||
public List<AddInstanceDto> InstanceList { get; set; }
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class AddInstanceDto
|
||||
{
|
||||
public string StudyInstanceUid { get; set; }
|
||||
public string SeriesInstanceUid { get; set; }
|
||||
public string SopInstanceUid { get; set; }
|
||||
public int InstanceNumber { get; set; }
|
||||
public DateTime? InstanceTime { get; set; }
|
||||
public bool CPIStatus { get; set; }
|
||||
public int ImageRows { get; set; }
|
||||
public int ImageColumns { get; set; }
|
||||
public int SliceLocation { get; set; }
|
||||
|
||||
|
||||
public string SliceThickness { get; set; }
|
||||
public int NumberOfFrames { get; set; }
|
||||
public string PixelSpacing { get; set; }
|
||||
|
||||
public string ImagerPixelSpacing { get; set; }
|
||||
public string FrameOfReferenceUID { get; set; }
|
||||
public string WindowCenter { get; set; }
|
||||
public string WindowWidth { get; set; }
|
||||
|
||||
public bool Anonymize { get; set; }
|
||||
public string Path { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@ using IRaCIS.Core.Infrastructure;
|
||||
|
||||
namespace IRaCIS.Core.Application.Services
|
||||
{
|
||||
public class DicomArchiveService : IDicomArchiveService
|
||||
public class DicomArchiveService :BaseService, IDicomArchiveService
|
||||
{
|
||||
private readonly IRepository<DicomStudy> _studyRepository;
|
||||
private readonly IRepository<DicomSeries> _seriesRepository;
|
||||
@@ -50,6 +50,9 @@ namespace IRaCIS.Core.Application.Services
|
||||
return success;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task<(Guid StudyId, string StudyCode)> ArchiveDicomStreamAsync(Stream dicomStream,
|
||||
DicomTrialSiteSubjectInfo addtionalInfo, List<string> seriesInstanceUidList, List<string> instanceUidList)
|
||||
{
|
||||
@@ -77,7 +80,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if (anonymize_AddFixedFiledList.Union(anonymize_AddIRCInfoFiledList).Union(anonymize_FixedFieldList).Union(anonymize_IRCInfoFieldList).Count() == 0)
|
||||
{
|
||||
throw new BusinessValidationFailedException("未取到缓存匿名化配置数据,上传停止,请联系开发人员核实");
|
||||
//---未取到缓存匿名化配置数据,上传停止,请联系开发人员核实
|
||||
throw new BusinessValidationFailedException(_localizer["DAS_NoAnonCacheData"]);
|
||||
}
|
||||
|
||||
|
||||
@@ -159,21 +163,32 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
var samplesPerPixel = dataset.GetSingleValueOrDefault(DicomTag.SamplesPerPixel, string.Empty);
|
||||
var photometricInterpretation = dataset.GetSingleValueOrDefault(DicomTag.PhotometricInterpretation, string.Empty);
|
||||
|
||||
if (samplesPerPixel == "1" && (photometricInterpretation.ToUpper() == "MONOCHROME2" || photometricInterpretation.ToUpper() == "MONOCHROME1"))//MONOCHROME2
|
||||
{
|
||||
if (dataset.InternalTransferSyntax.IsEncapsulated)
|
||||
{
|
||||
//正常保存 不做处理
|
||||
await dicomFile.SaveAsync(physicalPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
{ //JPEGLSLossless 保存
|
||||
await dicomFile.Clone(DicomTransferSyntax.JPEGLSLossless).SaveAsync(physicalPath);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (dataset.InternalTransferSyntax.IsEncapsulated) await dicomFile.SaveAsync(physicalPath);
|
||||
else await dicomFile.Clone(DicomTransferSyntax.RLELossless).SaveAsync(physicalPath); //RLELossless
|
||||
if (dataset.InternalTransferSyntax.IsEncapsulated)
|
||||
{
|
||||
//正常保存 不做处理
|
||||
await dicomFile.SaveAsync(physicalPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
//RLELossless 保存
|
||||
await dicomFile.Clone(DicomTransferSyntax.RLELossless).SaveAsync(physicalPath); //RLELossless
|
||||
|
||||
}
|
||||
}
|
||||
return (dicomInstance.StudyId, dicomStudy.StudyCode);
|
||||
}
|
||||
@@ -209,6 +224,21 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
var dicModalityList = _dictionaryRepository.Where(t => t.Code == "Modality").SelectMany(t => t.ChildList.Select(c => c.Value)).ToList();
|
||||
|
||||
var modalityForEdit = dicModalityList.Contains(modality) ? modality : String.Empty;
|
||||
|
||||
if (modality == "MR")
|
||||
{
|
||||
modalityForEdit = "MRI";
|
||||
}
|
||||
|
||||
if (modality == "PT")
|
||||
{
|
||||
modalityForEdit = "PET";
|
||||
}
|
||||
if(modality== "PT、CT")
|
||||
{
|
||||
modalityForEdit = "PET-CT";
|
||||
}
|
||||
|
||||
dicomStudy = new DicomStudy
|
||||
{
|
||||
@@ -217,7 +247,7 @@ namespace IRaCIS.Core.Application.Services
|
||||
/* StudyTime = dataset.GetSingleValueOrDefault(DicomTag.StudyDate, DateTime.Now).Add(dataset.GetSingleValueOrDefault(DicomTag.StudyTime, DateTime.Now).TimeOfDay),*///dataset.GetDateTime(DicomTag.StudyDate, DicomTag.StudyTime),
|
||||
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),
|
||||
Modalities = modality,
|
||||
ModalityForEdit = modality == "MR" ? "MRI": (dicModalityList.Contains(modality) ? modality : String.Empty),
|
||||
ModalityForEdit = modalityForEdit,
|
||||
Description = dataset.GetSingleValueOrDefault(DicomTag.StudyDescription, string.Empty),
|
||||
InstitutionName = dataset.GetSingleValueOrDefault(DicomTag.InstitutionName, string.Empty),
|
||||
PatientId = dataset.GetSingleValueOrDefault(DicomTag.PatientID, string.Empty),
|
||||
@@ -363,9 +393,9 @@ namespace IRaCIS.Core.Application.Services
|
||||
ProtocolName = dataset.GetSingleValueOrDefault(DicomTag.ProtocolName, string.Empty),
|
||||
ImagerPixelSpacing = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty),
|
||||
|
||||
AcquisitionTime = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty),
|
||||
AcquisitionNumber = dataset.GetSingleValueOrDefault(DicomTag.ImagerPixelSpacing, string.Empty),
|
||||
TriggerTime = 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),
|
||||
|
||||
SiteId = dicomStudy.SiteId,
|
||||
TrialId = dicomStudy.TrialId,
|
||||
|
||||
@@ -55,7 +55,8 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if (!studyIds.Any())
|
||||
{
|
||||
return ResponseOutput.NotOk("当前检查没有影像可以分享。 ");
|
||||
//---当前检查没有影像可以分享。
|
||||
return ResponseOutput.NotOk(_localizer["ISS_NoImgToShare"]);
|
||||
}
|
||||
|
||||
imageShareCommand.StudyId = studyIds.First();
|
||||
@@ -93,17 +94,20 @@ namespace IRaCIS.Core.Application.Services
|
||||
|
||||
if (imageShare == null)
|
||||
{
|
||||
return ResponseOutput.NotOk("资源不存在。");
|
||||
//---资源不存在。
|
||||
return ResponseOutput.NotOk(_localizer["ISS_ResNotExists"]);
|
||||
}
|
||||
|
||||
if (pWord != imageShare.Password.Trim())
|
||||
{
|
||||
return ResponseOutput.NotOk("分享密码错误。");
|
||||
//---分享密码错误。
|
||||
return ResponseOutput.NotOk(_localizer["ISS_SharePwdError"]);
|
||||
}
|
||||
|
||||
if (DateTime.Now > imageShare.ExpireTime)
|
||||
{
|
||||
return ResponseOutput.NotOk("资源分享过期。");
|
||||
//---资源分享过期。
|
||||
return ResponseOutput.NotOk(_localizer["ISS_ShareExpiration"]);
|
||||
}
|
||||
|
||||
var resource = new ResourceInfo()
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user