TransferInOfExpenses.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  1. <template>
  2. <el-container style="margin-right: 10px">
  3. <el-header height="36px" style="margin-top: 8px">
  4. <el-input
  5. size="small"
  6. placeholder="在此输入住院号"
  7. clearable
  8. prefix-icon="el-icon-search"
  9. style="width: 300px"
  10. @keyup.enter="queryClick"
  11. @blur="inpatientNo = $event.target.value.trim()"
  12. v-model="inpatientNo"
  13. >
  14. <template #prepend>住院号</template>
  15. </el-input>
  16. <el-button style="margin-left: 10px" size="mini" type="primary" @click="queryClick">查询患者信息</el-button>
  17. <el-divider direction="vertical"></el-divider>
  18. <el-input
  19. size="small"
  20. placeholder="在此输入机制号"
  21. clearable
  22. @keyup.enter="querySerialNo"
  23. prefix-icon="el-icon-search"
  24. style="width: 300px"
  25. v-model="serialNo"
  26. onkeyup="this.value=this.value.replace(/[^\d]/g,'') "
  27. @blur="serialNo = $event.target.value.trim()"
  28. >
  29. <template #prepend>机制号</template>
  30. </el-input>
  31. <el-select size="small" v-model="liShiFlag">
  32. <el-option v-for="item in chaKanLiShi" :key="item.code" :label="item.name" :value="item.code"></el-option>
  33. </el-select>
  34. <el-button style="margin-left: 10px" size="mini" type="primary" @click="querySerialNo">查询机制号信息</el-button>
  35. <el-button style="margin-left: 10px" size="mini" type="warning" @click="huanZheFeiYongDrawer = true">查看患者费用</el-button>
  36. <el-button style="margin-left: 10px" size="mini" type="success" @click="baoCunClick">保存</el-button>
  37. </el-header>
  38. <el-main>
  39. <div>
  40. <el-descriptions border title="基本信息">
  41. <el-descriptions-item>
  42. <template #label>
  43. <i class="el-icon-user"></i>
  44. 患者姓名
  45. </template>
  46. {{ huanZheXinXi.name }}
  47. </el-descriptions-item>
  48. <el-descriptions-item>
  49. <template #label>
  50. <i class="el-icon-user"></i>
  51. 住院次数
  52. </template>
  53. {{ huanZheXinXi.admissTimes }}
  54. </el-descriptions-item>
  55. <el-descriptions-item>
  56. <template #label>
  57. <i class="el-icon-user-solid"></i>
  58. 性别
  59. </template>
  60. {{ cptSex(huanZheXinXi.sex) }}
  61. </el-descriptions-item>
  62. <el-descriptions-item>
  63. <template #label>
  64. <i class="el-icon-house"></i>
  65. 床号
  66. </template>
  67. {{ huanZheXinXi.bedNo }}
  68. </el-descriptions-item>
  69. <el-descriptions-item>
  70. <template #label>
  71. <i class="el-icon-s-home"></i>
  72. 病房
  73. </template>
  74. {{ huanZheXinXi.wardName }}
  75. </el-descriptions-item>
  76. <el-descriptions-item>
  77. <template #label>
  78. <i class="el-icon-date"></i>
  79. 入院日期
  80. </template>
  81. {{ huanZheXinXi.admissDate }}
  82. </el-descriptions-item>
  83. <el-descriptions-item>
  84. <template #label>
  85. <i class="el-icon-tickets"></i>
  86. 身份
  87. </template>
  88. {{ huanZheXinXi.responceTypeName }}
  89. </el-descriptions-item>
  90. <el-descriptions-item>
  91. <template #label>
  92. <i class="el-icon-coin"></i>
  93. 总费用
  94. </template>
  95. {{ huanZheXinXi.totalCharge }}
  96. </el-descriptions-item>
  97. <el-descriptions-item>
  98. <template #label>
  99. <i class="el-icon-coin"></i>
  100. 余额
  101. </template>
  102. <span style="color: red">{{ huanZheXinXi.balance }}</span>
  103. </el-descriptions-item>
  104. </el-descriptions>
  105. </div>
  106. <el-divider></el-divider>
  107. <div style="width: 100%">
  108. <div style="float: left; width: 45%">
  109. <el-table :height="windowHeight" highlight-current-row :data="mzXinXiList" @selection-change="mzSelectChecked" ref="multipleTable">
  110. <el-table-column label="门诊发票信息">
  111. <el-table-column label="项目名称" prop="itemName"></el-table-column>
  112. <el-table-column label="收费编码" prop="chargeCode"></el-table-column>
  113. <el-table-column label="数量" prop="chargeAmount"></el-table-column>
  114. <el-table-column label="单价" prop="price"> </el-table-column>
  115. <el-table-column label="金额" prop="chargeFee"></el-table-column>
  116. <el-table-column label="选择" width="60" type="selection"></el-table-column>
  117. </el-table-column>
  118. </el-table>
  119. <el-tag>合计:{{ mzSum }}</el-tag>
  120. </div>
  121. <div style="width: 9%; float: left; margin-left: 4px; text-align: center" :style="{ lineHeight: windowHeight + 'px' }">
  122. <el-button size="mini" icon="el-icon-right" type="primary"></el-button>
  123. </div>
  124. <div style="float: right; width: 45%">
  125. <el-table :height="windowHeight" stripe :data="zyXinXiList">
  126. <el-table-column label="住院收费项目">
  127. <el-table-column label="项目名称" prop="itemName"></el-table-column>
  128. <el-table-column label="收费编码" prop="chargeCode"></el-table-column>
  129. <el-table-column label="数量" prop="chargeAmount"></el-table-column>
  130. <el-table-column label="单价" prop="price"> </el-table-column>
  131. <el-table-column label="金额" prop="chargeFee"></el-table-column>
  132. </el-table-column>
  133. </el-table>
  134. <el-tag>合计:{{ zySum }}</el-tag>
  135. </div>
  136. </div>
  137. <el-drawer title="查看患者通过急门诊转入的费用" v-model="huanZheFeiYongDrawer" size="50%">
  138. <div style="margin-left: 20px">
  139. <el-input
  140. size="mini"
  141. placeholder="住院号"
  142. clearable
  143. style="width: 200px"
  144. @keyup.enter="getZyJiMenZhenZhuangRuFeiYongClick"
  145. v-model="inpatientNo"
  146. @blur="inpatientNo = $event.target.value.trim()"
  147. >
  148. <template #prepend>住院号</template>
  149. </el-input>
  150. <el-divider direction="vertical"></el-divider>
  151. 项目名称:
  152. <el-select v-model="chargeCodeMX" placeholder="根据拼音首字母查找" filterable clearable remote size="mini" :remote-method="remoteMethodEntryName">
  153. <el-option v-for="item in entryNameList" :key="item.code" :label="item.name" :value="item.code">
  154. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  155. <el-divider direction="vertical"></el-divider>
  156. <span>{{ item.name }}</span>
  157. </el-option>
  158. </el-select>
  159. <el-divider direction="vertical"></el-divider>
  160. <el-button @click="getZyJiMenZhenZhuangRuFeiYongClick" size="mini" type="primary">查询</el-button>
  161. <el-table :data="zyDetailChargeList" :height="windowHeight + 140">
  162. <el-table-column label="住院号" prop="inpatientNo"></el-table-column>
  163. <el-table-column label="流水号" prop="detailSn"></el-table-column>
  164. <el-table-column label="收费日期" width="80" prop="chargeDate"></el-table-column>
  165. <el-table-column label="收费代码" prop="chargeCode"></el-table-column>
  166. <el-table-column label="项目名称" prop="chargeCodeName" show-overflow-tooltip></el-table-column>
  167. <el-table-column label="费用录入日期" prop="genTime" width="80"></el-table-column>
  168. <el-table-column label="金额" prop="chargeFee"></el-table-column>
  169. <el-table-column label="数量" prop="chargeAmount"></el-table-column>
  170. <el-table-column label="操作">
  171. <template #default="scope">
  172. <el-popconfirm
  173. confirm-button-text="删除"
  174. cancel-button-text="取消"
  175. icon="el-icon-info"
  176. iconColor="red"
  177. title="是否删除该费用"
  178. @confirm="shanChuFeiYongClick(scope.$index, scope.row)"
  179. >
  180. <template #reference>
  181. <el-button size="mini" type="danger">删除</el-button>
  182. </template>
  183. </el-popconfirm>
  184. </template>
  185. </el-table-column>
  186. </el-table>
  187. <el-pagination
  188. layout="prev, pager, next, total"
  189. @current-change="huanZheFeiYongCurrentChange"
  190. :total="huanZheFeiYongTotal"
  191. :page-size="huanZheFeiYongPageSize"
  192. background
  193. ></el-pagination>
  194. <el-tag style="margin-left: 7px">合计:{{ huanZheFeiYongZongHe }}</el-tag>
  195. </div>
  196. </el-drawer>
  197. </el-main>
  198. </el-container>
  199. </template>
  200. <script>
  201. import { ref } from '@vue/reactivity'
  202. import { baoCunHuanZheZhuYuanFeiYong, getSerialNo, getZyJiMenZhenZhuangRuFeiYong, queryEntryName, queryHuanZhe, shanChuFeiYong } from '@/api/yibao/transfer-in-of-expenses'
  203. import { cptSex } from '@/utils/computed'
  204. import store from '@/store'
  205. import { computed } from 'vue'
  206. import { ElMessage, ElMessageBox } from 'element-plus'
  207. import jsCookie from 'js-cookie'
  208. export default {
  209. name: 'TransferInOfExpenses',
  210. setup() {
  211. const windowSize = store.state.app.windowSize
  212. const windowHeight = windowSize.h - 280
  213. //查询条件
  214. //住院号
  215. const inpatientNo = ref('')
  216. //机制号
  217. const serialNo = ref('')
  218. //是否查看历史记录
  219. const liShiFlag = ref(0)
  220. //收费代码
  221. const chargeCodeMX = ref('')
  222. // 住院次数
  223. const admissTimes = ref('')
  224. const huanZheXinXi = ref({})
  225. const mzXinXiList = ref([])
  226. const zyXinXiList = ref([])
  227. //查询患者信息
  228. const queryClick = () => {
  229. if (!inpatientNo.value) {
  230. ElMessage({
  231. type: 'warning',
  232. message: '请先输入患者住院号',
  233. showClose: true,
  234. duration: 2500,
  235. })
  236. return
  237. }
  238. queryHuanZhe(inpatientNo.value).then((res) => {
  239. huanZheXinXi.value = res
  240. admissTimes.value = res.admissTimes
  241. })
  242. }
  243. //查询机制号
  244. const querySerialNo = () => {
  245. if (!serialNo.value) {
  246. ElMessage({
  247. type: 'warning',
  248. message: '请先输入机制号',
  249. showClose: true,
  250. duration: 2500,
  251. })
  252. return
  253. }
  254. getSerialNo(serialNo.value, liShiFlag.value)
  255. .then((res) => {
  256. mzXinXiList.value = res
  257. })
  258. .catch(() => {
  259. mzXinXiList.value = []
  260. })
  261. }
  262. //定义用来删除 多选框的选中状态 以及点击选中多选框
  263. const multipleTable = ref(null)
  264. //点击多选框,把里面的内容添加进去
  265. const mzSelectChecked = (selection, row) => {
  266. zyXinXiList.value = selection
  267. }
  268. //门诊发票信息 金额总和
  269. let mzSum = computed(() => {
  270. let sum = 0
  271. mzXinXiList.value.forEach((item) => {
  272. sum += item.price * item.chargeAmount
  273. })
  274. return sum.toFixed(2)
  275. })
  276. //住院收费项目 金额总和
  277. let zySum = computed(() => {
  278. let he = 0
  279. zyXinXiList.value.forEach((item) => {
  280. he += item.price * item.chargeAmount
  281. })
  282. return he.toFixed(2)
  283. })
  284. const huanZheFeiYongDrawer = ref(false)
  285. const HuanZheFeiYongCurrentPage = ref(1)
  286. const huanZheFeiYongPageSize = ref(10)
  287. const huanZheFeiYongTotal = ref(0)
  288. const huanZheFeiYongZongHe = ref(0)
  289. //住院患者的费用信息
  290. const zyDetailChargeList = ref([])
  291. let resInpatientNo = null
  292. let resChargeCodeMx = null
  293. //点击查询患者 门急诊转入的费用 在定义两个字段,用来分页的时候就算输入框没值了 也能拿到数据
  294. const getZyJiMenZhenZhuangRuFeiYongClick = () => {
  295. if (!admissTimes.value) {
  296. ElMessage.warning({
  297. message: '请先查询出患者信息',
  298. showClose: true,
  299. duration: 2500,
  300. })
  301. return
  302. }
  303. //通过住院号和项目编码 获取住院门诊装入费用
  304. getZyJiMenZhenZhuangRuFeiYong(inpatientNo.value, chargeCodeMX.value, admissTimes.value, HuanZheFeiYongCurrentPage.value, huanZheFeiYongPageSize.value).then((res) => {
  305. resInpatientNo = inpatientNo.value
  306. resChargeCodeMx = chargeCodeMX.value
  307. zyDetailChargeList.value = res.data
  308. huanZheFeiYongTotal.value = res.total
  309. huanZheFeiYongZongHe.value = res.sum
  310. })
  311. }
  312. //点击上下分页触发的事件
  313. const huanZheFeiYongCurrentChange = (val) => {
  314. HuanZheFeiYongCurrentPage.value = val
  315. if (zyDetailChargeList.value) {
  316. getZyJiMenZhenZhuangRuFeiYong(resInpatientNo, resChargeCodeMx, admissTimes.value, HuanZheFeiYongCurrentPage.value, huanZheFeiYongPageSize.value).then((res) => {
  317. zyDetailChargeList.value = res.data
  318. huanZheFeiYongTotal.value = res.total
  319. })
  320. }
  321. }
  322. //删除住院收费项目 前端删除 后端也删除 只是不执行一个查找的动作了
  323. const shanChuFeiYongClick = (index, val) => {
  324. shanChuFeiYong(val).then((res) => {
  325. zyDetailChargeList.value.splice(index, 1)
  326. })
  327. }
  328. //点击保存触发的事件
  329. const baoCunClick = () => {
  330. if (typeof huanZheXinXi.value.inpatientNo === 'undefined') {
  331. ElMessage({
  332. type: 'warning',
  333. message: '请先选择患者',
  334. showClose: true,
  335. duration: 2500,
  336. })
  337. return
  338. }
  339. if (zyXinXiList.value.length === 0) {
  340. ElMessage({
  341. type: 'warning',
  342. message: '请先选择要添加的费用',
  343. showClose: true,
  344. duration: 2500,
  345. })
  346. return
  347. }
  348. huanZheXinXi.value.list = zyXinXiList.value
  349. for (let i = 0; mzXinXiList.value.length; i++) {
  350. if (huanZheXinXi.value.name !== mzXinXiList.value[i].patientName) {
  351. return ElMessageBox.confirm('', '提示', {
  352. cancelButtonText: '取消',
  353. confirmButtonText: '确定',
  354. type: 'warning',
  355. message: '门诊病人姓名【' + mzXinXiList.value[i].patientName + '】住院病人姓名【' + huanZheXinXi.value.name + '】不一致,是否继续?',
  356. })
  357. .then(() => {
  358. huanZheXinXi.value.reqExecUnit = jsCookie.get('dept')
  359. baoCunHuanZheZhuYuanFeiYong(huanZheXinXi.value).then((res) => {
  360. zyXinXiList.value = []
  361. mzXinXiList.value = []
  362. })
  363. })
  364. .catch(() => {})
  365. }
  366. }
  367. }
  368. //项目名称 数组
  369. const entryNameList = ref([])
  370. //远程搜索项目名称
  371. const remoteMethodEntryName = (val) => {
  372. if (val.length >= 2) {
  373. queryEntryName(val).then((res) => {
  374. entryNameList.value = res
  375. })
  376. }
  377. }
  378. //门诊合计
  379. return {
  380. inpatientNo,
  381. serialNo,
  382. liShiFlag,
  383. queryClick,
  384. querySerialNo,
  385. huanZheXinXi,
  386. cptSex,
  387. windowHeight,
  388. chaKanLiShi,
  389. mzXinXiList,
  390. mzSelectChecked,
  391. zyXinXiList,
  392. mzSum,
  393. zySum,
  394. huanZheFeiYongDrawer,
  395. HuanZheFeiYongCurrentPage,
  396. huanZheFeiYongPageSize,
  397. huanZheFeiYongCurrentChange,
  398. huanZheFeiYongTotal,
  399. getZyJiMenZhenZhuangRuFeiYongClick,
  400. zyDetailChargeList,
  401. shanChuFeiYongClick,
  402. chargeCodeMX,
  403. baoCunClick,
  404. multipleTable,
  405. remoteMethodEntryName,
  406. entryNameList,
  407. huanZheFeiYongZongHe,
  408. }
  409. },
  410. }
  411. let chaKanLiShi = [
  412. { code: 0, name: '不查看历史记录' },
  413. { code: 1, name: '查看历史记录' },
  414. ]
  415. </script>
  416. <style></style>