Elizabeth's proactive approach involves introducing urinal toilet attachment , an ingenious concept that optimizes space and functionality.

summary.vue 22KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. <template>
  2. <div class="main-contain outpatientChargesManagement">
  3. <div class="position">
  4. <bread-crumb :crumbs='crumbs'></bread-crumb>
  5. </div>
  6. <div class="app-container">
  7. <div style="display: flex;justify-content: space-between;margin-bottom:10px;">
  8. <div>
  9. <el-input size="small" style="width:150px;" v-model="keywords"
  10. class="filter-item"/>
  11. <el-button size="small" style="margin-left:10px;" class="filter-item" type="primary"
  12. @click="searchAction">
  13. 搜索
  14. </el-button>
  15. <el-select size="small" v-model="admin_user_id" placeholder="请选择"
  16. style="width:150px;margin-left:10px;" @change="changeDoctor">
  17. <el-option
  18. label="全部"
  19. value="0">
  20. </el-option>
  21. <el-option
  22. v-for="item,index in doctors"
  23. :key="index"
  24. :label="item.user_name"
  25. :value="item.admin_user_id">
  26. </el-option>
  27. </el-select>
  28. <el-date-picker size="small" v-model="start_time" prefix-icon="el-icon-date"
  29. @change="handleStartTimeChange" :editable="false" :clearable="false"
  30. style="width: 196px;margin-right:10px;" type="date" placeholder="选择开始日期"
  31. format="yyyy-MM-dd"
  32. value-format="yyyy-MM-dd"
  33. align="right"></el-date-picker>
  34. <el-date-picker size="small" v-model="end_time" prefix-icon="el-icon-date"
  35. @change="handleEndTimeChange" :editable="false" :clearable="false"
  36. style="width: 196px;margin-right:10px;" type="date" placeholder="选择结束日期"
  37. format="yyyy-MM-dd"
  38. value-format="yyyy-MM-dd"
  39. align="right"></el-date-picker>
  40. <!--<el-radio v-model="radio" label="1">明细</el-radio>-->
  41. <!--<el-radio v-model="radio" label="2">汇总</el-radio>-->
  42. </div>
  43. <div>
  44. <!-- <el-popover
  45. placement="bottom"
  46. width="210"
  47. trigger="click">
  48. <el-button size="small" ref="button_two" @click="open(1)">打印清单</el-button>
  49. <el-button size="small" ref="button_six" @click="open(2)">打印汇总</el-button>
  50. <el-button slot="reference" style="margin:0 10px;" type="primary" size="small">打印</el-button>
  51. </el-popover> -->
  52. <el-button size="small" type="primary" @click="export_detail">报表下载</el-button>
  53. </div>
  54. </div>
  55. <el-table :data="tableData" border style="width: 100%;" :row-style="{ color: '#303133' }"
  56. :header-cell-style="{backgroundColor: 'rgb(245, 247, 250)',color: '#606266'}"
  57. highlight-current-row>
  58. <el-table-column
  59. prop="date"
  60. label="序号"
  61. width="60"
  62. align="center"
  63. type="index"
  64. >
  65. </el-table-column>
  66. <el-table-column align="center" prop="name" label="就诊号">
  67. <template slot-scope="scope">{{ scope.row.his_patient.number }}</template>
  68. </el-table-column>
  69. <el-table-column align="center" prop="name" label="患者名字">
  70. <template slot-scope="scope">{{ scope.row.patient.name }}</template>
  71. </el-table-column>
  72. <!--<el-table-column align="center" prop="name" label="患者类型">-->
  73. <!--<template slot-scope="scope"></template>-->
  74. <!--</el-table-column>-->
  75. <el-table-column align="center" prop="name" label="应收金额">
  76. <template slot-scope="scope">{{scope.row.medfee_sumamt}}</template>
  77. </el-table-column>
  78. <el-table-column align="center" prop="name" label="实收金额">
  79. <template slot-scope="scope">{{scope.row.reality_price}}</template>
  80. </el-table-column>
  81. <el-table-column align="center" prop="name" label="科室">
  82. <template slot-scope="scope">{{scope.row.department_name}}</template>
  83. </el-table-column>
  84. <el-table-column align="center" prop="name" label="收费日期">
  85. <template slot-scope="scope"> {{scope.row.setl_time}}</template>
  86. </el-table-column>
  87. <el-table-column align="center" prop="name" label="收费员">
  88. <template slot-scope="scope">{{ getName(scope.row.creator) }}</template>
  89. </el-table-column>
  90. <el-table-column align="center" prop="name" label="状态">
  91. <template slot-scope="scope">
  92. <div v-if="scope.row.order_status == 1">待结算</div>
  93. <div v-if="scope.row.order_status == 2">已结算</div>
  94. <div v-if="scope.row.order_status == 3">已退费</div>
  95. </template>
  96. </el-table-column>
  97. <el-table-column align="center" prop="name" label="操作">
  98. <template slot-scope="scope">
  99. <el-button size="mini" type="primary" @click="toDetail(scope.row)">详情</el-button>
  100. <el-button size="mini" type="primary" @click="toPrint(scope.row)"
  101. v-if="(scope.row.order_status == 2 && $store.getters.xt_user.org_id == 9504) || (scope.row.order_status == 2 && $store.getters.xt_user.org_id == 9919) || ($store.getters.xt_user.org_id == 10106) || (scope.row.order_status == 2 && $store.getters.xt_user.org_id == 4) || (scope.row.order_status == 2 && $store.getters.xt_user.org_id == 9990)">
  102. 结算单
  103. </el-button>
  104. <el-button size="mini" type="primary" v-if="scope.row.order_status == 2 && $store.getters.xt_user.org_id == 10106" @click="settlementPrint(scope.row)">结算单</el-button>
  105. <el-button size="mini" type="primary" @click="toRefund(scope.row)">
  106. 退费
  107. </el-button>
  108. <el-button size="mini" type="primary" @click="invoicePrint(scope.row)">打印发票</el-button>
  109. </template>
  110. </el-table-column>
  111. </el-table>
  112. <el-pagination
  113. @size-change="handleSizeChange"
  114. @current-change="handleCurrentChange"
  115. :page-sizes="[10, 50, 100]"
  116. :page-size="10"
  117. background
  118. style="margin-top:20px;float: right"
  119. layout="total, sizes, prev, pager, next, jumper"
  120. :total="total"
  121. >
  122. </el-pagination>
  123. </div>
  124. <el-dialog
  125. class="centerDialog"
  126. width="1200px"
  127. title="打印"
  128. :visible.sync="statementVisible">
  129. <!--<statementPrint ref="print" :paramsObj='orderObj'></statementPrint>-->
  130. <new-statement-print ref="print" :paramsObj='orderObj'></new-statement-print>
  131. </el-dialog>
  132. <el-dialog
  133. class="centerDialog"
  134. width="900px"
  135. title="打印"
  136. :visible.sync="listVisible">
  137. <listPrint></listPrint>
  138. </el-dialog>
  139. <el-dialog
  140. class="centerDialog"
  141. width="900px"
  142. title="打印"
  143. :visible.sync="allListVisible">
  144. <allListPrint :paramsObj='paramsObj'></allListPrint>
  145. </el-dialog>
  146. <el-dialog
  147. class="centerDialog"
  148. width="1200px"
  149. title="打印"
  150. :visible.sync="statementVisible9504">
  151. <!--<statementPrint ref="print" :paramsObj='orderObj'></statementPrint>-->
  152. <!--<new-statement-print ref="print" :paramsObj='orderObj9504'></new-statement-print>-->
  153. <new-statement-print-two ref="print" :paramsObj='orderObj9504'></new-statement-print-two>
  154. </el-dialog>
  155. <el-dialog
  156. class="centerDialog"
  157. width="1200px"
  158. title="打印"
  159. :visible.sync="invoiceVisible">
  160. <invoice-print ref="print" :invoiceParams='invoiceParams'></invoice-print>
  161. </el-dialog>
  162. <el-dialog
  163. class="centerDialog"
  164. width="1200px"
  165. title="打印"
  166. :visible.sync="settlementVisible">
  167. <settlement-print ref="print" :paramsObj='settlementObj'></settlement-print>
  168. </el-dialog>
  169. </div>
  170. </template>
  171. <script>
  172. import BreadCrumb from '@/xt_pages/components/bread-crumb'
  173. import { getDoctorList, getExportConsumeDetailList, getHisOrderList, Refund} from '@/api/his/his'
  174. import { uParseTime } from '@/utils/tools'
  175. import NewStatementPrint from './newStatementPrint'
  176. import listPrint from './listPrint'
  177. import allListPrint from './allListPrint'
  178. import NewStatementPrintTwo from './newStatementPrintTwo'
  179. import { fetchAllAdminUsers } from '@/api/doctor'
  180. import axios from 'axios'
  181. import invoicePrint from './invoicePrint'
  182. import settlementPrint from './settlementPrint'
  183. export default {
  184. components: {
  185. NewStatementPrintTwo,
  186. NewStatementPrint,
  187. BreadCrumb,
  188. listPrint,
  189. allListPrint,
  190. invoicePrint,
  191. settlementPrint
  192. },
  193. data() {
  194. return {
  195. orderObj: {},
  196. statementVisible: false,
  197. statementVisible9504: false,
  198. orderObj9504: {},
  199. crumbs: [
  200. { path: false, name: '门诊收费' },
  201. { path: false, name: '项目消费明细汇总' }
  202. ],
  203. tableData: [],
  204. limit: 10,
  205. page: 1,
  206. keywords: '',
  207. start_time: '',
  208. end_time: '',
  209. total: '',
  210. doctors: [],
  211. admin_user_id: '',
  212. listVisible: false,
  213. allListVisible: false,
  214. adminUserOptions:[],
  215. invoiceVisible:false,
  216. paramsObj:{},
  217. invoiceParams:{},
  218. settlementVisible:false,
  219. settlementObj:{}
  220. }
  221. },
  222. methods: {
  223. fetchAllAdminUsers() {
  224. fetchAllAdminUsers().then(response => {
  225. if (response.data.state == 1) {
  226. this.adminUserOptions = response.data.data.users
  227. }
  228. })
  229. },
  230. getName(admin_user_id) {
  231. for (let i = 0; i < this.adminUserOptions.length; i++) {
  232. if (this.adminUserOptions[i].id == admin_user_id) {
  233. return this.adminUserOptions[i].name
  234. }
  235. }
  236. },toRefund(row){
  237. if (this.$store.getters.xt_user.org_id == 9919 || this.$store.getters.xt_user.org_id == 4 || this.$store.getters.xt_user.org_id == 9538 || this.$store.getters.xt_user.org_id == 9671 || this.$store.getters.xt_user.org_id == 10106 || this.$store.getters.xt_user.org_id == 9990) {
  238. var that = this;
  239. this.$confirm('是否退费', '退费', {
  240. confirmButtonText: '确 定',
  241. cancelButtonText: '取 消',
  242. type: 'warning'
  243. }).then(() => {
  244. let params = {
  245. 'order_id': row.id,
  246. 'patient_id': row.patient_id,
  247. 'record_time': that.getTimes(row.settle_accounts_date),
  248. 'admin_user_id': that.$store.getters.xt_user.user.id,
  249. };
  250. axios.get('http://127.0.0.1:9532/api/refund/post', {
  251. params: params
  252. })
  253. .then(function(response) {
  254. if (response.data.state == 0) {
  255. that.$message.error(response.data.msg);
  256. return false
  257. } else {
  258. if (response.data.data.failed_code == -10) {
  259. // that.$message.error(response.data.data.msg)
  260. that.$confirm(response.data.data.msg, '医保错误信息', {
  261. confirmButtonText: '确 定',
  262. type: 'warning'
  263. }).then(() => {
  264. }).catch(() => {
  265. })
  266. } else {
  267. that.$message({ message: '退费成功', type: 'success', duration: 5000 });
  268. that.getHisOrderList()
  269. }
  270. }
  271. })
  272. .catch(function(error) {
  273. })
  274. }).catch(() => {
  275. })
  276. } else {
  277. this.$confirm('是否退费', '退费', {
  278. confirmButtonText: '确 定',
  279. cancelButtonText: '取 消',
  280. type: 'warning'
  281. }).then(() => {
  282. let params = {
  283. 'order_id': this.order.id,
  284. 'patient_id': this.patientInfo.id,
  285. 'record_time': this.record_date
  286. };
  287. Refund(params).then(response => {
  288. if (response.data.state == 0) {
  289. this.$message.error(response.data.msg);
  290. return false
  291. } else {
  292. this.$message({ message: '退费成功', type: 'success' });
  293. this.getHisOrderList()
  294. }
  295. })
  296. }).catch(() => {
  297. })
  298. }
  299. },
  300. toPrint(row) {
  301. if (this.$store.getters.xt_user.org_id == 9504 || this.$store.getters.xt_user.org_id == 10028) {
  302. this.statementVisible9504 = true;
  303. let obj = {
  304. order_id: row.id,
  305. patient_id: row.patient_id,
  306. record_time: this.getTimes(row.settle_accounts_date),
  307. admin_user_id: this.$store.getters.xt_user.user.id
  308. };
  309. this.orderObj9504 = obj
  310. } else {
  311. this.statementVisible = true;
  312. let obj = {
  313. order_id: row.id
  314. };
  315. this.orderObj = obj
  316. }
  317. },
  318. settlementPrint(row){
  319. this.settlementVisible = true;
  320. let obj = {
  321. order_id: row.id
  322. };
  323. this.settlementObj = obj
  324. },
  325. export_detail() {
  326. let params = {
  327. start_time: this.start_time,
  328. end_time: this.end_time,
  329. p_type: 2,
  330. };
  331. getExportConsumeDetailList(params).then(response => {
  332. if (response.data.state == 0) {
  333. this.$message.error(response.data.msg);
  334. return false
  335. } else {
  336. let list = [];
  337. for (let i = 0; i < response.data.data.order.length; i++) {
  338. let order = response.data.data.order[i];
  339. let number = '';
  340. let name = '';
  341. let department = '';
  342. let doctor_name = '';
  343. let balance_accounts = '';
  344. let order_status = '';
  345. let charge_name = '';
  346. if (order.his_patient != null && order.his_patient.number.length > 0) {
  347. number = order.his_patient.number
  348. }
  349. if (order.his_patient != null) {
  350. if (order.his_patient.balance_accounts_type == 1) {
  351. balance_accounts = '自费'
  352. }
  353. if (order.his_patient.balance_accounts_type == 2) {
  354. balance_accounts = '医保'
  355. }
  356. }
  357. if (order.patient != null && order.patient.name.length > 0) {
  358. name = order.patient.name
  359. }
  360. if (order.p_info != null && order.p_info.department != null && order.p_info.department.name.length > 0) {
  361. department = order.p_info.department.name
  362. }
  363. if (order.p_info != null && order.p_info.doctor.length > 0) {
  364. doctor_name = order.p_info.doctor
  365. }
  366. if (order.creator != null) {
  367. charge_name = this.getName(order.creator)
  368. }
  369. if (order.order_status == 1) {
  370. order_status = '待结算'
  371. }
  372. if (order.order_status == 2) {
  373. order_status = '已结算'
  374. }
  375. if (order.order_status == 3) {
  376. order_status = '已退费'
  377. }
  378. let obj = {
  379. '就诊号': number,
  380. '患者姓名': name,
  381. '应收金额': order.medfee_sumamt,
  382. '实收金额': order.medfee_sumamt,
  383. '医保统筹金额': order.fund_pay_sumamt,
  384. '大额基金金额': order.hifob_pay,
  385. '大病基金金额': order.hifmi_pay,
  386. '补充保险基金金额': order.hifes_pay,
  387. '医疗救助基金金额': order.maf_pay,
  388. '公务员基金': order.cvlserv_pay,
  389. '个人支付基金': order.psn_cash_pay,
  390. '个人账户支付金额': order.acct_pay,
  391. '科室': department,
  392. '医生姓名': doctor_name,
  393. '收费类别': balance_accounts,
  394. '收费者姓名': charge_name,
  395. '总金额': order.medfee_sumamt,
  396. '现金支付': '',
  397. '账户支付': '',
  398. '支付宝支付': '',
  399. '微信支付': '',
  400. '其他支付': '',
  401. '收费时间': order.setl_time,
  402. '收费状态': order_status,
  403. '退费日期': ''
  404. };
  405. list.push(obj)
  406. }
  407. import('@/vendor/Export2Excel').then(excel => {
  408. const tHeader = ['就诊号', '患者姓名', '应收金额', '实收金额', '医保统筹金额', '大额基金金额', '大病基金金额', '补充保险基金金额', '医疗救助基金金额', '公务员基金', '个人支付基金', '个人账户支付金额', '科室', '医生姓名', '收费类别', '收费者姓名', '总金额', '现金支付', '账户支付', '支付宝支付', '微信支付', '其他支付', '收费时间', '收费状态', '退费日期'];
  409. const filterVal = ['就诊号', '患者姓名', '应收金额', '实收金额', '医保统筹金额', '大额基金金额', '大病基金金额', '补充保险基金金额', '医疗救助基金金额', '公务员基金', '个人支付基金', '个人账户支付金额', '科室', '医生姓名', '收费类别', '收费者姓名', '总金额', '现金支付', '账户支付', '支付宝支付', '微信支付', '其他支付', '收费时间', '收费状态', '退费日期'];
  410. const data = this.formatJson(filterVal, list);
  411. excel.export_json_to_excel({
  412. header: tHeader,
  413. data,
  414. filename: '消费明细'
  415. })
  416. })
  417. }
  418. })
  419. }, formatJson(filterVal, jsonData) {
  420. return jsonData.map(v => filterVal.map(j => v[j]))
  421. },
  422. changeDoctor() {
  423. this.page = 1;
  424. this.keywords = '';
  425. this.getHisOrderList()
  426. },
  427. handleSizeChange(limit) {
  428. this.limit = limit;
  429. this.getHisOrderList()
  430. }, handleCurrentChange(page) {
  431. this.page = page;
  432. this.getHisOrderList()
  433. },
  434. handleStartTimeChange() {
  435. this.page = 1;
  436. this.keywords = '';
  437. this.getHisOrderList()
  438. }, handleEndTimeChange() {
  439. this.page = 1;
  440. this.keywords = '';
  441. this.getHisOrderList()
  442. },
  443. searchAction() {
  444. this.page = 1;
  445. this.getHisOrderList()
  446. },
  447. getTimes(time) {
  448. return uParseTime(time, '{y}-{m}-{d}')
  449. },
  450. toDetail(row) {
  451. this.$router.push('/outpatientCharges/summaryDetail?patient_id=' + row.patient.id + '&number=' + row.number + '&id=' + row.id)
  452. }, getTime(value, temp) {
  453. if (value != undefined) {
  454. return uParseTime(value, temp)
  455. }
  456. return ''
  457. }, getHisOrderList() {
  458. let params = {
  459. page: this.page,
  460. limit: this.limit,
  461. keywords: this.keywords,
  462. start_time: this.start_time,
  463. end_time: this.end_time,
  464. type: this.admin_user_id,
  465. p_type: 2,
  466. };
  467. getHisOrderList(params).then(response => {
  468. if (response.data.state == 0) {
  469. this.$message.error(response.data.msg);
  470. return false
  471. } else {
  472. this.tableData = response.data.data.order;
  473. this.total = response.data.data.total
  474. }
  475. })
  476. }, getDoctorList() {
  477. getDoctorList().then(response => {
  478. if (response.data.state == 0) {
  479. this.$message.error(response.data.msg);
  480. return false
  481. } else {
  482. this.doctors = response.data.data.doctors
  483. }
  484. })
  485. },
  486. open(index) {
  487. if (index == 1) {
  488. this.listVisible = true
  489. } else if (index == 2) {
  490. this.allListVisible = true
  491. }
  492. },
  493. invoicePrint(obj){
  494. console.log(obj);
  495. let paramsObj = {
  496. order_id: obj.id,
  497. patient_id: obj.patient_id,
  498. name:obj.patient.name,
  499. age:obj.age,
  500. gend:obj.gend,
  501. setl_time:obj.setl_time
  502. };
  503. this.invoiceParams = paramsObj;
  504. this.invoiceVisible = true
  505. }
  506. }, created() {
  507. this.fetchAllAdminUsers();
  508. this.getDoctorList();
  509. this.getHisOrderList()
  510. }
  511. }
  512. </script>