YiJiXiangMuLuRu.vue 17 KB

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