فهرست منبع

新增药品配药和企业追溯信息下载

hsh 2 ماه پیش
والد
کامیت
70db32004b

+ 65 - 0
src/api/yp-codg/yp-codg-match.js

@@ -0,0 +1,65 @@
+import request from '../../utils/request'
+
+
+// 查询门诊未发药处方数据
+export function selectMzChargePrescription(data) {
+    return request({
+        url: '/ypMatch/selectMzChargePrescription',
+        method: 'post',
+        data
+    })
+}
+
+// 查询药品追溯码匹配数据
+export function selectYpCodgMatchData(data) {
+    return request({
+        url: '/ypMatch/selectYpCodgMatchData',
+        method: 'post',
+        data
+    })
+}
+
+// 查询门诊处方明细
+export function selectMzCfDetail(data) {
+    return request({
+        url: '/ypMatch/selectMzCfDetail',
+        method: 'post',
+        data
+    })
+}
+
+// 查询门诊处方药品扫码匹配情况
+export function selectMatchCodgInfo(data) {
+    return request({
+        url: '/ypMatch/selectMatchCodgInfo',
+        method: 'post',
+        data
+    })
+}
+
+// 更新门诊处方药品追溯码匹配情况
+export function updateMzDrugCodgData(data){
+    return request({
+        url: '/ypMatch/updateMzDrugCodgData',
+        method: 'post',
+        data
+    })
+}
+
+// 根据条件删除门诊处方匹配后的追溯码信息
+export function delMzDrugCodgByCode(data){
+    return request({
+        url: '/ypMatch/delMzDrugCodgByCode',
+        method: 'post',
+        data
+    })
+}
+
+// 查询门诊处方匹配的追溯码情况
+export function selectMzDrugTracCodgData(data) {
+    return request({
+        url: '/ypMatch/selectMzDrugTracCodgData',
+        method: 'post',
+        data
+    })
+}

+ 0 - 12
src/api/yp-codg/yp-codg-upload.js

@@ -1,18 +1,6 @@
 import request from '../../utils/request.js'
 
 
-/**
- * 查询药库/药房信息
- * @returns {*}
- */
-export function selectGroupNoInfo() {
-    return request({
-        url: '/ypTracCodg/selectGroupNoInfo',
-        method: 'get',
-        params: { },
-    })
-}
-
 /**
  * 查询药品采购入库/退货信息
  * @param data

+ 29 - 0
src/api/yp-codg/yp-in-match.js

@@ -0,0 +1,29 @@
+import request from '../../utils/request'
+
+
+// 查询药库入库数据
+export function selectYpInDetlData(data) {
+    return request({
+        url: '/ypLine/selectYpInDetlData',
+        method: 'post',
+        data
+    })
+}
+
+// 根据条件保存企业追溯下载信息
+export function selectDownloadCodgBchno(data) {
+    return request({
+        url: '/ypTracCodg/selectDownloadCodgBchno',
+        method: 'post',
+        data
+    })
+}
+
+// 根据条件查询企业追溯下载信息
+export function selectYpCodgLineData(data) {
+    return request({
+        url: '/ypLine/selectYpCodgLineData',
+        method: 'post',
+        data
+    })
+}

+ 22 - 0
src/api/yp-dict/yp-comm-dict.js

@@ -0,0 +1,22 @@
+import request from '../../utils/request'
+
+
+/**
+ * 查询药库/药房信息
+ * @returns {*}
+ */
+export function selectGroupNoInfo() {
+    return request({
+        url: '/ypTracCodg/selectGroupNoInfo',
+        method: 'get',
+        params: { },
+    })
+}
+
+export function selectSupplyType() {
+    return request({
+        url: '/ypTracCodg/selectSupplyType',
+        method: 'get',
+        params: { },
+    })
+}

+ 92 - 0
src/views/yp-codg/YpCodgInfo.vue

@@ -0,0 +1,92 @@
+<template>
+  <div class="layout_container">
+    <div class="layout_main">
+      <div class="layout_display_flex_y">
+        <div class="layout_flex_1-y">
+          <el-table :data="codgLineData.slice(pageSizeLine * (currentPageLine - 1), pageSizeLine * currentPageLine)" border
+                    stripe highlight-current-row height="100%">
+            <el-table-column type="index" label="序号" width="50" />
+            <el-table-column prop="medListCodg" label="医疗目录编码" width="180" />
+            <el-table-column prop="medinsListCodg" label="医药机构目录编码" width="180" />
+            <el-table-column prop="medinsListName" label="医药机构目录名称" width="180" v-if="false"/>
+            <el-table-column prop="delvBchno" label="传票号" width="150"/>
+            <el-table-column prop="fixmedinsCode" label="医疗机构编码" width="100" />
+            <el-table-column prop="fixmedinsName" label="医疗机构名称" width="120" />
+            <el-table-column prop="bigPacTracCodg" label="大包装追溯码" width="150"/>
+            <el-table-column prop="midPacTracCodg" label="中包装追溯码" width="150"/>
+            <el-table-column prop="smlPacTracCodg" label="小包装追溯码" width="150"/>
+            <el-table-column prop="delventpUscc" label="供应商企业代码" width="150"/>
+            <el-table-column prop="delventpName" label="供应商企业名称" width="130" show-overflow-tooltip/>
+            <el-table-column prop="delventpProdInvTracId" label="企业配送商品追溯信息ID" width="160"/>
+            <el-table-column prop="delvDate" label="配送日期" width="140"/>
+            <el-table-column prop="delvOpter" label="配送操作员" width="70"/>
+            <el-table-column prop="drugProdname" label="药品商品名称" width="240" show-overflow-tooltip/>
+            <el-table-column prop="drugSpec" label="药品规格" width="160" show-overflow-tooltip/>
+            <el-table-column prop="drugDosform" label="药品剂型" width="80"/>
+            <el-table-column prop="manuBchno" label="生产批次号" width="100"/>
+            <el-table-column prop="manuDate" label="生产日期" width="140"/>
+            <el-table-column prop="expyEnd" label="有效期止" width="140"/>
+            <el-table-column prop="prodentpName" label="生产企业名称" width="130" show-overflow-tooltip/>
+            <el-table-column prop="prop" label="包装比例" width="70"/>
+            <el-table-column prop="rxFlag" label="处方药标志" width="70"/>
+            <el-table-column prop="rxFlagName" label="是否处方药" width="80"/>
+            <el-table-column prop="aprvno" label="批准文号" width="140"/>
+            <el-table-column prop="barcode" label="药品条形码" width="120"/>
+            <el-table-column prop="invChgType" label="库存变更类型" width="90"/>
+            <el-table-column prop="pric" label="单价" width="100"/>
+            <el-table-column prop="cnt" label="数量" width="90"/>
+            <el-table-column prop="minPacCnt" label="最小包装数量" width="90"/>
+            <el-table-column prop="minPacunt" label="最小包装单位" width="90"/>
+            <el-table-column prop="minPrepunt" label="最小制剂单位" width="90"/>
+            <el-table-column prop="crteTime" label="数据创建时间" width="140"/>
+            <el-table-column prop="updtTime" label="数据更新时间" width="140"/>
+            <el-table-column prop="regName" label="注册名称" width="170"/>
+            <el-table-column prop="valiFlag" label="有效标志" width="70"/>
+            <el-table-column prop="valiFlagName" label="是否有效" width="70"/>
+            <el-table-column prop="upldStas" label="上传状态" width="70"/>
+            <el-table-column prop="upldStasName" label="上传状态名称" width="100"/>
+            <el-table-column prop="upldRslt" label="上传结果描述" width="120" show-overflow-tooltip/>
+            <el-table-column prop="optTime" label="经办时间" width="140"/>
+            <el-table-column prop="memo" label="备注" width="160" show-overflow-tooltip/>
+          </el-table>
+        </div>
+        <div>
+          <el-pagination :current-page="currentPageLine" :page-size="pageSizeLine" :page-sizes="[10, 15, 20, 25]"
+                         :total="codgLineData.length" layout="total, sizes, prev, pager, next, jumper"
+                         style="margin-top: 5px" @size-change="handleSizeChangeLine"
+                         @current-change="handleCurrentChangeLine">
+          </el-pagination>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup name="YpCodgInfo">
+import {nextTick, onMounted, ref, watch} from "vue";
+
+const codgLineData = ref([])
+const pageSizeLine = ref(20)
+const currentPageLine = ref(1)
+const handleSizeChangeLine = (val) => {
+  pageSizeLine.value = val
+}
+const handleCurrentChangeLine = (val) => {
+  currentPageLine.value = val
+}
+
+const props = defineProps({
+  ypCodgDetail: {
+    type: Object,
+    default: {}
+  }
+})
+onMounted( () => {
+  nextTick(() => {
+    codgLineData.value = props.ypCodgDetail
+  })
+})
+watch(() => props.ypCodgDetail, () => {
+  codgLineData.value = props.ypCodgDetail
+})
+
+</script>

+ 243 - 0
src/views/yp-codg/YpCodgMatch.vue

@@ -0,0 +1,243 @@
+<template>
+  <div class="layout_container">
+    <header>
+      <el-input v-model.trim="patientId" class="w-50 m-2" style="width: 220px" placeholder="请输入门诊号" clearable>
+        <template #prepend>门诊号</template>
+      </el-input>
+      <el-input v-model.trim="xm" class="w-50 m-2" style="width: 220px; margin-left: 3px" placeholder="请输入病人姓名" clearable>
+        <template #prepend>病人姓名</template>
+      </el-input>
+      <el-autocomplete v-model="dept" value-key="name" :fetch-suggestions="querySearchDept"
+                       clearable class="inline-input w-50 m-2" style="width: 240px"
+                       @select="handleSelect" placeholder="请输入关键字">
+        <template #prepend>科室</template>
+      </el-autocomplete>
+      <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" :clearable="false"
+          end-placeholder="结束日期" :shortcuts="shortcuts" style="width: 300px; margin-left: 3px">
+      </el-date-picker>
+      <el-select  v-model="confirmFlag" placeholder="请选择发药状态" style="width: 140px; margin-left: 3px">
+        <el-option v-for="item in fyList" :key="item.value" :label="item.label" :value="item.value">
+        </el-option>
+      </el-select>
+      <el-select v-model="groupNo" placeholder="请选择药房" style="width: 140px; margin-left: 3px">
+        <el-option v-for="item in groupNoYfData" :key="item.value" :label="item.label" :value="item.value">
+        </el-option>
+      </el-select>
+      <el-divider direction="vertical" />
+      <el-button type="primary" icon="Search" @click="queryMzChargePrescription" style="margin-left: 5px">查询
+      </el-button>
+    </header>
+    <div class="layout_main" style="overflow-y: scroll">
+      <el-tabs class="el-tabs__fill" v-model="editableTabsValue" type="border-card" @tab-click="handleClick">
+        <el-tab-pane key="mzMatch" label="门诊配药" name="mzMatch">
+          <div class="layout_display_flex_y">
+            <div class="layout_flex_1-y">
+              <el-table :data="mzCfData.slice(pageSize * (currentPage - 1), pageSize * currentPage)"
+                        border stripe highlight-current-row>
+                <el-table-column type="index" label="序号" width="60" />
+                <el-table-column prop="confirmFlag" label="状态" width="100">
+                  <template #default="scope">
+                    <el-button v-if="scope.row.printFlag === '1' && scope.row.confirmFlag === 0" type="primary" size="small">配药中</el-button>
+                    <el-button v-else-if="scope.row.confirmFlag === 0 " type="warning" size="small">待配药</el-button>
+                    <el-button v-else-if="scope.row.confirmFlag === 5 " type="primary" size="small">已配药</el-button>
+                    <el-button v-else-if="scope.row.confirmFlag === 1 " type="primary" size="small">已发药</el-button>
+                    <el-button v-else-if="scope.row.confirmFlag === 3 " type="primary" size="small">已取消</el-button>
+                    <el-button v-else type="primary" size="small">其他</el-button>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="patientId" label="病人ID" width="120" />
+                <el-table-column prop="name" label="病人姓名" width="120" />
+                <el-table-column prop="times" label="病人就诊次数" width="100" />
+                <el-table-column prop="serialNo" label="流水号" width="120"/>
+                <el-table-column prop="deptName" label="科室" width="180"/>
+                <el-table-column prop="orderNo" label="处方号" width="100">
+                  <template #default="scope">
+                    <el-button v-if="scope.row.drugFlag === '2' || scope.row.drugFlag === '3' " type="danger" size="small">
+                      {{ scope.row.orderNo }}</el-button>
+                    <el-button v-else type="primary" size="small">{{scope.row.orderNo}}</el-button>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="chargeDate" label="缴费时间" width="180"/>
+                <el-table-column fixed="right" label="操作" min-width="180" width="180" header-align="center" align="center">
+                  <template #default="scope">
+                    <el-button type="primary" size="small" @click="matchCodgForCf(scope.row)">配药
+                    </el-button>
+                    <el-button v-if="scope.row.confirmFlag !== 1 " type="danger" size="small" @click="deleteCodgForCf(scope.row)">删除配药
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div>
+              <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[10, 15, 20, 25]"
+                             :total="mzCfData.length" layout="total, sizes, prev, pager, next, jumper"
+                             style="margin-top: 5px" @size-change="handleSizeChange"
+                             @current-change="handleCurrentChange">
+              </el-pagination>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+    <el-dialog v-model="showMzMatchCodg" :close-on-click-modal="false" :before-close="handleClose"
+               :close-on-press-escape="false" title="门诊处方药品追溯码匹配" :fullscreen="true" destroy-on-close>
+      <YpMzCodgMatch :ypMzCfData="ypMzCfData" @closeYpMzCodgMatch="closeYpMzCodgMatch"/>
+    </el-dialog>
+  </div>
+</template>
+<script setup name="YpCodgMatch">
+import { nextTick, onMounted, ref } from "vue";
+import {delMzDrugCodgByCode, selectMzChargePrescription} from "@/api/yp-codg/yp-codg-match.js";
+import {shortcuts} from "@/data/shortcuts.js";
+import {formatDatetime, getDateRangeFormatDate} from "@/utils/date.js";
+import {selectGroupNoInfo} from "@/api/yp-dict/yp-comm-dict.js";
+import {selectSmallDept} from "@/api/medical-insurance/si-yb-util.js";
+import YpMzCodgMatch from "@/views/yp-codg/YpMzCodgMatch.vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+const editableTabsValue = ref("mzMatch");
+const fyList = [{ value: "0", label: "未发药" }, { value: "5", label: "已配药" }, { value: "1", label: "已发药" }]
+const patientId = ref('')
+const xm = ref('')
+const dateRange = ref([])
+const confirmFlag = ref('0')
+const mzCfData = ref([])
+const groupNo = ref('71')
+const groupNoYfData = ref([]);
+const dept = ref('')
+const now = formatDatetime(new Date())
+const start = formatDatetime(shortcuts[0].value[0])
+const end = formatDatetime(shortcuts[0].value[0])
+
+const pageSize = ref(20)
+const currentPage = ref(1)
+const handleSizeChange = (val) => {
+  pageSize.value = val
+}
+const handleCurrentChange = (val) => {
+  currentPage.value = val
+}
+
+const handleClick = (tab, event) => {
+  // 查询哪个tab页面
+  editableTabsValue.value = tab.props.name;
+  if (editableTabsValue.value === "mzMatch") {
+    queryMzChargePrescription();
+  }
+}
+
+const queryGroupNoInfo = () => {
+  selectGroupNoInfo()
+      .then(res => {
+        groupNoYfData.value = res.yfList;
+      })
+      .catch(() => {
+        groupNoYfData.value = [];
+      });
+};
+
+const queryData = ref({
+  patNo: '',
+  patName: '',
+  confirmFlag: '0',
+  dept: '',
+  groupNo: '',
+  startTime: '',
+  endTime: '',
+})
+
+onMounted(() => {
+  nextTick(() => {
+    queryData.value.startTime = start;
+    queryData.value.endTime = end + " 23:59:59";
+    dateRange.value = [start, end];
+    queryGroupNoInfo()
+    queryMzChargePrescription()
+  })
+})
+
+const queryMzChargePrescription = () => {
+  if (dateRange.value) {
+    let dateS = getDateRangeFormatDate(dateRange.value)
+    queryData.value.startTime = dateS.startTime
+    queryData.value.endTime = dateS.endTime
+  }
+  queryData.value.patNo = patientId.value
+  queryData.value.patName = xm.value
+  queryData.value.groupNo = groupNo.value
+  queryData.value.confirmFlag = confirmFlag.value
+  queryData.value.dept = dept.value
+  selectMzChargePrescription(queryData.value).then((res) => {
+    mzCfData.value = res
+  })
+}
+
+// 处方匹配药品追溯码
+const showMzMatchCodg = ref(false)
+const ypMzCfData = ref([])
+const matchCodgForCf = (row) => {
+  ypMzCfData.value = row
+  ypMzCfData.value.patNo = row.patientId
+  ypMzCfData.value.times = row.times
+  showMzMatchCodg.value = true
+}
+
+const closeYpMzCodgMatch = (flag) => {
+  if (flag) {
+    showMzMatchCodg.value = false
+  }
+  queryMzChargePrescription()
+}
+
+const handleClose = (done) => {
+  queryMzChargePrescription()
+  done()
+}
+
+const querySearchDept = async (str, cb) => {
+  let results = await selectSmallDept({ str })
+  if (results) {
+    // 调用 callback 返回建议列表的数据
+    cb(results)
+  }
+}
+
+const handleSelect = (item) => {
+  queryData.value.dept = item.code
+}
+
+const deleteCodgForCf = (row) => {
+  ElMessageBox.confirm('确定删除门诊处方匹配的追溯码信息?', {
+    cancelButtonText: '取消',
+    confirmButtonText: '确定',
+    type: 'warning',
+    distinguishCancelAndClose: true,
+    dangerouslyUseHTMLString: true
+  }).then(() => {
+    delMzDrugCodgByCode(row).then(res => {
+      if(res.code === 0){
+        ElMessage({
+          type: "success",
+          message: res.message,
+          duration: 2500,
+          showClose: true,
+        });
+        queryMzChargePrescription()
+      } else {
+        ElMessage({
+          type: "error",
+          message: res.message,
+          duration: 2500,
+          showClose: true,
+        });
+      }
+    })
+
+  }).catch((action) => {
+    if (action === 'cancel') {
+      console.log("已取消。。。")
+    }
+  })
+
+}
+</script>

+ 1 - 1
src/views/ypCodg/YpCodgUpload.vue → src/views/yp-codg/YpCodgUpload.vue

@@ -1141,7 +1141,6 @@ import { ElMessage, ElMessageBox } from "element-plus";
 import {
   deleteYpUploadBatch,
   saveYpInvoice,
-  selectGroupNoInfo,
   selectYpInvinfoDetail,
   selectYpInvinfoResult,
   selectYpPurchaseDetail,
@@ -1162,6 +1161,7 @@ import {
 } from "@/utils/date.js";
 import { QuestionFilled } from "@element-plus/icons-vue";
 import { useYfGroupStore } from "@/pinia/use-yf-group";
+import { selectGroupNoInfo } from "@/api/yp-dict/yp-comm-dict.js";
 
 const kcList = ref([]);
 const retOptions = [

+ 403 - 0
src/views/yp-codg/YpInMatch.vue

@@ -0,0 +1,403 @@
+<template>
+  <div class="layout_container">
+    <header>
+      <el-input v-model.trim="inDocuNo" class="w-50 m-2" style="width: 220px" placeholder="请输入入库单号" clearable>
+        <template #prepend>入库单号</template>
+      </el-input>
+      <el-input v-model.trim="reptNo" class="w-50 m-2" style="width: 220px; margin-left: 3px" placeholder="请输入传票号" clearable>
+        <template #prepend>传票号</template>
+      </el-input>
+      <el-select v-model="supplyCode" placeholder="请选择供应商" style="width: 240px; margin-left: 3px" filterable clearable>
+        <el-option v-for="item in supplyList" :key="item.value" :label="item.label" :value="item.value">
+        </el-option>
+      </el-select>
+      <el-select v-model="groupNo" placeholder="请选择药库" style="width: 140px; margin-left: 3px">
+        <el-option v-for="item in groupNoYkData" :key="item.value" :label="item.label" :value="item.value">
+        </el-option>
+      </el-select>
+      <el-date-picker v-model="dateRange" type="daterange" range-separator="至" start-placeholder="开始日期" :clearable="false"
+                      end-placeholder="结束日期" :shortcuts="shortcuts" style="width: 300px; margin-left: 3px">
+      </el-date-picker>
+      <el-divider direction="vertical" />
+      <el-button type="primary" icon="Search" @click="queryCodgData" style="margin-left: 5px">查询</el-button>
+    </header>
+    <div class="layout_main">
+      <el-tabs class="el-tabs__fill" v-model="editableTabsValue" type="border-card" @tab-click="handleClick">
+        <el-tab-pane key="inMatch" label="入库匹配" name="inMatch">
+          <div class="layout_display_flex_y">
+            <div class="layout_flex_1-y">
+              <el-table :data="inMatchData.slice(pageSize * (currentPage - 1), pageSize * currentPage)" border
+                        stripe highlight-current-row height="100%">
+                <el-table-column type="index" label="序号" width="50" fixed/>
+                <el-table-column prop="isMatch" label="是否下载" width="80" fixed>
+                  <template #default="scope">
+                    <el-button v-if="scope.row.isMatch === '1'" type="primary" size="small">已下载</el-button>
+                    <el-button v-else-if="scope.row.isMatch === '0' " type="warning" size="small">未下载</el-button>
+                    <el-button v-else type="primary" size="small">其他</el-button>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="inDate" label="入库日期" width="140" />
+                <el-table-column prop="inDocuNo" label="入库单号" width="100" />
+                <el-table-column prop="inSeri" label="入库序号" width="60" />
+                <el-table-column prop="reptNo" label="传票号" width="160" />
+                <el-table-column prop="purchaserName" label="采购员" width="80"/>
+                <el-table-column prop="supplyId" label="供应商企业代码" width="150"/>
+                <el-table-column prop="supplyName" label="供应商" width="240"/>
+                <el-table-column prop="chargeName" label="药品" width="220" show-overflow-tooltip/>
+                <el-table-column prop="specification" label="药品规格" width="150"/>
+                <el-table-column prop="buyAmt" label="购入数量" width="80"/>
+                <el-table-column prop="buyPrice" label="购入金额" width="80"/>
+                <el-table-column prop="manuNo" label="生产批号" width="120"/>
+                <el-table-column prop="producingDate" label="生产日期" width="140"/>
+                <el-table-column prop="effDate" label="有效期止" width="100"/>
+                <el-table-column fixed="right" prop="cz" label="操作" min-width="200" width="200" header-align="center" align="center">
+                  <template #default="scope">
+                    <el-button type="primary" size="small" @click="downloadCodg(scope.row)">下载追溯码</el-button>
+                    <el-button type="danger" size="small" v-if="scope.row.isMatch === '1'" @click="queryYpMatchDetail(scope.row)">追溯码明细
+                    </el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div>
+              <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[10, 15, 20, 25]"
+                             :total="inMatchData.length" layout="total, sizes, prev, pager, next, jumper"
+                             style="margin-top: 5px" @size-change="handleSizeChange"
+                             @current-change="handleCurrentChange">
+              </el-pagination>
+            </div>
+          </div>
+        </el-tab-pane>
+        <el-tab-pane key="codgLine" label="追溯码数据集" name="codgLine">
+          <div class="layout_display_flex_y">
+            <div class="layout_flex_1-y">
+              <el-table :data="codgLineData.slice(pageSizeLine * (currentPageLine - 1), pageSizeLine * currentPageLine)" border
+                        stripe highlight-current-row height="100%">
+                <el-table-column type="index" label="序号" width="50" />
+                <el-table-column prop="medListCodg" label="医疗目录编码" width="180" />
+                <el-table-column prop="medinsListCodg" label="医药机构目录编码" width="180" />
+                <el-table-column prop="medinsListName" label="医药机构目录名称" width="180" v-if="false"/>
+                <el-table-column prop="delvBchno" label="传票号" width="150"/>
+                <el-table-column prop="fixmedinsCode" label="医疗机构编码" width="100" />
+                <el-table-column prop="fixmedinsName" label="医疗机构名称" width="120" />
+                <el-table-column prop="bigPacTracCodg" label="大包装追溯码" width="150"/>
+                <el-table-column prop="midPacTracCodg" label="中包装追溯码" width="150"/>
+                <el-table-column prop="smlPacTracCodg" label="小包装追溯码" width="150"/>
+                <el-table-column prop="delventpUscc" label="供应商企业代码" width="150"/>
+                <el-table-column prop="delventpName" label="供应商企业名称" width="130" show-overflow-tooltip/>
+                <el-table-column prop="delventpProdInvTracId" label="企业配送商品追溯信息ID" width="160"/>
+                <el-table-column prop="delvDate" label="配送日期" width="140"/>
+                <el-table-column prop="delvOpter" label="配送操作员" width="70"/>
+                <el-table-column prop="drugProdname" label="药品商品名称" width="240" show-overflow-tooltip/>
+                <el-table-column prop="drugSpec" label="药品规格" width="160" show-overflow-tooltip/>
+                <el-table-column prop="drugDosform" label="药品剂型" width="80"/>
+                <el-table-column prop="manuBchno" label="生产批次号" width="100"/>
+                <el-table-column prop="manuDate" label="生产日期" width="140"/>
+                <el-table-column prop="expyEnd" label="有效期止" width="140"/>
+                <el-table-column prop="prodentpName" label="生产企业名称" width="130" show-overflow-tooltip/>
+                <el-table-column prop="prop" label="包装比例" width="70"/>
+                <el-table-column prop="rxFlag" label="处方药标志" width="70"/>
+                <el-table-column prop="rxFlagName" label="是否处方药" width="80"/>
+                <el-table-column prop="aprvno" label="批准文号" width="140" show-overflow-tooltip/>
+                <el-table-column prop="barcode" label="药品条形码" width="120"/>
+                <el-table-column prop="invChgType" label="库存变更类型" width="90"/>
+                <el-table-column prop="pric" label="单价" width="100"/>
+                <el-table-column prop="cnt" label="数量" width="90"/>
+                <el-table-column prop="minPacCnt" label="最小包装数量" width="90"/>
+                <el-table-column prop="minPacunt" label="最小包装单位" width="90"/>
+                <el-table-column prop="minPrepunt" label="最小制剂单位" width="90"/>
+                <el-table-column prop="crteTime" label="数据创建时间" width="140"/>
+                <el-table-column prop="updtTime" label="数据更新时间" width="140"/>
+                <el-table-column prop="regName" label="注册名称" width="170"/>
+                <el-table-column prop="valiFlag" label="有效标志" width="70"/>
+                <el-table-column prop="valiFlagName" label="是否有效" width="70"/>
+                <el-table-column prop="upldStas" label="上传状态" width="70"/>
+                <el-table-column prop="upldStasName" label="上传状态名称" width="100"/>
+                <el-table-column prop="upldRslt" label="上传结果描述" width="120" show-overflow-tooltip/>
+                <el-table-column prop="optTime" label="经办时间" width="140"/>
+                <el-table-column prop="memo" label="备注" width="160" show-overflow-tooltip/>
+              </el-table>
+            </div>
+            <div>
+              <el-pagination :current-page="currentPageLine" :page-size="pageSizeLine" :page-sizes="[10, 15, 20, 25]"
+                             :total="codgLineData.length" layout="total, sizes, prev, pager, next, jumper"
+                             style="margin-top: 5px" @size-change="handleSizeChangeLine"
+                             @current-change="handleCurrentChangeLine">
+              </el-pagination>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+    <el-dialog v-model="dialogFormDownload" title="下载追溯码" width="500" draggable :before-close="handleClose"
+               :close-on-press-escape="false" :close-on-click-modal="false" destroy-on-close>
+      <el-form :model="formData">
+        <el-input v-model="formData.serial" v-show="false" />
+        <el-form-item label="入库单号" :label-width="formLabelWidth">
+          <el-input v-model="formData.inDocuNo" disabled />
+        </el-form-item>
+        <el-form-item label="传票号" :label-width="formLabelWidth">
+          <el-input v-model="formData.delvBchno" disabled />
+        </el-form-item>
+        <el-form-item label="供应商企业代码" :label-width="formLabelWidth">
+          <el-input v-model="formData.delventpUscc" disabled />
+        </el-form-item>
+        <el-form-item label="供应商" :label-width="formLabelWidth">
+          <el-input v-model="formData.delventpName" disabled />
+        </el-form-item>
+        <el-form-item label="购入数量" :label-width="formLabelWidth">
+          <el-input v-model.trim="formData.buyAmt" disabled />
+        </el-form-item>
+        <el-form-item label="下载页数" :label-width="formLabelWidth">
+          <el-input v-model.trim="formData.pageNum" autocomplete="off" />
+        </el-form-item>
+        <el-form-item label="每页数量" :label-width="formLabelWidth">
+          <el-input v-model.trim="formData.pageSize" autocomplete="off" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="dialogFormDownload = false">取消</el-button>
+          <el-button type="primary" @click="saveDownloadCodg">下载</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+  <el-dialog v-model="showYpCodgInfo" :close-on-click-modal="false" :before-close="handleClose"
+             :close-on-press-escape="false" :title="ypCodgInfoName" width="80%" destroy-on-close>
+    <YpCodgInfo :ypCodgDetail="ypCodgDetail"/>
+  </el-dialog>
+</template>
+<script setup name="YpInMatch">
+import { nextTick, onMounted, ref } from "vue";
+import {shortcuts} from "@/data/shortcuts.js";
+import {formatDatetime, getDateRangeFormatDate} from "@/utils/date.js";
+import {selectGroupNoInfo, selectSupplyType} from "@/api/yp-dict/yp-comm-dict.js";
+import {selectDownloadCodgBchno, selectYpCodgLineData, selectYpInDetlData} from "@/api/yp-codg/yp-in-match.js";
+import {isEmpty} from "xe-utils";
+import {ElMessage} from "element-plus";
+import YpCodgInfo from "@/views/yp-codg/YpCodgInfo.vue";
+
+const inDocuNo = ref('')
+const reptNo = ref('')
+const supplyCode = ref('')
+const dateRange = ref([])
+const groupNo = ref('11')
+const groupNoYkData = ref([]);
+const supplyList = ref([]);
+const now = formatDatetime(new Date())
+const start = formatDatetime(shortcuts[0].value[0])
+const end = formatDatetime(shortcuts[0].value[0])
+const editableTabsValue = ref("inMatch")
+const inMatchData = ref([])
+
+const pageSize = ref(20)
+const currentPage = ref(1)
+const handleSizeChange = (val) => {
+  pageSize.value = val
+}
+const handleCurrentChange = (val) => {
+  currentPage.value = val
+}
+
+// 追溯码相关
+const codgLineData = ref([])
+const pageSizeLine = ref(20)
+const currentPageLine = ref(1)
+const handleSizeChangeLine = (val) => {
+  pageSizeLine.value = val
+}
+const handleCurrentChangeLine = (val) => {
+  currentPageLine.value = val
+}
+
+const queryCodgData = () => {
+  if (editableTabsValue.value === "inMatch") {
+    queryYpInMatch();
+  } if(editableTabsValue.value === "codgLine"){
+    queryYpCodgLine()
+  }
+}
+
+const handleClick = (tab, event) => {
+  // 查询哪个tab页面
+  editableTabsValue.value = tab.props.name;
+  if (editableTabsValue.value === "inMatch") {
+    queryYpInMatch();
+  } if(editableTabsValue.value === "codgLine"){
+    queryYpCodgLine()
+  }
+}
+
+const queryGroupNoInfo = () => {
+  selectGroupNoInfo()
+      .then(res => {
+        groupNoYkData.value = res.ykList;
+      })
+      .catch(() => {
+        groupNoYkData.value = [];
+      });
+};
+
+const queryData = ref({
+  detlNo: '', // 入库单号(院内)
+  reptNo: '', // 传票号(供应批次流水号)
+  supplyCode: '', // 供应商编码(院内)
+  groupNo: '', // 库房编码(院内)
+  supplyId: '', // 供应商企业信用代码
+  manuNo: '', // 生产批次号
+  startTime: '',
+  endTime: '',
+})
+
+onMounted(() => {
+  nextTick(() => {
+    queryData.value.startTime = start;
+    queryData.value.endTime = end + " 23:59:59";
+    dateRange.value = [start, end];
+    queryGroupNoInfo()
+    querySupplyType()
+    queryYpInMatch()
+  })
+})
+
+const queryYpInMatch = () => {
+  if (dateRange.value) {
+    let dateS = getDateRangeFormatDate(dateRange.value)
+    queryData.value.startTime = dateS.startTime
+    queryData.value.endTime = dateS.endTime
+  }
+  queryData.value.detlNo = inDocuNo.value
+  queryData.value.reptNo = reptNo.value
+  queryData.value.supplyCode = supplyCode.value
+  queryData.value.groupNo = groupNo.value
+  selectYpInDetlData(queryData.value).then((res) => {
+    inMatchData.value = res
+  })
+}
+
+const showYpCodgInfo = ref(false)
+const ypCodgInfoName = ref('追溯码下载明细')
+const ypCodgDetail = ref([])
+const queryYpMatchDetail = (row) => {
+  if(isEmpty(row.supplyId)){
+    ElMessage({
+      message: row.supplyName + '企业信用代码不存在,请检查!',
+      type: 'warning',
+      duration: 2000,
+      showClose: true,
+    })
+    return false;
+  }
+  showYpCodgInfo.value = true
+  let paramData = ref({
+    reptNo: row.reptNo, // 传票号(配送批次流水号)
+    supplyId: row.supplyId, // 配送企业信用代码
+    manuNo: row.manuNo, // 生产批号
+  })
+  selectYpCodgLineData(paramData.value).then((res) => {
+    ypCodgDetail.value = res
+  })
+}
+
+const handleClose = (done) => {
+  queryCodgData()
+  done()
+}
+
+// 根据条件获取供应商企业追溯码下载信息
+const dialogFormDownload = ref(false);
+const formLabelWidth = "140px";
+let formData = ref({
+  inDocuNo: '',
+  buyAmt: 0,
+  delvBchno: '',
+  delventpUscc: '',
+  delventpName: '',
+  pageNum: 1,
+  pageSize: 10,
+})
+const downloadCodg = row => {
+  dialogFormDownload.value = true
+  formData.value.inDocuNo = row.inDocuNo
+  formData.value.delvBchno = row.reptNo
+  formData.value.delventpUscc = row.supplyId
+  formData.value.delventpName = row.supplyName
+  // 计算当前传票号所属供应商追溯码购入数量总和
+  let data = inMatchData.value.filter(item => {
+    return item.reptNo === row.reptNo;
+  })
+  let total = 0
+  for (const key in data) {
+    total = total + data[key].buyAmt
+  }
+  formData.value.buyAmt = total
+  formData.value.pageNum = 1
+  formData.value.pageSize = total
+}
+
+const saveDownloadCodg = () => {
+  if(isEmpty(formData.value.delvBchno)){
+    ElMessage({
+      message: '传票号不存在,请检查!',
+      type: 'warning',
+      duration: 2000,
+      showClose: true,
+    })
+    return false;
+  }
+  if(isEmpty(formData.value.delventpUscc)){
+    ElMessage({
+      message: '供应商企业代码不存在,请检查!',
+      type: 'warning',
+      duration: 2000,
+      showClose: true,
+    })
+    return false;
+  }
+  selectDownloadCodgBchno(formData.value).then((res) => {
+    ElMessage({
+      message: res.msg,
+      type: 'success',
+      duration: 2000,
+      showClose: true,
+    })
+    dialogFormDownload.value = false
+  })
+}
+
+const queryYpCodgLine = () => {
+  if (dateRange.value) {
+    let dateS = getDateRangeFormatDate(dateRange.value)
+    queryData.value.startTime = dateS.startTime
+    queryData.value.endTime = dateS.endTime
+  }
+  queryData.value.supplyId = ''
+  queryData.value.reptNo = reptNo.value
+  let supplyData = supplyList.value.filter((item) => {
+    return item.value === supplyCode.value
+  })
+  if(supplyData.length > 0){
+    if(isEmpty(supplyData[0].code)){
+      ElMessage({
+        message: supplyData[0].label + '企业信用代码不存在,请检查!',
+        type: 'warning',
+        duration: 2000,
+        showClose: true,
+      })
+      return false;
+    }
+    queryData.value.supplyId = supplyData[0].code
+  }
+  selectYpCodgLineData(queryData.value).then((res) => {
+    codgLineData.value = res
+  })
+}
+
+const querySupplyType = () => {
+  selectSupplyType().then((res) => {
+    supplyList.value = res.supplyList
+  })
+}
+
+</script>

+ 305 - 0
src/views/yp-codg/YpMzCodgMatch.vue

@@ -0,0 +1,305 @@
+<template>
+  <div class="layout_container">
+    <header>
+      <el-input v-model="codgTotal" class="w-50 m-2" style="width: 200px" >
+        <template #prepend>处方发药总数量</template>
+      </el-input>
+      <el-input v-model="quantityJc" class="w-50 m-2" style="width: 200px" >
+        <template #prepend>追溯码检查数量</template>
+      </el-input>
+      <el-divider direction="vertical" />
+      <el-button type="primary" icon="Search" @click="checkBarList" style="margin-left: 5px">检查</el-button>
+      <el-button type="danger" icon="Remove" @click="drugBarRepeat" style="margin-left: 5px">去重</el-button>
+      <el-button type="warning" icon="Filter" @click="matchCodgData" style="margin-left: 5px">匹配</el-button>
+      <el-button type="success" icon="Select" @click="saveMatchCodgData" style="margin-left: 5px" v-if="confirmFlag !== 1">保存</el-button>
+    </header>
+    <div class="layout_display_flex_y">
+      <div class="layout_flex_1-y">
+        <el-table :data="mzCfDetail" border stripe highlight-current-row height="100%">
+          <el-table-column type="index" label="序号" width="50" />
+          <el-table-column prop="location" label="货柜号" width="80" />
+          <el-table-column prop="patientId" label="门诊号" width="90" />
+          <el-table-column prop="times" label="就诊次数" width="70" />
+          <el-table-column prop="chargeCode" label="药品编码" width="80" />
+          <el-table-column prop="chargeName" label="品名" width="240" />
+          <el-table-column prop="specification" label="规格" width="200" />
+          <el-table-column prop="retprice" label="价格" width="80"/>
+          <el-table-column prop="quantity" label="数量" width="80">
+            <template #default="scope">
+              <el-button type="primary" size="small">{{ scope.row.quantity }}</el-button>
+            </template>
+          </el-table-column>
+          <el-table-column prop="factory" label="生产厂家" width="240"/>
+          <el-table-column prop="chargeDate" label="收费时间" width="140" />
+          <el-table-column prop="deptName" label="科室" width="120" />
+        </el-table>
+      </div>
+      <div style="margin-top: 4px">
+        <el-row :gutter="5">
+          <el-col :span="3">
+            <el-divider content-position="left">追溯码采集信息</el-divider>
+            <el-input ref="inputRef" v-model="codgLine" type="textarea" rows="36"/>
+          </el-col>
+          <el-col :span="3">
+            <el-divider content-position="left">追溯码检查信息</el-divider>
+            <el-input v-model="drugTracCodgAt" type="textarea" rows="36"/>
+          </el-col>
+          <el-col :span="18">
+            <el-divider content-position="left">追溯码匹配信息</el-divider>
+            <div class="layout_display_flex_y">
+              <div class="layout_flex_1-y">
+                <el-table :data="codgInfo" border stripe highlight-current-row>
+                  <el-table-column type="index" label="序号" width="40" fixed/>
+                  <el-table-column prop="matchFlag" label="匹配结果" width="105" fixed>
+                    <template #default="scope">
+                      <el-button v-if="scope.row.matchFlag === '0' " type="success" size="small">下载匹配成功</el-button>
+                      <el-button v-else-if="scope.row.matchFlag === '1' " type="success" size="small">平台匹配成功</el-button>
+                      <el-button v-else-if="scope.row.matchFlag === '-1' " type="danger" size="small">匹配失败</el-button>
+                      <el-button v-else type="primary" size="small">其他</el-button>
+                    </template>
+                  </el-table-column>
+                  <el-table-column prop="matchMessage" label="匹配信息" width="180" fixed show-overflow-tooltip/>
+                  <el-table-column prop="drugTracCodg" label="追溯码" width="150" fixed />
+                  <el-table-column prop="drugName" label="品名" width="240" fixed/>
+                  <el-table-column prop="specification" label="规格" width="160" />
+                  <el-table-column prop="manuNo" label="生产批号" width="140"/>
+                  <el-table-column prop="manuDate" label="生产日期" width="140"/>
+                  <el-table-column prop="expyEnd" label="有效期止" width="140"/>
+                  <el-table-column prop="abbrName" label="生产厂家" width="240"/>
+                </el-table>
+              </div>
+            </div>
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+  </div>
+</template>
+<script setup name="YpMzCodgMatch">
+import {nextTick, onMounted, ref, watch} from "vue";
+import {
+  selectMatchCodgInfo,
+  selectMzCfDetail,
+  selectMzDrugTracCodgData,
+  updateMzDrugCodgData
+} from "@/api/yp-codg/yp-codg-match.js";
+import {isEmpty} from "xe-utils";
+import {ElMessage, ElMessageBox} from "element-plus";
+
+const mzCfData = ref([])
+const mzCfDetail = ref([])
+const codgLine = ref('')
+const codgTotal = ref(0)
+// 处方匹配的追溯码信息
+const codgInfo = ref([])
+const inputRef = ref(null)
+const confirmFlag = ref(0)
+const emit = defineEmits(['close', 'closeYpMzCodgMatch'])
+
+const props = defineProps({
+  ypMzCfData: {
+    type: Object,
+    default: {}
+  }
+})
+onMounted( () => {
+  nextTick(() => {
+    mzCfData.value = props.ypMzCfData
+    inputRef.value?.focus()
+    confirmFlag.value = props.ypMzCfData.confirmFlag
+    queryMzCfDetail()
+    queryMzDrugCodgMatch()
+  })
+})
+watch(() => props.ypMzCfData, () => {
+  mzCfData.value = props.ypMzCfData
+  confirmFlag.value = props.ypMzCfData.confirmFlag
+})
+
+const queryMzCfDetail = () => {
+  selectMzCfDetail(mzCfData.value).then(res => {
+    let u = 0
+    res.forEach((item) => {
+      u = u + item.quantity
+    });
+    codgTotal.value = u
+    mzCfDetail.value = res
+  })
+}
+
+const queryMzDrugCodgMatch = () => {
+  selectMzDrugTracCodgData(mzCfData.value).then(res => {
+    if(res.data){
+      codgInfo.value = res.data
+    }
+  })
+}
+
+// 去重
+const drugBarRepeat = () => {
+  let barStr = codgLine.value
+  if(!isEmpty(barStr)) {
+    let barInfo = barStr.replaceAll('\n', ',').split(',')
+    if (barInfo.length > 0) {
+      let barData = new Set(barInfo)
+      let barList = [...barData]
+      let data = ''
+      for(let i in barList){
+        if(!isEmpty(barList[i])) {
+          data += (barList[i] + '\n')
+        }
+      }
+      codgLine.value = data
+    }
+  }
+  // 去重后在进行一起检查
+  checkBarList()
+}
+
+// 追溯码扫码计数统计
+let barFor = false
+let barC = 0
+// 检查后数量
+const quantityJc = ref(0)
+// 检验信息
+const drugTracCodgAt = ref('')
+// 追溯码检查
+const checkBarList = () => {
+  barFor = false
+  barC = 0
+  quantityJc.value = 0
+  drugTracCodgAt.value = ''
+
+  let sum = 0;
+  let str = codgLine.value;
+  let infoErr = '错误:\n';
+  let infoRep = '重复:\n';
+  if(!isEmpty(str)){
+    let barInfo = str.replaceAll('\n', ',').split(',')
+    if(barInfo.length > 0) {
+      for(let i in barInfo){
+        if(barInfo[i].length === 20){
+          sum++;
+        } else {
+          if(barInfo[i] > 0 && barInfo[i].length !== 20){
+            sum++;
+            barFor = true
+            infoErr += barInfo[i] + '\n';
+          }
+        }
+      }
+      let barInfoCp = [...barInfo]
+      let repStr = ''
+      for(let i in barInfo){
+        let rep = 1;
+        // 不能用index的序号去比,因为它已经比过了
+        let index = 0;
+        if(!(isEmpty(repStr) || repStr.indexOf(barInfo[i]) === -1)){
+          continue
+        }
+        for(let j in barInfoCp){
+          if(j > i && barInfo[i] === barInfoCp[j]){
+            rep++;
+            barFor = true
+            if(isEmpty(repStr)){
+              repStr = barInfo[i]
+            } else if(repStr.indexOf(barInfo[i]) === -1){
+              repStr += ',' + barInfo[i]
+            }
+            index = j
+          }
+        }
+        if(rep > 1){
+          infoRep  = infoRep + barInfo[i] + '重复出现:' + rep + '次。 \n'
+          rep = 1
+        }
+      }
+    }
+  }
+  let info = infoErr + '\n' + infoRep
+  quantityJc.value = sum
+  drugTracCodgAt.value = info
+
+}
+
+// 追溯码匹配
+const matchCodgData = () => {
+  if(barFor){
+    ElMessage({
+      type: "warning",
+      message: "当前扫码有重复或者错误追溯码信息,请检查!",
+      duration: 2500,
+      showClose: true,
+    });
+    return false
+  }
+  // 匹配追溯码并返回结果
+  mzCfData.value.codeLine = codgLine.value
+  selectMatchCodgInfo(mzCfData.value).then(res => {
+    if(res.data){
+      codgInfo.value = res.data
+    }
+  })
+
+}
+
+// 保存匹配结果
+const saveMatchCodgData = () => {
+  if(!codgInfo.value){
+    ElMessage({
+      type: "warning",
+      message: '没有匹配信息,请检查!',
+      duration: 2500,
+      showClose: true,
+    });
+    return false
+  }
+  let unMatchCodgInfo = codgInfo.value.filter(codg => {
+    return codg.flag === '-1'
+  })
+  if(unMatchCodgInfo.length > 0){
+    ElMessage({
+      type: "warning",
+      message: '追溯码匹配信息中存在匹配失败数据,请检查!',
+      duration: 2500,
+      showClose: true,
+    });
+    return false
+  }
+
+  if(codgInfo.value.length > codgTotal.value){
+    ElMessage({
+      type: "warning",
+      message: '追溯码匹配数量不允许超过处方发药总数量,请检查!',
+      duration: 2500,
+      showClose: true,
+    });
+    return false
+  }
+
+  ElMessageBox.confirm('确定保存药品匹配信息?', {
+    cancelButtonText: '取消',
+    confirmButtonText: '确定',
+    type: 'warning',
+    distinguishCancelAndClose: true,
+    dangerouslyUseHTMLString: true
+  }).then(() => {
+    updateMzDrugCodgData(codgInfo.value).then((res) => {
+      if(res.code === 0){
+        ElMessage({
+          type: "success",
+          message: res.message,
+          duration: 2500,
+          showClose: true,
+        });
+        emit('closeYpMzCodgMatch', true)
+      }
+    })
+  }).catch((action) => {
+    if (action === 'cancel') {
+      console.log("已取消。。。")
+    }
+  })
+
+}
+</script>

+ 0 - 1
src/views/yp-inventory/TempPurchaseAudit.vue

@@ -146,7 +146,6 @@ const ruleForm = ref({
 
 onMounted(() => {
     nextTick(() => {
-      console.log(props.ypTempPurchaseDetail)
         ruleForm.value = props.ypTempPurchaseDetail
         ruleForm.value.auditDate = now
     })