EmrControlRule.vue 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289
  1. <template>
  2. <xc-table :local-data="data" :height="40">
  3. <el-table-column label="质控名称" prop="name"/>
  4. <el-table-column label="时效(小时)" prop="prescription"/>
  5. <el-table-column label="描述" prop="promptStatement"/>
  6. <el-table-column label="是否开启" prop="offOrOnRule">
  7. <template #default="{row}">
  8. <el-switch
  9. v-model="row.offOrOnRule"
  10. :active-value="1"
  11. :inactive-value="0"
  12. @change="onOff(row.id,row.offOrOnRule)"
  13. active-text="开启"
  14. inactive-text="关闭"/>
  15. </template>
  16. </el-table-column>
  17. <el-table-column label="操作">
  18. <template #default="{row}">
  19. <el-button type="danger" @click="deleteQualityControl(row.id)">删除</el-button>
  20. <el-button type="warning">修改</el-button>
  21. </template>
  22. </el-table-column>
  23. </xc-table>
  24. <xc-dialog-v2 v-model="dialog"
  25. title="病历时效限制">
  26. <el-form :label-width="120">
  27. <el-form-item label="入参数据元:">
  28. <el-select v-model="ruleForm.sql" @change="selectChange" ref="selectRef">
  29. <el-option v-for="item in ruleDataElement"
  30. :label="item.name"
  31. :value="item.sql_sentence"
  32. :key="item.sql_sentence"
  33. :title="item.group_name"
  34. ></el-option>
  35. </el-select>
  36. </el-form-item>
  37. <el-form-item label="时效(小时):">
  38. <el-input v-model.number="ruleForm.prescription">
  39. <template #prepend>
  40. {{ selectRef?.selectedLabel }}
  41. </template>
  42. <template #append> 小时后</template>
  43. </el-input>
  44. </el-form-item>
  45. <el-form-item label="病历编码:">
  46. <el-tree-select
  47. style="width: 100%"
  48. class="tree-select"
  49. v-model="value"
  50. :data="emrTree"
  51. @clear=""
  52. @remove-tag="removeTag"
  53. multiple
  54. @node-click="nodeClick"
  55. :props="defaultProps"
  56. check-strictly
  57. :render-after-expand="false">
  58. <template #default="{data}">
  59. <div style="display: flex;justify-content: space-between;align-items: center">
  60. <div>
  61. {{ data.name }}
  62. </div>
  63. <div v-if="data.children && data.children.length > 0">
  64. <el-button text @click.stop="selectAll(data.children)">全选</el-button>
  65. </div>
  66. </div>
  67. </template>
  68. </el-tree-select>
  69. </el-form-item>
  70. <el-form-item label="提示语:">
  71. <el-input v-model="ruleForm.promptStatement" show-word-limit maxlength="50"/>
  72. </el-form-item>
  73. <el-form-item>
  74. <el-switch
  75. v-model="ruleForm.offOrOnRule"
  76. :active-value="1"
  77. :inactive-value="0"
  78. active-text="开启"
  79. inactive-text="关闭"/>
  80. </el-form-item>
  81. </el-form>
  82. <template #footer>
  83. <el-button>取消</el-button>
  84. <el-button @click="confirm">确认</el-button>
  85. </template>
  86. </xc-dialog-v2>
  87. </template>
  88. <script setup name='EmrControlRule' lang="ts">
  89. import XcTable from "@/components/xiao-chan/xc-table/XcTable.vue";
  90. import {nextTick, onMounted, Ref, ref} from "vue";
  91. import XcDialogV2 from "@/components/xiao-chan/dialog/XcDialogV2.vue";
  92. import {
  93. getEmrTree,
  94. } from "@/api/zhu-yuan-yi-sheng/emr-patient";
  95. import {
  96. addRule,
  97. getAvailableObjects,
  98. getRuleList,
  99. switchQualityControl
  100. } from '@/api/zhu-yuan-yi-sheng/emr-control-rule'
  101. import {ElMessageBox} from "element-plus";
  102. const data: Ref<Array<any>> = ref([])
  103. const dialog: Ref<boolean> = ref(false)
  104. const emrTree = ref([])
  105. const ruleDataElement: Ref<Array<any>> = ref([])
  106. const defaultProps = {
  107. children: 'children',
  108. label: 'name',
  109. value: '_id',
  110. disabled: (data) => {
  111. return data.children && data.children.length > 0;
  112. }
  113. }
  114. interface ruleFormClass {
  115. medicalRecord: Map<string, any>,
  116. // 病历编码
  117. medicalRecordCode: Array<string>,
  118. type: number,
  119. data: any,
  120. offOrOnRule: number
  121. promptStatement: string
  122. name: string
  123. sql: string
  124. prescription: number
  125. }
  126. const ruleForm: Ref<ruleFormClass> = ref({
  127. type: 1,
  128. medicalRecord: {},
  129. medicalRecordCode: {},
  130. data: {},
  131. offOrOnRule: 1,
  132. promptStatement: '超过了 24 小时无法创建',
  133. name: '',
  134. sql: '',
  135. prescription: 24
  136. })
  137. /**
  138. * 全选
  139. * @param list
  140. */
  141. const selectAll = (list) => {
  142. list.forEach(data => {
  143. ruleForm.value.medicalRecord[data._id] = {
  144. code: data.code,
  145. name: data.name
  146. }
  147. if (value.value.indexOf(data._id) === -1) {
  148. value.value.push(data._id);
  149. }
  150. })
  151. }
  152. /**
  153. * 编码点击
  154. * @param data
  155. */
  156. const nodeClick = (data) => {
  157. if (data.children) return
  158. if (ruleForm.value.medicalRecord[data._id]) {
  159. uncheck(data._id)
  160. } else {
  161. ruleForm.value.medicalRecord[data._id] = {
  162. code: data.code,
  163. name: data.name
  164. }
  165. }
  166. }
  167. /**
  168. * 移除标签
  169. * @param data
  170. */
  171. const removeTag = (data) => {
  172. uncheck(data)
  173. }
  174. /**
  175. * 删除数据
  176. * @param value
  177. */
  178. const uncheck = (value) => {
  179. delete ruleForm.value.medicalRecord[value]
  180. }
  181. const selectRef = ref(null)
  182. const selectChange = async () => {
  183. await nextTick()
  184. }
  185. const confirm = () => {
  186. let temp = new Set()
  187. for (let key in ruleForm.value.medicalRecord) {
  188. temp.add(ruleForm.value.medicalRecord[key].code)
  189. }
  190. ruleForm.value.medicalRecordCode = Array.from(temp)
  191. ruleForm.value.type = 1
  192. addRule(ruleForm.value)
  193. console.log(ruleForm.value)
  194. }
  195. const value: Ref<Array<string>> = ref([])
  196. const onOff = async (id, val) => {
  197. await switchQualityControl(id, val)
  198. }
  199. const deleteQualityControl = (val) => {
  200. ElMessageBox.confirm('是否要删除该质控!', '提示', {
  201. type: 'warning'
  202. }).then((res) => {
  203. console.log(val)
  204. }).catch((e) => {
  205. })
  206. }
  207. onMounted(() => {
  208. getEmrTree('hosp').then((res) => {
  209. emrTree.value = res.all[0].children
  210. })
  211. getRuleList().then((res) => {
  212. console.log(res)
  213. data.value = res
  214. })
  215. getAvailableObjects().then((res) => {
  216. ruleDataElement.value = res
  217. console.log(res)
  218. })
  219. })
  220. </script>
  221. <style lang="scss">
  222. .tree-select {
  223. .el-select-dropdown__item.hover,
  224. .el-select-dropdown__item:hover {
  225. background-color: #f5f7fa !important;
  226. color: black;
  227. }
  228. }
  229. .select_div {
  230. min-height: 20px;
  231. width: 100%;
  232. border: 1px solid;
  233. border-radius: 4px;
  234. table-layout: fixed;
  235. word-break: break-all;
  236. overflow: hidden;
  237. .select_input {
  238. margin-left: 3px;
  239. }
  240. span {
  241. border-radius: 2px;
  242. background-color: #f0f2f5;
  243. padding: 0 5px;
  244. margin: 4px;
  245. i {
  246. cursor: pointer;
  247. font-size: 12px;
  248. width: 14px;
  249. height: 14px;
  250. border-radius: 50%;
  251. }
  252. }
  253. }
  254. </style>