YangJian0701 7 months ago
parent
commit
818bfb5745
100 changed files with 3547 additions and 287 deletions
  1. 2 1
      .env
  2. 0 2
      env.development
  3. 7 0
      src/api/index.ts
  4. 16 0
      src/api/module/ReturnGoodsIncome.ts
  5. 52 0
      src/api/module/ReturnGoodsScrap.ts
  6. 4 0
      src/api/module/transmitReceive.ts
  7. 1 1
      src/components/bg.vue
  8. 4 4
      src/components/table.vue
  9. 1 1
      src/utils/download.ts
  10. 1 1
      src/views/layout/routerMenu.vue
  11. 246 0
      src/views/stockcontrol/ReturnGoodsIncome/Editinventory.vue
  12. 346 0
      src/views/stockcontrol/ReturnGoodsIncome/Labour.vue
  13. 224 0
      src/views/stockcontrol/ReturnGoodsIncome/index.vue
  14. 131 0
      src/views/stockcontrol/ReturnGoodsIncome/inputSearch.vue
  15. 277 0
      src/views/stockcontrol/ReturnGoodsIncome/scanCode.vue
  16. 242 0
      src/views/stockcontrol/ReturnGoodsIncome/transportScanCode.vue
  17. 249 0
      src/views/stockcontrol/ReturnGoodsScrap/Editinventory.vue
  18. 350 0
      src/views/stockcontrol/ReturnGoodsScrap/Labour.vue
  19. 175 0
      src/views/stockcontrol/ReturnGoodsScrap/downing.vue
  20. 45 0
      src/views/stockcontrol/ReturnGoodsScrap/goorsnote.vue
  21. 252 0
      src/views/stockcontrol/ReturnGoodsScrap/index.vue
  22. 124 0
      src/views/stockcontrol/ReturnGoodsScrap/inputSearch.vue
  23. 43 0
      src/views/stockcontrol/ReturnGoodsScrap/js/interface.ts
  24. 301 0
      src/views/stockcontrol/ReturnGoodsScrap/scanCode.vue
  25. 48 0
      src/views/stockcontrol/ReturnGoodsScrap/scrapNote.vue
  26. 1 1
      src/views/stockcontrol/storageFrom/Editinventory.vue
  27. 7 3
      src/views/stockcontrol/storageFrom/Labour.vue
  28. 168 0
      src/views/stockcontrol/storageFrom/Outbound.vue
  29. 109 247
      src/views/stockcontrol/storageFrom/downing.vue
  30. 8 1
      src/views/stockcontrol/storageFrom/index.vue
  31. 2 1
      src/views/stockcontrol/storageFrom/inputSearch.vue
  32. 40 0
      src/views/stockcontrol/storageFrom/js/interface.ts
  33. 13 2
      src/views/stockcontrol/storageFrom/scanCode.vue
  34. 1 1
      src/views/stockcontrol/storagePut/Editinventory.vue
  35. 7 3
      src/views/stockcontrol/storagePut/Labour.vue
  36. 5 1
      src/views/stockcontrol/storagePut/index.vue
  37. 1 2
      src/views/stockcontrol/storagePut/inputSearch.vue
  38. 14 5
      src/views/stockcontrol/storagePut/scanCode.vue
  39. 23 3
      src/views/stockcontrol/storagePut/transportScanCode.vue
  40. 2 2
      src/views/stockcontrol/transmitReceive/downing.vue
  41. 4 4
      src/views/stockcontrol/transmitReceive/index.vue
  42. BIN
      出入库管理系统.rar
  43. 0 0
      出入库管理系统/css/193.2f535045.css
  44. 0 0
      出入库管理系统/css/366.2b0d00a5.css
  45. 0 0
      出入库管理系统/css/684.4b5d2e9a.css
  46. 0 0
      出入库管理系统/css/79.cdc6182a.css
  47. 0 0
      出入库管理系统/css/877.2b0d00a5.css
  48. 0 0
      出入库管理系统/css/app.72159cba.css
  49. 1 1
      出入库管理系统/index.html
  50. 0 0
      出入库管理系统/js/134.49129ba1.js
  51. 0 0
      出入库管理系统/js/134.49129ba1.js.map
  52. 0 0
      出入库管理系统/js/134.79d902b2.js
  53. 0 0
      出入库管理系统/js/134.79d902b2.js.map
  54. 0 0
      出入库管理系统/js/179.05fdfd25.js
  55. 0 0
      出入库管理系统/js/179.05fdfd25.js.map
  56. 0 0
      出入库管理系统/js/179.f5b7b03d.js
  57. 0 0
      出入库管理系统/js/179.f5b7b03d.js.map
  58. 0 0
      出入库管理系统/js/193.28f4566f.js
  59. 0 0
      出入库管理系统/js/193.28f4566f.js.map
  60. 0 0
      出入库管理系统/js/219.8997cfec.js
  61. 0 0
      出入库管理系统/js/219.8997cfec.js.map
  62. 0 0
      出入库管理系统/js/253.2e54f253.js
  63. 0 0
      出入库管理系统/js/253.2e54f253.js.map
  64. 0 0
      出入库管理系统/js/253.94c75931.js
  65. 0 0
      出入库管理系统/js/253.94c75931.js.map
  66. 0 0
      出入库管理系统/js/264.4b05b936.js
  67. 0 0
      出入库管理系统/js/264.4b05b936.js.map
  68. 0 0
      出入库管理系统/js/264.7ddb9f74.js
  69. 0 0
      出入库管理系统/js/264.7ddb9f74.js.map
  70. 0 0
      出入库管理系统/js/33.e42ea9ae.js
  71. 0 0
      出入库管理系统/js/33.e42ea9ae.js.map
  72. 0 0
      出入库管理系统/js/357.b7381f47.js
  73. 0 0
      出入库管理系统/js/357.b7381f47.js.map
  74. 0 0
      出入库管理系统/js/366.bae3d234.js
  75. 0 0
      出入库管理系统/js/366.bae3d234.js.map
  76. 0 0
      出入库管理系统/js/401.91f77812.js
  77. 0 0
      出入库管理系统/js/401.91f77812.js.map
  78. 0 0
      出入库管理系统/js/401.a34dc089.js
  79. 0 0
      出入库管理系统/js/401.a34dc089.js.map
  80. 0 0
      出入库管理系统/js/422.97afcb33.js
  81. 0 0
      出入库管理系统/js/422.97afcb33.js.map
  82. 0 0
      出入库管理系统/js/422.fc41c509.js
  83. 0 0
      出入库管理系统/js/422.fc41c509.js.map
  84. 0 0
      出入库管理系统/js/605.b261a02e.js
  85. 0 0
      出入库管理系统/js/605.b261a02e.js.map
  86. 0 0
      出入库管理系统/js/670.75af8c98.js
  87. 0 0
      出入库管理系统/js/670.75af8c98.js.map
  88. 0 0
      出入库管理系统/js/670.b9c22b4c.js
  89. 0 0
      出入库管理系统/js/670.b9c22b4c.js.map
  90. 0 0
      出入库管理系统/js/674.084146e3.js
  91. 0 0
      出入库管理系统/js/674.084146e3.js.map
  92. 0 0
      出入库管理系统/js/684.761b972b.js
  93. 0 0
      出入库管理系统/js/684.761b972b.js.map
  94. 0 0
      出入库管理系统/js/79.615eaf5e.js
  95. 0 0
      出入库管理系统/js/79.615eaf5e.js.map
  96. 0 0
      出入库管理系统/js/877.23415a72.js
  97. 0 0
      出入库管理系统/js/877.23415a72.js.map
  98. 0 0
      出入库管理系统/js/894.412012ab.js
  99. 0 0
      出入库管理系统/js/894.412012ab.js.map
  100. 0 0
      出入库管理系统/js/894.cd3b3575.js

+ 2 - 1
.env

@@ -1,9 +1,10 @@
 NODE_ENV = 'production'
+# VUE_APP_BASE_URL1 = 'http://192.168.11.77:8100/'
+# VUE_APP_BASE_URL2 = 'http://192.168.11.77:8110/'
 VUE_APP_BASE_URL1 = 'https://godown.coldbaozhida.com/oauth/'
 VUE_APP_BASE_URL2 = 'https://godown.coldbaozhida.com/godown/'
 
 
-
 VUE_APP_BASE_URL_PORT1 = '8100/' 
 VUE_APP_BASE_URL_PORT2 = '8110/'
 

+ 0 - 2
env.development

@@ -3,8 +3,6 @@ VUE_APP_BASE_URL1 = 'https://godown.coldbaozhida.com/oauth/'
 VUE_APP_BASE_URL2 = 'https://godown.coldbaozhida.com/godown/'
 
 
-
-
 VUE_APP_BASE_URL_PORT1 = '8100/'  
 VUE_APP_BASE_URL_PORT2 = '8110/'
 

+ 7 - 0
src/api/index.ts

@@ -5,12 +5,19 @@ export * from './module/storageInquire'
 export * from './module/sellManage'
 
 export * from './module/storageOrderGoods'
+export * from './module/ReturnGoodsScrap'
+
+
 export * from './module/essentialinfo'
 export * from './module/transmitReceive'
 export * from './module/storagePut'
 export * from './module/storageFrom'
 export * from './module/printUilts'//打印,导出
 
+
+export * from './module/ReturnGoodsIncome'
+
+
 export * from './module/home'
 export * from './module/menu'
 export * from './module/files'

+ 16 - 0
src/api/module/ReturnGoodsIncome.ts

@@ -0,0 +1,16 @@
+
+import $http from '@/utils/index'
+
+/**
+ * 退货入库入库列表
+ * @param params 
+ * @returns 
+ */
+export const stockrefundInList = (params: any) => $http.post('/stock-template/refund/in/list', params)
+
+export const stockTemplateRefBatchIn = (params: any) => $http.post('/stock-template/refund/batch-in', params)
+
+
+export const medicRefTransport = (params: any) => $http.get('/stock-template/refund/out/barcode-info', params)
+
+export const stockRefCodein = (params: any) => $http.post('/stock-template/refund/scan-code-in', params)

+ 52 - 0
src/api/module/ReturnGoodsScrap.ts

@@ -0,0 +1,52 @@
+
+import $http from '@/utils/index'
+
+/**
+ * 入库列表
+ * @param params 
+ * @returns 
+ */
+export const stockrefsoutList = (params: any) => $http.post('/stock-template/refund/out/list', params)
+
+
+/**
+ * 退货单
+ * @param params 
+ * @returns 
+ */
+export const stockTemprefOutexport = (params: any) => $http.post('/stock-template/refund/out/export', params,{ responseType: "blob", })
+
+/**
+ * 报废出库单
+ * @param params 
+ * @returns 
+ */
+export const stockscrapoutexport = (params: any) => $http.post('/stock-template/scrap/out/export', params,{ responseType: "blob", })
+
+
+/**
+ * 批量入库
+ * @param params 
+ * @returns 
+ */
+export const RetGoodsRefout = (params: any) => $http.post('/stock-template/refund/batch-out', params)
+
+ /* 扫码出库
+ * @param params 
+ * @returns 
+ */
+
+export const RetGoodsRefcodeout = (params: any) => $http.post('/stock-template/refund/scan-code-out', params)
+
+export const RetGoodsReftransportout = (params: any) => $http.post('/stock-template/refund/out/transport-record/export', params, { responseType: "blob", })
+
+// 退货出库运输记录表----列表
+export const RetGoodsReftranList = (params: any) => $http.post('/stock-template/refund/out/transport-record/export', params)
+
+
+
+export const transportRecordLists = (params: any) => $http.post('/stock-template/refund/out/transport-record/list', params)
+
+
+
+

+ 4 - 0
src/api/module/transmitReceive.ts

@@ -10,6 +10,10 @@ export const inventoryExcel = (params: any) => $http.post('/stock-template/inven
 // 运输-excel
 export const transportWord = (params: any) => $http.post('/stock-template/transport-record/export', params, { responseType: "blob", })
 
+export const tranoutexport = (params: any) => $http.post('/stock-template/out/export', params, { responseType: "blob", })
+
+// 运输-excel
+export const transportrecordList = (params: any) => $http.post('/stock-template/transport-record/list', params)
 
 // //购货单位
 // export const stockunit = (params: any) => $http.post('/stock/unit/list', params)

+ 1 - 1
src/components/bg.vue

@@ -1,7 +1,7 @@
 <template>
     <div class="bg">
         <div class="bg-tit">
-            <div style="display: flex;align-items: center;flex: 1;">
+            <div style="display: flex;align-items: center;flex: 1;flex-shrink: 0;min-width: 200px;">
                 <markGreen></markGreen>
                 <el-text style="margin-left: 20px;" tag="b">
                     <slot name="tit">{{props.istitle}}</slot>

+ 4 - 4
src/components/table.vue

@@ -3,7 +3,7 @@
   <div class="y-tabs">
       <el-table v-loading="loading" :data="tableData" @row-click="props.rowClick"
           @selection-change="props.selectionChange" :row-key="props.getRowKey"
-          :border="props.border"
+          :border="props.border" max-height="450"
           :row-style="tableRowClassName" table-layout="auto">
          <!-- 默认插槽 -->
     <slot></slot>
@@ -58,7 +58,7 @@
       <!-- 分页组件 -->
       <div style="margin-top: 20px;">
           <el-pagination v-model:current-page="pageable.pageNum" v-model:page-size="pageable.pageSize" v-if="pagination"
-       :layout="props.layout" :total="pageable.total"
+       :layout="props.layout" :total="pageable.total" :page-sizes="[8, 10, 20, 50]"
        @size-change="handleSizeChange" @current-change="handleCurrentChange" />
       </div>
   </div>
@@ -91,9 +91,9 @@ const props = withDefaults(defineProps<ProTableProps>(), {
   columns: () => [],//渲染表格
   pagination: true,
   // layout: 'total, prev, pager, next, jumper',
-  layout: ' prev, pager, next',
+  layout: 'total, sizes, prev, pager, next, jumper',
   initParam: {},//请求参数
-  border: false,
+  border: true,
   toolButton: true,
   selectId: 'id',
   searchCol: () => ({ xs: 1, sm: 2, md: 2, lg: 3, xl: 4 })

+ 1 - 1
src/utils/download.ts

@@ -33,7 +33,7 @@ export function downloadExcelFun(res: any) {
 }
 
 
-//打印
+//下载pdf
 export function downPDF(result: any) {
   let fileAddress = URL.createObjectURL(new Blob([result.data], { type: "application/pdf;charset=utf-8" }))
   let innHtml = window.open(fileAddress, '_blank');

+ 1 - 1
src/views/layout/routerMenu.vue

@@ -1,5 +1,5 @@
 <template>
-  <div class="routerMenu">
+  <div class="routerMenu" :style="{width:!data.iscollapse?'160px':''}">
     <el-menu :default-active="data.isRouter" menu-trigger="click" v-for="item, index in routerData" :collapse="data.iscollapse" :unique-opened="false" :key="index" router>
       <el-menu-item :index="item.path" v-if="!item.children">
         <span class="iconfont" :class="item.icon" style="font-size: 16px;"></span>

+ 246 - 0
src/views/stockcontrol/ReturnGoodsIncome/Editinventory.vue

@@ -0,0 +1,246 @@
+<!-- 扫码 -->
+<template>
+    <div class="">
+        <el-button type="primary" @click="editFun(props.row)">编辑</el-button>
+        <el-button type="danger" @click="delClick(props.row)">删除</el-button>
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="编辑" :append-to-body="true" draggable width="60%">
+            <el-form ref="ruleFormRef" :rules="rules" :model="initParam" :inline="true">
+                <el-divider content-position="center">药品信息</el-divider>
+                <el-form-item :label="item.name" :label-width="formLabelWidth" v-for="(item,index) in data.showDiaData" :key="index" :prop="'medicineInfo.'+item.field_name">
+                    <el-select v-model="initParam.medicineInfo[item.field_name]" :placeholder="'请选择'+item.name" class="inputWidth" v-if="[1,2,3,4,5].includes(item.type)">
+                        <el-option :label="itemIt.name" :value="itemIt.id" v-for="itemIt,i in item.list" :key="i"/>
+                    </el-select>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==6"/>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==7"/>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==8"/>
+                    <el-date-picker v-model="initParam.medicineInfo[item.field_name]" type="date" value-format="YYYY-MM-DD" :placeholder="'请输入'+item.name" clearable style="width: 200px;" v-if="item.type==9"/>
+                    <el-date-picker v-model="initParam.medicineInfo[item.field_name]" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" :placeholder="'请输入'+item.name" clearable style="width: 200px;" v-if="item.type==10"/>
+                </el-form-item>
+                <el-divider content-position="center">入库信息</el-divider>
+                <el-form-item class="el-form-item-main" label="数量" :label-width="formLabelWidth" prop="quantity">
+                    <el-input v-model.number="initParam.quantity" autocomplete="off" class="inputWidth" />
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="购进单价" :label-width="formLabelWidth">
+                    <el-input v-model="initParam.unit_price" autocomplete="off" class="inputWidth"/>
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="入库日期" :label-width="formLabelWidth" prop="date">
+                    <el-date-picker v-model="initParam.date" type="date" placeholder="血液制品效期" value-format="YYYY-MM-DD" clearable style="width: 200px;" />
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="发货单位" :label-width="formLabelWidth">
+                    <el-autocomplete v-model="initParam.forwarding_unit" :fetch-suggestions="querySearch1" clearable class="inputWidth"
+                        placeholder="发货单位" />
+                </el-form-item>
+                <el-form-item label="经办人" :label-width="formLabelWidth" prop="operator">
+                    <el-autocomplete v-model="initParam.operator" :fetch-suggestions="querySearch" clearable class="inputWidth"
+                        placeholder="经办人" />
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="dialogFormVisible = false">取消</el-button>
+                    <el-button type="primary" @click="submitForm(ruleFormRef)">提交</el-button>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import type { FormInstance} from 'element-plus'
+import { syrulesData } from "@/plugins/rulesData";
+const dialogFormVisible = ref(false)
+const ruleFormRef = ref<FormInstance>()
+let rules:any = reactive({})
+
+
+const props = defineProps({
+    row: {
+        type: Object,
+        default: () => { },
+    },
+})
+
+import { 
+    medicListStock,
+    stockunit,//发货单位
+    operatorList,//经办人
+    stockedit,//编辑
+    stockdel,//删除
+} from "@/api";
+import { ElMessage, ElMessageBox } from 'element-plus'
+const formLabelWidth = '110px'
+
+//提交参数
+let initParam:any = reactive({
+    "id":"",
+    "date": "",
+    "forwarding_unit": "",
+    "medicineInfo": {},
+    "operator":'',
+    "quantity": null,
+    "unit_price":Number(null)
+})
+let data:any = reactive({
+    tableData:[],
+    showDiaData:[],
+    rules1:{},
+    columns:[],// 渲染表格
+    selectType:[],//表格的下拉对应
+    editStrot:false,
+    editIndex:null
+}) 
+
+//显示编辑
+const editFun = async (row:any)=>{
+    console.log('编辑',row)
+    dialogFormVisible.value = true
+    await medicListStockFun()//获取入库表单
+    await itemPirFun()//发货单位
+    await operatorListApi()//经办人
+
+}
+
+interface RestaurantItem {
+  value: string
+  link: string
+}
+const restaurants = ref<RestaurantItem[]>([])
+const querySearch = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants.value.filter(createFilter(queryString))
+    : restaurants.value
+  cb(results)
+}
+const createFilter = (queryString: string) => {
+  return (restaurant: RestaurantItem) => {
+    return (
+      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+    )
+  }
+}
+
+const restaurants1 = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants1.value.filter(createFilter(queryString))
+    : restaurants1.value
+  cb(results)
+}
+
+const emit:any = defineEmits(['scanCode','editinvent'])
+
+//重置
+const resetForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.resetFields()
+}
+
+//提交
+const submitForm = async (formEl: FormInstance | undefined) => {
+    console.log('tijiao',initParam)
+  if (!formEl) return
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+        stockeditApi()
+    } else {
+        ElMessage.error('请完善必填项')
+    }
+  })
+}
+//提交编辑
+const stockeditApi = async ()=>{
+    let param = {...initParam}
+    param.unit_price = Number(param.unit_price)
+    const reslut:any = await stockedit(param)
+    if(reslut.code==200 && reslut.msg=='修改入库信息成功'){
+        emit('editinvent', '');
+        dialogFormVisible.value = false;
+        ElMessage.success(reslut.msg)
+    }
+}
+//收发货单位Api
+const itemPirFun = async()=>{
+    const reslut:any = await stockunit({ type: 3 })
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants1.value = arr
+}
+//经办人Api
+const operatorListApi = async()=>{
+    const reslut:any = await operatorList({})
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants.value = arr
+}
+
+//获取入库表单Api
+const medicListStockFun = async ()=>{
+    data.columns = []
+    const reslut:any = await medicListStock({})
+    if(reslut.code==200 && reslut.msg=='查询成功'){
+        data.showDiaData = reslut.data?.list
+        data.rules1 = {}
+        data.columns = []
+        data.selectType = []
+        reslut.data?.list.forEach((value:any) => { //value设置成key
+            data.selectType.push({type:value.type,list:value.list})
+            data.columns.push({ prop: value.field_name, label: value.name, list:value.list})
+            initParam.medicineInfo[value.field_name] = ''; // 这里可以根据需要设置其他值作为键的内容
+            if(['product_id','enterprise_id','spec_id','batch_number','expiry_date','approval_number'].includes(value.field_name)){
+                if(value.type==6){
+                    data.rules1['medicineInfo.'+value.field_name] =  [{required: true,message: '必填项',trigger: 'change'}]
+                }else if(value.type==7){
+                    data.rules1['medicineInfo.'+value.field_name] =  [{required: true,message: '必填项',trigger: 'change'},{ pattern: /^(?:[1-9]\d*)$/, message: '请输入正整数', trigger: "blur" },]
+                }else{
+                    data.rules1['medicineInfo.'+value.field_name] = [{required: true,message: '必填项',trigger: 'change',}]
+                }
+            }
+        });
+        Object.assign(rules,{...data.rules1,...syrulesData})
+        let obj = {...props.row}
+        Object.keys(initParam).forEach(key => {
+            if(key!='medicineInfo'){
+                initParam[key] = obj[key]
+            }else{
+                Object.keys(initParam.medicineInfo).forEach(key => {
+                    initParam.medicineInfo[key] = obj[key]
+                })
+            }
+        })
+        console.log('rules',initParam,obj)
+        dialogFormVisible.value = true
+    }
+}
+
+/**
+ * 删除
+ * @param row 
+ */
+const delClick = (row:any) => {
+    ElMessageBox.confirm('删除一条信息,将导致数量变化,是否继续?','删除',{
+      confirmButtonText: '确认删除',
+      cancelButtonText: 'Cancel',
+      type: 'error',
+      center: true,
+    }).then(async() => {
+        const reslut:any = await stockdel({id:row.id})
+        console.log('删除成功',reslut)
+        if(reslut.code==200 && reslut.msg=='删除入库信息成功'){ emit('editinvent', '');ElMessage.success(reslut.msg)}
+    }).catch(() => {
+      ElMessage.info('已取消删除')
+    })
+}
+
+</script>
+<style lang="scss">
+.inputWidth {
+    width: 200px;
+}
+</style>

+ 346 - 0
src/views/stockcontrol/ReturnGoodsIncome/Labour.vue

@@ -0,0 +1,346 @@
+<!-- 手动 -->
+<template>
+    <div class="">
+        <el-button el-button type="primary" icon="Pointer" @click="showDia">手动退货入库</el-button>
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="手动入库" :append-to-body="true" :before-close="closeFun" draggable
+            :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
+            <el-form ref="ruleFormRef" :rules="rules" :model="initParam" :inline="true">
+                <el-divider content-position="center">药品信息</el-divider>
+                <el-form-item :label="item.name" :label-width="formLabelWidth" v-for="(item, index) in data.showDiaData"
+                    :key="index" :prop="'medicineInfo.' + item.field_name">
+                    <el-select v-model="initParam.medicineInfo[item.field_name]" :placeholder="'请选择' + item.name"
+                        class="inputWidth" v-if="[1, 2, 3, 4, 5].includes(item.type)">
+                        <el-option :label="itemIt.name" :value="itemIt.id" v-for="itemIt, i in item.list" :key="i" />
+                    </el-select>
+                    
+
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off"
+                        :placeholder="'请输入' + item.name" class="inputWidth" v-if="[6,7,8].includes(item.type)" />
+
+
+                    <el-date-picker v-model="initParam.medicineInfo[item.field_name]" type="date" value-format="YYYY-MM-DD"
+                        :placeholder="'请输入' + item.name" clearable style="width: 200px;" v-if="item.type == 9" />
+                    <el-date-picker v-model="initParam.medicineInfo[item.field_name]" type="datetime"
+                        value-format="YYYY-MM-DD HH:mm:ss" :placeholder="'请输入' + item.name" clearable style="width: 200px;"
+                        v-if="item.type == 10" />
+                </el-form-item>
+                <el-divider content-position="center">入库信息</el-divider>
+                <el-form-item class="el-form-item-main" label="数量" :label-width="formLabelWidth" prop="quantity">
+                    <el-input v-model.number="initParam.quantity" autocomplete="off" class="inputWidth" />
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="单价" :label-width="formLabelWidth">
+                    <el-input v-model="initParam.unitPrice" autocomplete="off" class="inputWidth" />
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="入库日期" :label-width="formLabelWidth" prop="date">
+                    <el-date-picker v-model="initParam.date" type="date" placeholder="入库日期" value-format="YYYY-MM-DD"
+                        clearable style="width: 200px;" />
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="发货单位" :label-width="formLabelWidth">
+                    <el-autocomplete v-model="initParam.forwardingUnit" :fetch-suggestions="querySearch1" clearable class="inputWidth"
+                        placeholder="发货单位" />
+                </el-form-item>
+                <el-form-item label="经办人" :label-width="formLabelWidth" prop="operator">
+                    <el-autocomplete v-model="initParam.operator" :fetch-suggestions="querySearch" clearable class="inputWidth"
+                        placeholder="经办人" />
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button type="primary" @click="submitForm(ruleFormRef)">加入暂存</el-button>
+                    <el-button @click="showinnerVisible">查看暂存</el-button>
+                    <el-button type="danger" @click="resetForm(ruleFormRef)">重置数据</el-button>
+                </span>
+            </template>
+            <el-dialog v-model="innerVisible" title="入库数据" width="95%" append-to-body draggable
+                :close-on-click-modal="false" :close-on-press-escape="false">
+                <el-table :data="data.tableData" style="width: 100%" border max-height="450"
+                    :header-cell-style="{ 'background-color': '#ccc', 'color': 'white' }">
+                    <el-table-column :label="item.label" v-for="item, i in data.columns" :key="i" min-width="110"
+                        show-overflow-tooltip>
+                        <template #default="scope"><!--scope.row.medicineInfo[item.prop] -->
+                            {{ findFun(scope.row.medicineInfo[item.prop], item.list) }}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="quantity" label="数量" min-width="110" show-overflow-tooltip />
+                    <el-table-column prop="unitPrice" label="购进单价" min-width="110" show-overflow-tooltip />
+                    <el-table-column prop="forwardingUnit" label="发货单位" min-width="110" show-overflow-tooltip />
+                    <el-table-column prop="date" label="入库日期" min-width="110" show-overflow-tooltip />
+                    <el-table-column prop="operator" label="经办人" min-width="110" show-overflow-tooltip />
+
+                    <el-table-column fixed="right" label="操作" min-width="110">
+                        <template #default="scope">
+                            <el-button type="primary" :icon="Edit" @click="handleClick(scope.row, scope.$index)" circle />
+                            <el-button type="danger" :icon="Delete" @click="delClick(scope.$index)" circle />
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <template #footer>
+                    <span class="dialog-footer">
+                        <el-button @click="innerVisible = false">关闭</el-button>
+                        <el-button type="primary" @click="subStock">立即入库</el-button>
+                    </span>
+                </template>
+            </el-dialog>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref ,onMounted} from 'vue'
+import type { FormInstance, FormRules } from 'element-plus'
+import { ElNotification } from 'element-plus'
+import { syrulesData, columnsTable } from "@/plugins/rulesData";
+import {timesFn} from "@/plugins/settime";
+
+const dialogFormVisible = ref(false)
+const ruleFormRef = ref<FormInstance>()
+
+let rules: any = reactive({})
+
+import {
+    medicListStock,
+    stockunit,//发货单位
+    operatorList,//经办人
+    stockTemplateIn,//单个入库
+    stockTemplateRefBatchIn,//批量入库
+} from "@/api";
+const innerVisible = ref(false)
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { Delete, Edit, } from '@element-plus/icons-vue'
+const formLabelWidth = '110px'
+let initParam: any = reactive({
+    "date":"",
+    "forwardingUnit": "",
+    "medicineInfo": {},
+    "operator": '',
+    "quantity": '',
+    "unitPrice":null
+})
+
+interface RestaurantItem {
+  value: string
+  link: string
+}
+const restaurants = ref<RestaurantItem[]>([])
+const querySearch = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants.value.filter(createFilter(queryString))
+    : restaurants.value
+  cb(results)
+}
+const createFilter = (queryString: string) => {
+  return (restaurant: RestaurantItem) => {
+    return (
+      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+    )
+  }
+}
+
+const restaurants1 = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants1.value.filter(createFilter(queryString))
+    : restaurants1.value
+  cb(results)
+}
+
+let data: any = reactive({
+    tableData: [],
+    showDiaData: [],
+    itemPir: [],
+    rules1: {},
+    columns: [],// 渲染表格
+    selectType: [],//表格的下拉对应
+    editStrot: false,
+    editIndex: null
+})
+const emit: any = defineEmits(['scanCode'])
+//立即入库
+const subStock = async () => {
+    let arr = [...data.tableData]
+    arr.forEach(item=>{
+        item.unitPrice = Number(item.unitPrice)
+    })
+    const reslut: any = await stockTemplateRefBatchIn({ "stockInList":arr })
+    console.log('返回', reslut)
+    if (reslut.code == 200 && reslut.msg == '入库成功') {
+        ElMessage.success(reslut.msg)
+        dialogFormVisible.value = false
+        innerVisible.value = false
+        emit('scanCode', '')
+        data.tableData = []
+    }
+}
+
+//函数
+const findFun = (data: any, list: any) => {
+    if (list) {
+        const b = list.find((item: any) => item.id == data)
+        if (b) return b.name
+        else return ''
+    } else {
+        return data
+    }
+}
+const resetForm = (formEl: FormInstance | undefined) => {
+    if (!formEl) return
+    formEl.resetFields()
+}
+//加入暂存区
+const submitForm = async (formEl: FormInstance | undefined) => {
+    if (!formEl) return
+    await formEl.validate((valid, fields) => {
+        if (valid) {
+            ElNotification({
+                title: '暂存成功',
+                message: 'ok,加入暂存成功,右下角按钮查看/提交暂存',
+                type: 'success',
+            })
+            console.log('提交', data.editStrot)
+            if (data.editStrot) {//编辑状态
+                let { date, forwardingUnit, operator, quantity, unitPrice, medicineInfo } = initParam
+                data.tableData.splice(data.editIndex, 1, { date, forwardingUnit, operator, quantity, unitPrice: unitPrice, medicineInfo: { ...medicineInfo } })
+                console.log('编辑状态', data.tableData)
+            } else {//正常添加
+                let { date, forwardingUnit, operator, quantity, unitPrice, medicineInfo } = initParam
+                data.tableData.push({ date, forwardingUnit, operator, quantity, unitPrice: unitPrice, medicineInfo: { ...medicineInfo } })
+                console.log('正常添加', data.tableData)
+            }
+        } else {
+            ElMessage.error('请完善必填项')
+        }
+    })
+}
+
+//函数
+const closeFun = async () => {
+    if (data.tableData.length == 0) {
+        dialogFormVisible.value = false
+        data.tableData = []
+    } else {
+        ElMessageBox.confirm('请检查录入数据是否已经提交,该操作将放弃录入信息,是否放弃?', '提示', {
+            confirmButtonText: '立即去入库',
+            cancelButtonText: '放弃数据',
+            type: 'warning',
+            draggable: true,
+            center: true,
+        }).then(() => {
+            innerVisible.value = true
+        }).catch(() => {
+            dialogFormVisible.value = false
+            ElMessage.success('已放弃入库数据')
+        })
+    }
+}
+//收发货单位
+const itemPirFun = async () => {
+    const reslut: any = await stockunit({ type: 3 })
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants1.value = arr
+}
+//经办人Api
+const operatorListApi = async () => {
+    const reslut: any = await operatorList({})
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants.value = arr
+}
+
+
+//函数
+const showinnerVisible = async () => {
+    innerVisible.value = true
+    data.editStrot = false
+    console.log(data.tableData)
+}
+
+const showDia = async () => {
+    data.tableData = []
+    data.showDiaData = []
+    data.rules1 = []
+    data.columns = []
+    data.selectType = []
+    data.editStrot = false
+    resetFun()//复原表单
+    medicListStockFun()//获取入库表单
+    itemPirFun()//发货单位
+    operatorListApi()//经办人
+    initParam.date = timesFn()
+
+}
+//复原表单
+const resetFun = async () => {
+    initParam.date = ''
+    initParam.forwardingUnit = ''
+    initParam.medicineInfo = {}
+    initParam.operator = ''
+    initParam.quantity = ''
+    initParam.unitPrice = null
+    resetForm(ruleFormRef.value)
+}
+//获取入库表单Api
+const medicListStockFun = async () => {
+    data.columns = []
+    const reslut: any = await medicListStock({})
+    if (reslut.code == 200 && reslut.msg == '查询成功') {
+        data.showDiaData = reslut.data?.list
+        data.rules1 = {}
+        data.columns = []
+        data.selectType = []
+        reslut.data?.list.forEach((value: any) => { //value设置成key
+            data.selectType.push({ type: value.type, list: value.list })
+            data.columns.push({ prop: value.field_name, label: value.name, list: value.list })
+            initParam.medicineInfo[value.field_name] = ''; // 这里可以根据需要设置其他值作为键的内容
+            if (['product_id', 'enterprise_id', 'spec_id', 'batch_number', 'expiry_date'].includes(value.field_name)) {
+                // if (value.type == 6) {
+                //     data.rules1['medicineInfo.' + value.field_name] = [{ required: true, message: '必填项', trigger: 'change' }, { pattern: /^([1-9]\d*|0)(\.\d{1,2})?$/, message: '请输入>=0,(最多两位小数)', trigger: "blur" },]
+                // } else if (value.type == 7) {
+                //     data.rules1['medicineInfo.' + value.field_name] = [{ required: true, message: '必填项', trigger: 'change' }, { pattern: /^(?:[1-9]\d*)$/, message: '请输入正整数', trigger: "blur" },]
+                // } else {
+                //     data.rules1['medicineInfo.' + value.field_name] = [{ required: true, message: '必填项', trigger: 'change', }]
+                // }
+                data.rules1['medicineInfo.' + value.field_name] = [{ required: true, message: '必填项', trigger: 'change', }]
+            }else{
+                if (value.type == 8) {
+                    data.rules1['medicineInfo.' + value.field_name] = [{ required: false, message: '必填项', trigger: 'change' }, { pattern: /^([1-9]\d*|0)(\.\d{1,2})?$/, message: '请输入>=0,(最多两位小数)', trigger: "blur" },]
+                } else if (value.type == 7) {
+                    data.rules1['medicineInfo.' + value.field_name] = [{ required: false, message: '必填项', trigger: 'change' }, { pattern: /^(?:[1-9]\d*)$/, message: '请输入正整数', trigger: "blur" },]
+                }
+            }
+        });
+        Object.assign(rules, { ...data.rules1, ...syrulesData })
+        // console.log('表格', data.selectType)
+        dialogFormVisible.value = true
+    }
+}
+
+const handleClick = (datas: any, index: any) => {
+    data.editStrot = true
+    data.editIndex = index
+    let { date, forwardingUnit, operator, quantity, unitPrice, medicineInfo } = datas
+    Object.assign(initParam, { date, forwardingUnit, operator, quantity, unitPrice, medicineInfo: { ...medicineInfo } })
+    innerVisible.value = false
+}
+const delClick = (index: any) => {
+    ElMessageBox.confirm('删除一条信息,是否继续?', '删除', {
+        confirmButtonText: '确认删除',
+        cancelButtonText: 'Cancel',
+        type: 'warning',
+        center: true,
+    }).then(() => {
+        data.tableData.splice(index, 1);
+        ElMessage.success('已删除')
+    })
+}
+
+</script>
+<style lang="scss">.inputWidth {
+    width: 200px;
+}</style>

+ 224 - 0
src/views/stockcontrol/ReturnGoodsIncome/index.vue

@@ -0,0 +1,224 @@
+<!-- 退货入库 -->
+<template>
+    <div class="storagePut">
+        <searchAdd isButtom="查询" @event="eventFun">
+            <template #searchConter>
+                <el-form-item label="血液制品名称">
+                    <el-select v-model.number="initParam.productId" filterable remote reserve-keyword placeholder="血液制品名称"
+                        :remote-method="remoteMethod1" :loading="loading" clearable style="width: 200px;"
+                        @clear="initParam.productId = null" @click="click1">
+                        <el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="生产企业">
+                    <el-select v-model.number="initParam.enterpriseId" filterable remote reserve-keyword placeholder="生产企业"
+                        :remote-method="remoteMethod2" :loading="loading" clearable @clear="initParam.enterpriseId = null"
+                        @click="click2" style="width: 200px;">
+                        <el-option v-for="item in options2" :key="item.value" :label="item.label" :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="血液制品批号">
+                    <el-input v-model="initParam.batchNumber" placeholder="血液制品批号" clearable style="width: 200px;" />
+                </el-form-item>
+                <el-form-item label="退货入库日期">
+                    <el-date-picker v-model="data.datepick" type="daterange" placeholder="出/入库日期" clearable
+                        start-placeholder="开始" end-placeholder="结束" value-format="YYYY-MM-DD" style="width: 200px;"
+                        @change="changFun" />
+                </el-form-item>
+                <el-form-item label="发货单位">
+                    <el-select v-model="initParam.forwardingUnit" filterable remote reserve-keyword placeholder="发货单位"
+                        :remote-method="remoteMethod3" :loading="loading" clearable @click="click3" style="width: 200px;">
+                        <el-option v-for="item in options3" :key="item.value" :label="item.label" :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="条码">
+                    <el-input v-model="initParam.qrcode" placeholder="请输入条码" clearable style="width: 200px;" />
+                </el-form-item>
+            </template>
+        </searchAdd>
+        <bg istitle="基本信息">
+            <template #btn>
+                <Labour @scanCode="scanCodeFun" style="margin-right: 20px;"></Labour>
+                <scanCode @scanCode="scanCodeFun" style="margin-right: 20px;"></scanCode>
+                <transportScanCode @scanCode="scanCodeFun"></transportScanCode>
+            </template>
+            <template #bg>
+                <tables ref="TableRef" :requestApi="stockrefundInList" :columns="columns" :initParam="initParam">
+                    <template #right="{ row }">
+                        <Editinventory :row="row" @editinvent="editinventFun"></Editinventory>
+                    </template>
+                </tables>
+            </template>
+        </bg>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { 
+    stockrefundInList,
+    productList,//血液制品名称
+    enterpriseList,//生产企业
+    stockunit,//收发货单位
+    medicineColumns,//表头
+} from "@/api";
+import { reactive, ref,onMounted,onBeforeMount } from "vue";
+import tables from "@/components/table.vue";
+import searchAdd from "@/components/searchAdd.vue";
+import bg from '@/components/bg.vue'
+import Labour from './Labour.vue'
+import scanCode from './scanCode.vue'
+import transportScanCode from './transportScanCode.vue'
+
+
+
+import Editinventory from './Editinventory.vue'
+
+const TableRef = ref()
+import {columnsTable } from "@/plugins/rulesData";
+
+
+const scanCodeFun = async ()=>{
+    console.log('添加完成')
+    TableRef.value?.getTableList()
+}
+//函数
+const datepickFn = ()=>{
+    const today =  new Date()
+    const year = today.getFullYear();
+    const month = (today.getMonth() + 1).toString().padStart(2,'0'); // 注意月份从0开始,所以要加1
+    const date = (today.getDate()).toString().padStart(2,'0');
+    const j = year +'-' + month + '-'+date
+    data.datepick = [j,j]
+    initParam.startDate = j; initParam.endDate = j
+}
+onBeforeMount(()=>{
+    // datepickFn()
+})
+const columns:any = []
+//提交参数
+const initParam = reactive({
+    "batchNumber": "",
+    "enterpriseId": null,
+    "endDate": "",
+    "startDate": "",
+    "productId": null,
+    "forwardingUnit": "",
+    'qrcode':''
+})
+const data:any = reactive({
+    datepick:[]
+})
+
+/**
+ * 
+ * @param val 子传值
+ */
+ const eventFun = (val: any) => {
+    TableRef.value?.getTableList()
+}
+const loading = ref(false)
+const list1 = ref<ListItem[]>([])//血液制品名称
+const list2 = ref<ListItem[]>([])//生产企业
+const list3 = ref<ListItem[]>([])//收发货单位
+//函数
+const click1 = async () => { options1.value = list1.value }
+const click2 = async () => { options2.value = list2.value }
+const click3 = async ()=>{options3.value = list3.value}
+
+//函数
+const editinventFun = async ()=>{
+    TableRef.value?.getTableList()
+}
+// 渲染表格
+onMounted(async () => {
+     const r:any = await medicineColumns({})
+     console.log('rrr',r)
+     if(r.code==200){
+        let obj = [...r.data?.list]
+        TableRef.value.tableColumns = [...obj,...columnsTable]
+     }
+
+    const result1: any = await productList({ age: 1, pageSize: 999 })//血液制品名称
+    const result2: any = await enterpriseList({ age: 1, pageSize: 999 })//生产企业
+    const result3: any = await stockunit({ type: 1 })//收发货单位
+
+
+    list1.value = findMap(result1.data?.list || [], 'obj')
+    list2.value = findMap(result2.data?.list || [], 'obj')
+    list3.value = findMap(result3.data?.list || [],'map')
+
+})
+//函数
+const changFun = async (e: any) => {
+    if (e) { initParam.startDate = e[0]; initParam.endDate = e[1] }
+    else { initParam.startDate = ""; initParam.endDate = "" }
+}
+interface ListItem {
+    value: string
+    label: string
+}
+const options1 = ref<ListItem[]>([])
+const options2 = ref<ListItem[]>([])
+const options3 = ref<ListItem[]>([])
+
+const remoteMethod1 = async (query: string) => {
+    if (query) {
+        loading.value = true
+        setTimeout(() => {
+            loading.value = false
+            options1.value = list1.value.filter((item: any) => {
+                return item.label.toLowerCase().includes(query.toLowerCase())
+            })
+        }, 200)
+    } else {
+        options1.value = []
+    }
+}
+
+const remoteMethod2 = async (query: string) => {
+    if (query) {
+        loading.value = true
+        setTimeout(() => {
+            loading.value = false
+            options2.value = list2.value.filter((item: any) => {
+                console.log('第一个', query, item)
+                return item.label.toLowerCase().includes(query.toLowerCase())
+            })
+        }, 200)
+    } else {
+        options2.value = []
+    }
+}
+const remoteMethod3 = async (query: string) => {
+    if (query) {
+        loading.value = true
+        setTimeout(() => {
+            loading.value = false
+            options3.value = list3.value.filter((item: any) => {
+                return item.label.toLowerCase().includes(query.toLowerCase())
+            })
+        }, 200)
+    } else {
+        options3.value = []
+    }
+}
+//函数
+const findMap = (arr: any, obj: any) => {
+    return arr.map((item: any) => {
+        return { value: obj == 'obj' ? item.id : item, label: obj == 'obj' ? item.name : item }
+    })
+}
+
+
+
+
+
+</script>
+<style lang="scss">
+.storagePut {
+    user-select: none;
+}
+.el-form-item {
+    // margin-bottom: 0;
+}
+</style>

+ 131 - 0
src/views/stockcontrol/ReturnGoodsIncome/inputSearch.vue

@@ -0,0 +1,131 @@
+<template>
+    <div class="Qr">
+        <div class="Qr-img">
+            <img src="@/assets/img/BarCodeQR.svg" style="width: 80%;height: 80%;">
+        </div>
+        <div class="Qr-input">
+            <input class="Qr-input-type" ref="myInput" v-model="data.value" type="text" :placeholder="props.placeholderData">
+            <el-icon :size="18" style="cursor: pointer;" @click="CloseFn">
+                <CircleClose />
+            </el-icon>
+        </div>
+        <button class="Qr-isButton" @click="onSubmit">确认搜索</button>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive} from "vue";
+import { ElMessage } from 'element-plus'
+const myInput = ref()
+const data: any = reactive({
+    value: '',
+    num:0
+})
+const props = defineProps({
+    placeholderData:({
+        type:String,
+        default: () =>'请扫描追溯码'
+    })
+})
+const emit: any = defineEmits(['inputSearchData',])
+//函数
+const inputFocus = async () => {
+    console.log('获取焦点',myInput.value)
+    setTimeout(() => {
+        myInput.value!=null?myInput.value.focus():''
+    }, 1000)
+}
+//函数
+const CloseFn = async () => {
+    ClearFn()
+    setTimeout(() => {
+        myInput.value.focus()
+    }, 1000)
+}
+/**
+ * 清空
+ */
+const ClearFn = async ()=>{
+    data.value = '';
+}
+
+document.addEventListener('keydown',(event:any)=>{
+    // console.log('扫码枪',event)
+    data.num += 1
+    if(data.num == 1){data.value = ''}
+    if (event.code === 'Enter') { // 判断是否按下了回车键
+        data.value = event.target.value; // 获取扫描枪输入框的值    
+        onSubmit()
+    }
+})
+const onSubmit = async () => {
+    if(data.value){
+        emit('inputSearchData', data.value);data.num = 0 
+    }else{
+        ElMessage.error('点击输入框在使用扫码枪扫码')
+    }
+}
+defineExpose({
+    inputFocus, data,ClearFn
+})
+</script>
+<style lang="scss">
+/* @import url(); 引入css类 */
+.Qr {
+    display: flex;
+    margin-bottom: 20px;
+    border: 1px solid #409eff;
+    box-sizing: border-box;
+    min-width: 450px;
+    width: 50%;
+    border-radius: 6px;
+    overflow: hidden;
+
+    &-img {
+        width: 30px;
+        height: 30px;
+        margin-top: 10px;
+        margin-bottom: 10px;
+        padding: 0 20px;
+        flex-shrink: 0;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border-right: .5px solid #409eff;
+        user-select: none;
+    }
+
+    &-input {
+        flex: 1;
+        padding: 0 20px;
+        display: flex;
+        align-items: center;
+
+        &-type {
+            outline: none;
+            border: none;
+            flex: 1;
+            font-weight: bold;
+            font-size: 18px;
+        }
+    }
+
+    &-isButton {
+        background: #409eff;
+        outline: none;
+        border: none;
+        color: #fff;
+        min-width: 100px;
+        flex-shrink: 0;
+        cursor: pointer;
+        user-select: none;
+    }
+
+    &-isButton:hover {
+        background: #a0cfff;
+    }
+
+    &-isButton:active {
+        background-color: #337ecc;
+    }
+}</style>

+ 277 - 0
src/views/stockcontrol/ReturnGoodsIncome/scanCode.vue

@@ -0,0 +1,277 @@
+<!-- 扫码 -->
+<template>
+    <div class="">
+        <el-button el-button type="primary" icon="Camera" @click="showDia">扫码退货入库</el-button>
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="扫码入库" :append-to-body="true" draggable :close-on-click-modal="false"
+            :close-on-press-escape="false" width="95%">
+            <inputSearch ref="inputSearchRef" style="margin:0 auto 40px auto;" @inputSearchData="inputSearchfn"></inputSearch>
+            <el-table :data="data.tableData" style="width: 100%" border height="450" :row-class-name="tableRowClassName">
+                <el-table-column :label="item.label" v-for="item, i in data.columns" :key="i" min-width="110" show-overflow-tooltip>
+                    <template #default="scope"><!--scope.row.medicineInfo[item.prop] -->
+                        {{ findFun(scope.row.medicineInfo[item.prop], item.list) }}
+                    </template>
+                </el-table-column>
+                <el-table-column min-width="150" v-for="item,index in scanCodeTable" :key="index"
+                :fixed="item.prop == 'operation'&&'right'">
+                    <template v-slot:header="scope">  
+                        <div @dblclick="dbclicklable(item)">  
+                            {{item.label}}  
+                        </div>  
+                    </template>    
+                    <template #default="scope">
+                        <el-input v-if="['quantity','unitPrice','operator'].includes(item.prop)" v-model="scope.row[item.prop]" style="width: 100px;"/>
+                        <el-date-picker v-if="item.prop == 'date'" v-model="scope.row[item.prop]" type="date" value-format="YYYY-MM-DD" style="width: 120px;"/>
+                        <el-autocomplete v-if="item.prop == 'forwardingUnit'" v-model="scope.row[item.prop]"
+                         :fetch-suggestions="querySearch1" clearable style="width: 120px;" />
+                        <el-button v-if="item.prop == 'operation'" type="danger" :icon="Delete" @click="deltable(scope.$index)">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="dialogFormVisible = false">关闭</el-button>
+                    <el-button type="danger" @click="resetForm">重置数据</el-button>
+                    <el-button type="primary" :disabled="data.tableData.length==0?true:false" @click="subStock">立即入库</el-button>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref,nextTick,watch, onMounted} from 'vue'
+import inputSearch from "./inputSearch.vue";
+import { scanCodeTable } from "@/plugins/rulesData";
+import { timesFn } from "@/plugins/settime";
+
+
+const dialogFormVisible = ref(false)
+watch(() => dialogFormVisible.value, (dy: any) => {
+  if(!dy)resetForm()
+})
+const inputSearchRef = ref<InstanceType<typeof inputSearch> | null>(null)
+import { 
+    stockunit,//收发货单位
+    stockRefCodein
+} from "@/api";
+import { ElMessage, ElMessageBox  } from 'element-plus'
+import { Delete} from '@element-plus/icons-vue'
+import { syrulesData } from "@/plugins/rulesData";
+
+import {
+    medicListScanCode,
+    medicMsfx
+} from "@/api";
+let data: any = reactive({
+    tableData: [],
+    showDiaData: [],
+    itemPir: [],
+    rules1: {},
+    columns: [],// 渲染表格
+    selectType: [],//表格的下拉对应
+    editStrot: false,
+    editIndex: null,
+    qr:''
+})
+let initParam: any = reactive({
+    "date": "",
+    "forwardingUnit": "",
+    "medicineInfo": {},
+    "operator": '',
+    "quantity": '',
+    "unitPrice": null
+})
+
+const dbclicklable = (item:any)=>{
+    if(['发货单位','经办人'].includes(item.label)){
+        if(data.tableData.length!=0){
+            if(data.tableData[0][item.prop]==''){
+                ElMessage.error('请填写第一项,在双击全部填充')
+                return
+            }
+            data.tableData.forEach((obj:any)=>{
+                obj[item.prop] = data.tableData[0][item.prop]
+            })
+        }else{
+            ElMessage.error('请先扫描在进行批量填充')
+            return
+        }
+    }
+}
+/**
+ * 当前搜索到的样式
+ * @param param0 
+ */
+const tableRowClassName = ({rowIndex}: {
+  rowIndex: number
+}) => {
+    if(data.qr){
+        const i = data.tableData.findIndex((item:any) => item.Qrcode==data.qr)
+        if (rowIndex==i) { return 'success-row' }else{return ''}
+    }else{
+        return ''
+    }
+}
+
+let rules: any = reactive({})
+const showDia = async () => {
+    await updating()
+    dialogFormVisible.value = true
+    medicListStockFun()//获取入库表单
+    itemPirFun()
+    nextTick(()=>{
+        console.log('inputSearchRef',inputSearchRef.value)
+        inputSearchRef.value?.inputFocus()
+    })
+}
+const updating = ()=>{
+    ElMessageBox.alert('扫码退货入库功能更新中,请先使用手动退货入库', '提示', {
+    confirmButtonText: '我知道了',
+    type: 'warning',
+    draggable: true,
+    callback: () => {
+    },
+  })
+  return new Promise<void>((resolve, reject) => {}) 
+}
+//函数
+const findFun = (data: any, list: any) => {
+    if (list) {
+        const b = list.find((item: any) => item.id == data)
+        if (b) return b.name
+        else return ''
+    } else {
+        return data
+    }
+}
+
+//获取入库表单Api
+const medicListStockFun = async () => {
+    data.columns = []
+    const reslut: any = await medicListScanCode({})
+    console.log('表格1234', reslut)
+    if (reslut.code == 200 && reslut.msg == '查询成功') {
+        data.showDiaData = reslut.data?.list
+        data.rules1 = {}
+        data.columns = []
+        reslut.data?.list.forEach((value: any) => { //value设置成key
+            data.columns.push({ prop: value.field_name, label: value.name, list: value.list })
+            initParam.medicineInfo[value.field_name] = ''; // 这里可以根据需要设置其他值作为键的内容
+        });
+        Object.assign(rules, { ...data.rules1, ...syrulesData })
+        dialogFormVisible.value = true
+    }
+}
+const emit: any = defineEmits(['scanCode'])
+const subStock = async ()=>{
+    const ab = data.tableData.every((item:any) => item.quantity != '' && item.operator != '' && item.date != '')
+    if(!ab){ElMessage.error('缺少数据提示:【数量】、【经办人】、【入库日期】是必填项哦!');return;}
+    else{
+        const arr = [...data.tableData]
+        arr.forEach((item:any)=>{
+            item.quantity = Number(item.quantity)
+            item.unitPrice = Number(item.unitPrice)
+
+        })
+        const reslut:any = await stockRefCodein({stockInList:arr})
+        console.log('添加成功')
+        if(reslut.code==200){
+            ElMessage.success(reslut.msg)
+            dialogFormVisible.value = false
+            emit('scanCode', '')
+        }
+    }
+}
+/**
+ * 搜索
+ * @param e 追溯码
+ */
+const inputSearchfn = async (e:any)=>{
+    data.qr = e
+    const j = await SearchFind(e)
+    if (j) {ElMessage.error('提示:重复扫描添加数据了哦');return}
+    const reslut:any = await medicMsfx({code:e})
+    let initParamObj = {...initParam}
+    initParamObj.Qrcode = e
+    console.log('扫描出',reslut)
+    if (reslut.code==200 && reslut.msg=='查询成功') {
+        initParamObj.medicineInfo = reslut.data[0] || {}
+        if(reslut.data[0].quantity!=undefined){
+            initParamObj.quantity = reslut.data[0].quantity
+        }
+        initParamObj.date = timesFn()
+        console.log('initParamObj',initParamObj)
+        data.tableData.push(initParamObj)
+        inputSearchRef.value?.inputFocus()
+    }
+}
+/**
+ * 筛选是否已经扫描过
+ * @param j 追溯码 
+ */
+const SearchFind = (j:any)=>{
+    return new Promise(resolve=>{
+        const ab = data.tableData.find((item:any) => item.Qrcode==j)
+        ab==undefined?resolve(false):resolve(true)
+    })
+}
+
+/**
+ * 删除
+ * @param index 
+ */
+const deltable = async (index:any)=>{
+    data.tableData.splice(index,1)
+    nextTick(()=>{
+        inputSearchRef.value?.inputFocus()
+    })
+}
+
+//收发货单位
+const itemPirFun = async () => {
+    const reslut: any = await stockunit({ type: 3 })
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants1.value = arr
+}
+interface RestaurantItem {
+  value: string
+  link: string
+}
+const restaurants1 = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants1.value.filter(createFilter(queryString))
+    : restaurants1.value
+  cb(results)
+}
+const createFilter = (queryString: string) => {
+  return (restaurant: RestaurantItem) => {
+    return (
+      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+    )
+  }
+}
+/**
+ * 重置
+ */
+const resetForm = async ()=>{
+    data.tableData = []
+    inputSearchRef?.value?.ClearFn()
+    inputSearchRef.value?.inputFocus()
+}
+</script>
+<style lang="scss">
+.inputWidth {
+    width: 200px;
+}
+.el-table .warning-row {
+  --el-table-tr-bg-color: var(--el-color-warning-light-9);
+}
+.el-table .success-row {
+  --el-table-tr-bg-color: var(--el-color-success-light-9);
+}
+</style>

+ 242 - 0
src/views/stockcontrol/ReturnGoodsIncome/transportScanCode.vue

@@ -0,0 +1,242 @@
+<!-- 运输扫码 -->
+<template>
+    <div class="">
+        <el-button el-button type="primary" icon="Camera" @click="showDia">退货单条码入库</el-button>
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="扫描运输条码入库" :append-to-body="true" draggable :close-on-click-modal="false"
+            :close-on-press-escape="false" width="95%">
+            <inputSearch ref="inputSearchRef" placeholderData="请扫描运输条码" style="margin:0 auto 40px auto;" @inputSearchData="inputSearchfn"></inputSearch>
+            <el-table :data="data.tableData" style="width: 100%" border height="450" row-class-name="success-row">
+                <el-table-column :label="item.label" v-for="item, i in data.columns" :key="i" min-width="110" show-overflow-tooltip>
+                    <template #default="scope">
+                        {{ scope.row[item.prop] }}
+                    </template>
+                </el-table-column>
+                <el-table-column :label="item.label" min-width="150" v-for="item,index in TranscanCodeTable" :key="index"
+                :fixed="item.prop == 'operation'&&'right'">
+                    <template v-slot:header="scope">  
+                        <div @dblclick="dbclicklable(item)">  
+                            {{item.label}}  
+                        </div>  
+                    </template> 
+                    <template #default="scope">
+                        <el-input v-if="['quantity','unit_price'].includes(item.prop)" v-model="scope.row[item.prop]" style="width: 100px;"/>
+                        <el-autocomplete v-if="item.prop == 'operator'" v-model="scope.row[item.prop]"
+                         :fetch-suggestions="querySearch2" clearable style="width: 120px;" />
+                        <el-date-picker v-if="item.prop == 'date'" v-model="scope.row[item.prop]" type="date" value-format="YYYY-MM-DD" style="width: 120px;"/>
+                        <el-autocomplete v-if="item.prop == 'forwardingUnit'" v-model="scope.row[item.prop]"
+                         :fetch-suggestions="querySearch1" clearable style="width: 120px;" />
+                        <el-button v-if="item.prop == 'operation'" type="danger" :icon="Delete" @click="deltable(scope.$index)">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="dialogFormVisible = false">关闭</el-button>
+                    <el-button type="danger" @click="resetForm">重置数据</el-button>
+                    <el-button type="primary" :disabled="data.tableData.length==0?true:false" @click="subStock">立即入库</el-button>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref,nextTick,watch} from 'vue'
+import inputSearch from "./inputSearch.vue";
+import {TranscanCodeTable,syrulesData } from "@/plugins/rulesData";
+import { timesFn } from "@/plugins/settime";
+
+
+const dialogFormVisible = ref(false)
+watch(() => dialogFormVisible.value, (dy: any) => {
+  if(!dy)resetForm()
+})
+const inputSearchRef = ref<InstanceType<typeof inputSearch> | null>(null)
+import { ElMessage } from 'element-plus'
+import { Delete} from '@element-plus/icons-vue'
+
+import {
+    stockunit,//收发货单位
+    stockRefCodein,
+    medicListScanCode,
+    medicRefTransport,
+    operatorList
+} from "@/api";
+let data: any = reactive({
+    tableData: [],
+    showDiaData: [],
+    itemPir: [],
+    rules1: {},
+    columns: [],// 渲染表格
+    selectType: [],//表格的下拉对应
+    editStrot: false,
+    editIndex: null,
+    qr:''
+})
+
+
+let rules: any = reactive({})
+const showDia = async () => {
+    dialogFormVisible.value = true
+    medicListStockFun()//获取入库表单
+    itemPirFun()
+    itemPirFun2()
+    nextTick(()=>{
+        console.log('inputSearchRef',inputSearchRef.value)
+        inputSearchRef.value?.inputFocus()
+    })
+}
+const dbclicklable = (item:any)=>{
+    if(['发货单位','经办人'].includes(item.label)){
+        if(data.tableData.length!=0){
+            if(data.tableData[0][item.prop]==''){
+                ElMessage.error('请填写第一项,在双击全部填充')
+                return
+            }
+            data.tableData.forEach((obj:any)=>{
+                obj[item.prop] = data.tableData[0][item.prop]
+            })
+        }else{
+            ElMessage.error('请先扫描在进行批量填充')
+            return
+        }
+    }
+}
+//获取入库表单Api
+const medicListStockFun = async () => {
+    data.columns = []
+    const reslut: any = await medicListScanCode({})
+    console.log('表格888', reslut)
+    if (reslut.code == 200 && reslut.msg == '查询成功') {
+        data.showDiaData = reslut.data?.list
+        data.rules1 = {}
+        data.columns = []
+        reslut.data?.list.forEach((value: any) => { //value设置成key
+            data.columns.push({ prop: value.field_name, label: value.name, list: value.list })
+            // initParam.medicineInfo[value.field_name] = ''; // 这里可以根据需要设置其他值作为键的内容
+        });
+        Object.assign(rules, { ...data.rules1, ...syrulesData })
+        dialogFormVisible.value = true
+    }
+}
+const emit: any = defineEmits(['scanCode'])
+const subStock = async ()=>{
+    const ab = data.tableData.every((item:any) => item.quantity != '' && item.operator != '' && item.date != '')
+    if(!ab){ElMessage.error('缺少数据提示:【数量】、【经办人】、【入库日期】是必填项哦!');return;}
+    else{
+        const arr = [...data.tableData]
+        let arrData:any = []
+        arr.forEach((item:any)=>{
+            item.quantity = Number(item.quantity)
+            item.unit_price = Number(item.unit_price)
+            arrData.push({
+                date:item.date,
+                forwardingUnit:item.forwardingUnit,
+                medicineInfo:item,
+                operator:item.operator,
+                quantity:item.quantity,
+                unitPrice:item.unit_price
+            })
+        })
+        const reslut:any = await stockRefCodein({stockInList:arrData})
+        if(reslut.code==200){
+            ElMessage.success(reslut.msg)
+            dialogFormVisible.value = false
+            emit('scanCode', '')
+        }
+    }
+}
+/**
+ * 搜索
+ * @param e 追溯码
+ */
+const inputSearchfn = async (e:any)=>{
+    data.qr = e
+    const reslut:any = await medicRefTransport({code:e})
+    if (reslut.code==200 && reslut.msg=='查询成功') {
+        console.log('reslut.data',reslut.data)
+        let arr = reslut.data || []
+        arr.forEach((item:any)=>{ item.date = timesFn()})
+        data.tableData = [...arr]
+    }
+}
+
+/**
+ * 删除
+ * @param index 
+ */
+const deltable = async (index:any)=>{
+    data.tableData.splice(index,1)
+    nextTick(()=>{
+        inputSearchRef.value?.inputFocus()
+    })
+}
+
+//经半人
+const itemPirFun2 = async () => {
+    const reslut: any = await operatorList({})
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants2.value = arr
+}
+const restaurants2 = ref<RestaurantItem[]>([])
+const querySearch2 = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants2.value.filter(createFilter(queryString))
+    : restaurants2.value
+  cb(results)
+}
+
+
+
+//收发货单位
+const itemPirFun = async () => {
+    const reslut: any = await stockunit({ type: 3 })
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants1.value = arr
+}
+interface RestaurantItem {
+  value: string
+  link: string
+}
+const restaurants1 = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants1.value.filter(createFilter(queryString))
+    : restaurants1.value
+  cb(results)
+}
+const createFilter = (queryString: string) => {
+  return (restaurant: RestaurantItem) => {
+    return (
+      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+    )
+  }
+}
+/**
+ * 重置
+ */
+const resetForm = async ()=>{
+    data.tableData = []
+    inputSearchRef?.value?.ClearFn()
+    inputSearchRef.value?.inputFocus()
+}
+</script>
+<style lang="scss">
+.inputWidth {
+    width: 200px;
+}
+.el-table .warning-row {
+  --el-table-tr-bg-color: var(--el-color-warning-light-9);
+}
+.el-table .success-row {
+  --el-table-tr-bg-color: var(--el-color-success-light-9);
+}
+</style>

+ 249 - 0
src/views/stockcontrol/ReturnGoodsScrap/Editinventory.vue

@@ -0,0 +1,249 @@
+<!-- 扫码 -->
+<template>
+    <div class="">
+        <el-button type="primary" @click="editFun(props.row)">编辑</el-button>
+        <el-button type="danger" @click="delClick(props.row)">删除</el-button>
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="编辑" :append-to-body="true" draggable width="60%">
+            <el-form ref="ruleFormRef" :rules="rules" :model="initParam" :inline="true">
+                <el-divider content-position="center">药品信息</el-divider>
+                <el-form-item :label="item.name" :label-width="formLabelWidth" v-for="(item,index) in data.showDiaData" :key="index" :prop="'medicineInfo.'+item.field_name">
+                    <el-select v-model="initParam.medicineInfo[item.field_name]" :placeholder="'请选择'+item.name" class="inputWidth" v-if="[1,2,3,4,5].includes(item.type)">
+                        <el-option :label="itemIt.name" :value="itemIt.id" v-for="itemIt,i in item.list" :key="i"/>
+                    </el-select>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==6"/>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==7"/>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==8"/>
+                    <el-date-picker v-model="initParam.medicineInfo[item.field_name]" type="date" value-format="YYYY-MM-DD" :placeholder="'请输入'+item.name" clearable style="width: 200px;" v-if="item.type==9"/>
+                    <el-date-picker v-model="initParam.medicineInfo[item.field_name]" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" :placeholder="'请输入'+item.name" clearable style="width: 200px;" v-if="item.type==10"/>
+                </el-form-item>
+                <el-divider content-position="center">入库信息</el-divider>
+                <el-form-item class="el-form-item-main" label="数量" :label-width="formLabelWidth" prop="quantity">
+                    <el-input v-model.number="initParam.quantity" autocomplete="off" class="inputWidth" />
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="销售单价" :label-width="formLabelWidth">
+                    <el-input v-model="initParam.unit_price" autocomplete="off" class="inputWidth"/>
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="入库日期" :label-width="formLabelWidth" prop="date">
+                    <el-date-picker v-model="initParam.date" type="date" placeholder="血液制品效期" value-format="YYYY-MM-DD" clearable style="width: 200px;" />
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="收货单位" :label-width="formLabelWidth">
+                    <el-autocomplete v-model="initParam.receiving_unit" :fetch-suggestions="querySearch1" clearable class="inputWidth"
+                        placeholder="收货单位" />
+                </el-form-item>
+                <el-form-item label="经办人" :label-width="formLabelWidth" prop="operator">
+                    <el-autocomplete v-model="initParam.operator" :fetch-suggestions="querySearch" clearable class="inputWidth"
+                        placeholder="经办人" />
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="dialogFormVisible = false">取消</el-button>
+                    <el-button type="primary" @click="submitForm(ruleFormRef)">提交</el-button>
+                </span>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import type { FormInstance} from 'element-plus'
+import { syrulesData } from "@/plugins/rulesData";
+const dialogFormVisible = ref(false)
+const ruleFormRef = ref<FormInstance>()
+let rules:any = reactive({})
+
+
+const props = defineProps({
+    row: {
+        type: Object,
+        default: () => { },
+    },
+})
+
+import { 
+    medicListStock,
+    stockunit,//发货单位
+    operatorList,//经办人
+    stockoutedit,//编辑
+    stockoutdel,//删除
+} from "@/api";
+import { ElMessage, ElMessageBox } from 'element-plus'
+const formLabelWidth = '110px'
+
+//提交参数
+let initParam:any = reactive({
+    "id":"",
+    "date": "",
+    "receiving_unit": "",
+    "medicineInfo": {},
+    "operator":'',
+    "quantity": null,
+    "unit_price":Number(null)
+})
+let data:any = reactive({
+    tableData:[],
+    showDiaData:[],
+    rules1:{},
+    columns:[],// 渲染表格
+    selectType:[],//表格的下拉对应
+    editStrot:false,
+    editIndex:null
+}) 
+
+//显示编辑
+const editFun = async (row:any)=>{
+    console.log('编辑',row)
+    dialogFormVisible.value = true
+    await medicListStockFun()//获取入库表单
+    await itemPirFun()//发货单位
+    await operatorListApi()//经办人
+}
+
+
+interface RestaurantItem {
+  value: string
+  link: string
+}
+const restaurants = ref<RestaurantItem[]>([])
+const querySearch = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants.value.filter(createFilter(queryString))
+    : restaurants.value
+  cb(results)
+}
+const createFilter = (queryString: string) => {
+  return (restaurant: RestaurantItem) => {
+    return (
+      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+    )
+  }
+}
+
+const restaurants1 = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants1.value.filter(createFilter(queryString))
+    : restaurants1.value
+  cb(results)
+}
+
+
+
+
+const emit:any = defineEmits(['scanCode','editinvent'])
+
+//重置
+const resetForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.resetFields()
+}
+
+//提交
+const submitForm = async (formEl: FormInstance | undefined) => {
+    console.log('tijiao',initParam)
+  if (!formEl) return
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+        stockouteditApi()
+    } else {
+        ElMessage.error('请完善必填项')
+    }
+  })
+}
+//提交编辑
+const stockouteditApi = async ()=>{
+    let param = {...initParam}
+    param.unit_price = Number(param.unit_price)
+    const reslut:any = await stockoutedit(param)
+    if(reslut.code==200 && reslut.msg=='修改出库信息成功'){
+        emit('editinvent', '');
+        dialogFormVisible.value = false;
+        ElMessage.success(reslut.msg)
+    }
+}
+//收发货单位Api
+const itemPirFun = async()=>{
+    const reslut:any = await stockunit({ type: 3 })
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants1.value = arr
+}
+//经办人Api
+const operatorListApi = async()=>{
+    const reslut:any = await operatorList({})
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants.value = arr
+}
+
+//获取入库表单Api
+const medicListStockFun = async ()=>{
+    data.columns = []
+    const reslut:any = await medicListStock({})
+    if(reslut.code==200 && reslut.msg=='查询成功'){
+        data.showDiaData = reslut.data?.list
+        data.rules1 = {}
+        data.columns = []
+        data.selectType = []
+        reslut.data?.list.forEach((value:any) => { //value设置成key
+            data.selectType.push({type:value.type,list:value.list})
+            data.columns.push({ prop: value.field_name, label: value.name, list:value.list})
+            initParam.medicineInfo[value.field_name] = ''; // 这里可以根据需要设置其他值作为键的内容
+            if(['product_id','enterprise_id','spec_id','batch_number','expiry_date','approval_number'].includes(value.field_name)){
+                if(value.type==6){
+                    data.rules1['medicineInfo.'+value.field_name] =  [{required: true,message: '必填项',trigger: 'change'}]
+                }else if(value.type==7){
+                    data.rules1['medicineInfo.'+value.field_name] =  [{required: true,message: '必填项',trigger: 'change'},{ pattern: /^(?:[1-9]\d*)$/, message: '请输入正整数', trigger: "blur" },]
+                }else{
+                    data.rules1['medicineInfo.'+value.field_name] = [{required: true,message: '必填项',trigger: 'change',}]
+                }
+            }
+        });
+        Object.assign(rules,{...data.rules1,...syrulesData})
+        let obj = {...props.row}
+        Object.keys(initParam).forEach(key => {
+            if(key!='medicineInfo'){
+                initParam[key] = obj[key]
+            }else{
+                Object.keys(initParam.medicineInfo).forEach(key => {
+                    initParam.medicineInfo[key] = obj[key]
+                })
+            }
+        })
+        console.log('rules',initParam,obj)
+        dialogFormVisible.value = true
+    }
+}
+
+/**
+ * 删除
+ * @param row 
+ */
+const delClick = (row:any) => {
+    ElMessageBox.confirm('删除一条信息,将导致数量变化,是否继续?','删除',{
+      confirmButtonText: '确认删除',
+      cancelButtonText: 'Cancel',
+      type: 'error',
+      center: true,
+    }).then(async() => {
+        const reslut:any = await stockoutdel({id:row.id})
+        console.log('删除成功',reslut)
+        if(reslut.code==200 && reslut.msg=='删除出库信息成功'){ emit('editinvent', '');ElMessage.success(reslut.msg)}
+    }).catch(() => {
+      ElMessage.info('已取消删除')
+    })
+}
+
+</script>
+<style lang="scss">
+.inputWidth {
+    width: 200px;
+}
+</style>

+ 350 - 0
src/views/stockcontrol/ReturnGoodsScrap/Labour.vue

@@ -0,0 +1,350 @@
+<!-- 扫码 -->
+<template>
+    <div class="">
+        <el-button el-button type="primary" icon="Pointer" @click="showDia">手动出库</el-button>
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="手动退货(报废)出库" :append-to-body="true" :before-close="closeFun" draggable :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
+            <el-form ref="ruleFormRef" :rules="rules" :model="initParam" :inline="true">
+                <el-divider content-position="center">药品信息</el-divider>
+                <el-form-item :label="item.name" :label-width="formLabelWidth" v-for="(item,index) in data.showDiaData" :key="index" :prop="'medicineInfo.'+item.field_name">
+                    <el-select v-model="initParam.medicineInfo[item.field_name]" :placeholder="'请选择'+item.name" class="inputWidth" v-if="[1,2,3,4,5].includes(item.type)">
+                        <el-option :label="itemIt.name" :value="itemIt.id" v-for="itemIt,i in item.list" :key="i"/>
+                    </el-select>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==6"/>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==7"/>
+                    <el-input v-model="initParam.medicineInfo[item.field_name]" autocomplete="off" :placeholder="'请输入'+item.name" class="inputWidth" v-if="item.type==8"/>
+                    <el-date-picker v-model="initParam.medicineInfo[item.field_name]" type="date" value-format="YYYY-MM-DD" :placeholder="'请输入'+item.name" clearable style="width: 200px;" v-if="item.type==9"/>
+                    <el-date-picker v-model="initParam.medicineInfo[item.field_name]" type="datetime" value-format="YYYY-MM-DD HH:mm:ss" :placeholder="'请输入'+item.name" clearable style="width: 200px;" v-if="item.type==10"/>
+                </el-form-item>
+                <el-divider content-position="center">出库信息</el-divider>
+                <el-form-item class="el-form-item-main" label="数量" :label-width="formLabelWidth" prop="quantity">
+                    <el-input v-model.number="initParam.quantity" autocomplete="off" class="inputWidth" />
+                </el-form-item>
+                <!-- <el-form-item class="el-form-item-main" label="销售单价" :label-width="formLabelWidth">
+                    <el-input v-model="initParam.unitPrice" autocomplete="off" class="inputWidth"/>
+                </el-form-item> -->
+                <el-form-item class="el-form-item-main" label="出库日期" :label-width="formLabelWidth" prop="date">
+                    <el-date-picker v-model="initParam.date" type="date" placeholder="出库日期" value-format="YYYY-MM-DD" clearable style="width: 200px;" />
+                </el-form-item>
+                <el-form-item class="el-form-item-main" label="收货单位" :label-width="formLabelWidth">
+                    <el-autocomplete v-model="initParam.forwardingUnit" :fetch-suggestions="querySearch1" clearable class="inputWidth"
+                        placeholder="收货单位" />
+                </el-form-item>
+                <el-form-item label="经办人" :label-width="formLabelWidth" prop="operator">
+                    <!-- <el-select v-model="initParam.operator" placeholder="请选择经办人" class="inputWidth">
+                        <el-option :label="it" :value="it" v-for="(it,j) in data.itemOpen" :key="j+Math.random()" />
+                    </el-select> -->
+                    <el-autocomplete v-model="initParam.operator" :fetch-suggestions="querySearch" clearable class="inputWidth"
+                        placeholder="经办人" />
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button type="primary" @click="submitForm(ruleFormRef)">加入暂存</el-button>
+                    <el-button @click="showinnerVisible">查看暂存</el-button>
+                    <el-button type="danger" @click="resetForm(ruleFormRef)">重置数据</el-button>
+                </span>
+            </template>
+            <el-dialog :destroy-on-close="true" v-model="innerVisible" title="出库数据" width="95%" append-to-body draggable :close-on-click-modal="false" :close-on-press-escape="false">
+                <el-table :data="data.tableData" style="width: 100%" border max-height="450"   :header-cell-style="{'background-color':'#ccc','color': 'white'}">
+                    <el-table-column :label="item.label" v-for="item,i in data.columns" :key="i" min-width="110" show-overflow-tooltip>
+                        <template #default="scope"><!--scope.row.medicineInfo[item.prop] -->
+                            {{ findFun(scope.row.medicineInfo[item.prop],item.list)}}
+                        </template>
+                    </el-table-column>
+                    <el-table-column prop="quantity" label="数量" min-width="110" show-overflow-tooltip/>
+                    <el-table-column prop="unitPrice" label="购进单价" min-width="110" show-overflow-tooltip/>
+                    <el-table-column prop="forwardingUnit" label="收货单位"  min-width="110" show-overflow-tooltip/>
+                    <el-table-column prop="date" label="出库日期" min-width="110" show-overflow-tooltip/>
+                    <el-table-column prop="operator" label="经办人" min-width="110" show-overflow-tooltip/>
+
+                    <el-table-column fixed="right" label="操作" min-width="110">
+                        <template #default="scope">
+                            <el-button type="primary" :icon="Edit" @click="handleClick(scope.row,scope.$index)" circle />
+                            <el-button type="danger" :icon="Delete" @click="delClick(scope.$index)" circle />
+                        </template>
+                    </el-table-column>
+                </el-table>
+                <template #footer>
+                    <span class="dialog-footer">
+                        <el-button @click="innerVisible = false">关闭</el-button>
+                        <el-button type="primary" :disabled="data.tableData.length==0?true:false"  @click="centerDialogVisible = true">立即出库</el-button>
+                    </span>
+                </template>
+                <el-dialog :destroy-on-close="true" v-model="centerDialogVisible" title="出库类型" width="500" center>
+                    <div style="display: flex;justify-content: center">
+                        <el-radio-group v-model="initParams.state">
+                            <el-radio :label="2" size="large">退货出库</el-radio>
+                            <el-radio :label="3" size="large">报废出库</el-radio>
+                        </el-radio-group>
+                    </div>
+                    <template #footer>
+                    <div class="dialog-footer">
+                        <el-button @click="centerDialogVisible = false">Cancel</el-button>
+                        <el-button type="primary" @click="subStock"> 提交 </el-button>
+                    </div>
+                    </template>
+                </el-dialog>
+            </el-dialog>
+        </el-dialog>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref } from 'vue'
+import type { FormInstance, FormRules} from 'element-plus'
+import { ElNotification} from 'element-plus'
+import { syrulesData,columnsTable } from "@/plugins/rulesData";
+const dialogFormVisible = ref(false)
+const centerDialogVisible = ref(false)
+
+const ruleFormRef = ref<FormInstance>()
+
+let rules:any = reactive({})
+
+import { 
+    medicListStockOut,
+    stockunit,//发货单位
+    operatorList,//经办人
+    stockTemplateIn,//单个出库
+    RetGoodsRefout,//批量出库
+} from "@/api";
+const innerVisible = ref(false)
+import { ElMessage, ElMessageBox } from 'element-plus'
+import {Delete,Edit,} from '@element-plus/icons-vue'
+const formLabelWidth = '110px'
+
+let initParam:any = reactive({
+    "date": "",
+    "forwardingUnit": "",
+    "medicineInfo": {},
+    "operator":'',
+    "quantity": null,
+    "unitPrice":null
+})
+let data:any = reactive({
+    tableData:[],
+    showDiaData:[],
+    itemPir:[],
+    itemOpen:[],
+    rules1:{},
+    columns:[],// 渲染表格
+    selectType:[],//表格的下拉对应
+    editStrot:false,
+    editIndex:null
+}) 
+const emit:any = defineEmits(['scanCode'])
+
+let initParams = reactive({//请求参数
+    state: 2,
+    stockOutList: []
+})
+//立即出库
+const subStock = async ()=>{
+    initParams.stockOutList = data.tableData
+    const reslut:any = await RetGoodsRefout(initParams)
+   
+    if(reslut.code==200){
+        ElMessage.success(reslut.msg)
+        dialogFormVisible.value = false
+        centerDialogVisible.value = false
+        innerVisible.value = false
+        emit('scanCode', '')
+        data.tableData = []
+    }
+}
+
+
+//函数
+const findFun =  (data:any,list:any)=>{
+    if(list){
+        const b = list.find((item:any) => item.id==data)
+        if(b) return b.name
+        else return ''
+    }else{
+        return data
+    }
+}
+const resetForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  formEl.resetFields()
+}
+//加入暂存区
+const submitForm = async (formEl: FormInstance | undefined) => {
+  if (!formEl) return
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+        ElNotification({
+            title: '暂存成功',
+            message: 'ok,加入暂存成功,右下角按钮查看/提交暂存',
+            type: 'success',
+        })
+        console.log('提交',data.editStrot)
+        if(data.editStrot){//编辑状态
+            let {date,forwardingUnit,operator,quantity,unitPrice,medicineInfo} = initParam
+            data.tableData.splice(data.editIndex,1,{date,forwardingUnit,operator,quantity,unitPrice:unitPrice,medicineInfo:{...medicineInfo}})
+            console.log('编辑状态',data.tableData)
+        }else{//正常添加
+            let {date,forwardingUnit,operator,quantity,unitPrice,medicineInfo} = initParam
+            data.tableData.push({date,forwardingUnit,operator,quantity,unitPrice:unitPrice,medicineInfo:{...medicineInfo}})
+            console.log('正常添加',data.tableData)
+        }
+    } else {
+        ElMessage.error('请完善必填项')
+    }
+  })
+}
+
+//函数
+const closeFun = async () => {
+    if(data.tableData.length==0){
+        dialogFormVisible.value = false
+        data.tableData = []
+    }else{
+        ElMessageBox.confirm('请检查录入数据是否已经提交,该操作将放弃出库信息,是否放弃?', '提示', {
+            confirmButtonText: '立即出库',
+            cancelButtonText: '放弃数据',
+            type: 'warning',
+            draggable: true,
+            center: true,
+        }).then(() => {
+            innerVisible.value = true
+        }).catch(() => {
+            dialogFormVisible.value = false
+            ElMessage.success('已放弃出库数据')
+        })
+    }
+}
+interface RestaurantItem {
+  value: string
+  link: string
+}
+const restaurants = ref<RestaurantItem[]>([])
+const querySearch = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants.value.filter(createFilter(queryString))
+    : restaurants.value
+  cb(results)
+}
+const createFilter = (queryString: string) => {
+  return (restaurant: RestaurantItem) => {
+    return (
+      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+    )
+  }
+}
+
+const restaurants1 = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants1.value.filter(createFilter(queryString))
+    : restaurants1.value
+  cb(results)
+}
+//收发货单位
+const itemPirFun = async()=>{
+    const reslut:any = await stockunit({ type: 3 })
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants1.value = arr
+}
+//经办人Api
+const operatorListApi = async()=>{
+    const reslut:any = await operatorList({})
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants.value = arr
+}
+
+
+//函数
+const showinnerVisible = async ()=>{
+    innerVisible.value = true
+    data.editStrot = false
+    console.log(data.tableData)
+}
+
+const showDia = async ()=>{
+    data.tableData = []
+    data.showDiaData = []
+    data.itemPir = []
+    data.itemOpen = []
+    data.rules1 = []
+    data.columns = []
+    data.selectType = []
+    data.editStrot = false
+    resetFun()//复原表单
+
+    medicListStockFun()//获取出库表单
+    itemPirFun()//发货单位
+    operatorListApi()//经办人
+}
+//复原表单
+const resetFun = async ()=>{
+    initParam.date = ''
+    initParam.forwardingUnit = ''
+    initParam.medicineInfo = {}
+    initParam.operator = ''
+    initParam.quantity = null
+    initParam.unitPrice = null
+    resetForm(ruleFormRef.value)
+}
+//获取出库表单Api
+const medicListStockFun = async ()=>{
+    data.columns = []
+    const reslut:any = await medicListStockOut({})
+    if(reslut.code==200 && reslut.msg=='查询成功'){
+        data.showDiaData = reslut.data?.list
+        data.rules1 = {}
+        data.columns = []
+        data.selectType = []
+        reslut.data?.list.forEach((value:any) => { //value设置成key
+            data.selectType.push({type:value.type,list:value.list})
+            data.columns.push({ prop: value.field_name, label: value.name, list:value.list})
+            initParam.medicineInfo[value.field_name] = ''; // 这里可以根据需要设置其他值作为键的内容
+            if(['product_id','enterprise_id','spec_id','batch_number','expiry_date','approval_number'].includes(value.field_name)){
+                if(value.type==6){
+                    data.rules1['medicineInfo.'+value.field_name] =  [{required: true,message: '必填项',trigger: 'change'}]
+                }else if(value.type==7){
+                    data.rules1['medicineInfo.'+value.field_name] =  [{required: true,message: '必填项',trigger: 'change'},{ pattern: /^(?:[1-9]\d*)$/, message: '请输入正整数', trigger: "blur" },]
+                }else{
+                    data.rules1['medicineInfo.'+value.field_name] = [{required: true,message: '必填项',trigger: 'change',}]
+                }
+            }
+        });
+        Object.assign(rules,{...data.rules1,...syrulesData})
+        console.log('表格', data.selectType)
+        dialogFormVisible.value = true
+    }
+}
+
+const handleClick = (datas:any,index:any) => {
+  data.editStrot = true
+  data.editIndex = index
+  let {date,forwardingUnit,operator,quantity,unitPrice,medicineInfo} = datas
+  Object.assign(initParam,{date,forwardingUnit,operator,quantity,unitPrice,medicineInfo:{...medicineInfo}})
+  innerVisible.value = false
+}
+const delClick = (index:any) => {
+    ElMessageBox.confirm('删除一条信息,是否继续?','删除',{
+      confirmButtonText: '确认删除',
+      cancelButtonText: 'Cancel',
+      type: 'warning',
+      center: true,
+    }).then(() => {
+        data.tableData.splice(index, 1);
+      ElMessage.success('已删除')
+    })
+}
+
+</script>
+<style lang="scss">
+.inputWidth {
+    width: 200px;
+}
+</style>

+ 175 - 0
src/views/stockcontrol/ReturnGoodsScrap/downing.vue

@@ -0,0 +1,175 @@
+<template>
+    <el-button el-button type="primary" icon="Download" @click="showdialogdialog">退货出库运输记录表</el-button>
+    <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="退货出库运输记录表" :append-to-body="true" draggable width="80%">
+        <div style="display: flex;justify-content: space-between;align-items: center;flex-wrap: wrap">
+            <div>
+                <el-form :model="initParam" ref="ruleFormRef" :inline="true">
+                    <el-form-item label="出库日期" prop="date">
+                        <el-date-picker v-model="initParam.date" :clearable='false' class="inputWidth" type="date" value-format="YYYY-MM-DD"
+                            style="width: 100%;" />
+                    </el-form-item>
+                    <el-form-item label="收货单位" prop="receivingUnit">
+                        <el-autocomplete v-model="initParam.receivingUnit" :fetch-suggestions="querySearch1"
+                            class="inputWidth" placeholder="收货单位" style="width: 100%;" />
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" icon="Search" @click="searchFn">搜索</el-button>
+                    </el-form-item>
+                    <!-- <el-form-item label="品名" :label-width="formLabelWidth">
+                        <el-select v-model.number="initParam.productId" filterable remote reserve-keyword placeholder="品名"
+                            :remote-method="remoteMethod1" :loading="loading" clearable style="width: 100%;"
+                            @clear="initParam.productId = null" @click="click1">
+                            <el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value" />
+                        </el-select>
+                    </el-form-item> -->
+                </el-form>
+            </div>
+            <div style="max-width: 200px;margin-bottom: 18px;">
+                <!-- <el-button type="primary" @click="submitForm('word')">导出</el-button> -->
+                <el-button type="primary" @click="submitForm('pdf')">打印</el-button>
+            </div>
+        </div>
+        <el-table :data="tableData" border style="margin-top: 40px;width: 100%"
+            @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="40" />
+            <el-table-column property="qrcode" label="条码" min-width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="product_name" label="品种" width="120" show-overflow-tooltip />
+            <el-table-column property="enterprise_name" label="生产企业" width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="approval_number" label="批准文号" min-width="120" show-overflow-tooltip />
+            <el-table-column property="qualification_number" label="批签发合格编号" min-width="150" show-overflow-tooltip></el-table-column>
+            <el-table-column property="spec_name" label="规格(剂/支或粒)" width="150" show-overflow-tooltip />
+            <el-table-column property="produced_date" label="生产日期" width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="batch_number" label="批号" width="100" show-overflow-tooltip />
+            <el-table-column property="expiry_date" label="失效日期" width="110" show-overflow-tooltip></el-table-column>
+            <el-table-column property="quantity" label="数量" width="70" show-overflow-tooltip />
+            <el-table-column property="unit_name" label="单位" width="70" show-overflow-tooltip/>
+            <el-table-column property="date" label="出库日期" width="110" show-overflow-tooltip />
+            <el-table-column property="receiving_unit" label="收货单位" width="90" show-overflow-tooltip/>
+        </el-table>
+    </el-dialog>
+</template>
+
+<script setup lang="ts">
+import {RetGoodsReftransportout, transportRecordLists } from "@/api";
+import { gradeName, enterpriseFun, stockunitFun, specification, LotNumber, shoubat } from "@/plugins/selectData";
+import { reactive, ref, onMounted } from 'vue'
+import { downPDF, downloadExcelFun } from "@/utils/download";
+import type { FormInstance, ElTable } from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { tableinterface,RuleForm,RuleForm1,ListItem,RestaurantItem,RuleFormdown} from "./js/interface";
+const dialogFormVisible = ref(false)
+const ruleFormRef = ref<FormInstance>()
+
+const multipleSelection:any = ref([])
+const handleSelectionChange = (val: any) => {
+    multipleSelection.value = val
+    let arrMap = [...val]
+    expinitParam.stockOutIds = arrMap.map(item=> item.stock_out_id )
+}
+
+let tableData = ref([])
+const initParam = reactive<RuleForm1>({//请求参数
+    "date": null,
+    "receivingUnit": ''
+})
+//函数
+const searchFn = async ()=>{
+    const reslut:any = await transportRecordLists(initParam)
+    if(reslut.code==200){
+        tableData.value = reslut.data.list || []
+    }
+    console.log('搜索',reslut)
+}
+
+
+
+onMounted(async () => {
+    const result1: any = await gradeName()//疫苗名称
+    const result2: any = await enterpriseFun()//生产企业
+    const result3: any = await specification()//规格
+    const result4: any = await stockunitFun(2)//收发货单位
+
+    list1.value = findMap(result1 || [], 'obj')
+    list2.value = findMap(result2 || [], 'obj')
+    list3.value = findMap(result3 || [], 'obj')
+    list4.value = findMap(result4 || [], 'map')
+})
+//函数
+const findMap = (arr: any, obj: any) => {
+    return arr.map((item: any) => {
+        return { value: obj == 'obj' ? item.id : item, label: obj == 'obj' ? item.name : item }
+    })
+}
+
+
+
+
+const list1 = ref<ListItem[]>([])//疫苗名称
+const list2 = ref<ListItem[]>([])//生产企业
+const list3 = ref<ListItem[]>([])//收发货单位
+const list4 = ref<ListItem[]>([])//收发货单位
+
+
+
+
+
+
+
+const createFilter = (queryString: string) => {
+    return (restaurant: RestaurantItem) => {
+        return (
+            restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+        )
+    }
+}
+
+
+
+
+
+//显示运输登记
+const showdialogdialog = async () => {
+    dialogFormVisible.value = true
+    const reslut: any = await shoubat()
+    console.log('数据1', reslut)
+    const arrMap = reslut
+    const arr: any = []
+    arrMap.forEach((item: any) => {
+        arr.push({ value: item, link: item })
+    })
+    restaurants.value = arr
+}
+const restaurants = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+    const results = queryString
+        ? restaurants.value.filter(createFilter(queryString))
+        : restaurants.value
+    cb(results)
+}
+
+let expinitParam:any = reactive<RuleFormdown>({
+    "stockOutIds": [],
+    "type": ''
+})
+const submitForm = async ( ty: any) => {
+    const b = Object.values(initParam).some(item => item==null || item=='')
+    console.log('b',b)
+    if(b){
+        ElMessage.error('请选择出库日期跟收货单位')
+        return
+    }else{
+        expinitParam.type = ty
+        expinitParam = {...expinitParam,...initParam}
+        const result: any = await RetGoodsReftransportout(expinitParam)
+        console.log('result', result, ty)
+        ty == 'word' ? downloadExcelFun(result) : downPDF(result)
+    }
+    
+}
+</script>
+<style lang="scss">
+/* @import url(); 引入css类 */
+.inputWidth {
+    width: 200px;
+}
+</style>

+ 45 - 0
src/views/stockcontrol/ReturnGoodsScrap/goorsnote.vue

@@ -0,0 +1,45 @@
+<template>
+    <el-button 
+    title='请勾选'
+    :disabled="props.multipleTables.length == 0?true:false" 
+    type="primary" icon="Download" @click="showdialogdialog">退货单</el-button>
+</template>
+
+<script setup lang="ts">
+import { stockTemprefOutexport } from "@/api";
+import { reactive} from 'vue'
+import { ElMessageBox } from 'element-plus'
+import { goddsnoteRuleForm } from "./js/interface";
+import { downPDF } from "@/utils/download";
+
+const props = defineProps({
+    multipleTables:{
+        type:Array,
+        default:()=>[]
+    }
+})
+const initParam = reactive<goddsnoteRuleForm>({//请求参数
+    "reason": null,
+    "stockOutIds": []
+})
+//函数
+const showdialogdialog = async () => {
+    ElMessageBox.prompt('请输入你的退货原因', '退货单', {
+        confirmButtonText: '提交',
+        cancelButtonText: '取消',
+    }).then(async ({ value }) => {
+        initParam.reason = value
+        initParam.stockOutIds = await filterfun()
+        const reslut = await stockTemprefOutexport(initParam)
+        downPDF(reslut)
+    }).catch(() => {})
+}
+const filterfun = ()=>{
+    return new Promise(resolve=>{
+        let Array = [...props.multipleTables]
+        const reslut = Array.map((item:any)=>item.id)
+        console.log('筛选',reslut)
+        resolve(reslut)
+    })
+}
+</script>

+ 252 - 0
src/views/stockcontrol/ReturnGoodsScrap/index.vue

@@ -0,0 +1,252 @@
+<!--  -->
+<template>
+    <div class="storagePut">
+        <searchAdd isButtom="查询" @event="eventFun">
+            <template #searchConter>
+                <el-form-item label="血液制品名称">
+                    <el-select v-model.number="initParam.productId" filterable remote reserve-keyword
+                        placeholder="血液制品名称" :remote-method="remoteMethod1" :loading="loading" clearable
+                        style="width: 200px;" @clear="initParam.productId = null" @click="click1">
+                        <el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="生产企业">
+                    <el-select v-model.number="initParam.enterpriseId" filterable remote reserve-keyword
+                        placeholder="生产企业" :remote-method="remoteMethod2" :loading="loading" clearable
+                        @clear="initParam.enterpriseId = null" @click="click2" style="width: 200px;">
+                        <el-option v-for="item in options2" :key="item.value" :label="item.label" :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="批准文号">
+                    <el-input v-model="initParam.batchNumber" placeholder="血液制品批号" clearable style="width: 200px;" />
+                </el-form-item>
+                <el-form-item label="出库日期">
+                    <el-date-picker v-model="data.datepick" type="daterange" placeholder="出/入库日期" clearable
+                        start-placeholder="开始" end-placeholder="结束" value-format="YYYY-MM-DD" style="width: 200px;"
+                        @change="changFun" />
+                </el-form-item>
+                <el-form-item label="收货单位">
+                    <el-select v-model="initParam.receivingUnit" filterable remote reserve-keyword placeholder="收货单位"
+                        :remote-method="remoteMethod3" :loading="loading" clearable @click="click3"
+                        style="width: 200px;">
+                        <el-option v-for="item in options3" :key="item.value" :label="item.label" :value="item.value" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="条码">
+                    <el-input v-model="initParam.qrcode" placeholder="请输入条码" clearable style="width: 200px;" />
+                </el-form-item>
+                <el-form-item label="状态">
+                    <el-select v-model="initParam.state" placeholder="请选择状态" style="width: 200px">
+                        <el-option label="全部" :value="0" />
+                        <el-option label="退货出库" :value="2" />
+                        <el-option label="报废出库" :value="3" />
+                    </el-select>
+                </el-form-item>
+            </template>
+        </searchAdd>
+        <bg istitle="基本信息">
+            <template #btn>
+                <div style="display: flex;gap: 10px;flex-wrap: wrap;">
+                    <goorsnote :multipleTables="multipleTableData"></goorsnote>
+                    <scrapNote :multipleTables="multipleTableData"></scrapNote>
+                    <Labour @scanCode="scanCodeFun"></Labour>
+                    <scanCode @scanCode="scanCodeFun"></scanCode>
+                    <downing></downing>
+                </div>
+            </template>
+            <template #bg>
+                <tables ref="TableRef" :selectionChange="selectionChangeFun"
+                    getRowKey="id" :requestApi="stockrefsoutList" :columns="columns" :initParam="initParam">
+                    <template #state="{ row }">
+                        <el-tag :type="row.state==2?'primary':'success'">
+                            {{ row.state==2?'退货出库':'报废出库' }}
+                        </el-tag>
+                    </template>
+                    <template #right="{ row }">
+                        <Editinventory :row="row" @editinvent="editinventFun"></Editinventory>
+                    </template>
+                </tables>
+            </template>
+        </bg>
+    </div>
+</template>
+
+<script setup lang="ts">
+import {
+    stockrefsoutList,
+    productList,//血液制品名称
+    enterpriseList,//生产企业
+    stockunit,//收发货单位
+    medicineColumns,//表头
+} from "@/api";
+import Editinventory from './Editinventory.vue'
+import { reactive, ref, onMounted, onBeforeMount } from "vue";
+import tables from "@/components/table.vue";
+import searchAdd from "@/components/searchAdd.vue";
+import bg from '@/components/bg.vue'
+import goorsnote from './goorsnote.vue'
+import scrapNote from './scrapNote.vue'
+
+import scanCode from './scanCode.vue'
+import Labour from './Labour.vue'
+import downing from './downing.vue'
+
+const multipleTableData = ref([])
+const selectionChangeFun = async (data:any)=>{
+    multipleTableData.value = data
+}
+
+const TableRef = ref()
+import { columnsTableOut } from "@/plugins/rulesData";
+//函数
+const scanCodeFun = async () => {
+    console.log('添加完成')
+    TableRef.value?.getTableList()
+}
+//函数
+const editinventFun = async () => {
+    TableRef.value?.getTableList()
+}
+
+//函数
+const datepickFn = () => {
+    const today = new Date()
+    const year = today.getFullYear();
+    const month = (today.getMonth() + 1).toString().padStart(2, '0'); // 注意月份从0开始,所以要加1
+    const date = (today.getDate()).toString().padStart(2, '0');
+    const j = year + '-' + month + '-' + date
+    data.datepick = [j, j]
+    initParam.startDate = j; initParam.endDate = j
+}
+onBeforeMount(() => {//默认获取当天的时间
+    // datepickFn()
+})
+
+const columns: any = []
+//提交参数
+const initParam = reactive({
+    "batchNumber": "",
+    "enterpriseId": null,
+    "endDate": "",
+    "startDate": "",
+    "productId": null,
+    "receivingUnit": "",
+    "qrcode": '',
+    'state':0
+})
+
+
+const data: any = reactive({
+    datepick: []
+})
+/**
+ * 
+ * @param val 子传值
+ */
+const eventFun = (val: any) => {
+    TableRef.value?.getTableList()
+}
+const loading = ref(false)
+const list1 = ref<ListItem[]>([])//血液制品名称
+const list2 = ref<ListItem[]>([])//生产企业
+const list3 = ref<ListItem[]>([])//收发货单位
+//函数
+const click1 = async () => { options1.value = list1.value }
+const click2 = async () => { options2.value = list2.value }
+const click3 = async () => { options3.value = list3.value }
+
+// 渲染表格
+onMounted(async () => {
+    let r: any = await medicineColumns({})
+    if (r.code == 200) {
+        let obj = [...r.data?.list]
+        let menus = {label: "状态", prop: "state", width: 0, name: 'state' }
+        TableRef.value.tableColumns = [{ type: 'selection',align:'left'},...obj,{...menus},...columnsTableOut]
+    }
+
+
+    const result1: any = await productList({ age: 1, pageSize: 999 })//血液制品名称
+    const result2: any = await enterpriseList({ age: 1, pageSize: 999 })//生产企业
+    const result3: any = await stockunit({ type: 2 })//收发货单位
+
+
+    list1.value = findMap(result1.data?.list || [], 'obj')
+    list2.value = findMap(result2.data?.list || [], 'obj')
+    list3.value = findMap(result3.data?.list || [], 'map')
+
+})
+//函数
+const changFun = async (e: any) => {
+    if (e) { initParam.startDate = e[0]; initParam.endDate = e[1] }
+    else { initParam.startDate = ""; initParam.endDate = "" }
+}
+interface ListItem {
+    value: string
+    label: string
+}
+const options1 = ref<ListItem[]>([])
+const options2 = ref<ListItem[]>([])
+const options3 = ref<ListItem[]>([])
+
+const remoteMethod1 = async (query: string) => {
+    if (query) {
+        loading.value = true
+        setTimeout(() => {
+            loading.value = false
+            options1.value = list1.value.filter((item: any) => {
+                return item.label.toLowerCase().includes(query.toLowerCase())
+            })
+        }, 200)
+    } else {
+        options1.value = []
+    }
+}
+
+const remoteMethod2 = async (query: string) => {
+    if (query) {
+        loading.value = true
+        setTimeout(() => {
+            loading.value = false
+            options2.value = list2.value.filter((item: any) => {
+                console.log('第一个', query, item)
+                return item.label.toLowerCase().includes(query.toLowerCase())
+            })
+        }, 200)
+    } else {
+        options2.value = []
+    }
+}
+const remoteMethod3 = async (query: string) => {
+    if (query) {
+        loading.value = true
+        setTimeout(() => {
+            loading.value = false
+            options3.value = list3.value.filter((item: any) => {
+                return item.label.toLowerCase().includes(query.toLowerCase())
+            })
+        }, 200)
+    } else {
+        options3.value = []
+    }
+}
+//函数
+const findMap = (arr: any, obj: any) => {
+    return arr.map((item: any) => {
+        return { value: obj == 'obj' ? item.id : item, label: obj == 'obj' ? item.name : item }
+    })
+}
+
+
+
+
+
+</script>
+<style lang="scss">
+.storagePut {
+    user-select: none;
+}
+
+.el-form-item {
+    // margin-bottom: 0;
+}
+</style>

+ 124 - 0
src/views/stockcontrol/ReturnGoodsScrap/inputSearch.vue

@@ -0,0 +1,124 @@
+<template>
+    <div class="Qr">
+        <div class="Qr-img">
+            <img src="@/assets/img/BarCodeQR.svg" style="width: 80%;height: 80%;">
+        </div>
+        <div class="Qr-input">
+            <input class="Qr-input-type" ref="myInput" v-model="data.value" type="text" placeholder="请扫描追溯码" >
+            <el-icon :size="18" style="cursor: pointer;" @click="CloseFn">
+                <CircleClose />
+            </el-icon>
+        </div>
+        <button class="Qr-isButton" @click="onSubmit">确认搜索</button>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive } from "vue";
+import { ElMessage, ElMessageBox } from 'element-plus'
+const myInput = ref()
+const data: any = reactive({
+    value: '',
+    num:0
+})
+const emit: any = defineEmits(['inputSearchData',])
+//函数
+const inputFocus = async () => {
+    console.log('获取焦点',myInput.value)
+    setTimeout(() => {
+        myInput.value!=null?myInput.value.focus():''
+    }, 1000)
+}
+//函数
+const CloseFn = async () => {
+    ClearFn()
+    setTimeout(() => {
+        myInput.value.focus()
+    }, 1000)
+}
+/**
+ * 清空
+ */
+const ClearFn = async ()=>{
+    data.value = '';
+}
+document.addEventListener('keydown',(event:any)=>{
+    // console.log('扫码枪',event)
+    data.num += 1
+    if(data.num == 1){data.value = ''}
+    if (event.code === 'Enter') { // 判断是否按下了回车键
+        data.value = event.target.value; // 获取扫描枪输入框的值    
+        onSubmit()
+    }
+})
+const onSubmit = async () => {
+    if(data.value){
+        emit('inputSearchData', data.value);data.num = 0 
+    }else{
+        ElMessage.error('点击输入框在使用扫码枪扫码')
+    }
+}
+defineExpose({
+    inputFocus, data,ClearFn
+})
+</script>
+<style lang="scss">
+/* @import url(); 引入css类 */
+.Qr {
+    display: flex;
+    margin-bottom: 20px;
+    border: 1px solid #409eff;
+    box-sizing: border-box;
+    min-width: 450px;
+    width: 50%;
+    border-radius: 6px;
+    overflow: hidden;
+
+    &-img {
+        width: 30px;
+        height: 30px;
+        margin-top: 10px;
+        margin-bottom: 10px;
+        padding: 0 20px;
+        flex-shrink: 0;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+        border-right: .5px solid #409eff;
+        user-select: none;
+    }
+
+    &-input {
+        flex: 1;
+        padding: 0 20px;
+        display: flex;
+        align-items: center;
+
+        &-type {
+            outline: none;
+            border: none;
+            flex: 1;
+            font-weight: bold;
+            font-size: 18px;
+        }
+    }
+
+    &-isButton {
+        background: #409eff;
+        outline: none;
+        border: none;
+        color: #fff;
+        min-width: 100px;
+        flex-shrink: 0;
+        cursor: pointer;
+        user-select: none;
+    }
+
+    &-isButton:hover {
+        background: #a0cfff;
+    }
+
+    &-isButton:active {
+        background-color: #337ecc;
+    }
+}</style>

+ 43 - 0
src/views/stockcontrol/ReturnGoodsScrap/js/interface.ts

@@ -0,0 +1,43 @@
+export interface tableinterface {
+    qrcode: string
+    product_name: string
+    enterprise_name: string
+    approval_number: string
+    qualification_number: string
+    spec_name: string
+    produced_date: string
+    batch_number: string
+    expiry_date: string
+    quantity: string
+    unit_name: string
+}
+
+export interface RuleForm {
+    batchNumber: any,
+    enterpriseId?: any,
+    productId?: any,
+    specId: any,
+    type: string
+}
+export interface goddsnoteRuleForm{
+    reason: any,
+    stockOutIds: any
+}
+export interface RuleForm1 {
+    date: any,
+    receivingUnit?: any
+}
+export interface RuleFormdown {
+    stockOutIds?:any,
+    type: string
+}
+
+export interface ListItem {
+    value: string
+    label: string
+}
+
+export interface RestaurantItem {
+    value: string
+    link: string
+}

+ 301 - 0
src/views/stockcontrol/ReturnGoodsScrap/scanCode.vue

@@ -0,0 +1,301 @@
+<!-- 扫码 -->
+<template>
+    <div class="">
+        <el-button el-button type="primary" icon="Camera" @click="showDia">扫码出库</el-button>
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="扫码退货(报废)出库" :append-to-body="true" draggable :close-on-click-modal="false"
+            :close-on-press-escape="false" width="95%">
+            <inputSearch ref="inputSearchRef" style="margin:0 auto 40px auto;" @inputSearchData="inputSearchfn"></inputSearch>
+            <el-table :data="data.tableData" style="width: 100%" border height="450" :row-class-name="tableRowClassName">
+                <el-table-column :label="item.label" v-for="item, i in data.columns" :key="i" min-width="110" show-overflow-tooltip>
+                    <template #default="scope"><!--scope.row.medicineInfo[item.prop] -->
+                        {{ findFun(scope.row.medicineInfo[item.prop], item.list) }}
+                    </template>
+                </el-table-column>
+                <el-table-column min-width="150" v-for="item,index in scanCodeTableOut" :key="index"
+                :fixed="item.prop == 'operation'&&'right'">
+                    <template v-slot:header="scope">  
+                        <div @dblclick="dbclicklable(item)">  
+                            {{item.label}}  
+                        </div>  
+                    </template> 
+                    <template #default="scope">
+                        <el-input v-if="['quantity','unitPrice','operator'].includes(item.prop)" v-model="scope.row[item.prop]" style="width: 100px;"/>
+                        <el-date-picker v-if="item.prop == 'date'" v-model="scope.row[item.prop]" type="date" value-format="YYYY-MM-DD" style="width: 120px;"/>
+                        <el-autocomplete v-if="item.prop == 'receivingUnit'" v-model="scope.row[item.prop]"
+                         :fetch-suggestions="querySearch1" clearable style="width: 120px;" />
+                        <el-button v-if="item.prop == 'operation'" type="danger" :icon="Delete" @click="deltable(scope.$index)">删除</el-button>
+                    </template>
+                </el-table-column>
+            </el-table>
+            <template #footer>
+                <span class="dialog-footer">
+                    <el-button @click="dialogFormVisible = false">关闭</el-button>
+                    <el-button type="danger" @click="resetForm">重置数据</el-button>
+                    <el-button :disabled="data.tableData.length==0?true:false" type="primary" @click="showcenterDialogVisible">立即出库</el-button>
+                </span>
+            </template>
+
+            <el-dialog :destroy-on-close="true" v-model="centerDialogVisible" title="出库类型" width="500" center>
+                <div style="display: flex;justify-content: center">
+                    <el-radio-group v-model="initParams.state">
+                        <el-radio :label="2" size="large">退货出库</el-radio>
+                        <el-radio :label="3" size="large">报废出库</el-radio>
+                    </el-radio-group>
+                </div>
+                <template #footer>
+                <div class="dialog-footer">
+                    <el-button @click="centerDialogVisible = false">Cancel</el-button>
+                    <el-button type="primary" @click="subStock"> 提交 </el-button>
+                </div>
+                </template>
+            </el-dialog>
+
+
+        </el-dialog>
+    </div>
+</template>
+
+<script setup lang="ts">
+import { reactive, ref,nextTick,watch, onMounted} from 'vue'
+import inputSearch from "./inputSearch.vue";
+import { scanCodeTableOut } from "@/plugins/rulesData";
+const dialogFormVisible = ref(false)
+const centerDialogVisible = ref(false)
+
+watch(() => dialogFormVisible.value, (dy: any) => {
+  if(!dy)resetForm()
+})
+const inputSearchRef = ref<InstanceType<typeof inputSearch> | null>(null)
+import { 
+    stockunit,//收发货单位
+    RetGoodsRefcodeout
+} from "@/api";
+import { ElMessage,ElMessageBox } from 'element-plus'
+import { Delete} from '@element-plus/icons-vue'
+import { syrulesData } from "@/plugins/rulesData";
+import { timesFn } from "@/plugins/settime";
+import {
+    medicListScanCode,
+    medicMsfx
+} from "@/api";
+let data: any = reactive({
+    tableData: [],
+    showDiaData: [],
+    itemPir: [],
+    rules1: {},
+    columns: [],// 渲染表格
+    selectType: [],//表格的下拉对应
+    editStrot: false,
+    editIndex: null,
+    qr:''
+})
+let initParam: any = reactive({
+    "date": "",
+    "receivingUnit": "",
+    "medicineInfo": {},
+    "operator": '',
+    "quantity": '',
+    "unitPrice": null
+})
+//双击填充经办人,发货单位
+const dbclicklable = (item:any)=>{
+    if(['收货单位','经办人'].includes(item.label)){
+        if(data.tableData.length!=0){
+            if(data.tableData[0][item.prop]==''){
+                ElMessage.error('请填写第一项,在双击全部填充')
+                return
+            }
+            data.tableData.forEach((obj:any)=>{
+                obj[item.prop] = data.tableData[0][item.prop]
+            })
+        }else{
+            ElMessage.error('请先扫描在进行批量填充')
+            return
+        }
+    }
+}
+/**
+ * 当前搜索到的样式
+ * @param param0 
+ */
+const tableRowClassName = ({rowIndex}: {
+  rowIndex: number
+}) => {
+    if(data.qr){
+        const i = data.tableData.findIndex((item:any) => item.Qrcode==data.qr)
+        if (rowIndex==i) { return 'success-row' }else{return ''}
+    }else{
+        return ''
+    }
+}
+
+let rules: any = reactive({})
+const showDia = async () => {
+    await updating()
+    dialogFormVisible.value = true
+    medicListStockFun()//获取入库表单
+    itemPirFun()
+    nextTick(()=>{
+        console.log('inputSearchRef111',inputSearchRef.value)
+        inputSearchRef.value?.inputFocus()
+    })
+}
+const updating = ()=>{
+    ElMessageBox.alert('扫码出库功能更新中,请先使用手动出库', '提示', {
+    confirmButtonText: '我知道了',
+    type: 'warning',
+    draggable: true,
+    callback: () => {
+    },
+  })
+  return new Promise<void>((resolve, reject) => {}) 
+}
+//函数
+const findFun = (data: any, list: any) => {
+    if (list) {
+        const b = list.find((item: any) => item.id == data)
+        if (b) return b.name
+        else return ''
+    } else {
+        return data
+    }
+}
+
+//获取入库表单Api
+const medicListStockFun = async () => {
+    data.columns = []
+    const reslut: any = await medicListScanCode({})
+    console.log('表格', reslut)
+    if (reslut.code == 200 && reslut.msg == '查询成功') {
+        data.showDiaData = reslut.data?.list || []
+        data.rules1 = {}
+        data.columns = []
+        reslut.data?.list.forEach((value: any) => { //value设置成key
+            data.columns.push({ prop: value.field_name, label: value.name, list: value.list })
+            initParam.medicineInfo[value.field_name] = ''; // 这里可以根据需要设置其他值作为键的内容
+        });
+        Object.assign(rules, { ...data.rules1, ...syrulesData })
+        dialogFormVisible.value = true
+    }
+}
+const emit: any = defineEmits(['scanCode'])
+
+
+const showcenterDialogVisible = ()=>{
+    const ab = data.tableData.every((item:any) => item.quantity != '' && item.operator != '' && item.date != '')
+    if(!ab){
+        ElMessage.error('缺少数据提示:【数量】、【经办人】、【出库日期】是必填项哦!');return;
+    }else{
+        centerDialogVisible.value = true
+    }
+}
+
+let initParams:any = reactive({//请求参数
+    state: 2,
+    stockOutList: []
+})
+const subStock = async ()=>{
+    const arr = [...data.tableData]
+    arr.forEach((item:any)=>{
+        item.quantity = Number(item.quantity)
+        item.unitPrice = Number(item.unitPrice)
+    })
+    initParams.stockOutList = arr
+    const reslut:any = await RetGoodsRefcodeout(initParams)
+    if(reslut.code==200){
+        ElMessage.success(reslut.msg)
+        dialogFormVisible.value = false
+        emit('scanCode', '')
+    }
+}
+/**
+ * 搜索
+ * @param e 追溯码
+ */
+const inputSearchfn = async (e:any)=>{
+    data.qr = e
+    const j = await SearchFind(e)
+    if (j) {ElMessage.error('提示:重复扫描添加数据了哦');return}
+    const reslut:any = await medicMsfx({code:e})
+    let initParamObj = {...initParam}
+    initParamObj.Qrcode = e
+    if (reslut.code==200 && reslut.msg=='查询成功') {
+        initParamObj.medicineInfo = reslut.data[0] || {}
+        if(reslut.data[0].quantity!=undefined){
+            initParamObj.quantity = reslut.data[0].quantity
+        }
+        initParamObj.date = timesFn()
+        data.tableData.push(initParamObj)
+        inputSearchRef.value?.inputFocus()
+    }
+}
+/**
+ * 筛选是否已经扫描过
+ * @param j 追溯码 
+ */
+const SearchFind = (j:any)=>{
+    return new Promise(resolve=>{
+        const ab = data.tableData.find((item:any) => item.Qrcode==j)
+        ab==undefined?resolve(false):resolve(true)
+    })
+}
+
+/**
+ * 删除
+ * @param index 
+ */
+const deltable = async (index:any)=>{
+    data.tableData.splice(index,1)
+    nextTick(()=>{
+        inputSearchRef.value?.inputFocus()
+    })
+}
+
+//收发货单位
+const itemPirFun = async () => {
+    const reslut: any = await stockunit({ type: 2 })
+    const arrMap = reslut.data?.list
+    const arr:any = []
+    arrMap.forEach((item:any)=>{
+        arr.push({ value: item, link: item})  
+    })
+    restaurants1.value = arr
+}
+interface RestaurantItem {
+  value: string
+  link: string
+}
+const restaurants1 = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+  const results = queryString
+    ? restaurants1.value.filter(createFilter(queryString))
+    : restaurants1.value
+  cb(results)
+}
+const createFilter = (queryString: string) => {
+  return (restaurant: RestaurantItem) => {
+    return (
+      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+    )
+  }
+}
+/**
+ * 重置
+ */
+const resetForm = async ()=>{
+    data.tableData = []
+    inputSearchRef?.value?.ClearFn()
+    inputSearchRef.value?.inputFocus()
+}
+</script>
+<style lang="scss">
+.inputWidth {
+    width: 200px;
+}
+.el-table .warning-row {
+  --el-table-tr-bg-color: var(--el-color-warning-light-9);
+}
+.el-table .success-row {
+  --el-table-tr-bg-color: var(--el-color-success-light-9);
+}
+</style>

+ 48 - 0
src/views/stockcontrol/ReturnGoodsScrap/scrapNote.vue

@@ -0,0 +1,48 @@
+<template>
+    <el-button
+    title='请勾选'
+    :disabled="props.multipleTables.length == 0?true:false" type="primary" icon="Download" @click="showdialogdialog">报废出库单</el-button>
+</template>
+
+<script setup lang="ts">
+import { stockscrapoutexport } from "@/api";
+import { reactive} from 'vue'
+import { ElMessageBox } from 'element-plus'
+import { goddsnoteRuleForm } from "./js/interface";
+import { downPDF } from "@/utils/download";
+
+const props = defineProps({
+    multipleTables:{
+        type:Array,
+        default:()=>[]
+    }
+})
+
+const initParam = reactive<goddsnoteRuleForm>({//请求参数
+    "reason": null,
+    "stockOutIds": []
+})
+//函数
+const showdialogdialog = async () => {
+    ElMessageBox.prompt('请输入你的报废出库原因', '报废出库', {
+        confirmButtonText: '提交',
+        cancelButtonText: '取消',
+    }).then(async ({ value }) => {
+        initParam.reason = value
+        initParam.stockOutIds = await filterfun()
+        const reslut = await stockscrapoutexport(initParam)
+        downPDF(reslut)
+    }).catch(() => {})
+}
+
+
+//函数
+const filterfun = async ()=>{
+    return new Promise(resolve=>{
+        let Array = [...props.multipleTables]
+        const reslut = Array.map((item:any)=>item.id)
+        console.log('筛选',reslut)
+        resolve(reslut)
+    })
+}
+</script>

+ 1 - 1
src/views/stockcontrol/storageFrom/Editinventory.vue

@@ -3,7 +3,7 @@
     <div class="">
         <el-button type="primary" @click="editFun(props.row)">编辑</el-button>
         <el-button type="danger" @click="delClick(props.row)">删除</el-button>
-        <el-dialog v-model="dialogFormVisible" title="编辑" :append-to-body="true" draggable width="60%">
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="编辑" :append-to-body="true" draggable width="60%">
             <el-form ref="ruleFormRef" :rules="rules" :model="initParam" :inline="true">
                 <el-divider content-position="center">药品信息</el-divider>
                 <el-form-item :label="item.name" :label-width="formLabelWidth" v-for="(item,index) in data.showDiaData" :key="index" :prop="'medicineInfo.'+item.field_name">

+ 7 - 3
src/views/stockcontrol/storageFrom/Labour.vue

@@ -2,7 +2,7 @@
 <template>
     <div class="">
         <el-button el-button type="primary" icon="Pointer" @click="showDia">手动出库</el-button>
-        <el-dialog v-model="dialogFormVisible" title="手动出库" :append-to-body="true" :before-close="closeFun" draggable :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="手动出库" :append-to-body="true" :before-close="closeFun" draggable :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
             <el-form ref="ruleFormRef" :rules="rules" :model="initParam" :inline="true">
                 <el-divider content-position="center">药品信息</el-divider>
                 <el-form-item :label="item.name" :label-width="formLabelWidth" v-for="(item,index) in data.showDiaData" :key="index" :prop="'medicineInfo.'+item.field_name">
@@ -44,7 +44,7 @@
                     <el-button type="danger" @click="resetForm(ruleFormRef)">重置数据</el-button>
                 </span>
             </template>
-            <el-dialog v-model="innerVisible" title="出库数据" width="95%" append-to-body draggable :close-on-click-modal="false" :close-on-press-escape="false">
+            <el-dialog :destroy-on-close="true" v-model="innerVisible" title="出库数据" width="95%" append-to-body draggable :close-on-click-modal="false" :close-on-press-escape="false">
                 <el-table :data="data.tableData" style="width: 100%" border max-height="450"   :header-cell-style="{'background-color':'#ccc','color': 'white'}">
                     <el-table-column :label="item.label" v-for="item,i in data.columns" :key="i" min-width="110" show-overflow-tooltip>
                         <template #default="scope"><!--scope.row.medicineInfo[item.prop] -->
@@ -119,7 +119,11 @@ let data:any = reactive({
 const emit:any = defineEmits(['scanCode'])
 //立即出库
 const subStock = async ()=>{
-    const reslut:any = await stockTemplateBatchOut({"stockOutList": data.tableData})
+    let arr = [...data.tableData]
+    arr.forEach(item=>{
+        item.unitPrice = Number(item.unitPrice)
+    })
+    const reslut:any = await stockTemplateBatchOut({"stockOutList": arr})
     console.log('返回',reslut)
     if(reslut.code==200 && reslut.msg=='出库成功'){
         ElMessage.success(reslut.msg)

+ 168 - 0
src/views/stockcontrol/storageFrom/Outbound.vue

@@ -0,0 +1,168 @@
+<template>
+    <el-button el-button type="primary" icon="Download" @click="showdialogdialog">出库单</el-button>
+    <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="出库单" :append-to-body="true" draggable width="80%">
+        <div style="display: flex;justify-content: space-between;align-items: center;flex-wrap: wrap">
+            <div>
+                <el-form :model="initParam" ref="ruleFormRef" :inline="true">
+                    <el-form-item label="出库日期" prop="date">
+                        <el-date-picker v-model="initParam.date" :clearable='false' class="inputWidth" type="date" value-format="YYYY-MM-DD"
+                            style="width: 100%;" />
+                    </el-form-item>
+                    <el-form-item label="收货单位" prop="receivingUnit">
+                        <el-autocomplete v-model="initParam.receivingUnit" :fetch-suggestions="querySearch1"
+                            class="inputWidth" placeholder="收货单位" style="width: 100%;" />
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" icon="Search" @click="searchFn">搜索</el-button>
+                    </el-form-item>
+                </el-form>
+            </div>
+            <div style="max-width: 200px;margin-bottom: 18px;">
+                <!-- <el-button type="primary" @click="submitForm('word')">导出</el-button> -->
+                <el-button type="primary" @click="submitForm('pdf')">打印</el-button>
+            </div>
+        </div>
+        <el-table :data="tableData" border style="margin-top: 40px;width: 100%"
+            @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="40" />
+            <el-table-column property="qrcode" label="条码" min-width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="product_name" label="品种" width="120" show-overflow-tooltip />
+            <el-table-column property="enterprise_name" label="生产企业" width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="approval_number" label="批准文号" min-width="120" show-overflow-tooltip />
+            <el-table-column property="qualification_number" label="批签发合格编号" min-width="150" show-overflow-tooltip></el-table-column>
+            <el-table-column property="spec_name" label="规格(剂/支或粒)" width="150" show-overflow-tooltip />
+            <el-table-column property="produced_date" label="生产日期" width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="batch_number" label="批号" width="100" show-overflow-tooltip />
+            <el-table-column property="expiry_date" label="失效日期" width="100" show-overflow-tooltip></el-table-column>
+            <el-table-column property="quantity" label="数量" width="70" show-overflow-tooltip />
+            <el-table-column property="unit_name" label="单位" width="70" show-overflow-tooltip/>
+            <el-table-column property="date" label="出库日期" width="110" show-overflow-tooltip />
+            <el-table-column property="receiving_unit" label="收货单位" width="90" show-overflow-tooltip/>
+        </el-table>
+    </el-dialog>
+</template>
+
+<script setup lang="ts">
+import {tranoutexport, transportrecordList } from "@/api";
+import { gradeName, enterpriseFun, stockunitFun, specification, LotNumber, shoubat } from "@/plugins/selectData";
+import { reactive, ref, onMounted } from 'vue'
+import { downPDF, downloadExcelFun } from "@/utils/download";
+import type { FormInstance, ElTable } from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { tableinterface,RuleForm,RuleForm1,ListItem,RestaurantItem,RuleFormdown} from "./js/interface";
+const dialogFormVisible = ref(false)
+const ruleFormRef = ref<FormInstance>()
+
+const multipleSelection:any = ref([])
+const handleSelectionChange = (val: any) => {
+    multipleSelection.value = val
+    let arrMap = [...val]
+    expinitParam.stockOutIds = arrMap.map(item=> item.stock_out_id )
+}
+
+let tableData = ref([])
+const initParam = reactive<RuleForm1>({//请求参数
+    "date": null,
+    "receivingUnit": ''
+})
+//函数
+const searchFn = async ()=>{
+    const reslut:any = await transportrecordList(initParam)
+    if(reslut.code==200){
+        tableData.value = reslut.data.list || []
+    }
+    console.log('搜索',reslut)
+}
+
+
+
+onMounted(async () => {
+    const result1: any = await gradeName()//疫苗名称
+    const result2: any = await enterpriseFun()//生产企业
+    const result3: any = await specification()//规格
+    const result4: any = await stockunitFun(2)//收发货单位
+
+    list1.value = findMap(result1 || [], 'obj')
+    list2.value = findMap(result2 || [], 'obj')
+    list3.value = findMap(result3 || [], 'obj')
+    list4.value = findMap(result4 || [], 'map')
+})
+//函数
+const findMap = (arr: any, obj: any) => {
+    return arr.map((item: any) => {
+        return { value: obj == 'obj' ? item.id : item, label: obj == 'obj' ? item.name : item }
+    })
+}
+
+
+
+
+const list1 = ref<ListItem[]>([])//疫苗名称
+const list2 = ref<ListItem[]>([])//生产企业
+const list3 = ref<ListItem[]>([])//收发货单位
+const list4 = ref<ListItem[]>([])//收发货单位
+
+
+
+
+
+
+
+const createFilter = (queryString: string) => {
+    return (restaurant: RestaurantItem) => {
+        return (
+            restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+        )
+    }
+}
+
+
+
+
+
+//显示运输登记
+const showdialogdialog = async () => {
+    dialogFormVisible.value = true
+    const reslut: any = await shoubat()
+    console.log('数据1', reslut)
+    const arrMap = reslut
+    const arr: any = []
+    arrMap.forEach((item: any) => {
+        arr.push({ value: item, link: item })
+    })
+    restaurants.value = arr
+}
+const restaurants = ref<RestaurantItem[]>([])
+const querySearch1 = (queryString: string, cb: any) => {
+    const results = queryString
+        ? restaurants.value.filter(createFilter(queryString))
+        : restaurants.value
+    cb(results)
+}
+
+let expinitParam:any = reactive<RuleFormdown>({
+    "stockOutIds": [],
+    "type": ''
+})
+const submitForm = async ( ty: any) => {
+    const b = Object.values(initParam).some(item => item==null || item=='')
+    console.log('b',b)
+    if(b){
+        ElMessage.error('请选择出库日期跟收货单位')
+        return
+    }else{
+        expinitParam.type = ty
+        expinitParam = {...expinitParam,...initParam}
+        const result: any = await tranoutexport(expinitParam)
+        console.log('result', result, ty)
+        ty == 'word' ? downloadExcelFun(result) : downPDF(result)
+    }
+    
+}
+</script>
+<style lang="scss">
+/* @import url(); 引入css类 */
+.inputWidth {
+    width: 200px;
+}
+</style>

+ 109 - 247
src/views/stockcontrol/storageFrom/downing.vue

@@ -1,118 +1,88 @@
-<template> 
-    <!-- <el-button el-button type="primary" icon="Download" @click="showdialog">收发登记表</el-button> -->
+<template>
     <el-button el-button type="primary" icon="Download" @click="showdialogdialog">运输登记表</el-button>
-    <el-dialog v-model="dialogFormVisible" title="收发登记表" :append-to-body="true" draggable width="30%">
-        <el-form :model="initParam" ref="ruleFormRef" :rules="rules">
-            <el-form-item label="品名" :label-width="formLabelWidth" prop="productId">
-                <el-select v-model.number="initParam.productId" filterable remote reserve-keyword placeholder="品名"
-                    :remote-method="remoteMethod1" :loading="loading" clearable style="width: 100%;"
-                    @clear="initParam.productId = null" @click="click1">
-                    <el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value" />
-                </el-select>
-            </el-form-item>
-            <el-form-item label="生产企业" :label-width="formLabelWidth" prop="enterpriseId">
-                <el-select v-model.number="initParam.enterpriseId" filterable remote reserve-keyword placeholder="生产企业"
-                    :remote-method="remoteMethod2" :loading="loading" clearable style="width: 100%;"
-                    @clear="initParam.enterpriseId = null" @click="click2">
-                    <el-option v-for="item in options2" :key="item.value" :label="item.label" :value="item.value" />
-                </el-select>
-            </el-form-item>
-            <el-form-item label="规格" :label-width="formLabelWidth" prop="specId">
-                <el-select v-model.number="initParam.specId" filterable remote reserve-keyword placeholder="规格"
-                    :remote-method="remoteMethod3" :loading="loading" clearable style="width: 100%;"
-                    @clear="initParam.specId = null" @click="click3">
-                    <el-option v-for="item in options3" :key="item.value" :label="item.label" :value="item.value" />
-                </el-select>
-            </el-form-item>
-            <el-form-item label="批号" :label-width="formLabelWidth" prop="batchNumber">
-                <!-- <el-select v-model="initParam.batchNumber" class="m-2" placeholder="Select" style="width: 100%;">
-                    <el-option v-for="item in options5" :key="item" :label="item" :value="item" />
-                </el-select> -->
-                <el-autocomplete v-model="initParam.batchNumber" :fetch-suggestions="querySearch" clearable 
-                class="inputWidth" placeholder="批号" style="width: 100%;"/>
-            </el-form-item>
-        </el-form>
-        <template #footer>
-            <span class="dialog-footer">
-                <el-button @click="dialogFormVisible = false">Cancel</el-button>
-                <el-button type="primary" @click="submitForm(ruleFormRef,'excel')">导出</el-button>
-                <el-button type="primary" @click="submitForm(ruleFormRef,'pdf')">打印</el-button>
-            </span>
-        </template>
-    </el-dialog>
-    <el-dialog v-model="dialogFormVisible1" title="运输登记表" :append-to-body="true" draggable width="30%">
-        <el-form :model="initParamWord" ref="ruleFormRef1" :rules="rules1">
-            <el-form-item label="出库日期" :label-width="formLabelWidth" prop="date">
-                <el-date-picker v-model="initParamWord.date" type="date" value-format="YYYY-MM-DD" clearable
-                    style="width: 100%;" />
-            </el-form-item>
-            <el-form-item label="收货单位" :label-width="formLabelWidth" prop="receivingUnit">
-                <!-- <el-select v-model.number="initParamWord.receivingUnit" filterable remote reserve-keyword placeholder="收货单位"
-                    :remote-method="remoteMethod4" :loading="loading" clearable style="width: 100%;"
-                    @clear="initParamWord.receivingUnit = null" @click="click4">
-                    <el-option v-for="item in options4" :key="item.value" :label="item.label" :value="item.value" />
-                </el-select> -->
-
-                <el-autocomplete v-model="initParamWord.receivingUnit" :fetch-suggestions="querySearch1" clearable class="inputWidth"
-                        placeholder="收货单位" style="width: 100%;" />
-            </el-form-item>
-            <el-form-item label="品名" :label-width="formLabelWidth">
-                <el-select v-model.number="initParamWord.productId" filterable remote reserve-keyword placeholder="品名"
-                    :remote-method="remoteMethod1" :loading="loading" clearable style="width: 100%;"
-                    @clear="initParamWord.productId = null" @click="click1">
-                    <el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value" />
-                </el-select>
-            </el-form-item>
-        </el-form>
-        <template #footer>
-            <span class="dialog-footer">
-                <el-button @click="dialogFormVisible1 = false">Cancel</el-button>
-                <el-button type="primary" @click="submitForm1(ruleFormRef1,'word')">导出</el-button>
-                <el-button type="primary" @click="submitForm1(ruleFormRef1,'pdf')">打印</el-button>
-
-            </span>
-        </template>
+    <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="运输登记表" :append-to-body="true" draggable width="80%">
+        <div style="display: flex;justify-content: space-between;align-items: center;flex-wrap: wrap">
+            <div>
+                <el-form :model="initParam" ref="ruleFormRef" :inline="true">
+                    <el-form-item label="出库日期" prop="date">
+                        <el-date-picker v-model="initParam.date" :clearable='false' class="inputWidth" type="date" value-format="YYYY-MM-DD"
+                            style="width: 100%;" />
+                    </el-form-item>
+                    <el-form-item label="收货单位" prop="receivingUnit">
+                        <el-autocomplete v-model="initParam.receivingUnit" :fetch-suggestions="querySearch1"
+                            class="inputWidth" placeholder="收货单位" style="width: 100%;" />
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" icon="Search" @click="searchFn">搜索</el-button>
+                    </el-form-item>
+                    <!-- <el-form-item label="品名" :label-width="formLabelWidth">
+                        <el-select v-model.number="initParam.productId" filterable remote reserve-keyword placeholder="品名"
+                            :remote-method="remoteMethod1" :loading="loading" clearable style="width: 100%;"
+                            @clear="initParam.productId = null" @click="click1">
+                            <el-option v-for="item in options1" :key="item.value" :label="item.label" :value="item.value" />
+                        </el-select>
+                    </el-form-item> -->
+                </el-form>
+            </div>
+            <div style="max-width: 200px;margin-bottom: 18px;">
+                <el-button type="primary" @click="submitForm('word')">导出</el-button>
+                <el-button type="primary" @click="submitForm('pdf')">打印</el-button>
+            </div>
+        </div>
+        <el-table :data="tableData" border style="margin-top: 40px;width: 100%"
+            @selection-change="handleSelectionChange">
+            <el-table-column type="selection" width="40" />
+            <el-table-column property="qrcode" label="条码" min-width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="product_name" label="品种" width="120" show-overflow-tooltip />
+            <el-table-column property="enterprise_name" label="生产企业" width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="approval_number" label="批准文号" min-width="120" show-overflow-tooltip />
+            <el-table-column property="qualification_number" label="批签发合格编号" min-width="150" show-overflow-tooltip></el-table-column>
+            <el-table-column property="spec_name" label="规格(剂/支或粒)" width="150" show-overflow-tooltip />
+            <el-table-column property="produced_date" label="生产日期" width="120" show-overflow-tooltip></el-table-column>
+            <el-table-column property="batch_number" label="批号" width="100" show-overflow-tooltip />
+            <el-table-column property="expiry_date" label="失效日期" width="110" show-overflow-tooltip></el-table-column>
+            <el-table-column property="quantity" label="数量" width="70" show-overflow-tooltip />
+            <el-table-column property="unit_name" label="单位" width="70" show-overflow-tooltip/>
+            <el-table-column property="date" label="出库日期" width="110" show-overflow-tooltip />
+            <el-table-column property="receiving_unit" label="收货单位" width="90" show-overflow-tooltip/>
+        </el-table>
     </el-dialog>
 </template>
 
 <script setup lang="ts">
-import { inventoryExcel, transportWord,stockunit } from "@/api";
-import { gradeName, enterpriseFun, stockunitFun, specification, LotNumber,shoubat } from "@/plugins/selectData";
+import {transportWord, transportrecordList } from "@/api";
+import { gradeName, enterpriseFun, stockunitFun, specification, LotNumber, shoubat } from "@/plugins/selectData";
 import { reactive, ref, onMounted } from 'vue'
 import { downPDF, downloadExcelFun } from "@/utils/download";
-import type { FormInstance } from 'element-plus'
+import type { FormInstance, ElTable } from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { tableinterface,RuleForm,RuleForm1,ListItem,RestaurantItem,RuleFormdown} from "./js/interface";
 const dialogFormVisible = ref(false)
-const dialogFormVisible1 = ref(false)
 const ruleFormRef = ref<FormInstance>()
-const ruleFormRef1 = ref<FormInstance>()
-const formLabelWidth = '80px'
-const loading = ref(false)
-interface RuleForm {
-    batchNumber: any,
-    enterpriseId?: any,
-    productId?: any,
-    specId: any,
-    type: string
-}
-const initParam = reactive<RuleForm>({//请求参数
-    "batchNumber":'',
-    "enterpriseId": null,
-    "productId": null,
-    "specId": null,
-    "type": ''
-})
-interface RuleForm1 {
-    date: any,
-    receivingUnit?: any,
-    productId?: any,
-    type: string
+
+const multipleSelection:any = ref([])
+const handleSelectionChange = (val: any) => {
+    multipleSelection.value = val
+    let arrMap = [...val]
+    expinitParam.stockOutIds = arrMap.map(item=> item.stock_out_id )
 }
-const initParamWord = reactive<RuleForm1>({//请求参数
+
+let tableData = ref([])
+const initParam = reactive<RuleForm1>({//请求参数
     "date": null,
-    "receivingUnit": '',
-    "productId": null,
-    "type": ''
+    "receivingUnit": ''
 })
+//函数
+const searchFn = async ()=>{
+    const reslut:any = await transportrecordList(initParam)
+    if(reslut.code==200){
+        tableData.value = reslut.data.list || []
+    }
+    console.log('搜索',reslut)
+}
+
+
+
 onMounted(async () => {
     const result1: any = await gradeName()//疫苗名称
     const result2: any = await enterpriseFun()//生产企业
@@ -130,15 +100,8 @@ const findMap = (arr: any, obj: any) => {
         return { value: obj == 'obj' ? item.id : item, label: obj == 'obj' ? item.name : item }
     })
 }
-interface ListItem {
-    value: string
-    label: string
-}
 
-const click1 = async () => { options1.value = list1.value }
-const click2 = async () => { options2.value = list2.value }
-const click3 = async () => { options3.value = list3.value }
-const click4 = async () => { options4.value = list4.value }
+
 
 
 const list1 = ref<ListItem[]>([])//疫苗名称
@@ -147,99 +110,17 @@ const list3 = ref<ListItem[]>([])//收发货单位
 const list4 = ref<ListItem[]>([])//收发货单位
 
 
-const options1 = ref<ListItem[]>([])
-const options2 = ref<ListItem[]>([])
-const options3 = ref<ListItem[]>([])
-const options4 = ref<ListItem[]>([])
 
 
 
-const remoteMethod1 = async (query: string) => {
-    if (query) {
-        loading.value = true
-        setTimeout(() => {
-            loading.value = false
-            options1.value = list1.value.filter((item: any) => {
-                return item.label.toLowerCase().includes(query.toLowerCase())
-            })
-        }, 200)
-    } else {
-        options1.value = []
-    }
-}
-const remoteMethod2 = async (query: string) => {
-    if (query) {
-        loading.value = true
-        setTimeout(() => {
-            loading.value = false
-            options2.value = list2.value.filter((item: any) => {
-                console.log('第一个', query, item)
-                return item.label.toLowerCase().includes(query.toLowerCase())
-            })
-        }, 200)
-    } else {
-        options2.value = []
-    }
-}
-const remoteMethod3 = async (query: string) => {
-    if (query) {
-        loading.value = true
-        setTimeout(() => {
-            loading.value = false
-            options3.value = list3.value.filter((item: any) => {
-                return item.label.toLowerCase().includes(query.toLowerCase())
-            })
-        }, 200)
-    } else {
-        options3.value = []
-    }
-}
-const remoteMethod4 = async (query: string) => {
-    if (query) {
-        loading.value = true
-        setTimeout(() => {
-            loading.value = false
-            options4.value = list4.value.filter((item: any) => {
-                return item.label.toLowerCase().includes(query.toLowerCase())
-            })
-        }, 200)
-    } else {
-        options3.value = []
-    }
-}
-//函数
-const showdialog = async ()=>{
-    dialogFormVisible.value = true
-    const reslut:any  = await LotNumber()
-    console.log('数据1',reslut)
-    const arrMap = reslut
-    const arr:any = []
-    arrMap.forEach((item:any)=>{
-        arr.push({ value: item, link: item})  
-    })
-    restaurants.value = arr
-    console.log('数据2',restaurants.value)
-}
-
-interface RestaurantItem {
-  value: string
-  link: string
-}
-const restaurants = ref<RestaurantItem[]>([])
-const querySearch = (queryString: string, cb: any) => {
-  const results = queryString
-    ? restaurants.value.filter(createFilter(queryString))
-    : restaurants.value
-  cb(results)
-}
 
 
 const createFilter = (queryString: string) => {
-  return (restaurant: RestaurantItem) => {
-    return (
-      restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
-    )
-  }
+    return (restaurant: RestaurantItem) => {
+        return (
+            restaurant.value.toLowerCase().indexOf(queryString.toLowerCase()) === 0
+        )
+    }
 }
 
 
@@ -247,62 +128,43 @@ const createFilter = (queryString: string) => {
 
 
 //显示运输登记
-const showdialogdialog = async ()=>{
-    dialogFormVisible1.value = true
-    const reslut:any  = await shoubat()
-    console.log('数据1',reslut)
+const showdialogdialog = async () => {
+    dialogFormVisible.value = true
+    const reslut: any = await shoubat()
+    console.log('数据1', reslut)
     const arrMap = reslut
-    const arr:any = []
-    arrMap.forEach((item:any)=>{
-        arr.push({ value: item, link: item})  
+    const arr: any = []
+    arrMap.forEach((item: any) => {
+        arr.push({ value: item, link: item })
     })
-    restaurants1.value = arr
-    console.log('数据2',restaurants1.value)
+    restaurants.value = arr
 }
-const restaurants1 = ref<RestaurantItem[]>([])
+const restaurants = ref<RestaurantItem[]>([])
 const querySearch1 = (queryString: string, cb: any) => {
-  const results = queryString
-    ? restaurants1.value.filter(createFilter(queryString))
-    : restaurants1.value
-  cb(results)
+    const results = queryString
+        ? restaurants.value.filter(createFilter(queryString))
+        : restaurants.value
+    cb(results)
 }
 
-
-const rules = reactive({
-    batchNumber: [{ required: true, message: '必填项', trigger: 'change' }],
-    enterpriseId: [{ required: true, message: '必填项', trigger: 'change' }],
-    productId: [{ required: true, message: '必填项', trigger: 'change' }],
-    specId: [{ required: true, message: '必填项', trigger: 'change' }],
-})
-const submitForm = async (formEl: FormInstance | undefined,ty:string) => {
-    if (!formEl) return
-    await formEl.validate(async (valid, fields) => {
-        if (valid) {
-            initParam.type = ty
-            const result = await inventoryExcel(initParam)
-            ty=='excel'?downloadExcelFun(result):downPDF(result)
-        } else {
-            console.log('error submit!', fields)
-        }
-    })
-}
-const rules1 = reactive({
-    date: [{ required: true, message: '必填项', trigger: 'change' }],
-    receivingUnit: [{ required: true, message: '必填项', trigger: 'change' }],
+let expinitParam:any = reactive<RuleFormdown>({
+    "stockOutIds": [],
+    "type": ''
 })
-const submitForm1 = async (formEl: FormInstance | undefined,ty:any) => {
-    if (!formEl) return
-    await formEl.validate(async (valid, fields) => {
-        if (valid) {
-            initParamWord.type = ty
-            const result:any = await transportWord(initParamWord)
-
-            console.log('result',result,ty)
-            ty=='word'?downloadExcelFun(result):downPDF(result)
-        } else {
-            console.log('error submit!', fields)
-        }
-    })
+const submitForm = async ( ty: any) => {
+    const b = Object.values(initParam).some(item => item==null || item=='')
+    console.log('b',b)
+    if(b){
+        ElMessage.error('请选择出库日期跟收货单位')
+        return
+    }else{
+        expinitParam.type = ty
+        expinitParam = {...expinitParam,...initParam}
+        const result: any = await transportWord(expinitParam)
+        console.log('result', result, ty)
+        ty == 'word' ? downloadExcelFun(result) : downPDF(result)
+    }
+    
 }
 </script>
 <style lang="scss">

+ 8 - 1
src/views/stockcontrol/storageFrom/index.vue

@@ -31,12 +31,16 @@
                         <el-option v-for="item in options3" :key="item.value" :label="item.label" :value="item.value" />
                     </el-select>
                 </el-form-item>
+                <el-form-item label="条码">
+                    <el-input v-model="initParam.qrcode" placeholder="请输入条码" clearable style="width: 200px;" />
+                </el-form-item>
             </template>
         </searchAdd>
         <bg istitle="基本信息">
             <template #btn>
                 <Labour @scanCode="scanCodeFun"></Labour>
                 <scanCode @scanCode="scanCodeFun" style="margin:0 10px;"></scanCode>
+                <Outbound></Outbound>
                 <downing></downing>
             </template>
             <template #bg>
@@ -65,6 +69,8 @@ import searchAdd from "@/components/searchAdd.vue";
 import bg from '@/components/bg.vue'
 import scanCode from './scanCode.vue'
 import Labour from './Labour.vue'
+import Outbound from './Outbound.vue'
+
 import downing from './downing.vue'
 
 
@@ -102,7 +108,8 @@ const initParam = reactive({
     "endDate": "",
     "startDate": "",
     "productId": null,
-    "receivingUnit": ""
+    "receivingUnit": "",
+    "qrcode":''
 })
 
 

+ 2 - 1
src/views/stockcontrol/storageFrom/inputSearch.vue

@@ -24,8 +24,9 @@ const data: any = reactive({
 const emit: any = defineEmits(['inputSearchData',])
 //函数
 const inputFocus = async () => {
+    console.log('获取焦点',myInput.value)
     setTimeout(() => {
-        myInput.value.focus()
+        myInput.value!=null?myInput.value.focus():''
     }, 1000)
 }
 //函数

+ 40 - 0
src/views/stockcontrol/storageFrom/js/interface.ts

@@ -0,0 +1,40 @@
+export interface tableinterface {
+    qrcode: string
+    product_name: string
+    enterprise_name: string
+    approval_number: string
+    qualification_number: string
+    spec_name: string
+    produced_date: string
+    batch_number: string
+    expiry_date: string
+    quantity: string
+    unit_name: string
+}
+
+export interface RuleForm {
+    batchNumber: any,
+    enterpriseId?: any,
+    productId?: any,
+    specId: any,
+    type: string
+}
+
+export interface RuleForm1 {
+    date: any,
+    receivingUnit?: any
+}
+export interface RuleFormdown {
+    stockOutIds?:any,
+    type: string
+}
+
+export interface ListItem {
+    value: string
+    label: string
+}
+
+export interface RestaurantItem {
+    value: string
+    link: string
+}

+ 13 - 2
src/views/stockcontrol/storageFrom/scanCode.vue

@@ -2,7 +2,7 @@
 <template>
     <div class="">
         <el-button el-button type="primary" icon="Camera" @click="showDia">扫码出库</el-button>
-        <el-dialog v-model="dialogFormVisible" title="扫码出库" :append-to-body="true" draggable :close-on-click-modal="false"
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="扫码出库" :append-to-body="true" draggable :close-on-click-modal="false"
             :close-on-press-escape="false" width="95%">
             <inputSearch ref="inputSearchRef" style="margin:0 auto 40px auto;" @inputSearchData="inputSearchfn"></inputSearch>
             <el-table :data="data.tableData" style="width: 100%" border height="450" :row-class-name="tableRowClassName">
@@ -51,7 +51,7 @@ import {
     stockunit,//收发货单位
     stockCodeOut
 } from "@/api";
-import { ElMessage } from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
 import { Delete} from '@element-plus/icons-vue'
 import { syrulesData } from "@/plugins/rulesData";
 import { timesFn } from "@/plugins/settime";
@@ -112,6 +112,7 @@ const tableRowClassName = ({rowIndex}: {
 
 let rules: any = reactive({})
 const showDia = async () => {
+    await updating()
     dialogFormVisible.value = true
     medicListStockFun()//获取入库表单
     itemPirFun()
@@ -120,6 +121,16 @@ const showDia = async () => {
         inputSearchRef.value?.inputFocus()
     })
 }
+const updating = ()=>{
+    ElMessageBox.alert('扫码出库功能更新中,请先使用手动出库', '提示', {
+    confirmButtonText: '我知道了',
+    type: 'warning',
+    draggable: true,
+    callback: () => {
+    },
+  })
+  return new Promise<void>((resolve, reject) => {}) 
+}
 //函数
 const findFun = (data: any, list: any) => {
     if (list) {

+ 1 - 1
src/views/stockcontrol/storagePut/Editinventory.vue

@@ -3,7 +3,7 @@
     <div class="">
         <el-button type="primary" @click="editFun(props.row)">编辑</el-button>
         <el-button type="danger" @click="delClick(props.row)">删除</el-button>
-        <el-dialog v-model="dialogFormVisible" title="编辑" :append-to-body="true" draggable width="60%">
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="编辑" :append-to-body="true" draggable width="60%">
             <el-form ref="ruleFormRef" :rules="rules" :model="initParam" :inline="true">
                 <el-divider content-position="center">药品信息</el-divider>
                 <el-form-item :label="item.name" :label-width="formLabelWidth" v-for="(item,index) in data.showDiaData" :key="index" :prop="'medicineInfo.'+item.field_name">

+ 7 - 3
src/views/stockcontrol/storagePut/Labour.vue

@@ -2,7 +2,7 @@
 <template>
     <div class="">
         <el-button el-button type="primary" icon="Pointer" @click="showDia">手动入库</el-button>
-        <el-dialog v-model="dialogFormVisible" title="手动入库" :append-to-body="true" :before-close="closeFun" draggable
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="手动入库" :append-to-body="true" :before-close="closeFun" draggable
             :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
             <el-form ref="ruleFormRef" :rules="rules" :model="initParam" :inline="true">
                 <el-divider content-position="center">药品信息</el-divider>
@@ -51,7 +51,7 @@
                     <el-button type="danger" @click="resetForm(ruleFormRef)">重置数据</el-button>
                 </span>
             </template>
-            <el-dialog v-model="innerVisible" title="入库数据" width="95%" append-to-body draggable
+            <el-dialog :destroy-on-close="true" v-model="innerVisible" title="入库数据" width="95%" append-to-body draggable
                 :close-on-click-modal="false" :close-on-press-escape="false">
                 <el-table :data="data.tableData" style="width: 100%" border max-height="450"
                     :header-cell-style="{ 'background-color': '#ccc', 'color': 'white' }">
@@ -157,7 +157,11 @@ let data: any = reactive({
 const emit: any = defineEmits(['scanCode'])
 //立即入库
 const subStock = async () => {
-    const reslut: any = await stockTemplateBatchIn({ "stockInList": data.tableData })
+    let arr = [...data.tableData]
+    arr.forEach(item=>{
+        item.unitPrice = Number(item.unitPrice)
+    })
+    const reslut: any = await stockTemplateBatchIn({ "stockInList": arr })
     console.log('返回', reslut)
     if (reslut.code == 200 && reslut.msg == '入库成功') {
         ElMessage.success(reslut.msg)

+ 5 - 1
src/views/stockcontrol/storagePut/index.vue

@@ -31,6 +31,9 @@
                         <el-option v-for="item in options3" :key="item.value" :label="item.label" :value="item.value" />
                     </el-select>
                 </el-form-item>
+                <el-form-item label="条码">
+                    <el-input v-model="initParam.qrcode" placeholder="请输入条码" clearable style="width: 200px;" />
+                </el-form-item>
             </template>
         </searchAdd>
         <bg istitle="基本信息">
@@ -99,7 +102,8 @@ const initParam = reactive({
     "endDate": "",
     "startDate": "",
     "productId": null,
-    "forwardingUnit": ""
+    "forwardingUnit": "",
+    'qrcode':''
 })
 const data:any = reactive({
     datepick:[]

+ 1 - 2
src/views/stockcontrol/storagePut/inputSearch.vue

@@ -31,8 +31,7 @@ const emit: any = defineEmits(['inputSearchData',])
 //函数
 const inputFocus = async () => {
     setTimeout(() => {
-        console.log('myInputmyInputmyInput',myInput)
-        myInput.value.focus()
+       myInput.value!=null?myInput.value.focus():''
     }, 1000)
 }
 //函数

+ 14 - 5
src/views/stockcontrol/storagePut/scanCode.vue

@@ -2,7 +2,7 @@
 <template>
     <div class="">
         <el-button el-button type="primary" icon="Camera" @click="showDia">扫码入库</el-button>
-        <el-dialog v-model="dialogFormVisible" title="扫码入库" :append-to-body="true" draggable :close-on-click-modal="false"
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="扫码入库" :append-to-body="true" draggable :close-on-click-modal="false"
             :close-on-press-escape="false" width="95%">
             <inputSearch ref="inputSearchRef" style="margin:0 auto 40px auto;" @inputSearchData="inputSearchfn"></inputSearch>
             <el-table :data="data.tableData" style="width: 100%" border height="450" :row-class-name="tableRowClassName">
@@ -54,10 +54,9 @@ import {
     stockunit,//收发货单位
     stockCodein
 } from "@/api";
-import { ElMessage } from 'element-plus'
+import { ElMessage, ElMessageBox } from 'element-plus'
 import { Delete} from '@element-plus/icons-vue'
 import { syrulesData } from "@/plugins/rulesData";
-
 import {
     medicListScanCode,
     medicMsfx
@@ -115,6 +114,7 @@ const tableRowClassName = ({rowIndex}: {
 
 let rules: any = reactive({})
 const showDia = async () => {
+    await updating()
     dialogFormVisible.value = true
     medicListStockFun()//获取入库表单
     itemPirFun()
@@ -123,6 +123,16 @@ const showDia = async () => {
         inputSearchRef.value?.inputFocus()
     })
 }
+const updating = ()=>{
+    ElMessageBox.alert('扫码入库功能更新中,请先使用手动入库', '提示', {
+    confirmButtonText: '我知道了',
+    type: 'warning',
+    draggable: true,
+    callback: () => {
+    },
+  })
+  return new Promise<void>((resolve, reject) => {}) 
+}
 //函数
 const findFun = (data: any, list: any) => {
     if (list) {
@@ -176,20 +186,19 @@ const subStock = async ()=>{
  * @param e 追溯码
  */
 const inputSearchfn = async (e:any)=>{
+    console.log('扫码了',e)
     data.qr = e
     const j = await SearchFind(e)
     if (j) {ElMessage.error('提示:重复扫描添加数据了哦');return}
     const reslut:any = await medicMsfx({code:e})
     let initParamObj = {...initParam}
     initParamObj.Qrcode = e
-    console.log('扫描出',reslut)
     if (reslut.code==200 && reslut.msg=='查询成功') {
         initParamObj.medicineInfo = reslut.data[0] || {}
         if(reslut.data[0].quantity!=undefined){
             initParamObj.quantity = reslut.data[0].quantity
         }
         initParamObj.date = timesFn()
-        console.log('initParamObj',initParamObj)
         data.tableData.push(initParamObj)
         inputSearchRef.value?.inputFocus()
     }

+ 23 - 3
src/views/stockcontrol/storagePut/transportScanCode.vue

@@ -2,7 +2,7 @@
 <template>
     <div class="">
         <el-button el-button type="primary" icon="Camera" @click="showDia">运输单条码入库</el-button>
-        <el-dialog v-model="dialogFormVisible" title="扫描运输条码入库" :append-to-body="true" draggable :close-on-click-modal="false"
+        <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="扫描运输条码入库" :append-to-body="true" draggable :close-on-click-modal="false"
             :close-on-press-escape="false" width="95%">
             <inputSearch ref="inputSearchRef" placeholderData="请扫描运输条码" style="margin:0 auto 40px auto;" @inputSearchData="inputSearchfn"></inputSearch>
             <el-table :data="data.tableData" style="width: 100%" border height="450" row-class-name="success-row">
@@ -13,6 +13,11 @@
                 </el-table-column>
                 <el-table-column :label="item.label" min-width="150" v-for="item,index in TranscanCodeTable" :key="index"
                 :fixed="item.prop == 'operation'&&'right'">
+                    <template v-slot:header="scope">  
+                        <div @dblclick="dbclicklable(item)">  
+                            {{item.label}}  
+                        </div>  
+                    </template>   
                     <template #default="scope">
                         <el-input v-if="['quantity','unit_price'].includes(item.prop)" v-model="scope.row[item.prop]" style="width: 100px;"/>
                         <el-autocomplete v-if="item.prop == 'operator'" v-model="scope.row[item.prop]"
@@ -72,6 +77,22 @@ let data: any = reactive({
     qr:''
 })
 
+const dbclicklable = (item:any)=>{
+    if(['发货单位','经办人'].includes(item.label)){
+        if(data.tableData.length!=0){
+            if(data.tableData[0][item.prop]==''){
+                ElMessage.error('请填写第一项,在双击全部填充')
+                return
+            }
+            data.tableData.forEach((obj:any)=>{
+                obj[item.prop] = data.tableData[0][item.prop]
+            })
+        }else{
+            ElMessage.error('请先扫描在进行批量填充')
+            return
+        }
+    }
+}
 
 let rules: any = reactive({})
 const showDia = async () => {
@@ -137,8 +158,7 @@ const inputSearchfn = async (e:any)=>{
     data.qr = e
     const reslut:any = await medicTransport({code:e})
     if (reslut.code==200 && reslut.msg=='查询成功') {
-        console.log('reslut.data',reslut.data)
-        let arr = [... reslut.data] || []
+        let arr = reslut.data || []
         arr.forEach((item:any)=>{ item.date = timesFn()})
         data.tableData = [...arr]
     }

+ 2 - 2
src/views/stockcontrol/transmitReceive/downing.vue

@@ -1,7 +1,7 @@
 <template> 
     <el-button el-button type="primary" icon="Download" @click="showdialog">收发登记表</el-button>
     <el-button el-button type="primary" icon="Download" @click="showdialogdialog">运输登记表</el-button>
-    <el-dialog v-model="dialogFormVisible" title="收发登记表" :append-to-body="true" draggable width="30%">
+    <el-dialog :destroy-on-close="true" v-model="dialogFormVisible" title="收发登记表" :append-to-body="true" draggable width="30%">
         <el-form :model="initParam" ref="ruleFormRef" :rules="rules">
             <el-form-item label="品名" :label-width="formLabelWidth" prop="productId">
                 <el-select v-model.number="initParam.productId" filterable remote reserve-keyword placeholder="品名"
@@ -40,7 +40,7 @@
             </span>
         </template>
     </el-dialog>
-    <el-dialog v-model="dialogFormVisible1" title="运输登记表" :append-to-body="true" draggable width="30%">
+    <el-dialog :destroy-on-close="true" v-model="dialogFormVisible1" title="运输登记表" :append-to-body="true" draggable width="30%">
         <el-form :model="initParamWord" ref="ruleFormRef1" :rules="rules1">
             <el-form-item label="出库日期" :label-width="formLabelWidth" prop="date">
                 <el-date-picker v-model="initParamWord.date" type="date" value-format="YYYY-MM-DD" clearable

+ 4 - 4
src/views/stockcontrol/transmitReceive/index.vue

@@ -35,7 +35,7 @@
                 <downing></downing>
             </template>
             <template #bg>
-                <el-table ref="multipleTableRef" :data="data.tableData" style="width: 100%"
+                <el-table ref="multipleTableRef" :data="data.tableData" border style="width: 100%" max-height="450"
                     @selection-change="handleSelectionChange" :row-key="(row: any) => { return row.id }">
                     <template v-for="(item, i) in columns" :key="i">
                         <el-table-column :type="item.type" width="55" v-if="item.type" :reserve-selection="true"
@@ -52,7 +52,7 @@
                 </el-table>
                 <div style="margin-top: 20px;">
                     <el-pagination v-model:current-page="initParam.page" v-model:page-size="initParam.pageSize"
-                    layout="prev, pager, next" :total="data.total" @current-change="handleCurrentChange" />
+                    layout="total, sizes, prev, pager, next, jumper" :total="data.total" @size-change="userListApi()" @current-change="handleCurrentChange" />
                 </div>
             </template>
         </bg>
@@ -115,12 +115,12 @@ const changFun = async (e:any)=>{
 const columns: any = [
     { type: 'selection', width: '60px', fixed: 'left' },
     { prop: 'product_name', label: '血液制品名称', width: '120px' },
-    { prop: 'enterprise_name', label: '生产企业', width: '120px' },
+    { prop: 'enterprise_name', label: '生产企业',},
     { prop: 'approval_number', label: '批准文号', width: '120px' },
     { prop: 'batch_number', label: '血液制品批号', width: 120 },
     { prop: 'expiry_date', label: '失效日期', width: 120 },
     { prop: 'total_in', label: '收入数量', width: 100 },
-    { prop: 'total_out', label: '发出数量', width: 80 },
+    { prop: 'total_out', label: '发出数量', width: 85 },
     { prop: 'balance', label: '结余数量', width: 100 },
     { prop: 'unit_name', label: '单位', width: 80 },
     { prop: 'dosage_form_name', label: '剂型', width: 100 },

BIN
出入库管理系统.rar


+ 0 - 0
出入库管理系统/css/605.2b0d00a5.css → 出入库管理系统/css/193.2f535045.css


+ 0 - 0
出入库管理系统/css/674.2f535045.css → 出入库管理系统/css/366.2b0d00a5.css


+ 0 - 0
出入库管理系统/css/357.4b5d2e9a.css → 出入库管理系统/css/684.4b5d2e9a.css


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/css/79.cdc6182a.css


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/css/877.2b0d00a5.css


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/css/app.72159cba.css


+ 1 - 1
出入库管理系统/index.html

@@ -83,4 +83,4 @@
       100% {
         transform: rotateZ(360deg) rotateX(66deg) rotateZ(360deg);
       }
-    }</style><script defer="defer" src="/js/chunk-vendors.eac145c3.js"></script><script defer="defer" src="/js/app.6ed78eac.js"></script><link href="/css/chunk-vendors.c5343724.css" rel="stylesheet"><link href="/css/app.fa206cd9.css" rel="stylesheet"><!--[if IE]><link rel="icon" type="image/svg+xml" href="/img/icons/favicon.svg"><![endif]--><link rel="icon" type="image/png" sizes="32x32" href="/./favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="/./favicon.ico"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#4DBA87"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="baozhidao-putoutstorage"><link rel="apple-touch-icon" href="/./favicon.ico"><link rel="mask-icon" href="/./favicon.ico" color="#4DBA87"><meta name="msapplication-TileImage" content="/./favicon.ico"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but baozhidao-putoutstorage doesn't work properly without JavaScript enabled.Please enable it to continue.</strong></noscript><div id="app"><div class="loadingSpinn"><div class="atom-spinner"><div class="spinner-inner"><div class="spinner-line"></div><div class="spinner-line"></div><div class="spinner-line"></div><div class="spinner-circle">&#9679;</div></div></div></div></div></body></html>
+    }</style><script defer="defer" src="/js/chunk-vendors.eac145c3.js"></script><script defer="defer" src="/js/app.50e44388.js"></script><link href="/css/chunk-vendors.c5343724.css" rel="stylesheet"><link href="/css/app.72159cba.css" rel="stylesheet"><!--[if IE]><link rel="icon" type="image/svg+xml" href="/img/icons/favicon.svg"><![endif]--><link rel="icon" type="image/png" sizes="32x32" href="/./favicon.ico"><link rel="icon" type="image/png" sizes="16x16" href="/./favicon.ico"><link rel="manifest" href="/manifest.json"><meta name="theme-color" content="#4DBA87"><meta name="apple-mobile-web-app-capable" content="no"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="apple-mobile-web-app-title" content="baozhidao-putoutstorage"><link rel="apple-touch-icon" href="/./favicon.ico"><link rel="mask-icon" href="/./favicon.ico" color="#4DBA87"><meta name="msapplication-TileImage" content="/./favicon.ico"><meta name="msapplication-TileColor" content="#000000"></head><body><noscript><strong>We're sorry but baozhidao-putoutstorage doesn't work properly without JavaScript enabled.Please enable it to continue.</strong></noscript><div id="app"><div class="loadingSpinn"><div class="atom-spinner"><div class="spinner-inner"><div class="spinner-line"></div><div class="spinner-line"></div><div class="spinner-line"></div><div class="spinner-circle">&#9679;</div></div></div></div></div></body></html>

File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/134.49129ba1.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/134.49129ba1.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/134.79d902b2.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/134.79d902b2.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/179.05fdfd25.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/179.05fdfd25.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/179.f5b7b03d.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/179.f5b7b03d.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/193.28f4566f.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/193.28f4566f.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/219.8997cfec.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/219.8997cfec.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/253.2e54f253.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/253.2e54f253.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/253.94c75931.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/253.94c75931.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/264.4b05b936.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/264.4b05b936.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/264.7ddb9f74.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/264.7ddb9f74.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/33.e42ea9ae.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/33.e42ea9ae.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/357.b7381f47.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/357.b7381f47.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/366.bae3d234.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/366.bae3d234.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/401.91f77812.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/401.91f77812.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/401.a34dc089.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/401.a34dc089.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/422.97afcb33.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/422.97afcb33.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/422.fc41c509.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/422.fc41c509.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/605.b261a02e.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/605.b261a02e.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/670.75af8c98.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/670.75af8c98.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/670.b9c22b4c.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/670.b9c22b4c.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/674.084146e3.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/674.084146e3.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/684.761b972b.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/684.761b972b.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/79.615eaf5e.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/79.615eaf5e.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/877.23415a72.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/877.23415a72.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/894.412012ab.js


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/894.412012ab.js.map


File diff suppressed because it is too large
+ 0 - 0
出入库管理系统/js/894.cd3b3575.js


Some files were not shown because too many files changed in this diff