TianJiaYiZhu.vue 34 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049
  1. <template>
  2. <!-- 这里是获取模板的 -->
  3. <huo-qu-mu-ban v-if="muBanDuiHuaKuang" @close="muBanDuiHuaKuang = false" @muBanShuJu="muBanShuJu"></huo-qu-mu-ban>
  4. <bao-cun-mu-ban ref="baoCunMuBanRef"></bao-cun-mu-ban>
  5. <template v-for="(item, index) in tiShiBiaoTi" :key="index">
  6. <el-alert :title="item.title" :type="item.type" effect="dark"></el-alert>
  7. </template>
  8. <el-button icon="ArrowLeft" style="font-size: 14px" text type="primary" @click="router.go(-1)">返回</el-button>
  9. <el-button type="primary" @click="muBanDuiHuaKuang = true">获取模板</el-button>
  10. <el-button :disabled="yiZhuList.length === 0" type="primary" @click="baoCunMuBanClick">保存模板</el-button>
  11. <el-button icon="el-icon-check" type="success" @click="baoCunYiZhuClick">保存</el-button>
  12. {{ count }}
  13. <cuo-wu-xin-xi/>
  14. <el-divider direction="vertical"></el-divider>
  15. <el-button :disabled="yiZhuData.serial === '00' || stringIsBlank(yiZhuData.serial)" icon="el-icon-view" type="success"
  16. @click="HeLiYongYao.dialog = true"> 药品用法
  17. </el-button>
  18. <el-divider direction="vertical"></el-divider>
  19. <el-button @click="tiaoZhuanZhiHeLiYongYao">合理用药</el-button>
  20. <el-button @click="allergenDialog = true">患者过敏信息</el-button>
  21. <yao-ping-xiang-qing v-if="HeLiYongYao.dialog" :code="HeLiYongYao.code"
  22. @close="HeLiYongYao.dialog = false"></yao-ping-xiang-qing>
  23. <el-form ref="yiZhuRef" v-model="yiZhuData" label-width="90px" size="small">
  24. <el-row>
  25. <el-col :span="span" @click="yiZhuMingDialog = true">
  26. <el-form-item class="bi_tian" label="医嘱名称:" prop="orderName">
  27. <div style="border-bottom: 1px solid #000; height: 29px">
  28. {{ yiZhuData.orderName }}
  29. </div>
  30. </el-form-item>
  31. </el-col>
  32. <el-col :span="span">
  33. <el-form-item label="规格:" prop="orderName">
  34. <div style="border-bottom: 1px solid #000; height: 29px">
  35. {{ yiZhuData.drugSpecification }}
  36. </div>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="span">
  40. <el-form-item class="bi_tian" label="频率:" prop="frequCode">
  41. <XcSelect v-model="yiZhuData" :data="yaoPinPingLvData" :name="['frequCode', 'frequCodeName']" clearable remote
  42. @method="pinLvRemoteMethod" ref="pingLv"></XcSelect>
  43. </el-form-item>
  44. </el-col>
  45. <el-col :span="span">
  46. <el-form-item class="bi_tian" label="一次剂量:" prop="dose">
  47. <el-input-number v-model="yiZhuData.dose" :min="0" :precision="2" style="width: 110px"
  48. @change="jiSuanLingLiang"></el-input-number>
  49. <XcSelect v-model="yiZhuData" :data="yaoPinJiLiangData" :name="['doseUnit', 'doseUnitName']" :width="80"
  50. @change="xuanZheJiLiang">
  51. <XcOption label="value"></XcOption>
  52. <XcOption label="name"></XcOption>
  53. </XcSelect>
  54. </el-form-item>
  55. </el-col>
  56. <el-col :span="span">
  57. <el-form-item label="领量:"> {{ yiZhuData.drugQuan }} {{ yiZhuData.miniUnitName }}</el-form-item>
  58. </el-col>
  59. <el-col :span="span">
  60. <el-form-item class="bi_tian" label="给药方式:" prop="supplyCode">
  61. <XcSelect v-model="yiZhuData" :data="geiYaoFangShiData" :name="['supplyCode', 'supplyCodeName']" clearable
  62. remote @method="geiYaoFangShiRemoteMethod"></XcSelect>
  63. </el-form-item>
  64. </el-col>
  65. <el-col :span="span">
  66. <el-form-item label="医嘱时间:" prop="orderName">
  67. {{ yiZhuData.orderTime }}
  68. </el-form-item>
  69. </el-col>
  70. <el-col :span="span">
  71. <el-form-item class="bi_tian" label="开始时间:" prop="startTime">
  72. <el-date-picker
  73. v-model="yiZhuData.startTime"
  74. :disabled-date="disabledDate"
  75. format="YYYY-MM-DD HH:mm:ss"
  76. type="datetime"
  77. value-format="YYYY-MM-DD HH:mm:ss"
  78. ></el-date-picker>
  79. </el-form-item>
  80. </el-col>
  81. <el-col :span="span">
  82. <el-form-item class="bi_tian" label="停止时间:" prop="endTime">
  83. <el-date-picker
  84. v-model="yiZhuData.endTime"
  85. :disabled="yiZhuData.frequCode === 'ONCE'"
  86. :disabled-date="disabledDate"
  87. format="YYYY-MM-DD HH:mm:ss"
  88. type="datetime"
  89. value-format="YYYY-MM-DD HH:mm:ss"
  90. ></el-date-picker>
  91. </el-form-item>
  92. </el-col>
  93. <el-col :span="span">
  94. <el-form-item label="医生:" prop="orderName">
  95. {{ store.state.user.info.name }}
  96. </el-form-item>
  97. </el-col>
  98. <el-col :span="span">
  99. <el-form-item class="bi_tian" label="执行科室:" prop="execUnit">
  100. <XcSelect v-model="yiZhuData" :data="zhiXingKeShiData" :name="['execUnit', 'execUnitName']" remote
  101. @method="metZhiXingKeShi"></XcSelect>
  102. </el-form-item>
  103. </el-col>
  104. <el-col :span="span">
  105. <el-form-item label="父医嘱:" prop="orderName">
  106. <el-select v-model="yiZhuData.parentNo" :disabled="yiZhuData.serial === '00'" clearable
  107. @clear="yiZhuData.parentNo = null" @click="fuYiZhuClick">
  108. <el-option v-for="item in fuYiZhuData" :key="item.code" :label="item.name" :value="item.code">
  109. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  110. <el-divider direction="vertical"></el-divider>
  111. <span>{{ item.name }}</span>
  112. </el-option>
  113. </el-select>
  114. </el-form-item>
  115. </el-col>
  116. <el-col :span="span" :title="yiZhuData.discription">
  117. <el-form-item label="医嘱描述:" prop="orderName">
  118. <el-input v-model="yiZhuData.discription" disabled type="textarea"></el-input>
  119. </el-form-item>
  120. </el-col>
  121. <el-col :span="span">
  122. <el-form-item label="医生嘱托:">
  123. <el-input v-model="yiZhuData.instruction" clearable maxlength="50" show-word-limit type="textarea"></el-input>
  124. </el-form-item>
  125. </el-col>
  126. <el-col :span="span">
  127. <el-form-item label="服用时间">
  128. <el-select v-model="yiZhuData.kfFlag" clearable style="width: 80px" @clear="yiZhuData.kfFlag = null">
  129. <el-option key="1" label="饭前" value="1"></el-option>
  130. <el-option key="2" label="饭后" value="2"></el-option>
  131. </el-select>
  132. </el-form-item>
  133. </el-col>
  134. <el-col :span="span">
  135. <el-form-item label="费用标志:">
  136. <el-select v-model="yiZhuData.selfBuy" clearable style="width: 120px" @clear="yiZhuData.selfBuy = null">
  137. <el-option key="1" label="自备" value="1"></el-option>
  138. <el-option key="2" label="嘱托" value="2"></el-option>
  139. <el-option key="3" label="基数药" value="3"></el-option>
  140. </el-select>
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="span">
  144. <el-form-item label="医保自费:">
  145. <el-switch v-model="yiZhuData.ybSelfFlag" active-color="#13ce66" active-text="自费" active-value="1"
  146. inactive-color="#ff4949" inactive-text="记账" inactive-value="0">
  147. </el-switch>
  148. </el-form-item>
  149. </el-col>
  150. <el-col :span="span">
  151. <el-form-item label="是否紧急:">
  152. <el-switch v-model="yiZhuData.emergencyFlag" active-color="#13ce66" active-text="是" active-value="1"
  153. inactive-color="#ff4949" inactive-text="否" inactive-value="0">
  154. </el-switch>
  155. </el-form-item>
  156. </el-col>
  157. <el-col v-if="yiZhuData.orderCode === zkCode" :span="span">
  158. <el-form-item label="转科:" class="bi_tian">
  159. <el-select v-model="yiZhuData.zkObj">
  160. <el-option v-for="(item, index) in zkList" :key="item.value" :label="item.wardName + '|' + item.smallName"
  161. :value="item.value">
  162. <span>{{ item.wardName }}</span>
  163. <el-divider direction="vertical"></el-divider>
  164. <span>{{ item.smallName }}</span>
  165. </el-option>
  166. </el-select>
  167. </el-form-item>
  168. </el-col>
  169. <el-col v-if="yiZhuData.kjywFlag !== 0" :span="span">
  170. <el-form-item label="用药方式:">
  171. <el-select v-model="yiZhuData.yyfs" style="width: 120px" @change="kangJunYaoYongYaoFangShiGaiBian">
  172. <el-option v-for="item in kangJunYaoWuYongYaoFangShi" :key="item.code" :label="item.name"
  173. :value="item.code">
  174. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  175. <el-divider direction="vertical"></el-divider>
  176. <span>{{ item.name }}</span>
  177. </el-option>
  178. </el-select>
  179. </el-form-item>
  180. </el-col>
  181. <el-col :span="span">
  182. <el-form-item v-if="yiZhuData.kjywFlag !== 0" label="切口等级:">
  183. <el-select
  184. v-model="yiZhuData.ssqk"
  185. :disabled="yiZhuData.yyfs !== 1 && yiZhuData.yyfs !== 2 && yiZhuData.yyfs !== null"
  186. clearable
  187. style="width: 120px"
  188. @clear="yiZhuData.ssqk = null"
  189. >
  190. <el-option v-for="item in kangJunYaoWuQieKou" :key="item.code" :label="item.name" :value="item.code">
  191. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  192. <el-divider direction="vertical"></el-divider>
  193. <span>{{ item.name }}</span></el-option
  194. >
  195. </el-select>
  196. </el-form-item>
  197. </el-col>
  198. <el-col :span="span">
  199. <el-form-item v-if="yiZhuData.kjywFlag !== 0" label="用药时间:">
  200. <el-select
  201. v-model="yiZhuData.yysj"
  202. :disabled="yiZhuData.yyfs !== 1 && yiZhuData.yyfs !== 2 && yiZhuData.yyfs !== null"
  203. clearable
  204. style="width: 120px"
  205. @clear="yiZhuData.yysj = null"
  206. >
  207. <el-option v-for="item in kangJunYaoWuYongYaoShiJian" :key="item.code" :label="item.name"
  208. :value="item.code">
  209. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  210. <el-divider direction="vertical"></el-divider>
  211. <span>{{ item.name }}</span></el-option
  212. >
  213. </el-select>
  214. </el-form-item>
  215. </el-col>
  216. </el-row>
  217. </el-form>
  218. <el-button icon="el-icon-plus" type="primary" @click="tianJiaYiZhu">添加</el-button>
  219. <xc-code code="Ctrl + S" description="键盘添加"/>
  220. <xc-code code="Ctrl + F" description="打开搜索框"/>
  221. <xc-code code="Ctrl + 1" description="回到第一个输入框(数字1)"/>
  222. <xc-code code="Alt + PgUp / PgDn" description="医嘱上下"/>
  223. <xc-code code="Alt + ← / →" description="编辑(←) / 复制 (→)"/>
  224. <xc-code code="Alt + D " description="删除选中的医嘱"/>
  225. <el-button @click="dianJiXiuGaiZhiXingKeShi">修改执行科室</el-button>
  226. <el-table
  227. :data="yiZhuList"
  228. ref="elTableRef"
  229. :height="windowSize.h / 2.4"
  230. @selection-change="dianJiXuanZhongShuJu"
  231. :row-class-name="doctorSOrderForm"
  232. @row-click="whenClickingOnTheForm"
  233. >
  234. <el-table-column type="selection"></el-table-column>
  235. <el-table-column label="排序" type="index"></el-table-column>
  236. <el-table-column label="uuid" prop="id"></el-table-column>
  237. <el-table-column label="医嘱编码" prop="orderCode"></el-table-column>
  238. <el-table-column label="医嘱名称" prop="orderName" show-overflow-tooltip></el-table-column>
  239. <el-table-column label="医嘱时间" prop="orderTime" width="70"></el-table-column>
  240. <el-table-column label="开始时间" prop="startTime" width="70"></el-table-column>
  241. <el-table-column label="结束时间" prop="endTime" width="70"></el-table-column>
  242. <el-table-column label="规格" prop="drugSpecification"></el-table-column>
  243. <el-table-column label="频率" prop="frequCodeName"></el-table-column>
  244. <el-table-column label="一次剂量" prop="dose">
  245. <template #default="scope"> {{ scope.row.dose }} {{ scope.row.doseUnitName }}</template>
  246. </el-table-column>
  247. <el-table-column label="领量" prop="drugQuan">
  248. <template #default="scope"> {{ scope.row.drugQuan }} {{ scope.row.miniUnitName }}</template>
  249. </el-table-column>
  250. <el-table-column label="给药方式" prop="supplyCodeName"></el-table-column>
  251. <el-table-column label="执行科室" prop="execUnitName"></el-table-column>
  252. <el-table-column label="父医嘱" prop="parentNo"></el-table-column>
  253. <el-table-column label="类型" prop="drugFlag"></el-table-column>
  254. <el-table-column label="费用标志" prop="selfBuy">
  255. <template #default="scope">
  256. {{ getSelfBuy(scope.row.selfBuy) }}
  257. </template>
  258. </el-table-column>
  259. <el-table-column label="医保自费">
  260. <template #default="scope">
  261. <el-tag v-if="scope.row.ybSelfFlag === '1'">是</el-tag>
  262. </template>
  263. </el-table-column>
  264. <el-table-column label="是否紧急">
  265. <template #default="scope">
  266. <el-tag v-if="scope.row.emergencyFlag === '1'">是</el-tag>
  267. </template>
  268. </el-table-column>
  269. <el-table-column fixed="right" label="操作" width="120">
  270. <template #default="scope">
  271. <el-button circle icon="el-icon-edit" type="warning" @click="xiuGaiYiZhu(scope.row)"></el-button>
  272. <el-button circle icon="el-icon-delete" type="danger" @click="shanChuBiaoGeYiZhu(scope.$index)"></el-button>
  273. <el-button circle class="iconfont icon-fuzhi" type="info" @click="dianJiFuZhiYiZhu(scope.row)"></el-button>
  274. </template>
  275. </el-table-column>
  276. </el-table>
  277. <!-- 这里是搜索医嘱的 -->
  278. <sou-suo-yi-zhu v-if="yiZhuMingDialog" @close="closeTheDoctorSOrderSearchBox()"
  279. @xuanZhongFeiYong="xuanZhongFeiYong"></sou-suo-yi-zhu>
  280. <AllergenEntry v-if="allergenDialog" :pat-no="huanZheXinXi.inpatientNo"
  281. @close="allergenDialog = false"></AllergenEntry>
  282. </template>
  283. <script name="TianJiaYiZhu" setup>
  284. import {
  285. huoQuFeiYongXinXi,
  286. huoQuGeiYaoFangShi,
  287. huoQuZhiXinKeShi,
  288. huoQuZhuYuanPinLv,
  289. jiaoYan,
  290. shangChuanYiZhu
  291. } from '@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru'
  292. import {
  293. cuoWuXinXi,
  294. fuZhiYiZhu,
  295. getSelfBuy,
  296. huanZheXinXi,
  297. youWuXuanZheHuanZhe,
  298. zkList
  299. } from '@/views/hospitalization/zhu-yuan-yi-sheng/public-js/zhu-yuan-yi-sheng'
  300. import store from '../../../../store'
  301. import {listIsBlank, listNotBlank, stringIsBlank, stringNotBlank} from '@/utils/blank-utils'
  302. import {kangJunYaoWuQieKou, kangJunYaoWuYongYaoFangShi, kangJunYaoWuYongYaoShiJian} from '@/data'
  303. import {ElMessage, ElMessageBox} from 'element-plus'
  304. import {clone} from '@/utils/clone'
  305. import HuoQuMuBan from '../../../../components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/HuoQuMuBan.vue'
  306. import {uuid} from '@/utils/getUuid'
  307. import BaoCunMuBan from '../../../../components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/BaoCunMuBan.vue'
  308. import {getServerDateApi, whetherThePatientHasAllergens, yaoPinXiangMuPiPeiYiBao} from '@/api/public-api'
  309. import router from '@/router'
  310. import SouSuoYiZhu from '@/components/zhu-yuan-yi-sheng/yi-zhu-lu-ru/SouSuoYiZhu.vue'
  311. import CuoWuXinXi from '@/components/zhu-yuan-yi-sheng/CuoWuXinXi.vue'
  312. import YaoPingXiangQing from '@/components/zhu-yuan-yi-sheng/he-li-yong-yao/YaoPingXiangQing.vue'
  313. import AllergenEntry from '@/components/zhu-yuan-yi-sheng/AllergenEntry.vue'
  314. import Sleep from '@/utils/sleep'
  315. import {logoutShortcut, xcHotKey} from '@/utils/xckeydown'
  316. import {BizException, ExceptionEnum} from '@/utils/BizException'
  317. const windowSize = computed(() => {
  318. return store.state.app.windowSize
  319. })
  320. // 设置倒计时
  321. const seconds = ref(600)
  322. // 倒计时提示
  323. const count = ref('')
  324. // 转科医嘱 编码
  325. const zkCode = '06286'
  326. // 当前的下标
  327. let dataIndex = $ref(-1)
  328. // 表格的 ref
  329. let elTableRef = $ref(null)
  330. const yiZhuData = ref({
  331. id: '',
  332. actOrderNo: null,
  333. orderName: '',
  334. orderCode: '',
  335. // 频率
  336. frequCode: '',
  337. frequCodeName: '',
  338. drugSpecification: '',
  339. dose: 0,
  340. // 领量
  341. doseUnit: '',
  342. doseUnitName: '',
  343. supplyCode: '',
  344. supplyCodeName: '',
  345. startTime: '',
  346. endTime: '',
  347. orderTime: '',
  348. doctorName: '',
  349. drugFlag: '',
  350. execUnit: '',
  351. execUnitName: '',
  352. parentNo: '',
  353. parentNoName: '',
  354. physicianName: '',
  355. discription: '',
  356. instruction: null,
  357. kfFlag: null,
  358. selfBuy: null,
  359. ybSelfFlag: '0',
  360. emergencyFlag: '0',
  361. drugQuan: 0,
  362. miniUnitName: '',
  363. serial: '',
  364. miniUnit: '',
  365. psFlag: false,
  366. kjywFlag: 0,
  367. yyfs: null,
  368. ssqk: null,
  369. yysj: null,
  370. zkObj: '',
  371. zkWardCode: '',
  372. zkDeptCode: '',
  373. })
  374. /*提示信息*/
  375. const tiShiBiaoTi = ref([])
  376. const span = ref(6)
  377. const spanSize = (val) => {
  378. if (val > 1200) {
  379. span.value = 6
  380. } else if (930 < val || val > 1200) {
  381. span.value = 8
  382. } else if (val < 930) {
  383. span.value = 12
  384. }
  385. }
  386. spanSize(windowSize.value.w)
  387. watch(
  388. () => windowSize.value,
  389. () => {
  390. spanSize(windowSize.value.w)
  391. }
  392. )
  393. // 搜索医嘱
  394. let yiZhuMingDialog = $ref(false)
  395. const xuanZhongFeiYong = async (row) => {
  396. qingKong()
  397. await Sleep(600)
  398. closeTheDoctorSOrderSearchBox()
  399. yiZhuData.value = row
  400. if (row.serial !== '00') {
  401. huoQuFeiYongXinXi(row.orderCode, row.serial)
  402. .then((res) => {
  403. yiZhuData.value.drugFlag = row.orderType
  404. // 判断是否 是皮试的药 如果是就只能有这些 给药方式
  405. if (res.data.psFlag === 1) {
  406. geiYaoFangShiData.value = res.piShi
  407. tiShiBiaoTi.value.push({title: '该药品为皮试药品给药方式只能是皮试类型', type: 'warning'})
  408. yiZhuData.value.psFlag = true
  409. } else {
  410. yiZhuData.value.psFlag = false
  411. }
  412. yiZhuData.value.kjywFlag = res.data.kjywFlag
  413. if (yiZhuData.value.kjywFlag === 1) {
  414. tiShiBiaoTi.value.push({title: '该药品为抗菌药物,请填写抗菌药物医嘱附注信息录入。', type: 'error'})
  415. }
  416. if (res.data.selfFlagYb === 1) {
  417. tiShiBiaoTi.value.push({title: '该药品医保自费药品,如符合条件请填写记账,不是请填写自费。'})
  418. }
  419. yiZhuData.value.miniUnitName = res.data.miniUnitName
  420. yaoPinJiLiangData.value = res.yaoPingJiLiang
  421. // 加载 剂量单位
  422. if (stringNotBlank(yiZhuData.value.doseUnit)) {
  423. yaoPinJiLiangData.value.forEach((item) => {
  424. if (item.code === yiZhuData.value.doseUnit) {
  425. jiLiangValue.value = item.value
  426. }
  427. })
  428. } else if (listNotBlank(yaoPinJiLiangData.value)) {
  429. // 没有剂量单位的时候默认加载第一个计量单位 并且计算
  430. yiZhuData.value.doseUnit = yaoPinJiLiangData.value[0].code
  431. yiZhuData.value.dose = yaoPinJiLiangData.value[0].value
  432. jiLiangValue.value = yaoPinJiLiangData.value[0].value
  433. jiSuanLingLiang(yaoPinJiLiangData.value[0].value)
  434. }
  435. // 加载默认频率 如果已经填写了 就用有的
  436. if (stringIsBlank(row.frequCode)) {
  437. if (stringNotBlank(res.data.frequCode)) {
  438. yiZhuData.value.frequCode = res.data.frequCode
  439. } else {
  440. yiZhuData.value.frequCode = 'ONCE'
  441. }
  442. }
  443. // 加载给药方式
  444. if (stringIsBlank(yiZhuData.value.supplyCode)) {
  445. if (stringNotBlank(res.data.supplyCode)) {
  446. yiZhuData.value.supplyCode = res.data.supplyCode
  447. }
  448. }
  449. })
  450. .catch(async () => {
  451. await Sleep(500)
  452. qingKong()
  453. })
  454. } else {
  455. yiZhuData.value.kjywFlag = 0
  456. huoQuFeiYongXinXi(row.orderCode, '00')
  457. .then((res) => {
  458. yiZhuData.value.drugFlag = row.orderType
  459. yiZhuData.value.frequCode = 'ONCE'
  460. if (stringNotBlank(res.paiChiYiZhu)) {
  461. tiShiBiaoTi.value.push({title: res.paiChiYiZhu, type: 'error'})
  462. }
  463. if (!res.dose) {
  464. yiZhuData.value.dose = 1
  465. }
  466. })
  467. .catch(async () => {
  468. await Sleep(500)
  469. qingKong()
  470. })
  471. }
  472. // 判断这个是不是 新添加的数据 如果是空的就是 新数据
  473. getServerDateApi().then((res) => {
  474. if (!yiZhuData.value.orderTime) {
  475. yiZhuData.value.orderTime = res
  476. }
  477. if (!yiZhuData.value.startTime) {
  478. yiZhuData.value.startTime = res
  479. }
  480. })
  481. // 用来加载默认的执行科室
  482. if (stringIsBlank(row.execUnit)) {
  483. if (stringNotBlank(huanZheXinXi.value.smallDept)) {
  484. yiZhuData.value.execUnit = huanZheXinXi.value.smallDept
  485. }
  486. }
  487. if (stringIsBlank(row.id)) {
  488. yiZhuData.value.id = uuid(8, 10)
  489. }
  490. try {
  491. pingLv.focus()
  492. } catch (e) {
  493. console.log(e)
  494. }
  495. }
  496. const closeTheDoctorSOrderSearchBox = () => {
  497. yiZhuMingDialog = false
  498. xcHotKey(shortcutKeyRegistration)
  499. }
  500. /* 频率 */
  501. let pingLv = $ref(null)
  502. const yaoPinPingLvData = ref([])
  503. const pinLvRemoteMethod = (val) => {
  504. huoQuZhuYuanPinLv(val).then((res) => {
  505. yaoPinPingLvData.value = res
  506. })
  507. }
  508. /* 选择剂量 */
  509. const yaoPinJiLiangData = ref([])
  510. const jiLiangValue = ref(0)
  511. const xuanZheJiLiang = (val) => {
  512. jiLiangValue.value = val.value
  513. yiZhuData.value.dose = val.value
  514. yiZhuData.value.drugQuan = 1
  515. }
  516. /*计算领量*/
  517. const jiSuanLingLiang = (val) => {
  518. if (jiLiangValue.value > 0) {
  519. yiZhuData.value.drugQuan = Math.ceil(val / jiLiangValue.value)
  520. }
  521. }
  522. /* 给药方式 */
  523. const geiYaoFangShiData = ref([])
  524. const geiYaoFangShiRemoteMethod = (val) => {
  525. /*如果是皮试的那么就不可以用别的给药方式*/
  526. if (yiZhuData.value.psFlag) return
  527. huoQuGeiYaoFangShi(val).then((res) => {
  528. geiYaoFangShiData.value = res
  529. })
  530. }
  531. /* 父医嘱 */
  532. const fuYiZhuData = ref([])
  533. const fuYiZhuClick = () => {
  534. fuYiZhuData.value = []
  535. yiZhuList.value.forEach((item, index) => {
  536. if (stringNotBlank(item.drugFlag) && item.drugFlag === 'i' && item.id !== yiZhuData.value.id && stringIsBlank(item.parentNo)) {
  537. fuYiZhuData.value.push({code: item.id, name: item.orderName})
  538. }
  539. })
  540. }
  541. /* 获取执行科室 */
  542. const zhiXingKeShiData = ref([])
  543. const metZhiXingKeShi = (val) => {
  544. huoQuZhiXinKeShi(val).then((res) => {
  545. zhiXingKeShiData.value = res
  546. })
  547. }
  548. /* 这里是添加信息 */
  549. const yiZhuList = ref([])
  550. const tianJiaYiZhuWeiYiBiaoShi = ref([])
  551. const tianJiaYiZhu = () => {
  552. if (stringIsBlank(yiZhuData.value.orderCode)) {
  553. return ElMessage.error('请先选择数据')
  554. }
  555. if (stringNotBlank(yiZhuData.value.parentNo)) {
  556. yiZhuData.value.supplyCode = '044'
  557. yiZhuData.value.supplyCodeName = '副药'
  558. }
  559. if (yiZhuData.value.orderCode === zkCode) {
  560. if (yiZhuData.value.zkObj) {
  561. let zk = JSON.parse(yiZhuData.value.zkObj)
  562. yiZhuData.value.zkWardCode = zk.wardCode
  563. yiZhuData.value.zkDeptCode = zk.smallCode
  564. yiZhuData.value.orderName = `转科医嘱转至${zk.wardName}(小科室:${zk.smallName})`
  565. } else {
  566. return ElMessage.error('请选择转科科室.')
  567. }
  568. }
  569. const list = []
  570. list.push(yiZhuData.value)
  571. let data = {
  572. inpatientNo: huanZheXinXi.value.inpatientNo,
  573. admissTimes: huanZheXinXi.value.admissTimes,
  574. list: list,
  575. }
  576. shangChuanYiZhu(data)
  577. .then((res) => {
  578. let index = tianJiaYiZhuWeiYiBiaoShi.value.indexOf(yiZhuData.value.id)
  579. if (index > -1) {
  580. yiZhuList.value.splice(index, 1)
  581. tianJiaYiZhuWeiYiBiaoShi.value.splice(index, 1)
  582. ElMessage.error('重复添加,老记录已删除。')
  583. }
  584. tianJiaYiZhuWeiYiBiaoShi.value.push(yiZhuData.value.id)
  585. yiZhuList.value.push(clone(yiZhuData.value))
  586. qingKong()
  587. })
  588. .catch((e) => {
  589. cuoWuXinXi.value = e
  590. })
  591. }
  592. /**
  593. * 是否重置数据下标,这个是用来判断需不需要 回到默认值
  594. */
  595. const whetherToResetTheDataSubscript = () => {
  596. if (dataIndex >= yiZhuList.value.length) {
  597. dataIndex--
  598. }
  599. }
  600. /* 这个是点击单个修改的 */
  601. const xiuGaiYiZhu = (val) => {
  602. xuanZhongFeiYong(val)
  603. ElMessage.success('你点击了修改')
  604. yiZhuList.value.splice(val, 1)
  605. tianJiaYiZhuWeiYiBiaoShi.value.splice(val, 1)
  606. whetherToResetTheDataSubscript()
  607. }
  608. /* 删除表格医嘱 */
  609. const shanChuBiaoGeYiZhu = (val) => {
  610. yiZhuList.value.splice(val, 1)
  611. tianJiaYiZhuWeiYiBiaoShi.value.splice(val, 1)
  612. ElMessage.success('删除成功')
  613. whetherToResetTheDataSubscript()
  614. }
  615. /* 复制医嘱 */
  616. const dianJiFuZhiYiZhu = (val) => {
  617. yiZhuData.value = clone(val)
  618. yiZhuData.value.id = uuid(8, 10)
  619. ElMessage.success('复制成功')
  620. }
  621. /* 保存信息 */
  622. const baoCunYiZhuClick = () => {
  623. if (listIsBlank(yiZhuList.value)) {
  624. return ElMessage.error('请先选择数据')
  625. }
  626. if (youWuXuanZheHuanZhe()) return
  627. let yiBaoBianMaTiShi = []
  628. yiZhuList.value.forEach((item) => {
  629. yiBaoBianMaTiShi.push(item.orderCode + '-' + item.serial)
  630. })
  631. yaoPinXiangMuPiPeiYiBao(yiBaoBianMaTiShi).then((res) => {
  632. if (stringNotBlank(res)) {
  633. cuoWuXinXi.value = res
  634. ElMessageBox.confirm(res, '提示', {
  635. type: 'warning',
  636. dangerouslyUseHTMLString: true,
  637. confirmButtonText: '继续录入',
  638. })
  639. .then(() => {
  640. baoCunYiZhu()
  641. })
  642. .catch(() => {
  643. })
  644. } else {
  645. baoCunYiZhu()
  646. }
  647. })
  648. }
  649. function baoCunYiZhu() {
  650. let list = yiZhuList.value.filter((item) => {
  651. return item.serial !== '00'
  652. })
  653. let data = {
  654. inpatientNo: huanZheXinXi.value.inpatientNo,
  655. admissTimes: huanZheXinXi.value.admissTimes,
  656. chaRuYiZhu: true,
  657. cfType: '1',
  658. list: yiZhuList.value,
  659. }
  660. if (listNotBlank(list)) {
  661. // 合理用药校验
  662. jiaoYan(data).then((res) => {
  663. console.log(res)
  664. })
  665. }
  666. return
  667. ElMessageBox.confirm('您确定要保存这些数据吗?请仔细检查数据。', '提示', {
  668. type: 'warning',
  669. closeOnClickModal: false,
  670. })
  671. .then(() => {
  672. shangChuanYiZhu(data)
  673. .then((res) => {
  674. fuZhiYiZhu.value = []
  675. router.go(-1)
  676. })
  677. .catch((e) => {
  678. cuoWuXinXi.value = e
  679. })
  680. })
  681. .catch(() => {
  682. })
  683. }
  684. /* 这里是抗菌药物,选择了除了 1和 2 的其他都可以不用填写 */
  685. const kangJunYaoYongYaoFangShiGaiBian = (val) => {
  686. if (val !== 1 || val !== 2) {
  687. yiZhuData.value.ssqk = null
  688. yiZhuData.value.yysj = null
  689. }
  690. }
  691. // 模板数据
  692. let muBanDuiHuaKuang = $ref(false)
  693. // 这里是返回的模板数据
  694. const muBanShuJu = (val) => {
  695. let tongZhiCiShu = 0
  696. val.forEach((item) => {
  697. let index = tianJiaYiZhuWeiYiBiaoShi.value.indexOf(item.id)
  698. if (index > -1) {
  699. yiZhuList.value.splice(index, 1)
  700. tianJiaYiZhuWeiYiBiaoShi.value.splice(index, 1)
  701. tongZhi(tongZhiCiShu)
  702. tongZhiCiShu++
  703. }
  704. tianJiaYiZhuWeiYiBiaoShi.value.push(item.id)
  705. yiZhuList.value.push(item)
  706. })
  707. function tongZhi(val) {
  708. if (val === 0) {
  709. setTimeout(() => {
  710. ElMessage.error('重复添加,老记录已删除。')
  711. }, 200)
  712. }
  713. }
  714. ElMessage.success('添加成功。')
  715. }
  716. // 保存模板
  717. const baoCunMuBanRef = ref(null)
  718. const baoCunMuBanClick = () => {
  719. if (listIsBlank(yiZhuList.value)) {
  720. return ElMessage.error('请先选择数据')
  721. }
  722. let data = {
  723. inpatientNo: huanZheXinXi.value.inpatientNo,
  724. admissTimes: huanZheXinXi.value.admissTimes,
  725. list: yiZhuList.value,
  726. }
  727. shangChuanYiZhu(data)
  728. .then((res) => {
  729. baoCunMuBanRef.value.daKaiBaoCunMuBan(yiZhuList.value)
  730. cuoWuXinXi.value = ''
  731. })
  732. .catch((e) => {
  733. cuoWuXinXi.value = e
  734. })
  735. }
  736. // 医嘱限制时间不能在之前
  737. const disabledDate = (time) => {
  738. return time.getTime() < Date.now() - 8.64e7
  739. }
  740. const xuanZhongShuJu = ref([])
  741. const dianJiXuanZhongShuJu = (selection) => {
  742. xuanZhongShuJu.value = selection
  743. }
  744. const dianJiXiuGaiZhiXingKeShi = () => {
  745. if (listIsBlank(xuanZhongShuJu.value)) {
  746. return ElMessage.error('请先选择数据。')
  747. } else {
  748. zhiXingKeShiData.value.forEach((item) => {
  749. if (item.code === yiZhuData.value.execUnit) {
  750. yiZhuData.value.execUnitName = item.name
  751. }
  752. })
  753. xuanZhongShuJu.value.forEach((item) => {
  754. item.execUnit = yiZhuData.value.execUnit
  755. item.execUnitName = yiZhuData.value.execUnitName
  756. })
  757. }
  758. }
  759. const qingKong = () => {
  760. cuoWuXinXi.value = ''
  761. yaoPinJiLiangData.value = []
  762. jiLiangValue.value = 0
  763. tiShiBiaoTi.value = []
  764. yiZhuData.value = {
  765. index: '',
  766. actOrderNo: null,
  767. orderName: '',
  768. orderCode: '',
  769. // 频率
  770. frequCode: '',
  771. frequCodeName: '',
  772. drugSpecification: '',
  773. dose: 0,
  774. // 领量
  775. doseUnit: '',
  776. doseUnitName: '',
  777. supplyCode: '',
  778. supplyCodeName: '',
  779. startTime: '',
  780. endTime: '',
  781. orderTime: '',
  782. doctorName: '',
  783. execUnit: '',
  784. execUnitName: '',
  785. parentNo: '',
  786. parentNoName: '',
  787. physicianName: '',
  788. discription: '',
  789. instruction: null,
  790. kfFlag: null,
  791. selfBuy: null,
  792. ybSelfFlag: '0',
  793. emergencyFlag: '0',
  794. drugQuan: 0,
  795. miniUnitName: '',
  796. serial: '',
  797. miniUnit: '',
  798. psFlag: false,
  799. kjywFlag: 0,
  800. yyfs: null,
  801. ssqk: null,
  802. yysj: null,
  803. zkWardCode: '',
  804. zkDeptCode: '',
  805. }
  806. }
  807. let daoJiShi = null
  808. onUnmounted(() => {
  809. ElMessageBox.close()
  810. clearInterval(daoJiShi)
  811. logoutShortcut()
  812. })
  813. // 倒计时功能
  814. const kaiQiDaoJiShi = () => {
  815. seconds.value = 600
  816. clearInterval(daoJiShi)
  817. daoJiShi = setInterval(() => {
  818. seconds.value--
  819. countDown()
  820. }, 1000)
  821. }
  822. const countDown = () => {
  823. let m = parseInt(((seconds.value / 60) % 60).toString())
  824. m = m < 10 ? '0' + m : m
  825. let s = parseInt((seconds.value % 60).toString())
  826. s = s < 10 ? '0' + s : s
  827. count.value = '剩余操作时间 ' + m + '分' + s + '秒'
  828. if (seconds.value === 300) {
  829. ElMessageBox.alert('您的操作时间过半', '提示', {
  830. type: 'warning',
  831. }).then((res) => {
  832. })
  833. } else if (seconds.value === 60 || seconds.value === 30 || seconds.value === 20) {
  834. ElMessage({
  835. message: '剩余操作时间' + seconds.value + '秒',
  836. showClose: true,
  837. type: 'error',
  838. title: '成功',
  839. duration: 4500,
  840. })
  841. } else if (seconds.value === 0) {
  842. clearInterval(daoJiShi)
  843. router.go(-1)
  844. }
  845. }
  846. let HeLiYongYao = $ref({
  847. dialog: false,
  848. code: '',
  849. })
  850. const tiaoZhuanZhiHeLiYongYao = () => {
  851. window.open('http://172.16.32.121:9097/index.html')
  852. }
  853. //// 下面都是过敏源信息
  854. let allergenDialog = $ref(false)
  855. ///// 过敏源结束
  856. /// 这里是 ctrl 快捷键
  857. /**
  858. * 保存或添加医嘱
  859. */
  860. const saveOrAddADoctorSOrder = () => {
  861. if (yiZhuData.value.orderCode) {
  862. tianJiaYiZhu()
  863. } else {
  864. baoCunYiZhuClick()
  865. }
  866. }
  867. /**
  868. * 打开医嘱搜索框
  869. */
  870. const openSearchBox = () => {
  871. yiZhuMingDialog = true
  872. }
  873. /// 这里是 ctrl 快捷键 结束
  874. const regainFocus = () => {
  875. pingLv.focus()
  876. }
  877. // 这里是表格事件
  878. /**
  879. * 表格样式
  880. * @param row 行
  881. * @param rowIndex 下标
  882. * @returns {string} 样式
  883. */
  884. const doctorSOrderForm = ({row, rowIndex}) => {
  885. row.tableIndex = rowIndex
  886. if (dataIndex === rowIndex) {
  887. return 'input_and_table_to_be_selected'
  888. }
  889. }
  890. /**
  891. * 点击表格时触发的事件
  892. * @param row 当前表格数据
  893. * @param column 当前行
  894. * @param event 事件
  895. */
  896. const whenClickingOnTheForm = (row, column, event) => {
  897. dataIndex = row.tableIndex
  898. }
  899. // 这里是表格事件 结束
  900. // 这里是 alt 快捷键
  901. /**
  902. * 检查是否存在医嘱数据
  903. * @param checkJudgment 判断是否检查选中数据
  904. */
  905. const dataJudgmentIsEmpty = (checkJudgment) => {
  906. let pageDataLength = yiZhuList.value.length
  907. if (pageDataLength <= 0) {
  908. BizException(ExceptionEnum.MESSAGE_ERROR, '请选选择数据')
  909. }
  910. if (checkJudgment) {
  911. if (dataIndex === -1) {
  912. BizException(ExceptionEnum.MESSAGE_ERROR, '请选选择数据')
  913. }
  914. }
  915. }
  916. const scrollBarSynchronization = () => {
  917. try {
  918. const targetTop = elTableRef.$el.querySelectorAll('.el-table__body tr')[dataIndex].getBoundingClientRect().top //该行的位置
  919. const containerTop = elTableRef.$el.querySelector('.el-table__body').getBoundingClientRect().top //body的位置
  920. elTableRef.$refs.bodyWrapper.scrollTop = targetTop - containerTop
  921. } catch (e) {
  922. // console.error(e)
  923. }
  924. }
  925. const upData = () => {
  926. dataJudgmentIsEmpty(false)
  927. let pageDataLength = yiZhuList.value.length
  928. dataIndex <= 0 ? (dataIndex = pageDataLength - 1) : dataIndex--
  929. scrollBarSynchronization()
  930. }
  931. const downData = () => {
  932. dataJudgmentIsEmpty(false)
  933. let pageDataLength = yiZhuList.value.length
  934. dataIndex === pageDataLength - 1 ? (dataIndex = 0) : dataIndex++
  935. scrollBarSynchronization()
  936. }
  937. const copyData = () => {
  938. dataJudgmentIsEmpty(true)
  939. dianJiFuZhiYiZhu(yiZhuList.value[dataIndex])
  940. }
  941. const editData = () => {
  942. dataJudgmentIsEmpty(true)
  943. xiuGaiYiZhu(yiZhuList.value[dataIndex])
  944. }
  945. const deleteSelectedOrders = () => {
  946. dataJudgmentIsEmpty(true)
  947. shanChuBiaoGeYiZhu(yiZhuList.value[dataIndex])
  948. }
  949. // alt 快捷键结束
  950. // 注册快捷键的 list
  951. let shortcutKeyRegistration = {
  952. ctrl: {s: saveOrAddADoctorSOrder, f: openSearchBox, 1: regainFocus},
  953. alt: {
  954. PageUp: upData,
  955. PageDown: downData,
  956. ArrowRight: copyData,
  957. ArrowLeft: editData,
  958. d: deleteSelectedOrders,
  959. },
  960. }
  961. onMounted(() => {
  962. xcHotKey(shortcutKeyRegistration)
  963. yiZhuList.value = clone(fuZhiYiZhu.value)
  964. for (let i = 0; i < yiZhuList.value.length; i++) {
  965. yiZhuList.value[i].id = yiZhuList.value[i].actOrderNo
  966. }
  967. if (stringIsBlank(huanZheXinXi.value.inpatientNo)) {
  968. ElMessage.warning('您现在进入的是医嘱模板编辑')
  969. } else {
  970. ElMessage.warning('您现在进入的是医嘱编辑模块,' + '您的编辑时间有 10 分钟,你准备好了吗?Are ya ready kids?')
  971. kaiQiDaoJiShi()
  972. whetherThePatientHasAllergens(huanZheXinXi.value.inpatientNo).then((res) => {
  973. allergenDialog = res
  974. })
  975. }
  976. if (stringNotBlank(huanZheXinXi.value.inpatientNo)) {
  977. zhiXingKeShiData.value = [
  978. {
  979. code: huanZheXinXi.value.smallDept,
  980. name: huanZheXinXi.value.smallDeptName,
  981. },
  982. ]
  983. }
  984. fuZhiYiZhu.value = []
  985. })
  986. </script>
  987. <style scoped>
  988. .el-popover {
  989. height: 240px;
  990. overflow: auto;
  991. }
  992. :deep(.el-textarea.is-disabled .el-textarea__inner) {
  993. color: #0a84fd;
  994. }
  995. </style>