YiJiXiangMuLuRu.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <template>
  2. <el-container>
  3. <el-aside width="195px">
  4. <HuoQuMuBan @selectionFeiYong="xuanZeXiangMuTable"></HuoQuMuBan>
  5. </el-aside>
  6. <el-main>
  7. <el-button icon="StarOff" type="warning" @click="baoCunMuBanDialog = true">存模板</el-button>
  8. <el-button icon="Upload" type="primary" @click="shangChuanXiangMu">保存</el-button>
  9. <el-button icon="Plus" type="success" @click="xinZhengXiangMuDialog = true">新增</el-button>
  10. <el-select v-model="zhiXingKeShi" filterable style="width: 120px; margin: 0px 10px 0px 10px">
  11. <el-option v-for="item in deptData" :key="item.code" :label="item.name" :value="item.code">
  12. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  13. <el-divider direction="vertical"></el-divider>
  14. <span>{{ item.name }}</span></el-option
  15. >
  16. </el-select>
  17. <el-button icon="Edit" type="warning" @click="xieGaiZhiXingKeShi">修改执行科室</el-button>
  18. <span v-if="panDuanSFWeiShouShuShi()">
  19. 病区:
  20. <el-select v-model="queryWard" filterable style="width: 120px" @change="getBingQuDuiYingKeShiChange">
  21. <el-option v-for="item in wardData" :key="item.code" :label="item.name" :value="item.code">
  22. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  23. <el-divider direction="vertical"></el-divider>
  24. <span>{{ item.name }}</span></el-option
  25. > </el-select
  26. >小科室:
  27. <el-select v-model="queryDept" filterable style="width: 120px">
  28. <el-option v-for="item in xiaoKeShiList" :key="item.code" :label="item.name" :value="item.code">
  29. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  30. <el-divider direction="vertical"></el-divider>
  31. <span>{{ item.name }}</span></el-option
  32. >
  33. </el-select>
  34. 手术编码:
  35. <el-input v-model="ssCode" clearable placeholder="请输入手术编码" style="width: 120px"></el-input>
  36. </span>
  37. <el-tag type="danger"> 项目总价:{{ xiangMuZongJia }}</el-tag>
  38. <el-table :data="feiYongShuJu" :height="tableHeight - 27" highlight-current-row stripe style="margin-top: 10px">
  39. <el-table-column label="录入信息">
  40. <el-table-column label="是否自费" width="130">
  41. <template #default="scope">
  42. <el-switch
  43. v-model="scope.row.ybSelfFlag"
  44. :active-value="1"
  45. :inactive-value="0"
  46. active-color="#ff4949"
  47. active-text="自费"
  48. inactive-color="#13ce66"
  49. inactive-text="医保"
  50. ></el-switch>
  51. </template>
  52. </el-table-column>
  53. <el-table-column label="医生" width="70px">
  54. <template #default="scope">
  55. <el-select v-model="scope.row.doctorCode" :remote-method="remoteMethodRenYuan" clearable filterable remote
  56. style="width: 100px">
  57. <el-option v-for="item in renYuanList" :key="item.code" :label="item.name" :value="item.code">
  58. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  59. <el-divider direction="vertical"></el-divider>
  60. <span>{{ item.name }}</span>
  61. </el-option>
  62. </el-select>
  63. </template>
  64. </el-table-column>
  65. <el-table-column label="项目编码" prop="chargeCodeMx"></el-table-column>
  66. <el-table-column label="名称" prop="chargeName"></el-table-column>
  67. <el-table-column label="执行科室" prop="deptCode">
  68. <template #default="scope">
  69. <el-select v-model="scope.row.deptCode" filterable style="width: 90%">
  70. <el-option v-for="item in deptData" :key="item.code" :label="item.name" :value="item.code">
  71. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  72. <el-divider direction="vertical"></el-divider>
  73. <span>{{ item.name }}</span></el-option
  74. >
  75. </el-select>
  76. </template>
  77. </el-table-column>
  78. <el-table-column label="单价" prop="chargeAmount"></el-table-column>
  79. <el-table-column label="数量" prop="amount" width="130">
  80. <template #default="scope">
  81. <!--precision 限制输入的精度 0 就是不带任何一位小数点 -->
  82. <el-input-number v-model="scope.row.amount" :min="0" :precision="1"
  83. style="width: 120px"></el-input-number>
  84. </template>
  85. </el-table-column>
  86. </el-table-column>
  87. <el-table-column label="金额">
  88. <template #default="scope">
  89. {{ (scope.row.chargeAmount * scope.row.amount).toFixed(2) }}
  90. </template>
  91. </el-table-column>
  92. <el-table-column label="账单码" prop="billItemName"></el-table-column>
  93. <el-table-column label="操作">
  94. <template #default="scope">
  95. <el-button type="danger" @click="shanChuXiangMuClick(scope.$index)">删除</el-button>
  96. </template>
  97. </el-table-column>
  98. </el-table>
  99. </el-main>
  100. <el-dialog v-model="xinZhengXiangMuDialog" :width="1500" title="新增">
  101. 搜索:
  102. <el-input v-model="chargeCodePy" style="width: 140px" @keyup.enter="rmChargePyCode"></el-input>
  103. <el-divider direction="vertical"></el-divider>
  104. <el-button type="primary" @click="rmChargePyCode">查询</el-button>
  105. <el-divider direction="vertical"></el-divider>
  106. <el-switch
  107. v-model="xiangMuHuoYaoPinFlag"
  108. :active-value="1"
  109. :inactive-value="0"
  110. active-color="#409EFF"
  111. active-text="药品"
  112. inactive-color="#13ce66"
  113. inactive-text="项目"
  114. ></el-switch>
  115. <el-divider direction="vertical"></el-divider>
  116. <el-table
  117. :data="
  118. xiangMuHuoYaoPinShuJu.data.slice(
  119. (xiangMuHuoYaoPinShuJu.currentPage - 1) * xiangMuHuoYaoPinShuJu.pageSize,
  120. xiangMuHuoYaoPinShuJu.currentPage * xiangMuHuoYaoPinShuJu.pageSize
  121. )
  122. "
  123. :height="tableHeight / 1.2"
  124. >
  125. <el-table-column label="操作" width="40">
  126. <template #default="scope">
  127. <el-button text @click="danGeXiangMuBaoCun(scope.row)" type="primary">添加</el-button>
  128. </template>
  129. </el-table-column>
  130. <el-table-column label="项目编码" prop="chargeCodeMx"></el-table-column>
  131. <el-table-column label="项目名称" prop="chargeName"></el-table-column>
  132. <el-table-column label="国家编码" prop="nationalCode"></el-table-column>
  133. <el-table-column label="国家名称" prop="nationalName"></el-table-column>
  134. <el-table-column label="单位" prop="spec"></el-table-column>
  135. <el-table-column label="执行科室" prop="deptCode">
  136. <template #default="scope">
  137. <el-select v-model="scope.row.deptCode" filterable style="width: 90%">
  138. <el-option v-for="item in deptData" :key="item.code" :label="item.name" :value="item.code">
  139. <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
  140. <el-divider direction="vertical"></el-divider>
  141. <span>{{ item.name }}</span></el-option
  142. >
  143. </el-select>
  144. </template>
  145. </el-table-column>
  146. <el-table-column label="单价" prop="chargeAmount"></el-table-column>
  147. <el-table-column label="数量" prop="amount">
  148. <template #default="scope">
  149. <el-input-number v-model="scope.row.amount" :min="1" :precision="1"></el-input-number>
  150. </template>
  151. </el-table-column>
  152. <el-table-column label="金额">
  153. <template #default="scope">
  154. {{ (scope.row.chargeAmount * scope.row.amount).toFixed(2) }}
  155. </template>
  156. </el-table-column>
  157. <el-table-column label="账单码" prop="billItemName"></el-table-column>
  158. <el-table-column label="规格" prop="descriptions" show-overflow-tooltip></el-table-column>
  159. <el-table-column v-if="xiangMuHuoYaoPinFlag === 1" label="库存" prop="stockAmount"></el-table-column>
  160. <el-table-column v-if="xiangMuHuoYaoPinFlag === 1" label="医保类型" prop="yblx"></el-table-column>
  161. </el-table>
  162. <el-pagination
  163. :current-page="xiangMuHuoYaoPinShuJu.currentPage"
  164. :page-size="xiangMuHuoYaoPinShuJu.pageSize"
  165. :total="xiangMuHuoYaoPinShuJu.data.length"
  166. background
  167. layout="total, sizes, prev, pager, next, jumper"
  168. @size-change="xinZhengSizeChange"
  169. @current-change="xinZhengCurrentChange"
  170. >
  171. </el-pagination>
  172. </el-dialog>
  173. <el-dialog v-model="baoCunMuBanDialog" title="保存模板">
  174. <el-row>
  175. <el-col :span="24">
  176. 模板名称:
  177. <el-input v-model="cunMuBanPojo.name" maxlength="15" show-word-limit @blur="zhuanPinYin"></el-input>
  178. </el-col>
  179. <el-col :span="12">
  180. 拼音码:
  181. <el-input v-model="cunMuBanPojo.pyCode" maxlength="8" show-word-limit></el-input>
  182. </el-col>
  183. <el-col :span="12">
  184. 五笔码:
  185. <el-input v-model="cunMuBanPojo.dcode" maxlength="8" show-word-limit></el-input>
  186. </el-col>
  187. <!-- <el-col :span="12"> 排序码:<el-input v-model="cunMuBanPojo.paiXu" maxlength="7" show-word-limit></el-input> </el-col> -->
  188. <el-col :span="12">
  189. <el-button icon="Upload" style="margin-top: 10px" type="primary" @click="baoCunMuBan">保存</el-button>
  190. </el-col>
  191. </el-row>
  192. </el-dialog>
  193. </el-container>
  194. </template>
  195. <script>
  196. import {computed, onMounted, ref, watch} from 'vue'
  197. import {
  198. getBingQuDuiYingKeShi,
  199. getDept,
  200. getMuBanXinXi,
  201. getPyCode,
  202. getWard,
  203. queryDanGeXiangMu,
  204. shangChuanMuBan,
  205. xiangMuFeiYongShangChuan
  206. } from '@/api/inpatient/xiang-mu-lu-ru'
  207. import {getRenYuan} from '../../api/public-api.js'
  208. import store from '@/store'
  209. import {getDatetime} from '@/utils/date'
  210. import {ElMessage, ElMessageBox} from 'element-plus'
  211. import {clone} from '@/utils/clone'
  212. import HuoQuMuBan from './HuoQuMuBan.vue'
  213. export default {
  214. components: {
  215. HuoQuMuBan,
  216. },
  217. props: {
  218. patient: {
  219. type: Object,
  220. },
  221. },
  222. setup(props, cxt) {
  223. const windowSize = store.state.app.windowSize
  224. const tableHeight = windowSize.h - 170
  225. const deptData = ref([])
  226. const wardData = ref([])
  227. // 手术编码
  228. const ssCode = ref('')
  229. const muBanCurrentPage = ref(1)
  230. const muBanPageSize = ref(10)
  231. const queryDept = ref('')
  232. const queryWard = ref('')
  233. const xiaoKeShiList = ref([])
  234. const muBanHandleCurrentChange = (val) => {
  235. muBanCurrentPage.value = val
  236. }
  237. // 获取模板信息
  238. const getMuBanXinXiClick = (row) => {
  239. getMuBanXinXi(row.name, row.opIdCode).then((res) => {
  240. muBanXiangQing.value = res
  241. })
  242. }
  243. // 获取模板的详情
  244. const muBanXiangQing = ref([])
  245. // 获取选择的数据
  246. const xuanZeXiangMuTable = (param) => {
  247. let val = param.val
  248. for (let i = 0; i < val.length; i++) {
  249. if (chargeCode.value.indexOf(val[i].chargeCodeMx) === -1) {
  250. chargeCode.value.push(val[i].chargeCodeMx)
  251. val[i].deptCode = store.state.user.info.deptCode
  252. feiYongShuJu.value.push(val[i])
  253. }
  254. }
  255. }
  256. const chargeCode = ref([])
  257. onMounted(() => {
  258. // 获取科室
  259. getDept().then((res) => {
  260. deptData.value = res
  261. })
  262. getWard().then((res) => {
  263. wardData.value = res
  264. })
  265. })
  266. const feiYongShuJu = ref([])
  267. const shangChuanXiangMu = () => {
  268. let shangChuanFeiYong = {
  269. // 这里又要反回来 就尼玛坑爹 我也不知道为什么
  270. dept: queryWard.value,
  271. ward: queryDept.value,
  272. inpatientNo: props.patient.inpatientNo,
  273. admissTimes: props.patient.admissTimes,
  274. zySerialNo: props.patient.zySerialNo,
  275. ssCode: ssCode.value,
  276. referPhysician: props.patient.referPhysician,
  277. list: feiYongShuJu.value,
  278. orderNo: 3,
  279. ledgerSn: props.patient.ledgerSn,
  280. }
  281. if (feiYongShuJu.value.length === 0) {
  282. return ElMessage.error('请先选择上传数据。')
  283. }
  284. //在此处上传
  285. ElMessageBox.confirm('共上传【' + feiYongShuJu.value.length + '】条', '请认真核对', {
  286. cancelButtonText: '取消',
  287. confirmButtonText: '确定',
  288. })
  289. .then(() => {
  290. xiangMuFeiYongShangChuan(shangChuanFeiYong).then(() => {
  291. feiYongShuJu.value = []
  292. chargeCode.value = []
  293. })
  294. })
  295. .catch(() => {
  296. })
  297. }
  298. const shanChuXiangMuClick = (val) => {
  299. feiYongShuJu.value.splice(val, 1)
  300. chargeCode.value.splice(val, 1)
  301. }
  302. // 新增项目或者药品
  303. const xinZhengXiangMuDialog = ref(false)
  304. // 判断查询药品还是项目
  305. const xiangMuHuoYaoPinFlag = ref(0)
  306. // 这个是远程查询数据后 保存
  307. const xiangMuHuoYaoPinShuJu = ref({
  308. currentPage: 1,
  309. pageSize: 20,
  310. data: [],
  311. })
  312. // 远程查询的
  313. const chargeCodePy = ref('')
  314. /**
  315. * 远程搜索
  316. */
  317. const rmChargePyCode = () => {
  318. if (chargeCodePy.value.length >= 2) {
  319. queryDanGeXiangMu(chargeCodePy.value, xiangMuHuoYaoPinFlag.value).then((res) => {
  320. xiangMuHuoYaoPinShuJu.value.data = res
  321. })
  322. }
  323. }
  324. // 单个费用
  325. const danGeFeiYong = ref([])
  326. const danGeXiangMuBaoCun = (val) => {
  327. let key
  328. if (xiangMuHuoYaoPinFlag.value === 1) {
  329. key = val.chargeCodeMx + val.serial
  330. } else {
  331. key = val.chargeCodeMx
  332. }
  333. if (chargeCode.value.indexOf(key) > -1) {
  334. return ElMessage.warning({
  335. message: '请勿重复录入',
  336. showClose: true,
  337. })
  338. } else {
  339. if (typeof val.deptCode === 'undefined') {
  340. val.deptCode = store.state.user.info.deptCode
  341. }
  342. feiYongShuJu.value.push(val)
  343. chargeCode.value.push(key)
  344. ElMessage.success({
  345. message: '添加成功',
  346. showClose: true,
  347. })
  348. }
  349. }
  350. const xiangMuZongJia = computed(() => {
  351. let sum = 0
  352. for (let i = 0; i < feiYongShuJu.value.length; i++) {
  353. sum += feiYongShuJu.value[i].chargeAmount * feiYongShuJu.value[i].amount
  354. }
  355. return sum.toFixed(2)
  356. })
  357. watch(
  358. () => props.patient,
  359. () => {
  360. // 这里刚好是反着的
  361. setTimeout(() => {
  362. queryWard.value = props.patient.admissDept
  363. getBingQuDuiYingKeShiChange()
  364. queryDept.value = props.patient.zkWard
  365. }, 200)
  366. }
  367. )
  368. // 以下是保存模板
  369. const baoCunMuBanDialog = ref(false)
  370. const cunMuBanPojo = ref({
  371. pyCode: '',
  372. dcode: '',
  373. name: '',
  374. paiXu: '',
  375. dept: '',
  376. deptCode: store.state.user.info.deptCode,
  377. list: [],
  378. })
  379. // 获取到保存模板的拼音码和五笔码
  380. const zhuanPinYin = () => {
  381. if (cunMuBanPojo.value.name !== '') {
  382. getPyCode(cunMuBanPojo.value.name).then((res) => {
  383. cunMuBanPojo.value.pyCode = res.pyCode
  384. cunMuBanPojo.value.dcode = res.wbCode
  385. })
  386. }
  387. }
  388. const baoCunMuBan = () => {
  389. if (feiYongShuJu.value.length === 0) {
  390. ElMessage.error({
  391. message: '请先选择项目',
  392. showClose: true,
  393. })
  394. return
  395. }
  396. if (cunMuBanPojo.value.name === '' || cunMuBanPojo.value.pyCode === '' || cunMuBanPojo.value.dcode === '') {
  397. ElMessage.error({
  398. message: '模板名称,拼音码,五笔码不能为空',
  399. showClose: true,
  400. })
  401. return
  402. }
  403. cunMuBanPojo.value.list = clone(feiYongShuJu.value)
  404. // 开始上传
  405. shangChuanMuBan(cunMuBanPojo.value).then(() => {
  406. cunMuBanPojo.value = {}
  407. })
  408. }
  409. // 根据病人的科室来获取
  410. const getBingQuDuiYingKeShiChange = () => {
  411. getBingQuDuiYingKeShi(queryWard.value).then((res) => {
  412. xiaoKeShiList.value = res
  413. queryDept.value = ''
  414. })
  415. }
  416. const zhiXingKeShi = ref(store.state.user.info.deptCode)
  417. const xieGaiZhiXingKeShi = () => {
  418. for (let i = 0; i < feiYongShuJu.value.length; i++) {
  419. feiYongShuJu.value[i].deptCode = zhiXingKeShi.value
  420. }
  421. }
  422. // 新增中的分页 事件
  423. const xinZhengSizeChange = (val) => {
  424. xiangMuHuoYaoPinShuJu.value.pageSize = val
  425. }
  426. const xinZhengCurrentChange = (val) => {
  427. xiangMuHuoYaoPinShuJu.value.currentPage = val
  428. }
  429. watch(
  430. () => xiangMuHuoYaoPinFlag.value,
  431. () => {
  432. xiangMuHuoYaoPinShuJu.value.data = []
  433. }
  434. )
  435. const renYuanList = ref([])
  436. // 搜索 医生工号
  437. const remoteMethodRenYuan = (val) => {
  438. if (val.length >= 2)
  439. getRenYuan(val).then((res) => {
  440. renYuanList.value = res
  441. })
  442. }
  443. return {
  444. tableHeight,
  445. muBanCurrentPage,
  446. muBanHandleCurrentChange,
  447. muBanPageSize,
  448. getMuBanXinXiClick,
  449. muBanXiangQing,
  450. xuanZeXiangMuTable,
  451. deptData,
  452. feiYongShuJu,
  453. getDatetime,
  454. shangChuanXiangMu,
  455. shanChuXiangMuClick,
  456. xinZhengXiangMuDialog,
  457. xiangMuHuoYaoPinFlag,
  458. xiangMuHuoYaoPinShuJu,
  459. chargeCodePy,
  460. rmChargePyCode,
  461. danGeFeiYong,
  462. danGeXiangMuBaoCun,
  463. wardData,
  464. queryWard,
  465. queryDept,
  466. ssCode,
  467. xiangMuZongJia,
  468. baoCunMuBanDialog,
  469. cunMuBanPojo,
  470. zhuanPinYin,
  471. baoCunMuBan,
  472. getBingQuDuiYingKeShiChange,
  473. panDuanSFWeiShouShuShi,
  474. zhiXingKeShi,
  475. xieGaiZhiXingKeShi,
  476. xiaoKeShiList,
  477. xinZhengCurrentChange,
  478. xinZhengSizeChange,
  479. remoteMethodRenYuan,
  480. renYuanList,
  481. }
  482. },
  483. }
  484. function panDuanSFWeiShouShuShi() {
  485. let dept = store.state.user.info.deptCode
  486. if (dept === '1300000' || dept === '3100000' || dept === '1300010') {
  487. return true
  488. }
  489. return false
  490. }
  491. </script>
  492. <style></style>