BianJiShouShu.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. <template>
  2. <el-form ref="shouShuBiaoGe" :model="props.data" :rules="jiaoYanGuiZe" label-width="80px">
  3. <el-row>
  4. <el-col :span="12">
  5. <el-form-item label="手术" prop="opCode">
  6. <xc-combo-grid v-model="props.data"
  7. code="opCode"
  8. @row-click="clickToSelectSurgery"
  9. :table-header="tableHeader"
  10. name="opName"
  11. :query-data-func="queryOperation">
  12. <el-table-column prop="opScale" label="手术等级"/>
  13. </xc-combo-grid>
  14. </el-form-item>
  15. </el-col>
  16. <el-col :span="12">
  17. <el-form-item label="申请时间" prop="applyDate">
  18. {{ props.data.applyDate }}
  19. </el-form-item>
  20. </el-col>
  21. <el-col :span="12">
  22. <el-form-item label="手术时间" prop="opDatetime">
  23. <el-date-picker v-model="props.data.opDatetime"
  24. @change="buildOrderName"
  25. format="YYYY-MM-DD HH:mm:ss"
  26. placeholder="time"
  27. type="datetime"
  28. value-format="YYYY-MM-DD HH:mm:ss"/>
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="12">
  32. <el-form-item label="情况">
  33. <el-switch
  34. v-model="props.data.urgentClinicFlag"
  35. :active-value="1"
  36. :inactive-value="0"
  37. active-color="#13ce66"
  38. active-text="急诊"
  39. inactive-color="#ff4949"
  40. inactive-text="择期">
  41. </el-switch>
  42. </el-form-item>
  43. </el-col>
  44. <el-col :span="12">
  45. <el-form-item label="班次">
  46. <el-switch
  47. v-model="props.data.ssbc"
  48. :active-value="1"
  49. :inactive-value="2"
  50. active-color="#13ce66"
  51. active-text="正常"
  52. inactive-color="#ff4949"
  53. inactive-text="加班">
  54. </el-switch>
  55. </el-form-item>
  56. </el-col>
  57. <el-col :span="12">
  58. <el-form-item label="术前诊断" prop="diagBeforeCode">
  59. <xc-select-v3 v-model="props.data"
  60. :data="shouShuZhenDuan"
  61. code="diagBeforeCode"
  62. name="diagBeforeOp"
  63. :remote-method="souSuoZhenDuan"/>
  64. </el-form-item>
  65. </el-col>
  66. <el-col :span="12">
  67. <el-form-item label="自费">
  68. <el-switch
  69. v-model="props.data.ybSelfFlag"
  70. :active-value="1"
  71. :inactive-value="0"
  72. active-color="#13ce66"
  73. active-text="是"
  74. inactive-color="#ff4949"
  75. inactive-text="否">
  76. </el-switch>
  77. </el-form-item>
  78. </el-col>
  79. <el-col :span="12">
  80. <el-form-item label="手术部位" prop="partCode">
  81. <xc-select-v3 v-model="props.data"
  82. code="partCode" name="partCodeName"
  83. :data="shouShuBuWeiShuJu"
  84. :remote-method="souSuoBuWei" clearable/>
  85. </el-form-item>
  86. </el-col>
  87. <el-col :span="12">
  88. <el-form-item label="手术等级" prop="opScale">
  89. <el-select v-model="props.data.opScale"
  90. :disabled="disabledOpScale">
  91. <xc-el-option :data="shouShuDengJi"/>
  92. </el-select>
  93. </el-form-item>
  94. </el-col>
  95. <el-col :span="12">
  96. <el-form-item label="麻醉方式">
  97. <xc-select-v3 v-model="props.data"
  98. code="hocusCode"
  99. @row-click="buildOrderName"
  100. name="hocusCodeName"
  101. :data="props.anestheticMode"/>
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="12">
  105. <el-form-item label="主刀医生" prop="doctorZd">
  106. <xc-select-v3 v-model="props.data"
  107. code="doctorZd"
  108. name="doctorZdName"
  109. :remote-method="suoSouYiShen"
  110. clearable
  111. :data="yiShengShuJu">
  112. <xc-table-column label="编码" prop="code"/>
  113. <xc-table-column label="姓名" prop="name"/>
  114. <xc-table-column label="科室" prop="deptName"/>
  115. <xc-table-column label="级别" prop="empTitName"/>
  116. </xc-select-v3>
  117. </el-form-item>
  118. </el-col>
  119. <el-col :span="12">
  120. <el-form-item label="第一助手">
  121. <xc-select-v3 v-model="props.data" code="doctor1" name="doctor1Name"
  122. :remote-method="suoSouYiShen" clearable
  123. :data="yiShengShuJu">
  124. <xc-table-column label="编码" prop="code"/>
  125. <xc-table-column label="姓名" prop="name"/>
  126. <xc-table-column label="科室" prop="deptName"/>
  127. <xc-table-column label="级别" prop="empTitName"/>
  128. </xc-select-v3>
  129. </el-form-item>
  130. </el-col>
  131. <el-col :span="12">
  132. <el-form-item label="第二助手">
  133. <xc-select-v3 v-model="data" code="doctor2" name="doctor2Name"
  134. :remote-method="suoSouYiShen" clearable
  135. :props.data="yiShengShuJu">
  136. <xc-table-column label="编码" prop="code"/>
  137. <xc-table-column label="姓名" prop="name"/>
  138. <xc-table-column label="科室" prop="deptName"/>
  139. <xc-table-column label="级别" prop="empTitName"/>
  140. </xc-select-v3>
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="12">
  144. <el-form-item label="第三助手">
  145. <xc-select-v3 v-model="props.data" code="doctor3" name="doctor3Name"
  146. :remote-method="suoSouYiShen" clearable
  147. :data="yiShengShuJu">
  148. <xc-table-column label="编码" prop="code"/>
  149. <xc-table-column label="姓名" prop="name"/>
  150. <xc-table-column label="科室" prop="deptName"/>
  151. <xc-table-column label="级别" prop="empTitName"/>
  152. </xc-select-v3>
  153. </el-form-item>
  154. </el-col>
  155. <el-col :span="12">
  156. <el-form-item label="麻醉医生">
  157. <xc-select-v3 v-model="props.data" code="doctorMz" name="doctorMzName"
  158. :remote-method="suoSouYiShen" clearable
  159. :data="yiShengShuJu">
  160. <xc-table-column label="编码" prop="code"/>
  161. <xc-table-column label="姓名" prop="name"/>
  162. <xc-table-column label="科室" prop="deptName"/>
  163. <xc-table-column label="级别" prop="empTitName"/>
  164. </xc-select-v3>
  165. </el-form-item>
  166. </el-col>
  167. <el-col :span="12">
  168. <el-form-item label="器械护士">
  169. <xc-select-v3 v-model="props.data" code="nurseQx" name="nurseQxName"
  170. :remote-method="suoSouYiShen" clearable
  171. :data="yiShengShuJu">
  172. <xc-table-column label="编码" prop="code"/>
  173. <xc-table-column label="姓名" prop="name"/>
  174. <xc-table-column label="科室" prop="deptName"/>
  175. <xc-table-column label="级别" prop="empTitName"/>
  176. </xc-select-v3>
  177. </el-form-item>
  178. </el-col>
  179. <el-col :span="12">
  180. <el-form-item label="巡回护士">
  181. <xc-select-v3 v-model="props.data" code="nurseXh" name="nurseXhName"
  182. :remote-method="suoSouYiShen" clearable
  183. :data="yiShengShuJu">
  184. <xc-table-column label="编码" prop="code"/>
  185. <xc-table-column label="姓名" prop="name"/>
  186. <xc-table-column label="科室" prop="deptName"/>
  187. <xc-table-column label="级别" prop="empTitName"/>
  188. </xc-select-v3>
  189. </el-form-item>
  190. </el-col>
  191. <el-col :span="24">
  192. <el-form-item label="医嘱名:">
  193. <el-input style="width: 220px"
  194. :rows="3"
  195. type="textarea"
  196. show-word-limit
  197. maxlength="50"
  198. v-model="props.data.orderName"/>
  199. </el-form-item>
  200. </el-col>
  201. <el-col :span="24">
  202. <el-form-item label="附注说明">
  203. <el-input v-model="props.data.remark" :rows="6" maxlength="50" show-word-limit
  204. style="width: 450px;"
  205. type="textarea"/>
  206. </el-form-item>
  207. </el-col>
  208. </el-row>
  209. </el-form>
  210. </template>
  211. <script setup name="BianJiShouShu">
  212. import {ref} from "vue";
  213. import {diagnosisInOurHospital} from "@/api/zhu-yuan-yi-sheng/jian-yan-jian-cha-shen-qing";
  214. import {getDoctorByOpCode, huoQuShouShuBuWei, obtainSurgicalItems} from "@/api/zhu-yuan-yi-sheng/shou-shu-shen-qing";
  215. import {getRenYuan} from "@/api/public-api";
  216. import moment from "moment";
  217. import XcSelectV3 from "@/components/xiao-chan/select-v3/XcSelectV3.vue";
  218. import XcTableColumn from "@/components/xiao-chan/select-v3/XcTableColumn";
  219. import {getFormatDatetime} from "@/utils/date";
  220. import XcComboGrid from "@/components/xiao-chan/combo-grid/XcComboGrid.vue";
  221. import XcElOption from "@/components/xiao-chan/xc-el-option/XcElOption.vue";
  222. import XEUtils from 'xe-utils'
  223. import {xcMessage} from "@/utils/xiaochan-element-plus";
  224. import {isDev} from "@/utils/public";
  225. const props = defineProps({
  226. anestheticMode: {
  227. type: Array,
  228. },
  229. data: Object,
  230. index: Number
  231. })
  232. const tableHeader = [
  233. {label: '编码', prop: 'code', width: 120},
  234. {label: '名称', prop: 'name', width: 240},
  235. {label: '类型', prop: 'opTypeName', width: 140},
  236. ]
  237. const emit = defineEmits(['qu-xiao'])
  238. const queryOperation = (val) => {
  239. return obtainSurgicalItems(val, 0)
  240. }
  241. const selectOpRow = ref({})
  242. const designateASurgeonInChief = ref([])
  243. const clickToSelectSurgery = async (val) => {
  244. disabledOpScale.value = false
  245. selectOpRow.value = val
  246. if (isDev) {
  247. let res = await getDoctorByOpCode(val.code)
  248. designateASurgeonInChief.value = res
  249. yiShengShuJu.value = res
  250. if (designateASurgeonInChief.value.length > 0) {
  251. xcMessage.warning('医务部锁定手术主刀医生无法修改');
  252. }
  253. if (val.opScale !== null) {
  254. disabledOpScale.value = true
  255. props.data.opScale = gradeToCode(val.opScale)
  256. xcMessage.warning('医务部锁定手术等级无法修改')
  257. }
  258. }
  259. buildOrderName()
  260. }
  261. const disabledOpScale = ref(false)
  262. // 手术部位
  263. const shouShuBuWeiShuJu = ref([])
  264. // 手术诊断
  265. const shouShuZhenDuan = ref([])
  266. // 医生信息
  267. const yiShengShuJu = ref([])
  268. // 搜索手术部位
  269. const souSuoBuWei = (val) => {
  270. huoQuShouShuBuWei(val).then((res) => {
  271. shouShuBuWeiShuJu.value = res
  272. })
  273. }
  274. // 搜索诊断
  275. const souSuoZhenDuan = (val) => {
  276. diagnosisInOurHospital(val).then(res => {
  277. shouShuZhenDuan.value = res
  278. })
  279. }
  280. // 搜索医生
  281. const suoSouYiShen = (val) => {
  282. if (designateASurgeonInChief.value.length > 0) {
  283. return
  284. }
  285. getRenYuan(val).then(res => {
  286. yiShengShuJu.value = res
  287. });
  288. }
  289. const shouShuBiaoGe = ref()
  290. // 时间校验
  291. const shenQingShiJian = (rule, value, callback) => {
  292. const oDate1 = moment(value).format('YYYY-MM-DD HH:mm:ss')
  293. const oDate2 = moment(props.data.applyDate).format('YYYY-MM-DD HH:mm:ss')
  294. if (moment(oDate1).isBefore(moment(oDate2))) {
  295. callback(new Error('手术时间不能小于申请时间'))
  296. } else {
  297. callback()
  298. }
  299. }
  300. // 校验数据
  301. const jiaoYanGuiZe = ref({
  302. opCode: [{required: true, message: '项目编码不能为空', trigger: 'blur'}],
  303. opName: [{required: true, message: '项目名称不能为空', trigger: 'blur'}],
  304. applyDate: [{required: true, message: '申请时间不能为空', trigger: 'blur'}],
  305. opDatetime: [{required: true, message: '手术时间不能为空', trigger: 'blur'},
  306. {validator: shenQingShiJian, trigger: 'blur'}],
  307. diagBeforeCode: [{required: true, message: '术前诊断不能为空', trigger: 'blur'}],
  308. partCode: [{required: true, message: '手术部位不能为空', trigger: 'blur'}],
  309. doctorZd: [{required: true, message: '主刀医生不能为空', trigger: 'blur'}],
  310. opScale: [{required: true, message: '手术等级不能为空', trigger: 'blur'}],
  311. })
  312. const buildOrderName = () => {
  313. props.data.orderName =
  314. `拟于${getFormatDatetime(props.data.opDatetime, 'YYYY-MM-DD HH:mm')}在${props.data.hocusCodeName === null ? '' : props.data.hocusCodeName}下行${props.data.opName}`
  315. }
  316. const shouShuDengJi = [
  317. {code: 1, name: '四级', value: 4},
  318. {code: 2, name: '三级', value: 3},
  319. {code: 3, name: '二级', value: 2},
  320. {code: 4, name: '一级', value: 1},
  321. ]
  322. const gradeToCode = (val) => {
  323. return XEUtils.filter(shouShuDengJi, (item) => {
  324. return item.value === val
  325. })[0].code
  326. }
  327. </script>
  328. <style scoped>
  329. </style>