YangJian0701 1 year ago
parent
commit
6fb28d9bf5

+ 2 - 1
package.json

@@ -21,7 +21,8 @@
     "vue-class-component": "^8.0.0-0",
     "vue-router": "^4.0.3",
     "vuex": "^4.0.0",
-    "vuex-persistedstate": "^4.1.0"
+    "vuex-persistedstate": "^4.1.0",
+    "xlsx": "^0.18.5"
   },
   "devDependencies": {
     "@types/aos": "^3.0.7",

+ 2 - 0
src/api/index.ts

@@ -8,6 +8,8 @@ export * from './module/storageOrderGoods'
 export * from './module/essentialinfo'
 export * from './module/transmitReceive'
 export * from './module/storagePut'
+export * from './module/storageFrom'
+
 
 
 

+ 27 - 0
src/api/module/storageFrom.ts

@@ -0,0 +1,27 @@
+
+import $http from '@/utils/index'
+
+/**
+ * 入库列表
+ * @param params 
+ * @returns 
+ */
+export const stockOutList = (params: any) => $http.post('/stock-template/out/list', params)
+
+
+/**
+ * 单个入库
+ * @param params 
+ * @returns 
+ */
+export const stockTemplateOut = (params: any) => $http.post('/stock-template/out', params)
+
+/**
+ * 批量入库
+ * @param params 
+ * @returns 
+ */
+export const stockTemplateBatchOut = (params: any) => $http.post('/stock-template/batch-out', params)
+
+
+export const medicListStockOut = (params: any) => $http.post('/medicine-template/list-for-stock-out', params)

+ 1 - 1
src/api/module/storageOrderGoods.ts

@@ -4,7 +4,7 @@ import $http from '@/utils/index'
 
 
 // 销售订单-列表
-export const orderList = (params: any) => $http.post('/sales/order_list', params)
+export const orderList = (params: any) => $http.post('/sales/order-list', params)
 
 
 

+ 13 - 0
src/api/module/storagePut.ts

@@ -11,6 +11,19 @@ export const stockInList = (params: any) => $http.post('/stock-template/in/list'
 //表头
 export const medicineColumns = (params: any) => $http.post('/medicine-template/columns', params)
 
+/**
+ * 单个入库
+ * @param params 
+ * @returns 
+ */
+export const stockTemplateIn = (params: any) => $http.post('/stock-template/in', params)
+
+/**
+ * 批量入库
+ * @param params 
+ * @returns 
+ */
+export const stockTemplateBatchIn = (params: any) => $http.post('/stock-template/batch-in', params)
 
 
 

+ 2 - 0
src/main.ts

@@ -6,6 +6,8 @@ import store from './store'
 const app = createApp(App)
 
 
+
+
 import 'element-plus/theme-chalk/index.css'  // 引入组件样式
 import ElementPlus from 'element-plus'
 

+ 16 - 6
src/plugins/rulesData.ts

@@ -16,10 +16,20 @@ export const syrulesData = {
     }]
 }
 
-export const columnsTable = [
-    { prop: 'quantity', label: '数量', width: 200 },    
-    { prop: 'unitPrice', label: '购进单价', width: 200 },
-    { prop: 'forwardingUnit', label: '发货单位', width: 200 },    
-    { prop: 'date', label: '入库日期', width: 200 },
-    { prop: 'operator', label: '经办人', width: 200 },    
+//入库
+export let columnsTable = [
+    { prop: 'quantity', label: '数量', width: 0 },
+    { prop: 'unitPrice', label: '购进单价', width: 0 },
+    { prop: 'operator', label: '经办人', width: 0 },
+    { prop: 'forwardingUnit', label: '发货单位', width: 0 },
+    { prop: 'date', label: '入库日期', width: 0 },
+]
+//出库
+export let columnsTableOut = [
+    { label: '数量', prop: 'quantity', width: 0 },
+    { label: '销售单价', prop: 'unitPrice', width: 0 },
+    { label: '经办人', prop: 'operator', width: 0 },
+    { label: '收货单位', prop: 'receivingUnit', width: 0 },
+    { label: '出库日期', prop: 'date', width: 0 },
+
 ]

+ 2 - 2
src/views/essentialinfo/index.vue

@@ -15,12 +15,12 @@
             </bgPure>
             <bgPure>
                 <template #bg>
-                    <statistics :imgUrl="require('@/assets/img/1700227167756.jpg')" titles="疫苗名称" :subhea="data.basicObj.productCount.toString()">
+                    <statistics :imgUrl="require('@/assets/img/1700228181332.jpg')" titles="疫苗名称" :subhea="data.basicObj.productCount.toString()">
                     </statistics>
                 </template>
             </bgPure>
             <bgPure #bg>
-                <statistics :imgUrl="require('@/assets/img/1700227576514.jpg')" titles="生产企业" :subhea="data.basicObj.enterpriseCount.toString()"></statistics>
+                <statistics :imgUrl="require('@/assets/img/1700228207945.jpg')" titles="生产企业" :subhea="data.basicObj.enterpriseCount.toString()"></statistics>
             </bgPure>
             <bgPure #bg>
                 <statistics :imgUrl="require('@/assets/img/1700228167058.jpg')" titles="药品信息管理" :subhea="data.basicObj.medicineTemplateCount.toString()"></statistics>

+ 2 - 7
src/views/home/index.vue

@@ -2,16 +2,11 @@
 <template>
   <div class="home">
     <div class="home-main">
-      <bgPure>
-        <template #bg>
-          <statistics :imgUrl="require('@/assets/img/1700227167756.jpg')" titles="药品信息管理" subhea="2154"></statistics>
-        </template>
-      </bgPure>
       <bgPure #bg>
-        <statistics :imgUrl="require('@/assets/img/1700227576514.jpg')" titles="疫苗名称" subhea="87546"></statistics>
+        <statistics :imgUrl="require('@/assets/img/1700227576514.jpg')" titles="库存总额" subhea="87546"></statistics>
       </bgPure>
       <bgPure #bg>
-        <statistics :imgUrl="require('@/assets/img/1700228167058.jpg')" titles="生产企业" subhea="931"></statistics>
+        <statistics :imgUrl="require('@/assets/img/1700228167058.jpg')" titles="库存总量" subhea="931"></statistics>
       </bgPure>
     </div>
     <cards>

+ 4 - 0
src/views/layout/routerMenu.vue

@@ -67,6 +67,10 @@ const setTag = (data: any) => {
 </script>
 
 <style scoped lang="scss">
+.el-menu-item-group>.el-menu-item-group__title{
+  display: none !important;
+  padding: 0 !important;
+}
 .routerMenu {
   height: 100%;
   overflow-y: auto;

+ 2 - 2
src/views/salesmanagement/sellManage/index.vue

@@ -14,7 +14,7 @@
                 </el-form-item>
                 <el-form-item label="购货单位">
                     <el-select v-model="data.initParam.receivingUnit" filterable remote reserve-keyword placeholder="购货单位"
-                        :remote-method="remoteMethod" :loading="loading">
+                        :remote-method="remoteMethod" :loading="loading" @click="click2" clearable style="width: 200px;">
                         <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
                     </el-select>
                 </el-form-item>
@@ -48,7 +48,7 @@ interface ListItem {
 }
 const list = ref<ListItem[]>([])
 const options = ref<ListItem[]>([])
-
+    const click2 = async ()=>{options.value = list.value }
 onMounted(async() => {
     prodListApi()
     const result:any = await stockunit({type:2,name:''})

+ 65 - 2
src/views/salesmanagement/storageOrderGoods/down.vue

@@ -1,6 +1,8 @@
 <!--  -->
 <template>
     <div class="">
+        <div id="printable">
+        </div>
         <el-button round type="primary" :icon="Download" @click="dialogFormVisible = true">导出打印</el-button>
         <el-dialog v-model="dialogFormVisible" title="导出打印" :append-to-body="true" draggable width="30%">
             <el-form :model="form">
@@ -26,8 +28,8 @@
             <template #footer>
                 <span class="dialog-footer">
                     <el-button @click="dialogFormVisible = false">Cancel</el-button>
-                    <el-button type="primary" @click="dialogFormVisible = false">
-                        Confirm
+                    <el-button type="primary" @click="printFun">
+                        打印
                     </el-button>
                 </span>
             </template>
@@ -36,7 +38,9 @@
 </template>
 
 <script lang="ts" setup>
+import * as XLSX from 'xlsx'
 import { Download } from '@element-plus/icons-vue'
+import { getContentExportApi, downloadExcelFun } from "@/utils/download";
 import { reactive, ref } from 'vue'
 const dialogFormVisible = ref(false)
 const formLabelWidth = '60px'
@@ -50,6 +54,65 @@ const form = reactive({
     resource: '',
     desc: '',
 })
+
+const data = reactive({
+    imgUrl: ''
+})
+//函数
+const printFun = async () => {
+    getContentExportApi({}).then((res) => {
+        const result: any = res
+        // 实例化 FileReader 对象
+        const reader = new FileReader()
+        // file为文件流
+        reader.readAsBinaryString(result)
+        
+        reader.onload = function () {
+            const binaryStringData = reader.result
+            
+            let printableContent:any = document.getElementById('printable')?.innerHTML;
+            printableContent = binaryStringData
+            let printWindow: any = window.open('', '_blank');
+
+            printWindow.document.write('<html><head><title>打印内容</title></head><body>' + printableContent + '</body></html>');
+      
+            printWindow.document.close();
+            printWindow.print();
+        }
+
+
+        return
+        const blob = new Blob([result], { type:result.type});
+        console.log(blob);
+        let src = window.URL.createObjectURL(blob);
+        console.log(src);
+
+        // const blob = new Blob([result], { type: "application/octet-stream" });
+        // data.imgUrl = URL.createObjectURL(blob);
+
+        let printWindow: any = window.open('', '_blank');
+
+        printWindow.document.write(`<html><head><title>打印123</title></head><body><img :src="${src}"/></body></html>`);
+        // // 执行打印操作
+        printWindow.document.close();
+        printWindow.print();
+    }).catch((error) => {
+        console.log('err', error.toString())
+    });
+    // 获取待打印的内容
+
+    // 创建一个新的窗口并加载打印内容
+
+
+
+
+    // 如果内容中有图片或其他需要一定时间加载的,请使用注释中的延时打印
+    // setTimeout(() => {
+    //   printWindow.print()
+    // }, 200)
+    // printWindow.print();
+
+}
 </script>
 <style lang="scss">
 /* @import url(); 引入css类 */

+ 2 - 2
src/views/salesmanagement/storageOrderGoods/index.vue

@@ -8,7 +8,7 @@
                 </el-form-item>
                 <el-form-item label="购货单位">
                     <el-select v-model="data.initParam.receivingUnit" filterable remote reserve-keyword placeholder="购货单位"
-                        :remote-method="remoteMethod" :loading="loading" clearable style="width: 200px;">
+                        :remote-method="remoteMethod" :loading="loading" clearable style="width: 200px;" @click="click2">
                         <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value" />
                     </el-select>
                 </el-form-item>
@@ -43,7 +43,7 @@ interface ListItem {
 }
 const list = ref<ListItem[]>([])
 const options = ref<ListItem[]>([])
-
+const click2 = async ()=>{options.value = list.value }
 onMounted(async() => {
     const result:any = await stockunit({type:2,name:''})
     list.value = result.data.list.map((item:any) => {

+ 173 - 31
src/views/stockcontrol/storageFrom/index.vue

@@ -1,48 +1,190 @@
 <!--  -->
 <template>
-    <div class="storageFrom">
-        <el-result title="扫码添加" sub-title="扫条形码,可以自动识别填写信息哦">
-            <template #icon>
-                <el-image :src="srcimg" style="width: 300px;height: auto;"/>
+    <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>
             </template>
-            <template #extra>
-                <el-button type="primary">扫码添加</el-button>
+        </searchAdd>
+        <bg istitle="基本信息">
+            <template #btn>
+                <scanCode style="margin-right: 20px;" @scanCode="scanCodeFun"></scanCode>
+                <!-- <Labour></Labour> -->
             </template>
-        </el-result>
-        <el-result title="手动添加" sub-title="手动填写信息">
-            <template #icon>
-                <el-image :src="srcimg1" style="width: 300px;height: auto;"/>
+            <template #bg>
+                <tables ref="TableRef" :requestApi="stockOutList" :columns="columns" :initParam="initParam">
+                </tables>
             </template>
-            <template #extra>
-                <el-button type="primary">手动添加</el-button>
-            </template>
-        </el-result>
-        <el-result title="查看入库" sub-title="管理入库信息,查看入库情况">
-            <template #icon>
-                <el-image :src="srcimg2" style="width: 300px;height: auto;"/>
-            </template>
-            <template #extra>
-                <el-button type="primary">查看出库数据</el-button>
-            </template>
-        </el-result>
+        </bg>
     </div>
 </template>
 
 <script setup lang="ts">
-const srcimg:any = require('@/assets/img/down21.webp')
-const srcimg1:any = require('@/assets/img/down23.webp')
-const srcimg2:any = require('@/assets/img/down22.webp')
+import { 
+    stockOutList,
+    productList,//疫苗名称
+    enterpriseList,//生产企业
+    stockunit,//收发货单位
+    medicineColumns,//表头
+} from "@/api";
+import { reactive, ref,onMounted } from "vue";
+import tables from "@/components/table.vue";
+import searchAdd from "@/components/searchAdd.vue";
+import bg from '@/components/bg.vue'
+import scanCode from './scanCode.vue'
+const TableRef = ref()
+import { columnsTableOut } from "@/plugins/rulesData";
+//函数
+const scanCodeFun = async ()=>{
+    console.log('添加完成')
+    TableRef.value?.getTableList()
+}
+
+const columns:any = []
+//提交参数
+const initParam = reactive({
+    "batchNumber": "",
+    "enterpriseId": null,
+    "endDate": "",
+    "startDate": "",
+    "productId": null,
+    "receivingUnit": ""
+})
+
+
+const data = 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({})
+     let obj = [...r.data.list]
+     TableRef.value.tableColumns = [...obj,...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">
-.storageFrom {
+.storagePut {
     user-select: none;
-    display: flex;
-    gap: 20px;
-    justify-content: center;
-    align-items: center;
-    height: 100%;
+}
+.el-form-item {
+    // margin-bottom: 0;
 }
 </style>

+ 289 - 0
src/views/stockcontrol/storageFrom/scanCode.vue

@@ -0,0 +1,289 @@
+<!-- 扫码 -->
+<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" :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" @blur="initParam.medicineInfo[item.field_name] = Number(initParam.medicineInfo[item.field_name]).toFixed(2)" 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-select v-model="initParam.forwardingUnit" placeholder="请选择发货单位" class="inputWidth">
+                        <el-option :value="it" v-for="it,j in data.itemPir" :key="j" />
+                    </el-select>
+                </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-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 } 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 ruleFormRef = ref<FormInstance>()
+
+let rules:any = reactive({})
+
+import { 
+    medicListStockOut,
+    stockunit,//发货单位
+    operatorList,//经办人
+    stockTemplateIn,//单个出库
+    stockTemplateBatchOut,//批量出库
+} 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'])
+//立即出库
+const subStock = async ()=>{
+    const reslut:any = await stockTemplateBatchOut({"stockInList": data.tableData})
+    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:parseInt(unitPrice),medicineInfo:{...medicineInfo}})
+            console.log('编辑状态',data.tableData)
+        }else{//正常添加
+            let {date,forwardingUnit,operator,quantity,unitPrice,medicineInfo} = initParam
+            data.tableData.push({date,forwardingUnit,operator,quantity,unitPrice:parseInt(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 })
+    data.itemPir = reslut.data.list
+}
+//经办人Api
+const operatorListApi = async()=>{
+    const reslut:any = await operatorList({})
+    data.itemOpen = reslut.data.list
+}
+
+
+//函数
+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'},{ 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',}]
+                }
+            }
+        });
+        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>

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

@@ -25,8 +25,8 @@
                         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="发单位"
+                <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>
@@ -35,7 +35,7 @@
         </searchAdd>
         <bg istitle="基本信息">
             <template #btn>
-                <scanCode style="margin-right: 20px;"></scanCode>
+                <scanCode style="margin-right: 20px;" @scanCode="scanCodeFun"></scanCode>
                 <!-- <Labour></Labour> -->
             </template>
             <template #bg>
@@ -60,6 +60,12 @@ import searchAdd from "@/components/searchAdd.vue";
 import bg from '@/components/bg.vue'
 import scanCode from './scanCode.vue'
 const TableRef = ref()
+import { syrulesData,columnsTable } from "@/plugins/rulesData";
+//函数
+const scanCodeFun = async ()=>{
+    console.log('添加完成')
+    TableRef.value?.getTableList()
+}
 
 const columns:any = []
 //提交参数
@@ -93,10 +99,13 @@ const click3 = async ()=>{options3.value = list3.value}
 // 渲染表格
 onMounted(async () => {
      const r:any = await medicineColumns({})
-     TableRef.value.tableColumns = r.data.list
+     
+     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: 3 })//收发货单位
+    const result3: any = await stockunit({ type: 1 })//收发货单位
 
 
     list1.value = findMap(result1.data.list, 'obj')

+ 43 - 23
src/views/stockcontrol/storagePut/scanCode.vue

@@ -17,7 +17,7 @@
                 </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="initParam.quantity" autocomplete="off" class="inputWidth" />
+                    <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" />
@@ -45,16 +45,16 @@
             </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">
+                    <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="数量"/>
-                    <el-table-column prop="unitPrice" label="购进单价"/>
-                    <el-table-column prop="forwardingUnit" label="发货单位" />
-                    <el-table-column prop="date" label="入库日期"/>
-                    <el-table-column prop="operator" label="经办人"/>
+                    <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">
@@ -66,7 +66,7 @@
                 <template #footer>
                     <span class="dialog-footer">
                         <el-button @click="innerVisible = false">关闭</el-button>
-                        <el-button type="primary" @click="innerVisible = true">立即入库</el-button>
+                        <el-button type="primary" @click="subStock">立即入库</el-button>
                     </span>
                 </template>
             </el-dialog>
@@ -88,6 +88,8 @@ import {
     medicListStock,
     stockunit,//发货单位
     operatorList,//经办人
+    stockTemplateIn,//单个入库
+    stockTemplateBatchIn,//批量入库
 } from "@/api";
 const innerVisible = ref(false)
 import { ElMessage, ElMessageBox } from 'element-plus'
@@ -112,6 +114,21 @@ let data:any = reactive({
     editStrot:false,
     editIndex:null
 }) 
+const emit:any = defineEmits(['scanCode'])
+//立即入库
+const subStock = async ()=>{
+    const reslut:any = await stockTemplateBatchIn({"stockInList": data.tableData})
+    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){
@@ -139,11 +156,11 @@ const submitForm = async (formEl: FormInstance | undefined) => {
         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,medicineInfo:{...medicineInfo}})
+            data.tableData.splice(data.editIndex,1,{date,forwardingUnit,operator,quantity,unitPrice:parseInt(unitPrice),medicineInfo:{...medicineInfo}})
             console.log('编辑状态',data.tableData)
         }else{//正常添加
             let {date,forwardingUnit,operator,quantity,unitPrice,medicineInfo} = initParam
-            data.tableData.push({date,forwardingUnit,operator,quantity,unitPrice,medicineInfo:{...medicineInfo}})
+            data.tableData.push({date,forwardingUnit,operator,quantity,unitPrice:parseInt(unitPrice),medicineInfo:{...medicineInfo}})
             console.log('正常添加',data.tableData)
         }
     } else {
@@ -154,18 +171,23 @@ const submitForm = async (formEl: FormInstance | undefined) => {
 
 //函数
 const closeFun = async () => {
-    ElMessageBox.confirm('请检查录入数据是否已经提交,该操作将放弃录入信息,是否放弃?', '提示', {
-        confirmButtonText: '立即去入库',
-        cancelButtonText: '放弃数据',
-        type: 'warning',
-        draggable: true,
-        center: true,
-    }).then(() => {
-        innerVisible.value = true
-    }).catch(() => {
+    if(data.tableData.length==0){
         dialogFormVisible.value = false
-        ElMessage.success('放弃')
-    })
+        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()=>{
@@ -257,8 +279,6 @@ const delClick = (index:any) => {
         data.tableData.splice(index, 1);
       ElMessage.success('已删除')
     })
-      
-//   window.print() //打印
 }
 
 </script>

+ 5 - 2
src/views/stockcontrol/transmitReceive/index.vue

@@ -33,7 +33,7 @@
         <bg istitle="基本信息">
             <template #btn>
                 <el-button el-button type="primary" icon="Download">导出</el-button>
-                <el-button el-button type="primary" icon="Tickets">打印</el-button>
+                <el-button el-button type="primary" icon="Tickets" @click="printFun">打印</el-button>
             </template>
             <template #bg>
                 <el-table ref="multipleTableRef" :data="data.tableData" style="width: 100%"
@@ -135,7 +135,10 @@ const userListApi = async () => {
     data.total = result.data.count
 }
 userListApi()
-
+//函数
+const printFun = async ()=>{
+    window.print() //打印
+}
 interface User {
     date: string
     name: string