TransferInOfExpenses.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479
  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" 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" type="primary" @click="querySerialNo">查询机制号信息</el-button>
  35. <el-button style="margin-left: 10px" type="warning" @click="huanZheFeiYongDrawer = true">查看患者费用</el-button>
  36. <el-button style="margin-left: 10px" 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. 收费日期:
  107. <el-date-picker type="datetime" v-model="chargeDate"></el-date-picker>
  108. <div style="width: 100%">
  109. <div style="float: left; width: 45%">
  110. <el-table :height="windowHeight / 1.4" highlight-current-row :data="mzXinXiList"
  111. @selection-change="mzSelectChecked"
  112. ref="multipleTable">
  113. <el-table-column label="门诊发票信息">
  114. <el-table-column label="项目名称" prop="itemName"></el-table-column>
  115. <el-table-column label="收费编码" prop="chargeCode"></el-table-column>
  116. <el-table-column label="数量" prop="chargeAmount"></el-table-column>
  117. <el-table-column label="单价" prop="price"></el-table-column>
  118. <el-table-column label="金额" prop="chargeFee"></el-table-column>
  119. <el-table-column label="选择" width="60" type="selection"></el-table-column>
  120. </el-table-column>
  121. </el-table>
  122. <el-tag>合计:{{ mzSum }}</el-tag>
  123. </div>
  124. <div style="width: 9%; float: left; margin-left: 4px; text-align: center"
  125. :style="{ lineHeight: windowHeight / 1.4 + 'px' }">
  126. <el-button icon="el-icon-right" type="primary"></el-button>
  127. </div>
  128. <div style="float: right; width: 45%">
  129. <el-table :height="windowHeight / 1.4" stripe :data="zyXinXiList">
  130. <el-table-column label="住院收费项目">
  131. <el-table-column label="项目名称" prop="itemName"></el-table-column>
  132. <el-table-column label="收费编码" prop="chargeCode"></el-table-column>
  133. <el-table-column label="数量" prop="chargeAmount"></el-table-column>
  134. <el-table-column label="单价" prop="price"></el-table-column>
  135. <el-table-column label="金额" prop="chargeFee"></el-table-column>
  136. </el-table-column>
  137. </el-table>
  138. <el-tag>合计:{{ zySum }}</el-tag>
  139. </div>
  140. </div>
  141. <el-drawer title="查看患者通过急门诊转入的费用" v-model="huanZheFeiYongDrawer" size="50%">
  142. <div style="margin-left: 20px">
  143. <el-input
  144. placeholder="住院号"
  145. clearable
  146. style="width: 200px"
  147. @keyup.enter="getZyJiMenZhenZhuangRuFeiYongClick"
  148. v-model="inpatientNo"
  149. @blur="inpatientNo = $event.target.value.trim()"
  150. >
  151. <template #prepend>住院号</template>
  152. </el-input>
  153. <el-divider direction="vertical"></el-divider>
  154. 项目名称:
  155. <el-select v-model="chargeCodeMX" placeholder="根据拼音首字母查找" filterable clearable remote
  156. :remote-method="remoteMethodEntryName">
  157. <el-option v-for="item in entryNameList" :key="item.code" :label="item.name" :value="item.code">
  158. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  159. <el-divider direction="vertical"></el-divider>
  160. <span>{{ item.name }}</span>
  161. </el-option>
  162. </el-select>
  163. <el-divider direction="vertical"></el-divider>
  164. <el-button @click="getZyJiMenZhenZhuangRuFeiYongClick" type="primary">查询</el-button>
  165. <el-table :data="zyDetailChargeList" :height="windowHeight / 1.1">
  166. <el-table-column label="住院号" prop="inpatientNo"></el-table-column>
  167. <el-table-column label="流水号" prop="detailSn"></el-table-column>
  168. <el-table-column label="收费日期" width="80" prop="chargeDate"></el-table-column>
  169. <el-table-column label="收费代码" prop="chargeCode"></el-table-column>
  170. <el-table-column label="项目名称" prop="chargeCodeName" show-overflow-tooltip></el-table-column>
  171. <el-table-column label="费用录入日期" prop="genTime" width="80"></el-table-column>
  172. <el-table-column label="金额" prop="chargeFee"></el-table-column>
  173. <el-table-column label="数量" prop="chargeAmount"></el-table-column>
  174. <el-table-column label="操作">
  175. <template #default="scope">
  176. <el-popconfirm
  177. confirm-button-text="删除"
  178. cancel-button-text="取消"
  179. icon="el-icon-info"
  180. iconColor="red"
  181. title="是否删除该费用"
  182. @confirm="shanChuFeiYongClick(scope.$index, scope.row)"
  183. >
  184. <template #reference>
  185. <el-button type="danger">删除</el-button>
  186. </template>
  187. </el-popconfirm>
  188. </template>
  189. </el-table-column>
  190. </el-table>
  191. <el-pagination
  192. layout="prev, pager, next, total"
  193. @current-change="huanZheFeiYongCurrentChange"
  194. :total="huanZheFeiYongTotal"
  195. :page-size="huanZheFeiYongPageSize"
  196. background
  197. ></el-pagination>
  198. <el-tag style="margin-left: 7px">合计:{{ huanZheFeiYongZongHe }}</el-tag>
  199. </div>
  200. </el-drawer>
  201. </el-main>
  202. </el-container>
  203. </template>
  204. <script>
  205. import {ref} from '@vue/reactivity'
  206. import {
  207. baoCunHuanZheZhuYuanFeiYong,
  208. getSerialNo,
  209. getZyJiMenZhenZhuangRuFeiYong,
  210. queryEntryName,
  211. queryHuanZhe,
  212. shanChuFeiYong
  213. } from '@/api/yibao/transfer-in-of-expenses'
  214. import {cptSex} from '@/utils/computed'
  215. import store from '@/store'
  216. import {computed} from 'vue'
  217. import {ElMessage, ElMessageBox} from 'element-plus'
  218. import {formatDatetime} from '../../utils/date'
  219. export default {
  220. name: 'TransferInOfExpenses',
  221. setup() {
  222. const windowSize = store.state.app.windowSize
  223. const windowHeight = windowSize.h
  224. //查询条件
  225. //住院号
  226. const inpatientNo = ref('') // 016868
  227. //机制号
  228. const serialNo = ref('') // 11516328
  229. //是否查看历史记录
  230. const liShiFlag = ref(0)
  231. //收费代码
  232. const chargeCodeMX = ref('')
  233. // 住院次数
  234. const admissTimes = ref('')
  235. const huanZheXinXi = ref({})
  236. const mzXinXiList = ref([])
  237. const zyXinXiList = ref([])
  238. //查询患者信息
  239. const queryClick = () => {
  240. if (!inpatientNo.value) {
  241. ElMessage({
  242. type: 'warning',
  243. message: '请先输入患者住院号',
  244. showClose: true,
  245. duration: 2500,
  246. })
  247. return
  248. }
  249. queryHuanZhe(inpatientNo.value).then((res) => {
  250. huanZheXinXi.value = res
  251. admissTimes.value = res.admissTimes
  252. })
  253. }
  254. //查询机制号
  255. const querySerialNo = () => {
  256. if (!serialNo.value) {
  257. ElMessage({
  258. type: 'warning',
  259. message: '请先输入机制号',
  260. showClose: true,
  261. duration: 2500,
  262. })
  263. return
  264. }
  265. getSerialNo(serialNo.value, liShiFlag.value)
  266. .then((res) => {
  267. mzXinXiList.value = res
  268. })
  269. .catch(() => {
  270. mzXinXiList.value = []
  271. })
  272. }
  273. //定义用来删除 多选框的选中状态 以及点击选中多选框
  274. const multipleTable = ref(null)
  275. //点击多选框,把里面的内容添加进去
  276. const mzSelectChecked = (selection, row) => {
  277. zyXinXiList.value = selection
  278. }
  279. //门诊发票信息 金额总和
  280. let mzSum = computed(() => {
  281. let sum = 0
  282. mzXinXiList.value.forEach((item) => {
  283. sum += item.price * item.chargeAmount
  284. })
  285. return sum.toFixed(2)
  286. })
  287. //住院收费项目 金额总和
  288. let zySum = computed(() => {
  289. let he = 0
  290. zyXinXiList.value.forEach((item) => {
  291. he += item.price * item.chargeAmount
  292. })
  293. return he.toFixed(2)
  294. })
  295. const huanZheFeiYongDrawer = ref(false)
  296. const HuanZheFeiYongCurrentPage = ref(1)
  297. const huanZheFeiYongPageSize = ref(10)
  298. const huanZheFeiYongTotal = ref(0)
  299. const huanZheFeiYongZongHe = ref(0)
  300. //住院患者的费用信息
  301. const zyDetailChargeList = ref([])
  302. let resInpatientNo = null
  303. let resChargeCodeMx = null
  304. //点击查询患者 门急诊转入的费用 在定义两个字段,用来分页的时候就算输入框没值了 也能拿到数据
  305. const getZyJiMenZhenZhuangRuFeiYongClick = () => {
  306. if (!admissTimes.value) {
  307. ElMessage.warning({
  308. message: '请先查询出患者信息',
  309. showClose: true,
  310. duration: 2500,
  311. })
  312. return
  313. }
  314. //通过住院号和项目编码 获取住院门诊装入费用
  315. getZyJiMenZhenZhuangRuFeiYong(inpatientNo.value, chargeCodeMX.value, admissTimes.value, HuanZheFeiYongCurrentPage.value, huanZheFeiYongPageSize.value).then((res) => {
  316. resInpatientNo = inpatientNo.value
  317. resChargeCodeMx = chargeCodeMX.value
  318. zyDetailChargeList.value = res.data
  319. huanZheFeiYongTotal.value = res.total
  320. huanZheFeiYongZongHe.value = res.sum
  321. })
  322. }
  323. //点击上下分页触发的事件
  324. const huanZheFeiYongCurrentChange = (val) => {
  325. HuanZheFeiYongCurrentPage.value = val
  326. if (zyDetailChargeList.value) {
  327. getZyJiMenZhenZhuangRuFeiYong(resInpatientNo, resChargeCodeMx, admissTimes.value, HuanZheFeiYongCurrentPage.value, huanZheFeiYongPageSize.value).then((res) => {
  328. zyDetailChargeList.value = res.data
  329. huanZheFeiYongTotal.value = res.total
  330. })
  331. }
  332. }
  333. //删除住院收费项目 前端删除 后端也删除 只是不执行一个查找的动作了
  334. const shanChuFeiYongClick = (index, val) => {
  335. shanChuFeiYong(val).then((res) => {
  336. zyDetailChargeList.value.splice(index, 1)
  337. })
  338. }
  339. //点击保存触发的事件
  340. const baoCunClick = () => {
  341. console.log(chargeDate.value)
  342. if (chargeDate.value === null) {
  343. chargeDate.value = new Date()
  344. }
  345. huanZheXinXi.value.chargeDate = formatDatetime(chargeDate.value)
  346. if (typeof huanZheXinXi.value.inpatientNo === 'undefined') {
  347. ElMessage({
  348. type: 'warning',
  349. message: '请先选择患者',
  350. showClose: true,
  351. duration: 2500,
  352. })
  353. return
  354. }
  355. if (zyXinXiList.value.length === 0) {
  356. ElMessage({
  357. type: 'warning',
  358. message: '请先选择要添加的费用',
  359. showClose: true,
  360. duration: 2500,
  361. })
  362. return
  363. }
  364. huanZheXinXi.value.list = zyXinXiList.value
  365. if (huanZheXinXi.value.chargeDate === '') {
  366. return ElMessage.error({
  367. message: '请选择日期',
  368. })
  369. }
  370. for (let i = 0; mzXinXiList.value.length; i++) {
  371. if (huanZheXinXi.value.name !== mzXinXiList.value[i].patientName && typeof mzXinXiList.value[i].patientName !== 'undefined') {
  372. return ElMessageBox.confirm('', '提示', {
  373. cancelButtonText: '取消',
  374. confirmButtonText: '确定',
  375. dangerouslyUseHTMLString: true,
  376. type: 'warning',
  377. message: `门诊病人姓名【' ${mzXinXiList.value[i].patientName} '】住院病人姓名【' ${huanZheXinXi.value.name} '】不一致,是否继续?<br>收费日期:${huanZheXinXi.value.chargeDate}`,
  378. })
  379. .then(() => {
  380. baoCunHuanZheZhuYuanFeiYong(huanZheXinXi.value).then((res) => {
  381. zyXinXiList.value = []
  382. mzXinXiList.value = []
  383. })
  384. })
  385. .catch(() => {
  386. })
  387. } else if (huanZheXinXi.value.name === mzXinXiList.value[i].patientName && typeof mzXinXiList.value[i].patientName !== 'undefined') {
  388. return ElMessageBox.confirm('', '提示', {
  389. cancelButtonText: '取消',
  390. confirmButtonText: '确定',
  391. dangerouslyUseHTMLString: true,
  392. type: 'warning',
  393. message: `收费日期:${huanZheXinXi.value.chargeDate}`,
  394. })
  395. .then(() => {
  396. baoCunHuanZheZhuYuanFeiYong(huanZheXinXi.value).then((res) => {
  397. zyXinXiList.value = []
  398. mzXinXiList.value = []
  399. })
  400. })
  401. .catch(() => {
  402. })
  403. }
  404. }
  405. }
  406. //项目名称 数组
  407. const entryNameList = ref([])
  408. //远程搜索项目名称
  409. const remoteMethodEntryName = (val) => {
  410. if (val.length >= 2) {
  411. queryEntryName(val).then((res) => {
  412. entryNameList.value = res
  413. })
  414. }
  415. }
  416. const chargeDate = ref(new Date())
  417. //门诊合计
  418. return {
  419. inpatientNo,
  420. serialNo,
  421. liShiFlag,
  422. queryClick,
  423. querySerialNo,
  424. huanZheXinXi,
  425. cptSex,
  426. windowHeight,
  427. chaKanLiShi,
  428. mzXinXiList,
  429. mzSelectChecked,
  430. zyXinXiList,
  431. mzSum,
  432. zySum,
  433. huanZheFeiYongDrawer,
  434. HuanZheFeiYongCurrentPage,
  435. huanZheFeiYongPageSize,
  436. huanZheFeiYongCurrentChange,
  437. huanZheFeiYongTotal,
  438. getZyJiMenZhenZhuangRuFeiYongClick,
  439. zyDetailChargeList,
  440. shanChuFeiYongClick,
  441. chargeCodeMX,
  442. baoCunClick,
  443. multipleTable,
  444. remoteMethodEntryName,
  445. entryNameList,
  446. huanZheFeiYongZongHe,
  447. chargeDate,
  448. }
  449. },
  450. }
  451. let chaKanLiShi = [
  452. {code: 0, name: '不查看历史记录'},
  453. {code: 1, name: '查看历史记录'},
  454. ]
  455. </script>
  456. <style></style>