TianJiaYiZhu.vue 34 KB

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