YpInMatch.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. <template>
  2. <div class="layout_container">
  3. <header>
  4. <el-input v-model.trim="inDocuNo" class="w-50 m-2" style="width: 220px" placeholder="请输入入库单号" clearable>
  5. <template #prepend>入库单号</template>
  6. </el-input>
  7. <el-input v-model.trim="reptNo" class="w-50 m-2" style="width: 220px; margin-left: 3px" placeholder="请输入传票号" clearable>
  8. <template #prepend>传票号</template>
  9. </el-input>
  10. <el-select v-model="supplyCode" placeholder="请选择供应商" style="width: 240px; margin-left: 3px" filterable clearable>
  11. <el-option v-for="item in supplyList" :key="item.value" :label="item.label" :value="item.value">
  12. </el-option>
  13. </el-select>
  14. <el-select v-model="groupNo" placeholder="请选择药库" style="width: 140px; margin-left: 3px">
  15. <el-option v-for="item in groupNoYkData" :key="item.value" :label="item.label" :value="item.value">
  16. </el-option>
  17. </el-select>
  18. <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" :clearable="false"
  19. end-placeholder="结束日期" :shortcuts="shortcuts" style="width: 300px; margin-left: 3px">
  20. </el-date-picker>
  21. <el-divider direction="vertical" />
  22. <el-button type="primary" icon="Search" @click="queryCodgData" style="margin-left: 5px">查询</el-button>
  23. </header>
  24. <div class="layout_main">
  25. <el-tabs class="el-tabs__fill" v-model="editableTabsValue" type="border-card" @tab-click="handleClick">
  26. <el-tab-pane key="inMatch" label="入库匹配" name="inMatch">
  27. <div class="layout_display_flex_y">
  28. <div class="layout_flex_1-y">
  29. <el-table :data="inMatchData.slice(pageSize * (currentPage - 1), pageSize * currentPage)" border
  30. stripe highlight-current-row height="100%">
  31. <el-table-column type="index" label="序号" width="50" fixed/>
  32. <el-table-column prop="isMatch" label="是否下载" width="80" fixed>
  33. <template #default="scope">
  34. <el-button v-if="scope.row.isMatch === '1'" type="primary" size="small">已下载</el-button>
  35. <el-button v-else-if="scope.row.isMatch === '0' " type="warning" size="small">未下载</el-button>
  36. <el-button v-else type="primary" size="small">其他</el-button>
  37. </template>
  38. </el-table-column>
  39. <el-table-column prop="inDate" label="入库日期" width="140" />
  40. <el-table-column prop="inDocuNo" label="入库单号" width="100" />
  41. <el-table-column prop="inSeri" label="入库序号" width="60" />
  42. <el-table-column prop="reptNo" label="传票号" width="160" />
  43. <el-table-column prop="purchaserName" label="采购员" width="80"/>
  44. <el-table-column prop="supplyId" label="供应商企业代码" width="150"/>
  45. <el-table-column prop="supplyName" label="供应商" width="240"/>
  46. <el-table-column prop="chargeName" label="药品" width="220" show-overflow-tooltip/>
  47. <el-table-column prop="specification" label="药品规格" width="150"/>
  48. <el-table-column prop="buyAmt" label="购入数量" width="80"/>
  49. <el-table-column prop="buyPrice" label="购入金额" width="80"/>
  50. <el-table-column prop="manuNo" label="生产批号" width="120"/>
  51. <el-table-column prop="producingDate" label="生产日期" width="140"/>
  52. <el-table-column prop="effDate" label="有效期止" width="100"/>
  53. <el-table-column fixed="right" prop="cz" label="操作" min-width="200" width="200" header-align="center" align="center">
  54. <template #default="scope">
  55. <el-button type="primary" size="small" @click="downloadCodg(scope.row)">下载追溯码</el-button>
  56. <el-button type="danger" size="small" v-if="scope.row.isMatch === '1'" @click="queryYpMatchDetail(scope.row)">追溯码明细
  57. </el-button>
  58. </template>
  59. </el-table-column>
  60. </el-table>
  61. </div>
  62. <div>
  63. <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[10, 15, 20, 25]"
  64. :total="inMatchData.length" layout="total, sizes, prev, pager, next, jumper"
  65. style="margin-top: 5px" @size-change="handleSizeChange"
  66. @current-change="handleCurrentChange">
  67. </el-pagination>
  68. </div>
  69. </div>
  70. </el-tab-pane>
  71. <el-tab-pane key="codgLine" label="追溯码数据集" name="codgLine">
  72. <div class="layout_display_flex_y">
  73. <div class="layout_flex_1-y">
  74. <el-table :data="codgLineData.slice(pageSizeLine * (currentPageLine - 1), pageSizeLine * currentPageLine)" border
  75. stripe highlight-current-row height="100%">
  76. <el-table-column type="index" label="序号" width="50" />
  77. <el-table-column prop="medListCodg" label="医疗目录编码" width="180" />
  78. <el-table-column prop="medinsListCodg" label="医药机构目录编码" width="180" />
  79. <el-table-column prop="medinsListName" label="医药机构目录名称" width="180" v-if="false"/>
  80. <el-table-column prop="delvBchno" label="传票号" width="150"/>
  81. <el-table-column prop="fixmedinsCode" label="医疗机构编码" width="100" />
  82. <el-table-column prop="fixmedinsName" label="医疗机构名称" width="120" />
  83. <el-table-column prop="bigPacTracCodg" label="大包装追溯码" width="150"/>
  84. <el-table-column prop="midPacTracCodg" label="中包装追溯码" width="150"/>
  85. <el-table-column prop="smlPacTracCodg" label="小包装追溯码" width="150"/>
  86. <el-table-column prop="delventpUscc" label="供应商企业代码" width="150"/>
  87. <el-table-column prop="delventpName" label="供应商企业名称" width="130" show-overflow-tooltip/>
  88. <el-table-column prop="delventpProdInvTracId" label="企业配送商品追溯信息ID" width="160"/>
  89. <el-table-column prop="delvDate" label="配送日期" width="140"/>
  90. <el-table-column prop="delvOpter" label="配送操作员" width="70"/>
  91. <el-table-column prop="drugProdname" label="药品商品名称" width="240" show-overflow-tooltip/>
  92. <el-table-column prop="drugSpec" label="药品规格" width="160" show-overflow-tooltip/>
  93. <el-table-column prop="drugDosform" label="药品剂型" width="80"/>
  94. <el-table-column prop="manuBchno" label="生产批次号" width="100"/>
  95. <el-table-column prop="manuDate" label="生产日期" width="140"/>
  96. <el-table-column prop="expyEnd" label="有效期止" width="140"/>
  97. <el-table-column prop="prodentpName" label="生产企业名称" width="130" show-overflow-tooltip/>
  98. <el-table-column prop="prop" label="包装比例" width="70"/>
  99. <el-table-column prop="rxFlag" label="处方药标志" width="70"/>
  100. <el-table-column prop="rxFlagName" label="是否处方药" width="80"/>
  101. <el-table-column prop="aprvno" label="批准文号" width="140" show-overflow-tooltip/>
  102. <el-table-column prop="barcode" label="药品条形码" width="120"/>
  103. <el-table-column prop="invChgType" label="库存变更类型" width="90"/>
  104. <el-table-column prop="pric" label="单价" width="100"/>
  105. <el-table-column prop="cnt" label="数量" width="90"/>
  106. <el-table-column prop="minPacCnt" label="最小包装数量" width="90"/>
  107. <el-table-column prop="minPacunt" label="最小包装单位" width="90"/>
  108. <el-table-column prop="minPrepunt" label="最小制剂单位" width="90"/>
  109. <el-table-column prop="crteTime" label="数据创建时间" width="140"/>
  110. <el-table-column prop="updtTime" label="数据更新时间" width="140"/>
  111. <el-table-column prop="regName" label="注册名称" width="170"/>
  112. <el-table-column prop="valiFlag" label="有效标志" width="70"/>
  113. <el-table-column prop="valiFlagName" label="是否有效" width="70"/>
  114. <el-table-column prop="upldStas" label="上传状态" width="70"/>
  115. <el-table-column prop="upldStasName" label="上传状态名称" width="100"/>
  116. <el-table-column prop="upldRslt" label="上传结果描述" width="120" show-overflow-tooltip/>
  117. <el-table-column prop="optTime" label="经办时间" width="140"/>
  118. <el-table-column prop="memo" label="备注" width="160" show-overflow-tooltip/>
  119. </el-table>
  120. </div>
  121. <div>
  122. <el-pagination :current-page="currentPageLine" :page-size="pageSizeLine" :page-sizes="[10, 15, 20, 25]"
  123. :total="codgLineData.length" layout="total, sizes, prev, pager, next, jumper"
  124. style="margin-top: 5px" @size-change="handleSizeChangeLine"
  125. @current-change="handleCurrentChangeLine">
  126. </el-pagination>
  127. </div>
  128. </div>
  129. </el-tab-pane>
  130. </el-tabs>
  131. </div>
  132. <el-dialog v-model="dialogFormDownload" title="下载追溯码" width="500" draggable :before-close="handleClose"
  133. :close-on-press-escape="false" :close-on-click-modal="false" destroy-on-close>
  134. <el-form :model="formData">
  135. <el-input v-model="formData.serial" v-show="false" />
  136. <el-form-item label="入库单号" :label-width="formLabelWidth">
  137. <el-input v-model="formData.inDocuNo" disabled />
  138. </el-form-item>
  139. <el-form-item label="传票号" :label-width="formLabelWidth">
  140. <el-input v-model="formData.delvBchno" disabled />
  141. </el-form-item>
  142. <el-form-item label="供应商企业代码" :label-width="formLabelWidth">
  143. <el-input v-model="formData.delventpUscc" disabled />
  144. </el-form-item>
  145. <el-form-item label="供应商" :label-width="formLabelWidth">
  146. <el-input v-model="formData.delventpName" disabled />
  147. </el-form-item>
  148. <el-form-item label="购入数量" :label-width="formLabelWidth">
  149. <el-input v-model.trim="formData.buyAmt" disabled />
  150. </el-form-item>
  151. <el-form-item label="下载页数" :label-width="formLabelWidth">
  152. <el-input v-model.trim="formData.pageNum" autocomplete="off" />
  153. </el-form-item>
  154. <el-form-item label="每页数量" :label-width="formLabelWidth">
  155. <el-input v-model.trim="formData.pageSize" autocomplete="off" />
  156. </el-form-item>
  157. </el-form>
  158. <template #footer>
  159. <div class="dialog-footer">
  160. <el-button @click="dialogFormDownload = false">取消</el-button>
  161. <el-button type="primary" @click="saveDownloadCodg">下载</el-button>
  162. </div>
  163. </template>
  164. </el-dialog>
  165. </div>
  166. <el-dialog v-model="showYpCodgInfo" :close-on-click-modal="false" :before-close="handleClose" top="8vh"
  167. :close-on-press-escape="false" :title="ypCodgInfoName" width="80%" destroy-on-close>
  168. <YpCodgInfo :ypCodgDetail="ypCodgDetail"/>
  169. </el-dialog>
  170. </template>
  171. <script setup name="YpInMatch">
  172. import { nextTick, onMounted, ref } from "vue";
  173. import {shortcuts} from "@/data/shortcuts.js";
  174. import {formatDatetime, getDateRangeFormatDate} from "@/utils/date.js";
  175. import {selectGroupNoInfo, selectSupplyType} from "@/api/yp-dict/yp-comm-dict.js";
  176. import {selectDownloadCodgBchno, selectYpCodgLineData, selectYpInDetlData} from "@/api/yp-codg/yp-in-match.js";
  177. import {isEmpty} from "xe-utils";
  178. import {ElMessage} from "element-plus";
  179. import YpCodgInfo from "@/views/yp-codg/YpCodgInfo.vue";
  180. const inDocuNo = ref('')
  181. const reptNo = ref('')
  182. const supplyCode = ref('')
  183. const dateRange = ref([])
  184. const groupNo = ref('11')
  185. const groupNoYkData = ref([]);
  186. const supplyList = ref([]);
  187. const start = formatDatetime(shortcuts[0].value[0])
  188. const end = formatDatetime(shortcuts[0].value[0])
  189. const editableTabsValue = ref("inMatch")
  190. const inMatchData = ref([])
  191. const pageSize = ref(20)
  192. const currentPage = ref(1)
  193. const handleSizeChange = (val) => {
  194. pageSize.value = val
  195. }
  196. const handleCurrentChange = (val) => {
  197. currentPage.value = val
  198. }
  199. // 追溯码相关
  200. const codgLineData = ref([])
  201. const pageSizeLine = ref(20)
  202. const currentPageLine = ref(1)
  203. const handleSizeChangeLine = (val) => {
  204. pageSizeLine.value = val
  205. }
  206. const handleCurrentChangeLine = (val) => {
  207. currentPageLine.value = val
  208. }
  209. const queryCodgData = () => {
  210. if (editableTabsValue.value === "inMatch") {
  211. queryYpInMatch();
  212. } else if(editableTabsValue.value === "codgLine"){
  213. queryYpCodgLine()
  214. }
  215. }
  216. const handleClick = (tab, event) => {
  217. // 查询哪个tab页面
  218. editableTabsValue.value = tab.props.name;
  219. if (editableTabsValue.value === "inMatch") {
  220. queryYpInMatch();
  221. } else if(editableTabsValue.value === "codgLine"){
  222. queryYpCodgLine()
  223. }
  224. }
  225. const queryGroupNoInfo = () => {
  226. selectGroupNoInfo()
  227. .then(res => {
  228. groupNoYkData.value = res.ykList;
  229. })
  230. .catch(() => {
  231. groupNoYkData.value = [];
  232. });
  233. };
  234. const queryData = ref({
  235. detlNo: '', // 入库单号(院内)
  236. reptNo: '', // 传票号(供应批次流水号)
  237. supplyCode: '', // 供应商编码(院内)
  238. groupNo: '', // 药库编码(院内)
  239. supplyId: '', // 供应商企业信用代码
  240. manuNo: '', // 生产批次号
  241. startTime: '',
  242. endTime: '',
  243. })
  244. onMounted(() => {
  245. nextTick(() => {
  246. queryData.value.startTime = start;
  247. queryData.value.endTime = end + " 23:59:59";
  248. dateRange.value = [start, end];
  249. queryGroupNoInfo()
  250. querySupplyType()
  251. queryYpInMatch()
  252. })
  253. })
  254. const queryYpInMatch = () => {
  255. if (dateRange.value) {
  256. let dateS = getDateRangeFormatDate(dateRange.value)
  257. queryData.value.startTime = dateS.startTime
  258. queryData.value.endTime = dateS.endTime
  259. }
  260. queryData.value.detlNo = inDocuNo.value
  261. queryData.value.reptNo = reptNo.value
  262. queryData.value.supplyCode = supplyCode.value
  263. queryData.value.groupNo = groupNo.value
  264. selectYpInDetlData(queryData.value).then((res) => {
  265. inMatchData.value = res
  266. })
  267. }
  268. const showYpCodgInfo = ref(false)
  269. const ypCodgInfoName = ref('追溯码下载明细')
  270. const ypCodgDetail = ref([])
  271. const queryYpMatchDetail = (row) => {
  272. if(isEmpty(row.supplyId)){
  273. ElMessage({
  274. message: row.supplyName + '企业信用代码不存在,请检查!',
  275. type: 'warning',
  276. duration: 2000,
  277. showClose: true,
  278. })
  279. return false;
  280. }
  281. showYpCodgInfo.value = true
  282. let paramData = ref({
  283. reptNo: row.reptNo, // 传票号(配送批次流水号)
  284. supplyId: row.supplyId, // 配送企业信用代码
  285. manuNo: row.manuNo, // 生产批号
  286. })
  287. selectYpCodgLineData(paramData.value).then((res) => {
  288. ypCodgDetail.value = res
  289. })
  290. }
  291. const handleClose = (done) => {
  292. queryCodgData()
  293. done()
  294. }
  295. // 根据条件获取供应商企业追溯码下载信息
  296. const dialogFormDownload = ref(false);
  297. const formLabelWidth = "140px";
  298. let formData = ref({
  299. inDocuNo: '',
  300. buyAmt: 0,
  301. delvBchno: '',
  302. delventpUscc: '',
  303. delventpName: '',
  304. pageNum: 1,
  305. pageSize: 10,
  306. })
  307. const downloadCodg = row => {
  308. dialogFormDownload.value = true
  309. formData.value.inDocuNo = row.inDocuNo
  310. formData.value.delvBchno = row.reptNo
  311. formData.value.delventpUscc = row.supplyId
  312. formData.value.delventpName = row.supplyName
  313. // 计算当前传票号所属供应商追溯码购入数量总和
  314. let data = inMatchData.value.filter(item => {
  315. return item.reptNo === row.reptNo;
  316. })
  317. let total = 0
  318. for (const key in data) {
  319. total = total + data[key].buyAmt
  320. }
  321. formData.value.buyAmt = total
  322. formData.value.pageNum = 1
  323. formData.value.pageSize = total
  324. }
  325. const saveDownloadCodg = () => {
  326. if(isEmpty(formData.value.delvBchno)){
  327. ElMessage({
  328. message: '传票号不存在,请检查!',
  329. type: 'warning',
  330. duration: 2000,
  331. showClose: true,
  332. })
  333. return false;
  334. }
  335. if(isEmpty(formData.value.delventpUscc)){
  336. ElMessage({
  337. message: '供应商企业代码不存在,请检查!',
  338. type: 'warning',
  339. duration: 2000,
  340. showClose: true,
  341. })
  342. return false;
  343. }
  344. selectDownloadCodgBchno(formData.value).then((res) => {
  345. ElMessage({
  346. message: res.msg,
  347. type: 'success',
  348. duration: 2000,
  349. showClose: true,
  350. })
  351. dialogFormDownload.value = false
  352. queryYpCodgLine()
  353. })
  354. }
  355. const queryYpCodgLine = () => {
  356. if (dateRange.value) {
  357. let dateS = getDateRangeFormatDate(dateRange.value)
  358. queryData.value.startTime = dateS.startTime
  359. queryData.value.endTime = dateS.endTime
  360. }
  361. queryData.value.supplyId = ''
  362. queryData.value.reptNo = reptNo.value
  363. let supplyData = supplyList.value.filter((item) => {
  364. return item.value === supplyCode.value
  365. })
  366. if(supplyData.length > 0){
  367. if(isEmpty(supplyData[0].code)){
  368. ElMessage({
  369. message: supplyData[0].label + '企业信用代码不存在,请检查!',
  370. type: 'warning',
  371. duration: 2000,
  372. showClose: true,
  373. })
  374. return false;
  375. }
  376. queryData.value.supplyId = supplyData[0].code
  377. }
  378. selectYpCodgLineData(queryData.value).then((res) => {
  379. codgLineData.value = res
  380. })
  381. }
  382. const querySupplyType = () => {
  383. selectSupplyType().then((res) => {
  384. supplyList.value = res.supplyList
  385. })
  386. }
  387. </script>