index.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703
  1. <template>
  2. <div class="layout_display_flex_y">
  3. <div class="obviousBox" style="margin-bottom: 6px;">
  4. <searchArea :searchData="searchData" @submit="searchByForm"></searchArea>
  5. </div>
  6. <div class="layout_display_flex_y" style="height: 80%">
  7. <el-table
  8. :data="ypClassData.slice(pageSizeClass * (currentPageClass - 1), pageSizeClass * currentPageClass)"
  9. border style="width: 100%" height="100%" stripe highlight-current-row class="ypClassTable normal-size">
  10. <el-table-column prop="code" label="调拨单号">
  11. </el-table-column>
  12. <el-table-column prop="name" label="调拨日期">
  13. </el-table-column>
  14. <el-table-column prop="name" label="制单人员">
  15. </el-table-column>
  16. <el-table-column prop="name" label="接收人员">
  17. </el-table-column>
  18. <el-table-column prop="name" label="调入科室">
  19. </el-table-column>
  20. <el-table-column prop="name" label="调出科室">
  21. </el-table-column>
  22. <el-table-column prop="name" label="状态">
  23. <template #default="scope">
  24. {{ }}
  25. </template>
  26. </el-table-column>
  27. <el-table-column fixed="right" label="操作" min-width="180" width="180" center>
  28. <template #default="scope">
  29. <el-button type="primary" size="small" @click="editYpClass(scope.row)">查看</el-button>
  30. </template>
  31. </el-table-column>
  32. </el-table>
  33. </div>
  34. <div>
  35. <el-pagination :current-page="currentPageClass" :page-size="pageSizeClass" :page-sizes="[10, 15, 20, 25]"
  36. :total="ypClassData.length" layout="total, sizes, prev, pager, next, jumper" style="margin-top: 5px"
  37. @size-change="handleSizeChangeClass" @current-change="handleCurrentChangeClass">
  38. </el-pagination>
  39. </div>
  40. </div>
  41. <el-dialog v-model="showDialog" :close-on-click-modal="false" :close-on-press-escape="false"
  42. :title="'调拨接收'" width="100%" destroy-on-close fullscreen>
  43. <!-- <YpPrintName :ypPrintNameDetail="ypPrintNameDetail" @closeYpPrintNameEditFor="closeYpPrintName" /> -->
  44. <info :currentEditCode="currentEditCode"></info>
  45. </el-dialog>
  46. </template>
  47. <script setup name="YpDict">
  48. import { ref, onMounted, nextTick } from 'vue'
  49. import { ElMessage, ElMessageBox } from 'element-plus'
  50. import {
  51. selectYpClass, saveYpClass, delYpClassByCode,
  52. selectDrugKind,
  53. selectYpDosage,
  54. selectYpUnit,
  55. selectYpChargeGroup,
  56. selectYpVisibleFlag,
  57. selectYpSupply,
  58. selectYpManuFactory,
  59. } from '@/api/yp-dict/yp-dict-base.js'
  60. import searchArea from '@/components/searchArea/index.vue';
  61. import info from '@/views/logisticsMaterials/transfer/transferReceipt/info.vue';
  62. const editableTabsValue = ref('ypClass')
  63. const msgTip = '分类编码(code)有变更,原始字典记录存在关联,请谨慎做更改,是否确认!!!'
  64. const delFlagOptions = [{ code: '0', name: '启用' }, { code: '1', name: '停用' }]
  65. const searchData = ref([
  66. {
  67. label: '调拨单号',
  68. key: 'vehicleName',
  69. type: 'input',
  70. value: '',
  71. clearable: true,
  72. },
  73. {
  74. label: '调入科室',
  75. key: 'vehicleType',
  76. type: 'select',
  77. value: '',
  78. optionsData: [ //(0:轿车,1:面包车,2:越野车,3:吉普车,4:巴士,5:卡车)
  79. {
  80. label: '轿车',
  81. value: '0',
  82. },
  83. {
  84. label: '面包车',
  85. value: '1',
  86. },
  87. ],
  88. },
  89. {
  90. label: '调出科室',
  91. key: 'vehicleType',
  92. type: 'select',
  93. value: '',
  94. optionsData: [ //(0:轿车,1:面包车,2:越野车,3:吉普车,4:巴士,5:卡车)
  95. {
  96. label: '轿车',
  97. value: '0',
  98. },
  99. {
  100. label: '面包车',
  101. value: '1',
  102. },
  103. ],
  104. },
  105. {
  106. label: '调拨日期',
  107. key: 'vehicleType',
  108. type: 'datePicker',
  109. value: {}
  110. },
  111. {
  112. label: '制单人员',
  113. key: 'vehicleName',
  114. type: 'input',
  115. value: '',
  116. clearable: true,
  117. },
  118. ])
  119. const pageSizeClass = ref(20)
  120. const currentPageClass = ref(1)
  121. const handleSizeChangeClass = (val) => {
  122. pageSizeClass.value = val
  123. }
  124. const handleCurrentChangeClass = (val) => {
  125. currentPageClass.value = val
  126. }
  127. const pageSizeKind = ref(20)
  128. const currentPageKind = ref(1)
  129. const pageSizeDosage = ref(20)
  130. const currentPageDosage = ref(1)
  131. const pageSizeUnit = ref(20)
  132. const currentPageUnit = ref(1)
  133. const pageSizeSupply = ref(20)
  134. const currentPageSupply = ref(1)
  135. const pageSizeManuFactory = ref(20)
  136. const currentPageManuFactory = ref(1)
  137. const ypClassData = ref([])
  138. const drugKindData = ref([])
  139. const ypDosageData = ref([])
  140. const ypUnitData = ref([])
  141. const ypChargeGroupData = ref([])
  142. const visibleFlagData = ref([])
  143. const ypSupplyData = ref([])
  144. const ypManuFactoryData = ref([])
  145. let showDialog = ref(false)
  146. const text = ref('')
  147. onMounted(() => {
  148. nextTick(() => {
  149. queryYpClass()
  150. })
  151. })
  152. //搜索表单方法
  153. const searchByForm = (form) => {
  154. console.log("search", form)
  155. }
  156. // 查询药品字典-药性字典
  157. const queryYpClass = () => {
  158. selectYpClass(text.value)
  159. .then((res) => {
  160. res.forEach(row => {
  161. // 是否标记
  162. row['isEdit'] = false
  163. // 是否新增
  164. row['isAdd'] = false
  165. })
  166. ypClassData.value = res
  167. })
  168. .catch(() => {
  169. ypClassData.value = []
  170. })
  171. }
  172. // 查询药品字典-药品分类字典
  173. const queryDrugKind = () => {
  174. selectDrugKind(text.value)
  175. .then((res) => {
  176. res.forEach(row => {
  177. // 是否标记
  178. row['isEdit'] = false
  179. // 是否新增
  180. row['isAdd'] = false
  181. })
  182. drugKindData.value = res
  183. })
  184. .catch(() => {
  185. drugKindData.value = []
  186. })
  187. }
  188. // 查询药品字典-药品剂型字典
  189. const queryYpDosage = () => {
  190. selectYpDosage(text.value)
  191. .then((res) => {
  192. res.forEach(row => {
  193. // 是否标记
  194. row['isEdit'] = false
  195. // 是否新增
  196. row['isAdd'] = false
  197. })
  198. ypDosageData.value = res
  199. })
  200. .catch(() => {
  201. ypDosageData.value = []
  202. })
  203. }
  204. // 查询药品字典-药品单位字典
  205. const queryYpUnit = () => {
  206. selectYpUnit(text.value)
  207. .then((res) => {
  208. res.forEach(row => {
  209. // 是否标记
  210. row['isEdit'] = false
  211. // 是否新增
  212. row['isAdd'] = false
  213. })
  214. ypUnitData.value = res
  215. })
  216. .catch(() => {
  217. ypUnitData.value = []
  218. })
  219. }
  220. // 查询药品字典-药品费别字典
  221. const queryYpChargeGroup = () => {
  222. selectYpChargeGroup(text.value)
  223. .then((res) => {
  224. res.forEach(row => {
  225. // 是否标记
  226. row['isEdit'] = false
  227. // 是否新增
  228. row['isAdd'] = false
  229. })
  230. ypChargeGroupData.value = res
  231. })
  232. .catch(() => {
  233. ypChargeGroupData.value = []
  234. })
  235. }
  236. // 查询药房药品停用情况
  237. const flagFilter = ref('')
  238. const queryVisibleFlag = () => {
  239. selectYpVisibleFlag(text.value, flagFilter.value)
  240. .then((res) => {
  241. res.forEach(row => {
  242. // 是否标记
  243. row['isEdit'] = false
  244. // 是否新增
  245. row['isAdd'] = false
  246. })
  247. visibleFlagData.value = res
  248. })
  249. .catch(() => {
  250. visibleFlagData.value = []
  251. })
  252. }
  253. // 查询药品字典-药品厂家字典
  254. const queryYpSupply = () => {
  255. selectYpSupply(text.value)
  256. .then((res) => {
  257. res.forEach(row => {
  258. // 是否标记
  259. row['isEdit'] = false
  260. // 是否新增
  261. row['isAdd'] = false
  262. })
  263. ypSupplyData.value = res
  264. })
  265. .catch(() => {
  266. ypSupplyData.value = []
  267. })
  268. }
  269. // 查询药品字典-药品供应商字典
  270. const queryYpManuFactory = () => {
  271. selectYpManuFactory(text.value)
  272. .then((res) => {
  273. res.forEach(row => {
  274. // 是否标记
  275. row['isEdit'] = false
  276. // 是否新增
  277. row['isAdd'] = false
  278. })
  279. ypManuFactoryData.value = res
  280. })
  281. .catch(() => {
  282. ypManuFactoryData.value = []
  283. })
  284. }
  285. // 查询
  286. const queryItem = () => {
  287. if (editableTabsValue.value === 'ypClass') {
  288. queryYpClass()
  289. } else if (editableTabsValue.value === 'drugKind') {
  290. queryDrugKind()
  291. } else if (editableTabsValue.value === 'ypDosage') {
  292. queryYpDosage()
  293. } else if (editableTabsValue.value === 'ypUnit') {
  294. queryYpUnit()
  295. } else if (editableTabsValue.value === 'ypChargeGroup') {
  296. queryYpChargeGroup()
  297. } else if (editableTabsValue.value === 'visibleFlag') {
  298. queryVisibleFlag()
  299. } else if (editableTabsValue.value === 'ypSupply') {
  300. queryYpSupply()
  301. } else if (editableTabsValue.value === 'ypManuFactory') {
  302. queryYpManuFactory()
  303. }
  304. }
  305. // 新增行
  306. const onAddItem = () => {
  307. showDialog.value = true
  308. return
  309. if (editableTabsValue.value === 'ypClass') {
  310. let count
  311. if (ypClassData.value.length % pageSizeClass.value === 0) {
  312. count = Math.ceil(ypClassData.value.length / pageSizeClass.value) + 1
  313. } else {
  314. count = Math.ceil(ypClassData.value.length / pageSizeClass.value)
  315. }
  316. currentPageClass.value = count
  317. ypClassData.value.push({
  318. code: '',
  319. name: '',
  320. pyCode: '',
  321. dcode: '',
  322. delFlag: '',
  323. isEdit: true,
  324. isAdd: true,
  325. })
  326. const el = document.querySelector('.ypClassTable .el-scrollbar__wrap')
  327. const el2 = document.querySelector('.ypClassTable .el-table__body tbody')
  328. setTimeout(() => {
  329. const height = el2.clientHeight - el.clientHeight
  330. if (height > 0) {
  331. el.scrollTop = height
  332. }
  333. }, 100)
  334. } else if (editableTabsValue.value === 'drugKind') {
  335. let count
  336. if (drugKindData.value.length % pageSizeKind.value === 0) {
  337. count = Math.ceil(drugKindData.value.length / pageSizeKind.value) + 1
  338. } else {
  339. count = Math.ceil(drugKindData.value.length / pageSizeKind.value)
  340. }
  341. currentPageKind.value = count
  342. drugKindData.value.push({
  343. code: '',
  344. name: '',
  345. pyCode: '',
  346. dcode: '',
  347. ypType: '',
  348. mzBillCode: '',
  349. zyBillCode: '',
  350. isEdit: true,
  351. isAdd: true,
  352. })
  353. const el = document.querySelector('.drugKindTable .el-scrollbar__wrap')
  354. const el2 = document.querySelector('.drugKindTable .el-table__body tbody')
  355. setTimeout(() => {
  356. const height = el2.clientHeight - el.clientHeight
  357. if (height > 0) {
  358. el.scrollTop = height
  359. }
  360. }, 100)
  361. } else if (editableTabsValue.value === 'ypDosage') {
  362. let count
  363. if (ypDosageData.value.length % pageSizeDosage.value === 0) {
  364. count = Math.ceil(ypDosageData.value.length / pageSizeDosage.value) + 1
  365. } else {
  366. count = Math.ceil(ypDosageData.value.length / pageSizeDosage.value)
  367. }
  368. currentPageDosage.value = count
  369. ypDosageData.value.push({
  370. code: '',
  371. name: '',
  372. pyCode: '',
  373. dcode: '',
  374. dosaType: '',
  375. dosaRemark: '',
  376. orderNo: '',
  377. delFlag: '',
  378. ybCode: '',
  379. hnsybCode: '',
  380. isEdit: true,
  381. isAdd: true,
  382. })
  383. const el = document.querySelector('.ypDosageTable .el-scrollbar__wrap')
  384. const el2 = document.querySelector('.ypDosageTable .el-table__body tbody')
  385. setTimeout(() => {
  386. const height = el2.clientHeight - el.clientHeight
  387. if (height > 0) {
  388. el.scrollTop = height
  389. }
  390. }, 100)
  391. } else if (editableTabsValue.value === 'ypUnit') {
  392. let count
  393. if (ypUnitData.value.length % pageSizeUnit.value === 0) {
  394. count = Math.ceil(ypUnitData.value.length / pageSizeUnit.value) + 1
  395. } else {
  396. count = Math.ceil(ypUnitData.value.length / pageSizeUnit.value)
  397. }
  398. currentPageUnit.value = count
  399. ypUnitData.value.push({
  400. code: '',
  401. name: '',
  402. pyCode: '',
  403. dcode: '',
  404. orderNo: '',
  405. delFlag: '',
  406. refundableFees: '',
  407. isEdit: true,
  408. isAdd: true,
  409. })
  410. const el = document.querySelector('.ypUnitTable .el-scrollbar__wrap')
  411. const el2 = document.querySelector('.ypUnitTable .el-table__body tbody')
  412. setTimeout(() => {
  413. const height = el2.clientHeight - el.clientHeight
  414. if (height > 0) {
  415. el.scrollTop = height
  416. }
  417. }, 100)
  418. } else if (editableTabsValue.value === 'ypChargeGroup') {
  419. ypChargeGroupData.value.push({
  420. code: '',
  421. name: '',
  422. pyCode: '',
  423. dcode: '',
  424. delFlag: '',
  425. isEdit: true,
  426. isAdd: true,
  427. })
  428. } else if (editableTabsValue.value === 'visibleFlag') {
  429. ElMessage({
  430. type: "warning",
  431. message: "不能新增药房药品停用,需先维护药品信息!",
  432. duration: 2500,
  433. showClose: true,
  434. });
  435. } else if (editableTabsValue.value === 'ypSupply') {
  436. let count
  437. if (ypSupplyData.value.length % pageSizeSupply.value === 0) {
  438. count = Math.ceil(ypSupplyData.value.length / pageSizeSupply.value) + 1
  439. } else {
  440. count = Math.ceil(ypSupplyData.value.length / pageSizeSupply.value)
  441. }
  442. currentPageSupply.value = count
  443. ypSupplyData.value.push({
  444. code: '',
  445. name: '',
  446. abbrName: '',
  447. address: '',
  448. zipCode: '',
  449. telNo: '',
  450. relName: '',
  451. busiRange: '',
  452. comment: '',
  453. useFlag: '',
  454. pyCode: '',
  455. dcode: '',
  456. delFlag: '',
  457. isEdit: true,
  458. isAdd: true,
  459. })
  460. const el = document.querySelector('.ypSupplyTable .el-scrollbar__wrap')
  461. const el2 = document.querySelector('.ypSupplyTable .el-table__body tbody')
  462. setTimeout(() => {
  463. const height = el2.clientHeight - el.clientHeight
  464. if (height > 0) {
  465. el.scrollTop = height
  466. }
  467. }, 100)
  468. } else if (editableTabsValue.value === 'ypManuFactory') {
  469. let count
  470. if (ypManuFactoryData.value.length % pageSizeManuFactory.value === 0) {
  471. count = Math.ceil(ypManuFactoryData.value.length / pageSizeManuFactory.value) + 1
  472. } else {
  473. count = Math.ceil(ypManuFactoryData.value.length / pageSizeManuFactory.value)
  474. }
  475. currentPageManuFactory.value = count
  476. ypManuFactoryData.value.push({
  477. code: '',
  478. name: '',
  479. abbrName: '',
  480. address: '',
  481. zipCode: '',
  482. telNo: '',
  483. relName: '',
  484. productRange: '',
  485. comment: '',
  486. useFlag: '',
  487. pyCode: '',
  488. dcode: '',
  489. delFlag: '',
  490. isEdit: true,
  491. isAdd: true,
  492. })
  493. const el = document.querySelector('.ypManuFactoryTable .el-scrollbar__wrap')
  494. const el2 = document.querySelector('.ypManuFactoryTable .el-table__body tbody')
  495. setTimeout(() => {
  496. const height = el2.clientHeight - el.clientHeight
  497. if (height > 0) {
  498. el.scrollTop = height
  499. }
  500. }, 100)
  501. }
  502. }
  503. // 药品字典-药性字典增删改存开始
  504. // 编辑
  505. const editYpClass = (row) => {
  506. showDialog.value = true
  507. return
  508. // 备份原始数据
  509. row['oldRow'] = JSON.parse(JSON.stringify(row))
  510. row.isEdit = true
  511. }
  512. // 取消
  513. const cancelYpClass = (row) => {
  514. // 如果是新增的数据
  515. if (row.isAdd) {
  516. ypClassData.value.splice(ypClassData.value.length - 1, 1)
  517. } else {
  518. // 不是新增的数据 还原数据
  519. for (const i in row.oldRow) {
  520. row[i] = row.oldRow[i]
  521. }
  522. }
  523. }
  524. // 保存
  525. const updateYpClass = (row) => {
  526. if (!row.code || !row.name) {
  527. ElMessage({
  528. type: "warning",
  529. message: "药性字典编码或名称不存在,请检查!",
  530. duration: 2500,
  531. showClose: true,
  532. });
  533. return
  534. }
  535. if (row.isAdd) {
  536. let fe = 0
  537. for (let num in ypClassData.value) {
  538. if (ypClassData.value[num].code === row.code) {
  539. fe++
  540. }
  541. }
  542. if (fe === 2) {
  543. ElMessage({
  544. type: "warning",
  545. message: "存在重复的药性字典,请核对!",
  546. duration: 2500,
  547. showClose: true,
  548. });
  549. } else {
  550. callSaveYpClass(row, null)
  551. }
  552. } else {
  553. let oldCode = row.oldRow.code
  554. if (oldCode !== row.code) {
  555. ElMessageBox.confirm(msgTip, {
  556. cancelButtonText: '取消',
  557. confirmButtonText: '确定',
  558. type: 'warning',
  559. distinguishCancelAndClose: true,
  560. dangerouslyUseHTMLString: true
  561. }).then(() => {
  562. callSaveYpClass(row, oldCode)
  563. }).catch((action) => {
  564. if (action === 'cancel') {
  565. queryYpClass()
  566. }
  567. })
  568. } else {
  569. callSaveYpClass(row, oldCode)
  570. }
  571. }
  572. }
  573. const callSaveYpClass = (row, oldCode) => {
  574. let title = '请确认是否保存<span style="color:#d12020;">' + row.name + '</span>?'
  575. ElMessageBox.confirm(title, {
  576. cancelButtonText: '取消',
  577. confirmButtonText: '确定',
  578. type: 'warning',
  579. distinguishCancelAndClose: true,
  580. dangerouslyUseHTMLString: true
  581. }).then(() => {
  582. saveYpClass(row).then((res) => {
  583. ElMessage({
  584. type: "success",
  585. message: res.cg,
  586. duration: 2500,
  587. showClose: true,
  588. });
  589. if (oldCode !== null && oldCode !== row.code) {
  590. // 删除原始数据
  591. delYpClassByCode(oldCode).then((res) => {
  592. queryYpClass()
  593. })
  594. } else {
  595. queryYpClass()
  596. }
  597. })
  598. }).catch((action) => {
  599. if (action === 'cancel') {
  600. queryYpClass()
  601. }
  602. })
  603. }
  604. const deleteYpClass = (index, row) => {
  605. let title = '请确认是否删除<span style="color:#d12020;">' + row.name + '</span>?'
  606. ElMessageBox.confirm(title, {
  607. cancelButtonText: '取消',
  608. confirmButtonText: '确定',
  609. type: 'warning',
  610. distinguishCancelAndClose: true,
  611. dangerouslyUseHTMLString: true
  612. }).then(() => {
  613. delYpClassByCode(row.code).then((res) => {
  614. ElMessage({
  615. type: "success",
  616. message: res.cg,
  617. duration: 2500,
  618. showClose: true,
  619. });
  620. queryYpClass()
  621. })
  622. }).catch((action) => {
  623. if (action === 'cancel') {
  624. queryYpClass()
  625. }
  626. })
  627. }
  628. const currentEditCode = ref('')
  629. const tableEdit = (row) => {
  630. currentEditCode.value = row.code
  631. }
  632. </script>
  633. <style lang="scss" deep>
  634. .el-dialog__body {
  635. // padding: 0 16px;
  636. // height: calc(100% - 25px);
  637. }
  638. .el-tabs {
  639. height: calc(100% - 10px);
  640. .el-tabs__content {
  641. padding: 5px;
  642. height: calc(100% - 27px);
  643. }
  644. .el-tab-pane {
  645. height: calc(100% - 27px);
  646. overflow: auto;
  647. }
  648. .el-table__inner-wrapper {
  649. height: calc(100% - 10px) !important;
  650. }
  651. }
  652. .el-table .warning-row {
  653. --el-table-tr-bg-color: #dd7694;
  654. }
  655. .search-select-pre {
  656. padding: 0 12px;
  657. color: var(--el-text-color-regular);
  658. background: var(--el-fill-color-light);
  659. border-right: 1px solid var(--el-border-color);
  660. --el-select-input-padding-left: '0'
  661. }
  662. </style>