personSettle.vue 21KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634
  1. <template>
  2. <div>
  3. <div style="display: flex;justify-content: space-between;margin-bottom:10px;">
  4. <div>
  5. <el-input size="small" style="width:150px;" v-model="keywords" @input="searchAction"
  6. @keyup.enter.native='searchAction'
  7. placeholder="请输入患者姓名"
  8. class="filter-item"/>
  9. <el-select size="small" v-model="item_type" placeholder="请选择"
  10. style="width:150px;margin-left:10px;" @change="changeItem">
  11. <el-option
  12. label="全部"
  13. value="0">
  14. </el-option>
  15. <el-option
  16. v-for="item,index in items"
  17. :key="index"
  18. :label="item.name"
  19. :value="item.id">
  20. </el-option>
  21. </el-select>
  22. <el-date-picker
  23. v-model="chargeDate"
  24. type="daterange"
  25. value-format="yyyy-MM-dd"
  26. range-separator="至"
  27. start-placeholder="开始日期"
  28. @change="changeDate"
  29. end-placeholder="结束日期">
  30. </el-date-picker>
  31. <!--<el-radio v-model="radio" label="1">明细</el-radio>-->
  32. <!--<el-radio v-model="radio" label="2">汇总</el-radio>-->
  33. </div>
  34. <div>
  35. <!-- <el-popover
  36. placement="bottom"
  37. width="210"
  38. trigger="click">
  39. <el-button size="small" ref="button_two" @click="open(1)">打印清单</el-button>
  40. <el-button size="small" ref="button_six" @click="open(2)">打印汇总</el-button>
  41. <el-button slot="reference" style="margin:0 10px;" type="primary" size="small">打印</el-button>
  42. </el-popover> -->
  43. <el-button size="small" type="primary" @click="export_detail">报表下载</el-button>
  44. <el-button size="small" type="primary" @click="export_detail_two" v-if="this.$store.getters.xt_user.org_id == 9478">收入统计</el-button>
  45. </div>
  46. </div>
  47. <el-table ref="tables" :data="tableData" border :row-style="{ color: '#303133' }"
  48. :header-cell-style="{backgroundColor: 'rgb(245, 247, 250)',color: '#606266'}"
  49. v-loading="settle_loading"
  50. max-height="600"
  51. highlight-current-row>
  52. <el-table-column align="center" prop="name" label="患者名字" fixed>
  53. <template slot-scope="scope">{{ scope.row.name }}</template>
  54. </el-table-column>
  55. <el-table-column align="center" prop="id_card_no" label="身份证">
  56. <template slot-scope="scope">
  57. {{scope.row.id_card_no}}
  58. </template>
  59. </el-table-column>
  60. <el-table-column align="center" prop="dis" label="透析次数">
  61. <template slot-scope="scope">
  62. {{scope.row.dis.length}}
  63. </template>
  64. </el-table-column>
  65. <el-table-column align="center" prop="s_count" label="结算次数">
  66. <template slot-scope="scope">
  67. {{scope.row.orders.length}}
  68. </template>
  69. </el-table-column>
  70. <el-table-column align="center" prop="medfee_sumamt" label="医疗费总额">
  71. <template slot-scope="scope">{{GetMedfeeSumam(scope.row)}}</template>
  72. </el-table-column>
  73. <el-table-column align="center" prop="fund_pay_sumamt" label="基金支付金额">
  74. <template slot-scope="scope">{{GetFundPaySumamt(scope.row)}}</template>
  75. </el-table-column>
  76. <el-table-column align="center" prop="acct_pay" label="个人账户支付金额">
  77. <template slot-scope="scope">{{GetAcctPay(scope.row)}}</template>
  78. </el-table-column>
  79. <el-table-column align="center" prop="psn_cash_pay" label="个人支付金额">
  80. <template slot-scope="scope">{{GetPsnCashPay(scope.row)}}</template>
  81. </el-table-column>
  82. <el-table-column align="center" prop="hifp_pay" label="基金统筹金额">
  83. <template slot-scope="scope">{{GetHifpPay(scope.row)}}</template>
  84. </el-table-column>
  85. <el-table-column align="center" prop="hifob_pay" label="大额基金支付">
  86. <template slot-scope="scope">{{GetHiFobPay(scope.row)}}</template>
  87. </el-table-column>
  88. <el-table-column align="center" prop="preselfpay_amt" label="先行自付金额">
  89. <template slot-scope="scope">{{GetPreselfpaAmt(scope.row)}}</template>
  90. </el-table-column>
  91. <el-table-column align="center" prop="overlmt_self_pay" label="超限价金额">
  92. <template slot-scope="scope">{{GetOverlmtSelfPay(scope.row)}}</template>
  93. </el-table-column>
  94. <el-table-column align="center" prop="fulamt_ownpay_amt" label="全自费金额">
  95. <template slot-scope="scope">{{GetFulamtOwnpayAmt(scope.row)}}</template>
  96. </el-table-column>
  97. <el-table-column align="center" prop="inscp_scp_amt" label="符合政策范围金额">
  98. <template slot-scope="scope">{{GetInscpScpAmt(scope.row)}}</template>
  99. </el-table-column>
  100. <el-table-column align="center" prop="maf_pay" label="医疗救助基金">
  101. <template slot-scope="scope">{{GetMafPay(scope.row)}}</template>
  102. </el-table-column>
  103. <el-table-column align="center" prop="hifes_pay" label="企业补充医疗保险基金支出">
  104. <template slot-scope="scope">{{GetHifesPay(scope.row)}}</template>
  105. </el-table-column>
  106. <el-table-column align="center" prop="hifmi_pay" label="居民大病保险资金支出">
  107. <template slot-scope="scope">{{GetHifmiPay(scope.row)}}</template>
  108. </el-table-column>
  109. <el-table-column align="center" prop="oth_pay" label="其他支付">
  110. <template slot-scope="scope">{{GetOthPay(scope.row)}}</template>
  111. </el-table-column>
  112. <el-table-column align="center" prop="cvlserv_pay" label="公务员医疗补助资金支出">
  113. <template slot-scope="scope">{{GetCvlservPay(scope.row)}}</template>
  114. </el-table-column>
  115. </el-table>
  116. </div>
  117. </template>
  118. <script>
  119. import BreadCrumb from '@/xt_pages/components/bread-crumb'
  120. import { GetSummarySettle,changeOrderDesc } from '@/api/his/his'
  121. import { uParseTime } from '@/utils/tools'
  122. import {newsummary} from "../../../api/his/his";
  123. // import NewStatementPrint from './newStatementPrint'
  124. const moment = require('moment')
  125. export default {
  126. components: {
  127. BreadCrumb
  128. },
  129. data() {
  130. return {
  131. settle_loading:false,
  132. crumbs: [],
  133. tempArr: [],
  134. sameRowArr: [],
  135. modeOptions:this.$store.getters.treatment_mode,
  136. tableData: [],
  137. config:{},
  138. sick:{},
  139. chargeDate: [moment(new Date()).add('year', 0).format('YYYY-MM-DD'), moment(new Date()).add('year', 0).format('YYYY-MM-DD')],
  140. item_type: '0',
  141. items: [
  142. { id: 2, name: '自费' },
  143. { id: 5, name: '城乡居民基本医疗保险' },
  144. { id: 6, name: '职工基本医疗保险' }
  145. ]
  146. }
  147. },
  148. methods: {
  149. GetMedfeeSumam(row){
  150. let medfee = 0
  151. for(let i = 0; i < row.orders.length; i++){
  152. medfee = medfee + row.orders[i].medfee_sumamt
  153. }
  154. return medfee.toFixed(2)
  155. }, GetFundPaySumamt(row){
  156. let medfee = 0
  157. for(let i = 0; i < row.orders.length; i++){
  158. medfee = medfee + row.orders[i].fund_pay_sumamt
  159. }
  160. return medfee.toFixed(2)
  161. },GetAcctPay(row){
  162. let medfee = 0
  163. for(let i = 0; i < row.orders.length; i++){
  164. medfee = medfee + row.orders[i].acct_pay
  165. }
  166. return medfee.toFixed(2)
  167. },GetPsnCashPay(row){
  168. let medfee = 0
  169. for(let i = 0; i < row.orders.length; i++){
  170. medfee = medfee + row.orders[i].psn_cash_pay
  171. }
  172. return medfee.toFixed(2)
  173. },GetHifpPay(row){
  174. let medfee = 0
  175. for(let i = 0; i < row.orders.length; i++){
  176. medfee = medfee + row.orders[i].hifp_pay
  177. }
  178. return medfee.toFixed(2)
  179. },GetHiFobPay(row){
  180. let medfee = 0
  181. for(let i = 0; i < row.orders.length; i++){
  182. medfee = medfee + row.orders[i].hifob_pay
  183. }
  184. return medfee.toFixed(2)
  185. },GetPreselfpaAmt(row){
  186. let medfee = 0
  187. for(let i = 0; i < row.orders.length; i++){
  188. medfee = medfee + row.orders[i].preselfpay_amt
  189. }
  190. return medfee.toFixed(2)
  191. },GetOverlmtSelfPay(row){
  192. let medfee = 0
  193. for(let i = 0; i < row.orders.length; i++){
  194. medfee = medfee + row.orders[i].overlmt_self_pay
  195. }
  196. return medfee.toFixed(2)
  197. },GetFulamtOwnpayAmt(row){
  198. let medfee = 0
  199. for(let i = 0; i < row.orders.length; i++){
  200. medfee = medfee + row.orders[i].fulamt_ownpay_amt
  201. }
  202. return medfee.toFixed(2)
  203. },GetMafPay(row){
  204. let medfee = 0
  205. for(let i = 0; i < row.orders.length; i++){
  206. medfee = medfee + row.orders[i].maf_pay
  207. }
  208. return medfee.toFixed(2)
  209. },GetHifesPay(row){
  210. let medfee = 0
  211. for(let i = 0; i < row.orders.length; i++){
  212. medfee = medfee + row.orders[i].hifes_pay
  213. }
  214. return medfee.toFixed(2)
  215. },GetHifmiPay(row){
  216. let medfee = 0
  217. for(let i = 0; i < row.orders.length; i++){
  218. medfee = medfee + row.orders[i].hifmi_pay
  219. }
  220. return medfee.toFixed(2)
  221. },GetInscpScpAmt(row){
  222. let medfee = 0
  223. for(let i = 0; i < row.orders.length; i++){
  224. medfee = medfee + row.orders[i].inscp_scp_amt
  225. }
  226. return medfee.toFixed(2)
  227. },GetOthPay(row){
  228. let medfee = 0
  229. for(let i = 0; i < row.orders.length; i++){
  230. medfee = medfee + row.orders[i].oth_pay
  231. }
  232. return medfee.toFixed(2)
  233. },GetCvlservPay(row){
  234. let medfee = 0
  235. for(let i = 0; i < row.orders.length; i++){
  236. medfee = medfee + row.orders[i].cvlserv_pay
  237. }
  238. return medfee.toFixed(2)
  239. },
  240. change(id,desc,type){
  241. let params = {
  242. id: id,
  243. desc: desc,
  244. change_type: type
  245. }
  246. changeOrderDesc(params).then(response => {
  247. if (response.data.state == 0) {
  248. this.$message.error(response.data.msg)
  249. } else {
  250. this.$message.success(response.data.data.msg)
  251. }
  252. })
  253. },
  254. getTimes(time) {
  255. return uParseTime(time, '{y}-{m}-{d}')
  256. },
  257. objectSpanMethod({ row, column, rowIndex, columnIndex }) {
  258. if (columnIndex === 0) {
  259. if (rowIndex % 2 === 0) {
  260. return {
  261. rowspan: 2,
  262. colspan: 1
  263. }
  264. } else {
  265. return {
  266. rowspan: 0,
  267. colspan: 0
  268. }
  269. }
  270. }
  271. },
  272. unique(arr) {
  273. const res = new Map()
  274. return arr.filter((arr) => !res.has(arr.id) && res.set(arr.id, 1))
  275. },getSickName(sick_id){
  276. let name = ""
  277. for(let i = 0;i < this.sick.length;i++){
  278. if(sick_id == this.sick[i].id){
  279. name = this.sick[i].class_name + "(" + this.sick[i].content_code +")"
  280. }
  281. }
  282. return name
  283. },getTypeName(row){
  284. let name = ""
  285. if(row.insutype == '390'){
  286. // let a = config.mdtrtarea_admvs.slice(0, 4); //就医地前4位编码
  287. let a = this.config.mdtrtarea_admvs.slice(0, 3); //就医地前3位编码
  288. // let aa= row.his.insuplc_admdvs.slice(0, 4); //参保地前4位编码
  289. let b= row.his.insuplc_admdvs.slice(0, 3); //参保地前3位编码
  290. if(a == b){
  291. name = "本地城乡"
  292. }else{
  293. name = "异地城乡"
  294. }
  295. }else if(row.insutype == '310'){
  296. // let c = config.mdtrtarea_admvs.slice(0, 4); //就医地前4位编码
  297. let a = this.config.mdtrtarea_admvs.slice(0, 3); //就医地前3位编码
  298. // let d= row.his.insuplc_admdvs.slice(0, 4); //参保地前4位编码
  299. let b= row.his.insuplc_admdvs.slice(0, 3); //参保地前3位编码
  300. if(a == b){
  301. name = "本地职工"
  302. }else{
  303. name = "异地职工"
  304. }
  305. }else{
  306. name = "其他"
  307. }
  308. return name
  309. },getName(id){
  310. var name = ""
  311. var options = this.$store.getters.insuplc_admdvs
  312. for(let i = 0; i < options.length; i++){
  313. if(id == options[i].value){
  314. name = options[i].label
  315. }
  316. }
  317. return name
  318. },
  319. changeDate() {
  320. this.getSummarySettleList()
  321. },
  322. changeItem() {
  323. this.getSummarySettleList()
  324. },
  325. searchAction() {
  326. this.item_type = '0'
  327. this.getSummarySettleList()
  328. },
  329. getSummarySettleList() {
  330. let start_time = this.chargeDate[0]
  331. let end_time = this.chargeDate[1]
  332. let params = {
  333. start_time: start_time,
  334. end_time: end_time,
  335. type: this.item_type,
  336. keyword: this.keywords,
  337. s_type:2,
  338. }
  339. this.settle_loading = true
  340. GetSummarySettle(params).then(response => {
  341. if (response.data.state == 0) {
  342. this.settle_loading = false
  343. this.$message.error(response.data.msg)
  344. return false
  345. } else {
  346. this.settle_loading = false
  347. this.tableData = []
  348. this.config = response.data.data.config
  349. this.sick = response.data.data.sick
  350. let data = response.data.data.patients
  351. this.tableData = data
  352. console.log( this.tableData)
  353. }
  354. })
  355. }, uniqueProjectAndAdvice(array) {
  356. // res用来存储结果
  357. var res = []
  358. for (var i = 0, arrayLen = array.length; i < arrayLen; i++) {
  359. for (var j = 0, resLen = res.length; j < resLen; j++) {
  360. if (array[i].item_id === res[j].item_id && array[i].price === res[j].price) {
  361. break
  362. }
  363. }
  364. // 如果array[i]是唯一的,那么执行完循环,j等于resLen
  365. if (j === resLen) {
  366. res.push(array[i])
  367. }
  368. }
  369. return res
  370. }, sort(arr) {
  371. for (var i = 0; i < arr.length - 1; i++) {
  372. for (var j = 0; j < arr.length - i - 1; j++) {
  373. if (arr[j].patient_id > arr[j + 1].patient_id) {// 相邻元素两两对比
  374. var hand = arr[j]
  375. arr[j] = arr[j + 1]
  376. arr[j + 1] = hand
  377. }
  378. }
  379. }
  380. return arr
  381. }, handleSpanTempArr() {
  382. this.tempArr = []
  383. for (let i = 0; i < this.tableData.length; i++) {
  384. if (i === 0) {
  385. this.tempArr.push(1)
  386. this.pos = 0
  387. } else {
  388. // 判断当前元素与上一个元素是否相同
  389. if (this.tableData[i].patient_id === this.tableData[i - 1].patient_id) {
  390. this.tempArr[this.pos] += 1
  391. this.tempArr.push(0)
  392. } else {
  393. this.tempArr.push(1)
  394. this.pos = i
  395. }
  396. }
  397. }
  398. let sameRowArr = [], sIdx = 0
  399. this.tableData.forEach((item, index) => {
  400. item.index = index
  401. if (index === 0) {
  402. sameRowArr.push([index])
  403. } else {
  404. if (item.patient_id === this.tableData[index - 1].patient_id) {
  405. sameRowArr[sIdx].push(index)
  406. } else {
  407. sIdx = sIdx + 1
  408. sameRowArr.push([index])
  409. }
  410. }
  411. })
  412. this.sameRowArr = sameRowArr
  413. }, merge({ row, column, rowIndex, columnIndex }) {
  414. if (columnIndex === 0) {
  415. const _row = this.tempArr[rowIndex]
  416. const _col = _row > 0 ? 1 : 0
  417. return {
  418. rowspan: _row,
  419. colspan: _col
  420. }
  421. }
  422. },export_detail_two(){
  423. let start_time = this.chargeDate[0]
  424. let end_time = this.chargeDate[1]
  425. let params = {
  426. start_time: start_time,
  427. end_time: end_time,
  428. }
  429. // this.settle_loading = true
  430. newsummary(params).then(response => {
  431. if (response.data.state == 0) {
  432. this.settle_loading = false
  433. this.$message.error(response.data.msg)
  434. return false
  435. } else {
  436. let org_info = response.data.data.org_info
  437. let result = response.data.data.result
  438. let list = []
  439. for (let i = 0; i < result.length; i++) {
  440. let order = result[i]
  441. let name = order.PsnName
  442. let type_name = ""
  443. if(order.TypeName == '城乡'){
  444. // let c = this.config.mdtrtarea_admvs.slice(0, 4); //就医地前4位编码
  445. let a = org_info.mdtrtarea_admvs.slice(0, 3); //就医地前3位编码
  446. let e = org_info.mdtrtarea_admvs.slice(0, 2); //就医地前3位编码
  447. let f= order.CanBaoDi.slice(0, 2); //参保地前4位编码
  448. let b= order.CanBaoDi.slice(0, 3); //参保地前3位编码
  449. if(a == b){
  450. type_name = "本地城乡"
  451. }else{
  452. if(e == f){
  453. type_name = "省内异地城乡"
  454. }else{
  455. type_name = "省外异地城乡"
  456. }
  457. }
  458. }else if(order.TypeName == '职工'){
  459. // let c = this.config.mdtrtarea_admvs.slice(0, 4); //就医地前4位编码
  460. let a = this.config.mdtrtarea_admvs.slice(0, 3); //就医地前3位编码
  461. let e = this.config.mdtrtarea_admvs.slice(0, 2); //就医地前3位编码
  462. let f= order.CanBaoDi.slice(0, 2); //参保地前4位编码
  463. // let d= row.his.insuplc_admdvs.slice(0, 4); //参保地前4位编码
  464. let b= order.CanBaoDi.slice(0, 3); //参保地前3位编码
  465. if(a == b){
  466. type_name = "本地职工"
  467. }else{
  468. if (e == f){
  469. type_name = "省内异地职工"
  470. }else{
  471. type_name = "省外异地职工"
  472. }
  473. }
  474. }else{
  475. type_name = "自费"
  476. }
  477. let total = order.Total
  478. let xt = order.XtCount
  479. let xl = order.XlCount
  480. let gl = order.GlCount
  481. let obj = {
  482. '患者姓名': name,
  483. '类型': type_name,
  484. "合计次数": total,
  485. '血透': xt,
  486. "血滤": xl,
  487. '灌流': gl,
  488. "西药费":order.WesternMedicineFee,
  489. "中成药费":order.ChinesePatentMedicineFee,
  490. '耗材费': order.HealthMaterialsFee,
  491. '挂号费': order.RegistrationFee,
  492. '治疗费': order.TreatmentFee,
  493. '检查费': order.ExaminationFee,
  494. '化验费': order.LaboratoryFee,
  495. '护理费': order.NursingFee,
  496. '其他费': order.OtherFee,
  497. '床位费': order.BedsFee,
  498. '诊察费': order.ConsultationFee,
  499. '中药饮片费': order.ChineseMedicineFee,
  500. '一般诊疗费': order.GeneralTreatmentFee,
  501. '合计': order.TotalMedicalFee,
  502. '自费金额': order.SelfPay,
  503. '个人账户支付': order.AcctPay,
  504. '退费': order.Return,
  505. '优惠': order.YouHui,
  506. '应收': order.YingShou,
  507. '挂账': order.GuaZhang,
  508. '冲账': order.ChongZhang,
  509. '实收': order.ShiShou,
  510. '已收': order.YiShou,
  511. }
  512. list.push(obj)
  513. }
  514. if(list.length > 0){
  515. import('@/vendor/Export2Excel').then(excel => {
  516. const tHeader = ['患者姓名', '类型', "合计次数", '血透', '血滤', "灌流", "西药费", "中成药费", '耗材费', '挂号费', '治疗费', '检查费', '化验费', '护理费', "其他费", "床位费", "诊察费", "中药饮片费", "一般诊疗费", "合计", "自费金额", '个人账户支付', '退费', "优惠", "应收", "挂账", "冲账", "实收", "已收"]
  517. const filterVal = ['患者姓名', '类型', "合计次数", '血透', '血滤', "灌流", "西药费", "中成药费", '耗材费', '挂号费', '治疗费', '检查费', '化验费', '护理费', "其他费", "床位费", "诊察费", "中药饮片费", "一般诊疗费", "合计", "自费金额", '个人账户支付', '退费', "优惠", "应收", "挂账", "冲账", "实收", "已收"]
  518. const data = this.formatJson(filterVal, list)
  519. excel.export_json_to_excel({
  520. header: tHeader,
  521. data,
  522. filename: '收入统计'
  523. })
  524. })
  525. }
  526. }
  527. })
  528. },
  529. export_detail() {
  530. let list = []
  531. for (let i = 0; i < this.tableData.length; i++) {
  532. let order = this.tableData[i]
  533. let name = order.name
  534. let obj = {
  535. '患者姓名': name,
  536. }
  537. list.push(obj)
  538. }
  539. import('@/vendor/Export2Excel').then(excel => {
  540. const tHeader = [ '患者姓名']
  541. const filterVal = [ '患者姓名']
  542. const data = this.formatJson(filterVal, list)
  543. excel.export_json_to_excel1({
  544. header: tHeader,
  545. data,
  546. filename: '汇总',
  547. ref:this.$refs['tables'].$el
  548. })
  549. })
  550. }, formatJson(filterVal, jsonData) {
  551. return jsonData.map(v => filterVal.map(j => v[j]))
  552. }
  553. },
  554. created() {
  555. this.getSummarySettleList()
  556. }
  557. }
  558. </script>