From 0daf7e406663eb3a99c2122773f5c3297b8c1253 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期二, 13 八月 2024 17:38:31 +0800
Subject: [PATCH] 提交

---
 src/views/hazardousChemicals/warehouseManage/components/productTable.vue           |  186 ++++
 src/views/hazardousChemicals/accessRecords/index.vue                               |   38 
 src/views/hazardousChemicals/electronicWarehouse/components/proDetail.vue          |  173 +++
 src/views/hazardousChemicals/electronicWarehouse/components/viewQR.vue             |   66 +
 src/layout/components/Sidebar/menu.js                                              |   20 
 src/views/hazardousChemicals/warehouseManage/index.vue                             |   38 
 src/views/homePage.vue                                                             |   13 
 src/views/hazardousChemicals/electronicWarehouse/components/rawWarehouseRecord.vue |  109 ++
 src/views/hazardousChemicals/electronicWarehouse/components/productTable.vue       |  154 +++
 src/views/hazardousChemicals/traceableQuery/index.vue                              |   34 
 src/views/hazardousChemicals/warehouseManage/components/addRawDialog.vue           |  272 ++++++
 src/router/index.js                                                                |   23 
 src/views/hazardousChemicals/electronicWarehouse/components/proWarehouseRecord.vue |  112 ++
 src/components/Pagination/index.vue                                                |    4 
 src/views/hazardousChemicals/warehouseManage/components/printCode.vue              |  189 ++++
 src/views/hazardousChemicals/warehouseManage/components/addProDialog.vue           |  267 ++++++
 src/api/hazardousChemicals/productRecord.js                                        |   63 +
 src/api/hazardousChemicals/rawRecord.js                                            |   55 +
 src/views/hazardousChemicals/accessRecords/components/productTable.vue             |  163 +++
 src/views/hazardousChemicals/overdueWarning/index.vue                              |   18 
 src/views/hazardousChemicals/warehouseManage/components/rawTable.vue               |  183 ++++
 src/views/hazardousChemicals/electronicWarehouse/components/rawTable.vue           |  170 +++
 src/views/hazardousChemicals/electronicWarehouse/index.vue                         |   49 +
 src/views/hazardousChemicals/electronicWarehouse/components/rawDetail.vue          |  183 ++++
 24 files changed, 2,547 insertions(+), 35 deletions(-)

diff --git a/src/api/hazardousChemicals/productRecord.js b/src/api/hazardousChemicals/productRecord.js
new file mode 100644
index 0000000..da982c9
--- /dev/null
+++ b/src/api/hazardousChemicals/productRecord.js
@@ -0,0 +1,63 @@
+import request from "@/utils/request";
+
+export function getProductRecord(params) {
+    return request({
+        url: '/product-entry-record/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addProductRecord(data) {
+    return request({
+        url: '/product-entry-record',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editProductRecord(params) {
+    return request({
+        url: `/product-entry-record`,
+        method: 'put',
+        data: params
+    })
+}
+
+export function delProductRecord(data) {
+    return request({
+        url: `/product-entry-record/` + data,
+        method: 'delete'
+    })
+}
+
+export function doEntryPro(data) {
+    return request({
+        url: '/product-entry-record/doEntry/' + data,
+        method: 'post'
+    })
+}
+
+export function getProWarehouseRecord(params) {
+    return request({
+        url: '/product-warehouse-record/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getProDetail(params) {
+    return request({
+        url: '/product/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getProFlow(params) {
+    return request({
+        url: '/product-flow/list',
+        method: 'get',
+        params: params
+    })
+}
diff --git a/src/api/hazardousChemicals/rawRecord.js b/src/api/hazardousChemicals/rawRecord.js
new file mode 100644
index 0000000..5226964
--- /dev/null
+++ b/src/api/hazardousChemicals/rawRecord.js
@@ -0,0 +1,55 @@
+import request from "@/utils/request";
+
+export function getRawRecord(params) {
+    return request({
+        url: '/entry-record/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function addRawRecord(data) {
+    return request({
+        url: '/entry-record',
+        method: 'post',
+        data: data
+    })
+}
+
+export function editRawRecord(params) {
+    return request({
+        url: `/entry-record`,
+        method: 'put',
+        data: params
+    })
+}
+
+export function delRawRecord(data) {
+    return request({
+        url: `/entry-record/` + data,
+        method: 'delete'
+    })
+}
+
+export function doEntryRaw(data) {
+    return request({
+        url: '/entry-record/doEntry/' + data,
+        method: 'post'
+    })
+}
+
+export function getRawWarehouseRecord(params) {
+    return request({
+        url: '/warehouse-record/list',
+        method: 'get',
+        params: params
+    })
+}
+
+export function getRawDetail(params) {
+    return request({
+        url: '/hazmat/list',
+        method: 'get',
+        params: params
+    })
+}
diff --git a/src/components/Pagination/index.vue b/src/components/Pagination/index.vue
index 38de953..d4b31ad 100644
--- a/src/components/Pagination/index.vue
+++ b/src/components/Pagination/index.vue
@@ -33,7 +33,7 @@
   pageSizes: {
     type: Array,
     default() {
-      return [10, 20, 30, 50]
+      return [5,10, 20, 30, 50]
     }
   },
   // 移动端页码按钮的数量端默认值5
@@ -102,4 +102,4 @@
 .pagination-container.hidden {
   display: none;
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/src/layout/components/Sidebar/menu.js b/src/layout/components/Sidebar/menu.js
index fc6a211..28af68b 100644
--- a/src/layout/components/Sidebar/menu.js
+++ b/src/layout/components/Sidebar/menu.js
@@ -12,11 +12,11 @@
             name: 'electronicWarehouse',
             meta: { title: '电子仓库',icon: 'build',affix: true }
         },
-        {
-            path: '/detailList',
-            name: 'detailList',
-            meta: { title: '危化品详单',icon: 'education',affix: true }
-        },
+        // {
+        //     path: '/detailList',
+        //     name: 'detailList',
+        //     meta: { title: '危化品详单',icon: 'education',affix: true }
+        // },
         {
             path: '/accessRecords',
             name: 'accessRecords',
@@ -81,11 +81,11 @@
             name: 'electronicWarehouse',
             meta: { title: '电子仓库',icon: 'build',affix: true }
         },
-        {
-            path: '/detailList',
-            name: 'detailList',
-            meta: { title: '危化品详单',icon: 'education',affix: true }
-        },
+        // {
+        //     path: '/detailList',
+        //     name: 'detailList',
+        //     meta: { title: '危化品详单',icon: 'education',affix: true }
+        // },
         {
             path: '/accessRecords',
             name: 'accessRecords',
diff --git a/src/router/index.js b/src/router/index.js
index 42cf5f2..00443bb 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -92,19 +92,32 @@
     ]
   },
   {
-    path: '/detailList',
+    path: '/rawDetail',
     component: Layout,
-    redirect: '/detailList',
+    redirect: '/rawDetail',
     children: [
       {
-        path: '/detailList',
-        component: () => import('@/views/hazardousChemicals/detailList/index.vue'),
-        name: 'detailList',
+        path: '/rawDetail',
+        component: () => import('@/views/hazardousChemicals/electronicWarehouse/components/rawDetail.vue'),
+        name: 'rawDetail',
         meta: { title: '危化品详单',icon: 'form',  affix: true }
       }
     ]
   },
   {
+    path: '/proDetail',
+    component: Layout,
+    redirect: '/proDetail',
+    children: [
+      {
+        path: '/proDetail',
+        component: () => import('@/views/hazardousChemicals/electronicWarehouse/components/proDetail.vue'),
+        name: 'proDetail',
+        meta: { title: '成品详单',icon: 'form',  affix: true }
+      }
+    ]
+  },
+  {
     path: '/accessRecords',
     component: Layout,
     redirect: '/accessRecords',
diff --git a/src/views/hazardousChemicals/accessRecords/components/productTable.vue b/src/views/hazardousChemicals/accessRecords/components/productTable.vue
new file mode 100644
index 0000000..a921cfa
--- /dev/null
+++ b/src/views/hazardousChemicals/accessRecords/components/productTable.vue
@@ -0,0 +1,163 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item label="品名:" >
+          <el-input v-model="data.queryParams.name" placeholder="请输入品名" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="产品编号:" >
+          <el-input v-model="data.queryParams.productSn" placeholder="请输入产品编号" clearable></el-input>
+        </el-form-item>
+        <el-form-item >
+          <el-button
+              type="primary"
+              @click="getList"
+          >查询</el-button>
+          <el-button
+              type="primary"
+              plain
+              @click="reset"
+          >重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="流转时间" prop="updateTime" align="center"  />
+      <el-table-column label="品名" prop="productBasic.name" align="center"  />
+      <el-table-column label="产品编号" prop="productBasic.productSn" align="center" />
+      <el-table-column label="二维码识别号" prop="productBasic.code" align="center" />
+      <el-table-column label="类型" prop="productBasic.productSn" align="center" >
+        <template #default="scope">
+          <span>{{scope.row.state === 0 ? '入库' :scope.row.state === 3 ? '标签作废' :scope.row.state === 4 ? '销售' : ''}}</span>
+
+        </template>
+      </el-table-column>
+      <el-table-column label="数量" prop="batchNo" align="center" width="120" />
+      <el-table-column label="操作人" prop="batchNo" align="center" width="120" />
+      <el-table-column label="人员所在部门" prop="user.departName" align="center" width="120" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" >
+        <template #default="scope">
+          <el-button link type="primary" >查看完整记录</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {delWarehouse, getWarehouse} from "@/api/hazardousChemicals/warehouse";
+import {
+  delProductRecord,
+  doEntryPro,
+  getProductRecord, getProFlow,
+  getProWarehouseRecord
+} from "@/api/hazardousChemicals/productRecord";
+import {delRawRecord} from "@/api/hazardousChemicals/rawRecord";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const codeRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  },
+  total: 0,
+  dataList: []
+});
+
+const { queryParams, total, dataList } = toRefs(data);
+const classHourRef = ref();
+onMounted(()=>{
+  getList()
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getProFlow(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value);
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  }
+  getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delProductRecord(val.id)
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const doEntry = (val) => {
+  ElMessageBox.confirm(
+      '确定入库该成品?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await doEntryPro(val.id)
+        if(res.code == 200){
+          ElMessage.success('入库成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const printCode = (val) => {
+  console.log("val",val)
+  codeRef.value.openDialog('pro',val);
+
+}
+defineExpose({
+  getList
+});
+
+
+</script>
diff --git a/src/views/hazardousChemicals/accessRecords/index.vue b/src/views/hazardousChemicals/accessRecords/index.vue
index e5894d9..807c53b 100644
--- a/src/views/hazardousChemicals/accessRecords/index.vue
+++ b/src/views/hazardousChemicals/accessRecords/index.vue
@@ -1,9 +1,45 @@
 <template>
-  <div>取用记录</div>
+  <div>
+    <el-tabs v-model="data.activeName" class="demo-tabs" @click="clickTab" style="margin: 10px 10px">
+      <el-tab-pane label="成品" name="finishPro" v-if="showFinishPro">
+        <pro-table ref="proRef"></pro-table>
+      </el-tab-pane>
+      <el-tab-pane label="原材料" name="rawMaterial">
+<!--        <raw-table ref="rawRef"></raw-table>-->
+      </el-tab-pane>
+    </el-tabs>
+  </div>
 
 </template>
 <script setup>
+import {onMounted, reactive, ref} from "vue";
+import proTable from './components/productTable.vue'
+// import rawTable from './components/rawTable.vue'
+const showFinishPro = ref(false)
+const proRef = ref()
+const rawRef = ref()
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+  },
+  total: 0,
+  dataList: [],
+  activeName: 'finishPro'
+})
 
+onMounted(()=>{
+  showFinishPro.value = true;
+  data.activeName = showFinishPro.value ? 'finishPro' : 'rawMaterial'
+})
+const clickTab = (tab,event) =>{
+  console.log('tab',data.activeName)
+  if(data.activeName == 'finishPro'){
+    proRef.value.getList()
+  }else {
+    rawRef.value.getList()
+  }
+}
 </script>
 
 <style scoped lang="scss">
diff --git a/src/views/hazardousChemicals/electronicWarehouse/components/proDetail.vue b/src/views/hazardousChemicals/electronicWarehouse/components/proDetail.vue
new file mode 100644
index 0000000..b807bc3
--- /dev/null
+++ b/src/views/hazardousChemicals/electronicWarehouse/components/proDetail.vue
@@ -0,0 +1,173 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item label="状态:" >
+          <el-select
+              v-model="data.queryParams.state"
+              placeholder="请选择状态"
+              style="width: 240px"
+          >
+            <el-option
+                v-for="item in data.typeList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item >
+          <el-button
+              type="primary"
+              @click="getList"
+          >查询</el-button>
+          <el-button
+              type="primary"
+              plain
+              @click="reset"
+          >重置</el-button>
+        </el-form-item>
+      </el-form>
+      <div>
+        <el-button
+            type="primary"
+            plain
+            @click="back"
+        >返回</el-button>
+      </div>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="data.dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="品名" prop="productBasic.name" align="center"  />
+      <el-table-column label="产品编号" prop="productBasic.productSn" align="center" />
+      <el-table-column label="CAS号" prop="productBasic.cas" align="center" />
+      <el-table-column label="厂家" prop="productBasic.manufacturer" align="center" />
+      <el-table-column label="供应商" prop="productBasic.supplier" align="center" />
+      <el-table-column label="批号" prop="batchNo" align="center" width="120" />
+      <el-table-column label="危险性质" prop="productBasic.productCharacter" align="center" />
+      <el-table-column label="最小包装" prop="productBasic.productSn" align="center" width="120">
+        <template #default="scope">
+          <span>{{scope.row.productBasic.metering}}{{scope.row.productBasic.unit}} / {{scope.row.productBasic.minPackage == 0 ? '瓶' :scope.row.productBasic.minPackage == 1?'袋':scope.row.productBasic.minPackage == 2?'桶 ':scope.row.productBasic.minPackage == 3?'盒':scope.row.productBasic.minPackage == 4?'箱':'其他'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="入库时间" prop="updateTime" align="center" />
+      <el-table-column label="当前状态" prop="state" align="center">
+        <template #default="scope">
+          <span>{{scope.row.state ===0 ? '在库' : scope.row.state ===4 ? '标签作废' : scope.row.state ===5 ? '销售' : ''}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="在库余量" prop="remaining" align="center" >
+        <template #default="scope">
+          <span v-if="scope.row.state === 0">{{scope.row.remaining}}{{scope.row.productBasic.unit}}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="所在仓库" prop="warehouseName" align="center" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180" >
+        <template #default="scope">
+          <el-button link type="primary" >取用记录</el-button>
+          <el-button link type="primary" @click="viewQR(scope.row)">查看二维码</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+        v-show="data.total > 0"
+        :total="data.total"
+        v-model:page="data.queryParams.pageNum"
+        v-model:limit="data.queryParams.pageSize"
+        @pagination="getList"
+    />
+    <viewQRcode ref="dialogRef" @getList="getList"></viewQRcode>
+  </div>
+</template>
+
+<script setup>
+import {onMounted, reactive, ref} from "vue";
+import {useRoute, useRouter} from "vue-router";
+import {getProDetail, getProductRecord} from "@/api/hazardousChemicals/productRecord";
+import viewQRcode from './viewQR.vue'
+import {ElMessage} from "element-plus";
+import Cookies from "js-cookie";
+const route = useRoute()
+const router = useRouter();
+const dialogRef = ref();
+const data = reactive({
+  queryParams: {
+    basicId: null,
+    warehouseId: null,
+    state: null,
+    pageNum: 1,
+    pageSize: 10,
+  },
+  total: 0,
+  dataList: [],
+  isAdmin: false,
+  typeList: [
+    {
+      id: 0,
+      name: '在库'
+    },
+    {
+      id: 5,
+      name: '已销售'
+    },
+    {
+      id: 4,
+      name: '标签作废'
+    },
+
+  ]
+});
+const loading = ref(false);
+const backValue = ref({})
+onMounted(async ()=>{
+  if(route.query.val){
+    const val = JSON.parse(route.query.val)
+    backValue.value.pageNum =val.pageNum;
+    backValue.value.pageSize =val.pageSize;
+    data.queryParams.warehouseId =val.warehouseId
+    data.queryParams.basicId =val.basicId
+  }
+  await getList()
+})
+const getList = async () => {
+  loading.value = true
+  const res = await getProDetail(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+const reset = () => {
+  data.queryParams = {
+    basicId: data.queryParams.basicId,
+    warehouseId: data.queryParams.warehouseId,
+    state: null,
+    pageNum: 1,
+    pageSize: 10,
+  }
+  getList()
+}
+
+const back = () =>{
+  const obj = {
+    pageNum: backValue.value.pageNum,
+    pageSize: backValue.value.pageSize,
+  }
+  const v = JSON.stringify(obj)
+  Cookies.set('type','pro')
+  router.push({ path: "/electronicWarehouse", query: { val: v } });
+}
+const viewQR = (val) => {
+  dialogRef.value.openDialog('pro',val)
+}
+
+</script>
+
+<style scoped lang="scss">
+
+</style>
diff --git a/src/views/hazardousChemicals/electronicWarehouse/components/proWarehouseRecord.vue b/src/views/hazardousChemicals/electronicWarehouse/components/proWarehouseRecord.vue
new file mode 100644
index 0000000..db14e34
--- /dev/null
+++ b/src/views/hazardousChemicals/electronicWarehouse/components/proWarehouseRecord.vue
@@ -0,0 +1,112 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="50%"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-table v-loading="loading" :data="state.dataList" :border="true">
+        <el-table-column label="序号" type="index" align="center" width="80" />
+        <el-table-column label="时间" prop="createTime" align="center" width="120" />
+        <el-table-column label="类型" prop="state" align="center">
+          <template #default="scope">
+            <span>{{scope.row.state ===0 ? '批量导入' : scope.row.state ===3 ? '标签作废' : scope.row.state ===5 ? '销售' : ''}}</span>
+
+          </template>
+        </el-table-column>
+        <el-table-column label="数量" prop="num" align="center"  />
+        <el-table-column label="操作人" prop="createName" align="center"  />
+        <el-table-column label="变动后剩余" prop="remaining" align="center"  />
+      </el-table>
+      <pagination
+          v-show="state.total > 0"
+          :total="state.total"
+          v-model:page="state.queryParams.pageNum"
+          v-model:limit="state.queryParams.pageSize"
+          @pagination="getRecord"
+      />
+
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs} from 'vue'
+import {ElMessage} from "element-plus";
+import {addWarehouse, checkName, editWarehouse} from "@/api/hazardousChemicals/warehouse";
+import {verifyPhone} from "@/utils/validate";
+import {checkBasicName} from "@/api/hazardousChemicals/basicInfo";
+import {getProductRecord, getProWarehouseRecord} from "@/api/hazardousChemicals/productRecord";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const loading = ref(false)
+const state = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    warehouseId: '',
+    basicId: ''
+  },
+  total: 0,
+  dataList: []
+
+})
+
+
+const openDialog = async (value) => {
+  title.value = value.productBasic.name + ' ' +  '(编号:' + value.productBasic.productSn + ')' + ' '+  '的取用记录'
+  state.form = value;
+  await getRecord()
+  dialogVisible.value = true;
+}
+
+const getRecord = async () => {
+  loading.value = true
+  state.queryParams.basicId = state.form.basicId;
+  state.queryParams.warehouseId = state.form.warehouseId;
+  const res = await getProWarehouseRecord(state.queryParams)
+  if(res.code == 200){
+    state.dataList = res.data.list
+    state.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const handleClose = () => {
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+}
+const reset = () => {
+  state.form = {
+    id: '',
+    name: '',
+    remark: '',
+  }
+}
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/hazardousChemicals/electronicWarehouse/components/productTable.vue b/src/views/hazardousChemicals/electronicWarehouse/components/productTable.vue
new file mode 100644
index 0000000..5133541
--- /dev/null
+++ b/src/views/hazardousChemicals/electronicWarehouse/components/productTable.vue
@@ -0,0 +1,154 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item label="品名:" >
+          <el-input v-model="data.queryParams.name" placeholder="请输入品名" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="产品编号:" >
+          <el-input v-model="data.queryParams.productSn" placeholder="请输入产品编号" clearable></el-input>
+        </el-form-item>
+        <el-form-item >
+          <el-button
+              type="primary"
+              @click="getList"
+          >查询</el-button>
+          <el-button
+              type="primary"
+              plain
+              @click="reset"
+          >重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="品名" prop="productBasic.name" align="center"  />
+      <el-table-column label="产品编号" prop="productBasic.productSn" align="center" />
+      <el-table-column label="CAS号" prop="productBasic.cas" align="center" />
+      <el-table-column label="厂家" prop="productBasic.manufacturer" align="center" />
+      <el-table-column label="供应商" prop="productBasic.supplier" align="center" />
+      <el-table-column label="危险性质" prop="productBasic.productCharacter" align="center" />
+      <el-table-column label="最小包装" prop="productBasic.productSn" align="center" width="120">
+        <template #default="scope">
+          <span>{{scope.row.productBasic.metering}}{{scope.row.productBasic.unit}} / {{scope.row.productBasic.minPackage == 0 ? '瓶' :scope.row.productBasic.minPackage == 1?'袋':scope.row.productBasic.minPackage == 2?'桶 ':scope.row.productBasic.minPackage == 3?'盒':scope.row.productBasic.minPackage == 4?'箱':'其他'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="批号" prop="batchNo" align="center" width="120" />
+      <el-table-column label="所在仓库" prop="warehouseName" align="center" >
+        <template #default="scope">
+          <span>{{scope.row.warehouse.name}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" prop="state" align="center">
+        <template #default="scope">
+          <span>{{scope.row.state === 0 ? '未入库' : '已入库'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180" >
+        <template #default="scope">
+          <el-button link type="primary" @click="getProRecord(scope.row)" >动库记录</el-button>
+          <el-button link type="primary" @click="toDetail(scope.row)">查看详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+    <pro-warehouse-dialog ref="dialogRef" @getList="getList"></pro-warehouse-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import proWarehouseDialog from './proWarehouseRecord.vue'
+
+import {
+  delProductRecord,
+  doEntryPro,
+  getProductRecord,
+  getProWarehouseRecord
+} from "@/api/hazardousChemicals/productRecord";
+import {delRawRecord} from "@/api/hazardousChemicals/rawRecord";
+import {useRoute, useRouter} from "vue-router";
+const router = useRouter()
+const route = useRoute()
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const codeRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  },
+  total: 0,
+  dataList: []
+});
+
+const { queryParams, total, dataList } = toRefs(data);
+const classHourRef = ref();
+onMounted(()=>{
+  if(route.query.val){
+    const val = JSON.parse(route.query.val)
+    if(val){
+      data.queryParams.pageNum = val.pageNum;
+      data.queryParams.pageSize = val.pageSize;
+    }
+  }
+  getList()
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getProductRecord(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value);
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  }
+  getList()
+}
+const getProRecord = (val) => {
+  dialogRef.value.openDialog(val)
+}
+const toDetail = (val) => {
+  const obj = {
+    pageNum: data.queryParams.pageNum,
+    pageSize: data.queryParams.pageSize,
+    basicId: val.basicId,
+    warehouseId: val.warehouseId
+  }
+  const v = JSON.stringify(obj)
+  router.push({ path: "/proDetail", query: { val: v } });
+}
+
+defineExpose({
+  getList
+});
+
+</script>
diff --git a/src/views/hazardousChemicals/electronicWarehouse/components/rawDetail.vue b/src/views/hazardousChemicals/electronicWarehouse/components/rawDetail.vue
new file mode 100644
index 0000000..e9212a0
--- /dev/null
+++ b/src/views/hazardousChemicals/electronicWarehouse/components/rawDetail.vue
@@ -0,0 +1,183 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item label="状态:" >
+          <el-select
+              v-model="data.queryParams.state"
+              placeholder="请选择状态"
+              style="width: 240px"
+          >
+            <el-option
+                v-for="item in data.typeList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item >
+          <el-button
+              type="primary"
+              @click="getList"
+          >查询</el-button>
+          <el-button
+              type="primary"
+              plain
+              @click="reset"
+          >重置</el-button>
+        </el-form-item>
+      </el-form>
+      <div>
+        <el-button
+            type="primary"
+            plain
+            @click="back"
+        >返回</el-button>
+      </div>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="data.dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="品名" prop="hazmatBasic.name" align="center"  />
+      <el-table-column label="产品编号" prop="hazmatBasic.productSn" align="center" />
+      <el-table-column label="CAS号" prop="hazmatBasic.cas" align="center" />
+      <el-table-column label="厂家" prop="hazmatBasic.manufacturer" align="center" />
+      <el-table-column label="供应商" prop="hazmatBasic.supplier" align="center" />
+      <el-table-column label="批号" prop="batchNo" align="center" width="120" />
+      <el-table-column label="危险性质" prop="hazmatBasic.hazmatCharacter" align="center" />
+      <el-table-column label="最小包装" prop="hazmatBasic.productSn" align="center" width="120">
+        <template #default="scope">
+          <span>{{scope.row.hazmatBasic.metering}}{{scope.row.hazmatBasic.unit}} / {{scope.row.hazmatBasic.minPackage == 0 ? '瓶' :scope.row.hazmatBasic.minPackage == 1?'袋':scope.row.hazmatBasic.minPackage == 2?'桶 ':scope.row.hazmatBasic.minPackage == 3?'盒':scope.row.hazmatBasic.minPackage == 4?'箱':'其他'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="入库时间" prop="updateTime" align="center" />
+      <el-table-column label="当前状态" prop="state" align="center">
+        <template #default="scope">
+          <span>{{scope.row.state ===0 ? '在库' : scope.row.state === 1 ? '领用归还在库' :scope.row.state === 2? '领用中': scope.row.state === 3 ? '已用完' : scope.row.state === 4 ? '标签作废' : ''}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="在库余量" prop="remaining" align="center" >
+        <template #default="scope">
+          <span v-if="scope.row.state === 0">{{scope.row.remaining}}{{scope.row.hazmatBasic.unit}}</span>
+          <span v-else>—</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="所在仓库" prop="warehouseName" align="center" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180" >
+        <template #default="scope">
+          <el-button link type="primary" >取用记录</el-button>
+          <el-button link type="primary" @click="viewQR(scope.row)">查看二维码</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+        v-show="data.total > 0"
+        :total="data.total"
+        v-model:page="data.queryParams.pageNum"
+        v-model:limit="data.queryParams.pageSize"
+        @pagination="getList"
+    />
+    <viewQRcode ref="dialogRef" @getList="getList"></viewQRcode>
+  </div>
+</template>
+
+<script setup>
+import {onMounted, reactive, ref} from "vue";
+import {useRoute, useRouter} from "vue-router";
+import {getProDetail, getProductRecord} from "@/api/hazardousChemicals/productRecord";
+import viewQRcode from './viewQR.vue'
+import {ElMessage} from "element-plus";
+import {getRawDetail} from "@/api/hazardousChemicals/rawRecord";
+import Cookies from "js-cookie";
+const route = useRoute()
+const router = useRouter();
+const dialogRef = ref();
+const data = reactive({
+  queryParams: {
+    basicId: null,
+    warehouseId: null,
+    state: null,
+    pageNum: 1,
+    pageSize: 10,
+  },
+  total: 0,
+  dataList: [],
+  isAdmin: false,
+  typeList: [
+    {
+      id: 0,
+      name: '在库'
+    },
+    {
+      id: 1,
+      name: '领用归还在库'
+    },
+    {
+      id: 2,
+      name: '领用中'
+    },
+    {
+      id: 3,
+      name: '已用完'
+    },
+    {
+      id: 4,
+      name: '标签作废'
+    },
+
+  ]
+});
+const loading = ref(false);
+const backValue = ref({})
+onMounted(async ()=>{
+  if(route.query.val){
+    const val = JSON.parse(route.query.val)
+    backValue.value.pageNum =val.pageNum;
+    backValue.value.pageSize =val.pageSize;
+    data.queryParams.warehouseId =val.warehouseId
+    data.queryParams.basicId =val.basicId
+  }
+  await getList()
+})
+const getList = async () => {
+  loading.value = true
+  const res = await getRawDetail(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+const reset = () => {
+  data.queryParams = {
+    basicId: data.queryParams.basicId,
+    warehouseId: data.queryParams.warehouseId,
+    state: null,
+    pageNum: 1,
+    pageSize: 10,
+  }
+  getList()
+}
+
+const back = () =>{
+  const obj = {
+    pageNum: backValue.value.pageNum,
+    pageSize: backValue.value.pageSize,
+    type: 'raw'
+  }
+  const v = JSON.stringify(obj)
+  Cookies.set('type','raw')
+  router.push({ path: "/electronicWarehouse", query: { val: v } });
+}
+const viewQR = (val) => {
+  dialogRef.value.openDialog('raw',val)
+}
+
+</script>
+
+<style scoped lang="scss">
+
+</style>
diff --git a/src/views/hazardousChemicals/electronicWarehouse/components/rawTable.vue b/src/views/hazardousChemicals/electronicWarehouse/components/rawTable.vue
new file mode 100644
index 0000000..4e65c13
--- /dev/null
+++ b/src/views/hazardousChemicals/electronicWarehouse/components/rawTable.vue
@@ -0,0 +1,170 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item label="品名:" >
+          <el-input v-model="data.queryParams.name" placeholder="请输入品名" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="产品编号:" >
+          <el-input v-model="data.queryParams.productSn" placeholder="请输入产品编号" clearable></el-input>
+        </el-form-item>
+        <el-form-item >
+          <el-button
+              type="primary"
+              @click="getList"
+          >查询</el-button>
+          <el-button
+              type="primary"
+              plain
+              @click="reset"
+          >重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="品名" prop="hazmatBasic.name" align="center"  />
+      <el-table-column label="产品编号" prop="hazmatBasic.productSn" align="center" />
+      <el-table-column label="CAS号" prop="hazmatBasic.cas" align="center" />
+      <el-table-column label="厂家" prop="hazmatBasic.manufacturer" align="center" />
+      <el-table-column label="供应商" prop="hazmatBasic.supplier" align="center" />
+      <el-table-column label="危险性质" prop="hazmatBasic.hazmatCharacter" align="center" />
+      <el-table-column label="最小包装" align="center" width="120">
+        <template #default="scope">
+          <span>{{scope.row.hazmatBasic.metering}}{{scope.row.hazmatBasic.unit}} / {{scope.row.hazmatBasic.minPackage == 0 ? '瓶' :scope.row.hazmatBasic.minPackage == 1?'袋':scope.row.hazmatBasic.minPackage == 2?'桶 ':scope.row.hazmatBasic.minPackage == 3?'盒':scope.row.hazmatBasic.minPackage == 4?'箱':'其他'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="批号" prop="batchNo" align="center" width="120" />
+      <el-table-column label="所在仓库" prop="warehouseName" align="center" >
+        <template #default="scope">
+          <span>{{scope.row.warehouse.name}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" prop="state" align="center">
+        <template #default="scope">
+          <span>{{scope.row.state === 0 ? '未入库' : '已入库'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" >
+        <template #default="scope">
+          <el-button link type="primary"  @click="getProRecord(scope.row)" >动库记录</el-button>
+          <el-button link type="primary" @click="toDetail(scope.row)">查看详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+    <raw-warehouse-dialog ref="dialogRef" @getList="getList"></raw-warehouse-dialog>
+
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+const router = useRouter()
+const route = useRoute()
+import rawWarehouseDialog from './rawWarehouseRecord.vue'
+import {delRawRecord, doEntryRaw, getRawRecord, getRawWarehouseRecord} from "@/api/hazardousChemicals/rawRecord";
+import {useRoute, useRouter} from "vue-router";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const codeRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  },
+  total: 0,
+  dataList: []
+});
+
+const { queryParams, total, dataList } = toRefs(data);
+const classHourRef = ref();
+onMounted(()=>{
+  if(route.query.val){
+    const val = JSON.parse(route.query.val)
+    if(val){
+      data.queryParams.pageNum = val.pageNum;
+      data.queryParams.pageSize = val.pageSize;
+    }
+  }
+  getList()
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getRawRecord(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value);
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  }
+  getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delRawRecord(val.id)
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+const toDetail = (val) => {
+  const obj = {
+    pageNum: data.queryParams.pageNum,
+    pageSize: data.queryParams.pageSize,
+    basicId: val.basicId,
+    warehouseId: val.warehouseId
+  }
+  const v = JSON.stringify(obj)
+  router.push({ path: "/rawDetail", query: { val: v } });
+}
+
+const getProRecord = (val) => {
+  dialogRef.value.openDialog(val)
+}
+
+defineExpose({
+  getList
+});
+
+</script>
diff --git a/src/views/hazardousChemicals/electronicWarehouse/components/rawWarehouseRecord.vue b/src/views/hazardousChemicals/electronicWarehouse/components/rawWarehouseRecord.vue
new file mode 100644
index 0000000..cbe3ff6
--- /dev/null
+++ b/src/views/hazardousChemicals/electronicWarehouse/components/rawWarehouseRecord.vue
@@ -0,0 +1,109 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title"
+        width="50%"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-table v-loading="loading" :data="state.dataList" :border="true">
+        <el-table-column label="序号" type="index" align="center" width="80" />
+        <el-table-column label="时间" prop="createTime" align="center" width="120" />
+        <el-table-column label="类型" prop="state" align="center">
+          <template #default="scope">
+            <span>{{scope.row.state ===0 ? '批量导入' : scope.row.state ===1 ? '取用' :scope.row.state ===2 ? '归还': scope.row.state ===3 ? '标签作废' : ''}}</span>
+
+          </template>
+        </el-table-column>
+        <el-table-column label="数量" prop="num" align="center"  />
+        <el-table-column label="操作人" prop="createName" align="center"  />
+        <el-table-column label="变动后剩余" prop="remaining" align="center"  />
+      </el-table>
+      <pagination
+          v-show="state.total > 0"
+          :total="state.total"
+          v-model:page="state.queryParams.pageNum"
+          v-model:limit="state.queryParams.pageSize"
+          @pagination="getRecord"
+      />
+
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs} from 'vue'
+import {ElMessage} from "element-plus";
+import {getRawWarehouseRecord} from "@/api/hazardousChemicals/rawRecord";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const loading = ref(false)
+const state = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    warehouseId: '',
+    basicId: ''
+  },
+  total: 0,
+  dataList: []
+
+})
+
+
+const openDialog = async (value) => {
+  title.value = value.hazmatBasic.name + ' ' +  '(编号:' + value.hazmatBasic.productSn + ')' + ' '+  '的取用记录'
+  state.form = value;
+  await getRecord()
+  dialogVisible.value = true;
+}
+
+const getRecord = async () => {
+  loading.value = true
+  state.queryParams.basicId = state.form.basicId;
+  state.queryParams.warehouseId = state.form.warehouseId;
+  const res = await getRawWarehouseRecord(state.queryParams)
+  if(res.code == 200){
+    state.dataList = res.data.list
+    state.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const handleClose = () => {
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+}
+const reset = () => {
+  state.form = {
+    id: '',
+    name: '',
+    remark: '',
+  }
+}
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/hazardousChemicals/electronicWarehouse/components/viewQR.vue b/src/views/hazardousChemicals/electronicWarehouse/components/viewQR.vue
new file mode 100644
index 0000000..a7dd3b3
--- /dev/null
+++ b/src/views/hazardousChemicals/electronicWarehouse/components/viewQR.vue
@@ -0,0 +1,66 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        width="400px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-card style="max-width: 480px">
+        <div style="display: flex;flex-direction: column;align-items: center;font-size: 20px;font-weight: 600">
+          <span>{{title}}</span>
+          <vue-qr :size="150" :margin="0" :auto-color="true" :dot-scale="1" :text="state.form.code" style="margin: 10px 0 10px 0"></vue-qr>
+          <span>{{state.form.code}}</span>
+        </div>
+      </el-card>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs} from 'vue'
+import {ElMessage} from "element-plus";
+import VueQr from "vue-qr/src/packages/vue-qr.vue";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+
+const state = reactive({
+})
+
+
+const openDialog = async (type,value) => {
+  if(type == 'pro'){
+    title.value = value.productBasic.name + ' ' + '—' + ' '+ value.productBasic.productSn
+  }else {
+    title.value = value.hazmatBasic.name + ' ' + '—' + ' '+ value.hazmatBasic.productSn
+  }
+
+  state.form = value;
+  dialogVisible.value = true;
+}
+const handleClose = () => {
+  dialogVisible.value = false;
+  emit("getList")
+}
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/hazardousChemicals/electronicWarehouse/index.vue b/src/views/hazardousChemicals/electronicWarehouse/index.vue
index ffa1c08..e3c43d6 100644
--- a/src/views/hazardousChemicals/electronicWarehouse/index.vue
+++ b/src/views/hazardousChemicals/electronicWarehouse/index.vue
@@ -1,9 +1,56 @@
 <template>
-  <div>电子仓库</div>
+  <div>
+    <el-tabs v-model="data.activeName" class="demo-tabs" @click="clickTab" style="margin: 10px 10px">
+      <el-tab-pane label="成品" name="finishPro" v-if="showFinishPro">
+        <pro-table ref="proRef"></pro-table>
+      </el-tab-pane>
+      <el-tab-pane label="原材料" name="rawMaterial">
+        <raw-table ref="rawRef"></raw-table>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
 
 </template>
 <script setup>
+import {onMounted, reactive, ref} from "vue";
+import proTable from './components/productTable.vue'
+import rawTable from './components/rawTable.vue'
+import Cookies from "js-cookie";
+const showFinishPro = ref(false)
+const proRef = ref()
+const rawRef = ref()
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+  },
+  total: 0,
+  dataList: [],
+  activeName: 'finishPro'
+})
 
+onMounted(()=>{
+  showFinishPro.value = true;
+  if(Cookies.get('type')){
+    data.activeName = showFinishPro.value && Cookies.get('type') ==='pro' ? 'finishPro' : 'rawMaterial'
+  }else{
+    data.activeName = showFinishPro.value ? 'finishPro' : 'rawMaterial'
+  }
+})
+const clickTab = (tab,event) =>{
+  console.log('tab',data.activeName)
+  if(data.activeName == 'finishPro'){
+    if(proRef.value){
+      proRef.value.getList()
+    }
+
+  }else {
+    if(rawRef.value){
+      rawRef.value.getList()
+    }
+
+  }
+}
 </script>
 
 <style scoped lang="scss">
diff --git a/src/views/hazardousChemicals/overdueWarning/index.vue b/src/views/hazardousChemicals/overdueWarning/index.vue
index 20c9979..de7dd3e 100644
--- a/src/views/hazardousChemicals/overdueWarning/index.vue
+++ b/src/views/hazardousChemicals/overdueWarning/index.vue
@@ -97,15 +97,15 @@
 })
 
 const getList = async () => {
-  // loading.value = true
-  // const res = await getWarning(data.queryParams)
-  // if(res.code == 200){
-  //   data.dataList = res.data.list
-  //   data.total = res.data.total
-  // }else{
-  //   ElMessage.warning(res.message)
-  // }
-  // loading.value = false
+  loading.value = true
+  const res = await getWarning(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
 }
 
 const openDialog = (type, value) => {
diff --git a/src/views/hazardousChemicals/traceableQuery/index.vue b/src/views/hazardousChemicals/traceableQuery/index.vue
index b8d08e4..cd019e4 100644
--- a/src/views/hazardousChemicals/traceableQuery/index.vue
+++ b/src/views/hazardousChemicals/traceableQuery/index.vue
@@ -1,9 +1,41 @@
 <template>
-  <div>溯源查询</div>
+  <div>
+    <div style="margin-top:20px;margin-left: 20px">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item label="二维码编号:" >
+          <el-input v-model="data.form.code" placeholder="请输入二维码编号进行搜索" clearable></el-input>
+        </el-form-item>
+        <el-form-item >
+          <el-button
+              type="primary"
+              @click="getList"
+          >查询</el-button>
+        </el-form-item>
+      </el-form>
+      <div v-if="data.form.code !=''">
+
+      </div>
+      <el-empty description="暂无数据" style="margin-top: 10%" v-else></el-empty>
+    </div>
+  </div>
 
 </template>
 <script setup>
+import {reactive} from "vue";
 
+const data = reactive({
+  queryParams: {
+    name: '',
+    productSn: ''
+  },
+  form: {
+    code: ''
+  },
+  dataList: []
+});
+const getList = () => {
+
+}
 </script>
 
 <style scoped lang="scss">
diff --git a/src/views/hazardousChemicals/warehouseManage/components/addProDialog.vue b/src/views/hazardousChemicals/warehouseManage/components/addProDialog.vue
new file mode 100644
index 0000000..db362a7
--- /dev/null
+++ b/src/views/hazardousChemicals/warehouseManage/components/addProDialog.vue
@@ -0,0 +1,267 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title+'成品入库'"
+        width="600px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" >
+        <el-form-item label="入库成品:" prop="basicName" >
+          <el-select
+              clearable
+              v-model="state.form.basicName"
+              filterable
+              remote
+              reserve-keyword
+              placeholder="请输入入库成品"
+              remote-show-suffix
+              :remote-method="getProBasic"
+              style="width: 100%"
+              @change="selectValue"
+          >
+            <el-option
+                v-for="item in state.proList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="仓库:" prop="warehouseName" >
+          <el-select
+              clearable
+              v-model="state.form.warehouseName"
+              filterable
+              remote
+              reserve-keyword
+              placeholder="请输入所入仓库"
+              remote-show-suffix
+              :remote-method="getWareHouseList"
+              style="width: 100%"
+              @change="selectWareValue"
+          >
+            <el-option
+                v-for="item in state.wareHouseList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="最小包装数量:" prop="num" >
+          <el-input v-model.trim="state.form.num" oninput="value=value.replace(/^\.+|[^\d]/g,'')" placeholder="请输入最小包装数量" @input="changeNum"></el-input>
+        </el-form-item>
+        <el-form-item label="批号:" prop="batchNo" >
+          <el-input v-model.trim="state.form.batchNo" placeholder="请输入批号"></el-input>
+        </el-form-item>
+        <el-form-item v-if="state.form.basicName && state.form.num" style="margin-left: -75px;margin-top: 30px">
+          <span style="font-size: 15px;font-weight: 600">{{state.message}}</span>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs} from 'vue'
+import {ElMessage} from "element-plus";
+import {getWarehouse} from "@/api/hazardousChemicals/warehouse";
+import {addProductRecord, editProductRecord, getProductRecord} from "@/api/hazardousChemicals/productRecord";
+import {getFinishBasicList} from "@/api/hazardousChemicals/finishedBasicInfo";
+import moment from "moment";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+
+
+const state = reactive({
+  form: {
+    id: '',
+    basicId: null,
+    basicName:'',
+    warehouseName: '',
+    warehouseId: null,
+    num: null,
+    batchNo: ''
+
+  },
+  formRules:{
+    num: [{ required: true, trigger: "blur", message: '请输入最小包装数量' }],
+    warehouseName: [{ required: true, trigger: "blur", message: '请选择入库仓库' }],
+    basicName: [{ required: true, trigger: "blur", message: '请选择入库成品' }],
+    // batchNo: [{ required: true, trigger: "blur", message: '请输入批号' }]
+  },
+  proList: [],
+  wareHouseList: [],
+  message: ''
+})
+
+
+const openDialog = async (type, value) => {
+  await getProBasic("")
+  await getWareHouseList("")
+
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑':'' ;
+  if(type === 'edit' ) {
+    state.form = value;
+    state.form.basicName = value.productBasic.name
+    state.form.warehouseName = value.warehouse.name;
+    choosePro.value = value.productBasic
+    changeNum()
+  }
+  dialogVisible.value = true;
+}
+const getProBasic = async (val) => {
+  let param = {}
+  if(val != ""){
+    param = {
+      name: val
+    }
+  }else {
+    param = {
+      pageNum: 1,
+      pageSize: 10
+    }
+  }
+  const res = await getFinishBasicList(param)
+  if(res.code == 200){
+    state.proList = res.data.list
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+const getWareHouseList = async (val) => {
+  let param = {}
+  if(val != ""){
+    param = {
+      name: val
+    }
+  }else {
+    param = {
+      pageNum: 1,
+      pageSize: 10
+    }
+  }
+  const res = await getWarehouse(param)
+  if(res.code == 200){
+    state.wareHouseList = res.data.list
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      if(state.form.batchNo == ''){
+        state.form.batchNo = moment(new Date()).format("YYYY-MM-DD")
+      }
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addProductRecord(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑'){
+      if(state.form.batchNo == ''){
+        state.form.batchNo = moment(new Date()).format("YYYY-MM-DD")
+      }
+      const {...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editProductRecord(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }
+  }
+}
+const choosePro =ref()
+const selectValue = (val) => {
+  state.proList.forEach(item => {
+    if(item.name === val){
+      state.form.basicId = item.id
+      console.log('item',item)
+      choosePro.value = item;
+    }
+  })
+}
+const changeNum = () => {
+  const minPackageType = choosePro.value.minPackage == 0 ? '瓶' :choosePro.value.minPackage == 1?'袋':choosePro.value.minPackage == 2?'桶 ':choosePro.value.minPackage == 3?'盒':choosePro.value.minPackage == 4?'箱':'其他'
+  state.message = `您将入库 { ${choosePro.value.name} },编号:{ ${choosePro.value.productSn} },最小包装${choosePro.value.metering}${choosePro.value.unit},类别:${minPackageType}。 \n 共计:${state.form.num}${minPackageType}`
+}
+const selectWareValue = (val) => {
+  state.wareHouseList.forEach(item => {
+    if(item.name === val){
+      state.form.warehouseId = item.id
+    }
+  })
+}
+
+const handleClose = () => {
+  busRef.value.clearValidate();
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+}
+const reset = () => {
+  state.form = {
+    id: '',
+    basicId: null,
+    basicName:'',
+    warehouseName: '',
+    warehouseId: null,
+    num: null,
+    batchNo: ''
+  }
+  state.proList = [];
+  state.wareHouseList = [];
+  state.message = '';
+}
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  white-space: pre-line;
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+
+}
+</style>
diff --git a/src/views/hazardousChemicals/warehouseManage/components/addRawDialog.vue b/src/views/hazardousChemicals/warehouseManage/components/addRawDialog.vue
new file mode 100644
index 0000000..2bc3776
--- /dev/null
+++ b/src/views/hazardousChemicals/warehouseManage/components/addRawDialog.vue
@@ -0,0 +1,272 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title+'危化品入库'"
+        width="600px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="150px" >
+        <el-form-item label="入库危化品:" prop="basicName" >
+          <el-select
+              clearable
+              v-model="state.form.basicName"
+              filterable
+              remote
+              reserve-keyword
+              placeholder="请输入入库危化品"
+              remote-show-suffix
+              :remote-method="getRawBasicList"
+              style="width: 100%"
+              @change="selectValue"
+          >
+            <el-option
+                v-for="item in state.rawList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="仓库:" prop="warehouseName" >
+          <el-select
+              clearable
+              v-model="state.form.warehouseName"
+              filterable
+              remote
+              reserve-keyword
+              placeholder="请输入所入仓库"
+              remote-show-suffix
+              :remote-method="getWareHouseList"
+              style="width: 100%"
+              @change="selectWareValue"
+          >
+            <el-option
+                v-for="item in state.wareHouseList"
+                :key="item.id"
+                :label="item.name"
+                :value="item.name"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="最小包装数量:" prop="num" >
+          <el-input v-model.trim="state.form.num" oninput="value=value.replace(/^\.+|[^\d]/g,'')" placeholder="请输入最小包装数量" @input="changeNum"></el-input>
+        </el-form-item>
+        <el-form-item label="批号:" prop="batchNo" >
+          <el-input v-model.trim="state.form.batchNo" placeholder="请输入批号"></el-input>
+        </el-form-item>
+<!--        <el-form-item label="条码前缀:" prop="codePrex" >-->
+<!--          <el-input v-model.trim="state.form.codePrex" placeholder="请输入条码前缀"></el-input>-->
+<!--        </el-form-item>-->
+        <el-form-item v-if="state.form.basicName && state.form.num" style="margin-left: -75px;margin-top: 30px">
+          <span style="font-size: 15px;font-weight: 600">{{state.message}}</span>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="onSubmit" size="default" v-preReClick>确认</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs} from 'vue'
+import {ElMessage} from "element-plus";
+import {addWarehouse, checkName, editWarehouse, getWarehouse} from "@/api/hazardousChemicals/warehouse";
+import {verifyPhone} from "@/utils/validate";
+import {checkBasicName, getBasicList} from "@/api/hazardousChemicals/basicInfo";
+import {addProductRecord, editProductRecord, getProductRecord} from "@/api/hazardousChemicals/productRecord";
+import {getFinishBasicList} from "@/api/hazardousChemicals/finishedBasicInfo";
+import moment from "moment";
+import {addRawRecord, editRawRecord, getRawRecord} from "@/api/hazardousChemicals/rawRecord";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+
+
+const state = reactive({
+  form: {
+    id: '',
+    basicId: null,
+    basicName:'',
+    warehouseName: '',
+    warehouseId: null,
+    num: null,
+    batchNo: ''
+
+  },
+  formRules:{
+    num: [{ required: true, trigger: "blur", message: '请输入最小包装数量' }],
+    warehouseName: [{ required: true, trigger: "blur", message: '请选择入库仓库' }],
+    basicName: [{ required: true, trigger: "blur", message: '请选择入库成品' }],
+    // batchNo: [{ required: true, trigger: "blur", message: '请输入批号' }]
+  },
+  rawList: [],
+  wareHouseList: [],
+  message: ''
+})
+
+
+const openDialog = async (type, value) => {
+  await getRawBasicList("")
+  await getWareHouseList("")
+  title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑':'' ;
+  if(type === 'edit' ) {
+    state.form = value;
+    state.form.basicName = value.hazmatBasic.name
+    state.form.warehouseName = value.warehouse.name;
+    choosePro.value = value.hazmatBasic
+    changeNum()
+  }
+  dialogVisible.value = true;
+}
+const getRawBasicList = async (val) => {
+  let param = {}
+  if(val != ""){
+    param = {
+      name: val
+    }
+  }else {
+    param = {
+      pageNum: 1,
+      pageSize: 10
+    }
+  }
+  const res = await getBasicList(param)
+  if(res.code == 200){
+    state.rawList = res.data.list
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+const getWareHouseList = async (val) => {
+  let param = {}
+  if(val != ""){
+    param = {
+      name: val
+    }
+  }else {
+    param = {
+      pageNum: 1,
+      pageSize: 10
+    }
+  }
+  const res = await getWarehouse(param)
+  if(res.code == 200){
+    state.wareHouseList = res.data.list
+  }else{
+    ElMessage.warning(res.message)
+  }
+}
+
+const onSubmit = async () => {
+  const valid = await busRef.value.validate();
+  if(valid){
+    if(title.value === '新增'){
+      if(state.form.batchNo == ''){
+        state.form.batchNo = moment(new Date()).format("YYYY-MM-DD")
+      }
+      const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await addRawRecord(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '新增成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }else if(title.value === '编辑'){
+      if(state.form.batchNo == ''){
+        state.form.batchNo = moment(new Date()).format("YYYY-MM-DD")
+      }
+      const {...data} = JSON.parse(JSON.stringify(state.form))
+      const res = await editRawRecord(data)
+      if(res.code === 200){
+        ElMessage({
+          type: 'success',
+          message: '编辑成功'
+        });
+      }else{
+        ElMessage.warning(res.message)
+      }
+      emit("getList")
+      busRef.value.clearValidate();
+      reset();
+      dialogVisible.value = false;
+    }
+  }
+}
+const choosePro =ref()
+const selectValue = (val) => {
+  state.rawList.forEach(item => {
+    if(item.name === val){
+      state.form.basicId = item.id
+      console.log('item',item)
+      choosePro.value = item;
+    }
+  })
+}
+const changeNum = () => {
+  const minPackageType = choosePro.value.minPackage == 0 ? '瓶' :choosePro.value.minPackage == 1?'袋':choosePro.value.minPackage == 2?'桶 ':choosePro.value.minPackage == 3?'盒':choosePro.value.minPackage == 4?'箱':'其他'
+  state.message = `您将入库 { ${choosePro.value.name} },编号:{ ${choosePro.value.productSn} },最小包装${choosePro.value.metering}${choosePro.value.unit},类别:${minPackageType}。 \n 共计:${state.form.num}${minPackageType}`
+}
+const selectWareValue = (val) => {
+  state.wareHouseList.forEach(item => {
+    if(item.name === val){
+      state.form.warehouseId = item.id
+    }
+  })
+}
+
+const handleClose = () => {
+  busRef.value.clearValidate();
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+}
+const reset = () => {
+  state.form = {
+    id: '',
+    basicId: null,
+    basicName:'',
+    warehouseName: '',
+    warehouseId: null,
+    num: null,
+    batchNo: ''
+  }
+  state.rawList = [];
+  state.wareHouseList = [];
+  state.message = '';
+}
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  white-space: pre-line;
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+
+}
+</style>
diff --git a/src/views/hazardousChemicals/warehouseManage/components/printCode.vue b/src/views/hazardousChemicals/warehouseManage/components/printCode.vue
new file mode 100644
index 0000000..6c776a9
--- /dev/null
+++ b/src/views/hazardousChemicals/warehouseManage/components/printCode.vue
@@ -0,0 +1,189 @@
+<template>
+  <div class="notice">
+    <el-dialog
+        v-model="dialogVisible"
+        :title="title == 'pro' ? '成品二维码打印' : '危化品二维码打印'"
+        width="600px"
+        :before-close="handleClose"
+        :close-on-press-escape="false"
+        :close-on-click-modal="false"
+    >
+      <el-table v-loading="state.loading" :data="state.dataList" :border="true" :show-header="false" height="550"  @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55"  align="center" />
+        <el-table-column align="center" >
+          <template #default="scope">
+            <div :id="scope.row.code">
+              <div style="display: flex;flex-direction: column;align-items: center;justify-content: center">
+                <div style="font-size:14px;margin-top:10px;">{{scope.row.name}}—{{scope.row.productSn}}</div>
+                <vue-qr :size="80" :margin="0" :auto-color="true" :dot-scale="1" :text="scope.row.code" style="margin-top:10px;"></vue-qr>
+                <div style="font-size:10px;margin-top:10px;">{{scope.row.code}}</div>
+              </div>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          v-show="state.total > 0"
+          :total="state.total"
+          v-model:page="state.queryParams.pageNum"
+          v-model:limit="state.queryParams.pageSize"
+          @pagination="getList"
+      />
+      <template #footer>
+        <span class="dialog-footer">
+            <el-button @click="handleClose" size="default">取 消</el-button>
+            <el-button type="primary"  @click="printEvent" size="default" v-preReClick>打印</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+<script setup>
+import {reactive, ref, toRefs} from 'vue'
+import VueQr from 'vue-qr/src/packages/vue-qr.vue'
+import {ElMessage} from "element-plus";
+import {addWarehouse, checkName, editWarehouse} from "@/api/hazardousChemicals/warehouse";
+import {verifyPhone} from "@/utils/validate";
+import {checkBasicName} from "@/api/hazardousChemicals/basicInfo";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+
+const state = reactive({
+  loading: false,
+  dataList: [],
+  total: 0,
+  queryParams:{
+    pageNum: 1,
+    pageSize: 5
+  },
+  chooseList: []
+
+})
+
+const originalList = ref([])
+const openDialog = async (type,value) => {
+  title.value = type;
+  if(type == 'pro'){
+    for(let i=value.startCode ; i<=value.endCode;i++){
+      const obj = {
+        name: value.productBasic.name,
+        productSn: value.productBasic.productSn,
+        code: value.codePrex+(i+"").padStart(4,'0')
+      }
+      state.dataList.push(obj)
+    }
+  }else {
+
+    for(let i=value.startCode ; i<=value.endCode;i++){
+      const obj = {
+        name: value.hazmatBasic.name,
+        productSn: value.hazmatBasic.productSn,
+        code: value.codePrex+(i+"").padStart(4,'0')
+      }
+      state.dataList.push(obj)
+    }
+  }
+  state.total = state.dataList.length
+  originalList.value = state.dataList
+  getList()
+  console.log('state.dataList',state.dataList)
+  dialogVisible.value = true;
+}
+const getRowKey = (row) => {
+  return row.id
+}
+
+const onSubmit = async () => {
+
+}
+const handleSelectionChange = (val) => {
+  // state.form.studentIds = val.map(item => item.id)
+  state.chooseList = val
+  console.log("选中的行", val)
+}
+
+const handleClose = () => {
+  reset();
+  dialogVisible.value = false;
+  emit("getList")
+}
+const reset = () => {
+  state.dataList = [];
+  state.queryParams = {
+    pageNum: 1,
+    pageSize: 5
+  }
+  state.total = 0
+  state.chooseList = []
+}
+const getList = () => {
+  state.dataList = originalList.value.slice((state.queryParams.pageNum-1) * state.queryParams.pageSize, state.queryParams.pageNum * state.queryParams.pageSize)
+}
+
+const printEvent=() => {
+  let data = []
+  if(state.chooseList && state.chooseList.length>0){
+    data = state.chooseList
+  }else {
+    data = state.dataList
+  }
+  let qrCodes=''
+  for(let index in data){
+    console.log(index,'index')
+    qrCodes+=`<div class="my-list-col"><div class="centered-content">${document.getElementById(data[index].code).innerHTML}</div></div>`
+  }
+  const printContent=document.createElement('div')
+  printContent.innerHTML=qrCodes
+  //创建一个新的隐藏的iframe元素
+  const printFrame =document.createElement('iframe')
+  printFrame.style.display='none'
+  document.body.appendChild(printFrame)
+
+  const printDocument=printFrame.contentWindow.document
+  printDocument.open()
+  printDocument.write(`
+  <html>
+  <head>
+    <title>Print</title>
+    <style>
+      @media print {
+        .page-break { page-break-after:always;} /* 定义分页符格式*/
+        .centered-content { text-align:center;} /* 居中对齐内容*/
+        @page { size:50mm 40mm;margin:0mm; }
+      }
+    </style>
+  </head>
+  <body style='margin:0;padding:0;'>${printContent.innerHTML}</body>
+  </html>
+  `)
+  printDocument.close()
+  //在打印窗口中调用打印功能
+  printFrame.contentWindow.print()
+  //移除隐藏的iframe元素
+  document.body.removeChild(printFrame)
+  // handleClose()
+}
+
+
+defineExpose({
+  openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+  :deep(.el-form .el-form-item__label) {
+    font-size: 15px;
+  }
+  .file {
+    display: flex;
+    flex-direction: column;
+    align-items: flex-start;
+  }
+}
+</style>
diff --git a/src/views/hazardousChemicals/warehouseManage/components/productTable.vue b/src/views/hazardousChemicals/warehouseManage/components/productTable.vue
new file mode 100644
index 0000000..7668e43
--- /dev/null
+++ b/src/views/hazardousChemicals/warehouseManage/components/productTable.vue
@@ -0,0 +1,186 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="品名:" >
+          <el-input v-model="data.queryParams.name" placeholder="请输入品名" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="产品编号:" >
+          <el-input v-model="data.queryParams.productSn" placeholder="请输入产品编号" clearable></el-input>
+        </el-form-item>
+        <el-form-item >
+          <el-button
+              type="primary"
+              @click="getList"
+          >查询</el-button>
+          <el-button
+              type="primary"
+              plain
+              @click="reset"
+          >重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="品名" prop="productBasic.name" align="center"  />
+      <el-table-column label="产品编号" prop="productBasic.productSn" align="center" />
+      <el-table-column label="CAS号" prop="productBasic.cas" align="center" />
+      <el-table-column label="厂家" prop="productBasic.manufacturer" align="center" />
+      <el-table-column label="供应商" prop="productBasic.supplier" align="center" />
+      <el-table-column label="危险性质" prop="productBasic.productCharacter" align="center" />
+      <el-table-column label="最小包装" prop="productBasic.productSn" align="center" width="120">
+        <template #default="scope">
+          <span>{{scope.row.productBasic.metering}}{{scope.row.productBasic.unit}} / {{scope.row.productBasic.minPackage == 0 ? '瓶' :scope.row.productBasic.minPackage == 1?'袋':scope.row.productBasic.minPackage == 2?'桶 ':scope.row.productBasic.minPackage == 3?'盒':scope.row.productBasic.minPackage == 4?'箱':'其他'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="批号" prop="batchNo" align="center" width="120" />
+      <el-table-column label="所在仓库" prop="warehouseName" align="center" >
+        <template #default="scope">
+          <span>{{scope.row.warehouse.name}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" prop="state" align="center">
+        <template #default="scope">
+          <span>{{scope.row.state === 0 ? '未入库' : '已入库'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" >
+        <template #default="scope">
+          <el-button link type="primary" v-if="scope.row.state == 0" @click="doEntry(scope.row)">入库</el-button>
+          <el-button link type="primary" v-if="scope.row.state == 1" @click="printCode(scope.row)">打印二维码</el-button>
+          <el-button link type="primary" @click="openDialog('edit',scope.row)" v-if="scope.row.state == 0">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)" v-if="scope.row.state == 0">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+    <pro-dialog ref="dialogRef" @getList=getList></pro-dialog>
+    <printcode ref="codeRef" @getList=getList></printcode>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import proDialog from "./addProDialog.vue";
+import printcode from './printCode.vue'
+import {delWarehouse, getWarehouse} from "@/api/hazardousChemicals/warehouse";
+import {
+  delProductRecord,
+  doEntryPro,
+  getProductRecord,
+  getProWarehouseRecord
+} from "@/api/hazardousChemicals/productRecord";
+import {delRawRecord} from "@/api/hazardousChemicals/rawRecord";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const codeRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  },
+  total: 0,
+  dataList: []
+});
+
+const { queryParams, total, dataList } = toRefs(data);
+const classHourRef = ref();
+onMounted(()=>{
+  getList()
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getProductRecord(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value);
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  }
+  getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delProductRecord(val.id)
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const doEntry = (val) => {
+  ElMessageBox.confirm(
+      '确定入库该成品?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await doEntryPro(val.id)
+        if(res.code == 200){
+          ElMessage.success('入库成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+const printCode = (val) => {
+  console.log("val",val)
+  codeRef.value.openDialog('pro',val);
+
+}
+defineExpose({
+  getList
+});
+
+
+</script>
diff --git a/src/views/hazardousChemicals/warehouseManage/components/rawTable.vue b/src/views/hazardousChemicals/warehouseManage/components/rawTable.vue
new file mode 100644
index 0000000..c2a47f9
--- /dev/null
+++ b/src/views/hazardousChemicals/warehouseManage/components/rawTable.vue
@@ -0,0 +1,183 @@
+<template>
+  <div class="app-container">
+    <div style="display: flex;justify-content: space-between">
+      <el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
+        <el-form-item>
+          <el-button
+              type="primary"
+              plain
+              icon="Plus"
+              @click="openDialog('add',{})"
+          >新增</el-button>
+        </el-form-item>
+        <el-form-item label="品名:" >
+          <el-input v-model="data.queryParams.name" placeholder="请输入品名" clearable></el-input>
+        </el-form-item>
+        <el-form-item label="产品编号:" >
+          <el-input v-model="data.queryParams.productSn" placeholder="请输入产品编号" clearable></el-input>
+        </el-form-item>
+        <el-form-item >
+          <el-button
+              type="primary"
+              @click="getList"
+          >查询</el-button>
+          <el-button
+              type="primary"
+              plain
+              @click="reset"
+          >重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <!-- 表格数据 -->
+    <el-table v-loading="loading" :data="dataList" :border="true">
+      <el-table-column label="序号" type="index" align="center" width="80" />
+      <el-table-column label="品名" prop="hazmatBasic.name" align="center"  />
+      <el-table-column label="产品编号" prop="hazmatBasic.productSn" align="center" />
+      <el-table-column label="CAS号" prop="hazmatBasic.cas" align="center" />
+      <el-table-column label="厂家" prop="hazmatBasic.manufacturer" align="center" />
+      <el-table-column label="供应商" prop="hazmatBasic.supplier" align="center" />
+      <el-table-column label="危险性质" prop="hazmatBasic.hazmatCharacter" align="center" />
+      <el-table-column label="最小包装" align="center" width="120">
+        <template #default="scope">
+          <span>
+            {{scope.row.hazmatBasic.metering}}{{scope.row.hazmatBasic.unit}} / {{scope.row.hazmatBasic.minPackage == 0 ? '瓶' :scope.row.hazmatBasic.minPackage == 1?'袋':scope.row.hazmatBasic.minPackage == 2?'桶 ':scope.row.hazmatBasic.minPackage == 3?'盒':scope.row.hazmatBasic.minPackage == 4?'箱':'其他'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="批号" prop="batchNo" align="center" width="120" />
+      <el-table-column label="所在仓库" prop="warehouseName" align="center" >
+        <template #default="scope">
+          <span>{{scope.row.warehouse.name}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="状态" prop="state" align="center">
+        <template #default="scope">
+          <span>{{scope.row.state === 0 ? '未入库' : '已入库'}}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200" >
+        <template #default="scope">
+          <el-button link type="primary" v-if="scope.row.state == 0" @click="doEntry(scope.row)">入库</el-button>
+          <el-button link type="primary" v-if="scope.row.state == 1" @click="printCode(scope.row)">打印二维码</el-button>
+          <el-button link type="primary" @click="openDialog('edit',scope.row)" v-if="scope.row.state == 0">编辑</el-button>
+          <el-button link type="danger" @click="handleDelete(scope.row)" v-if="scope.row.state == 0">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total > 0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <raw-dialog ref="dialogRef" @getList=getList></raw-dialog>
+    <printcode ref="codeRef" @getList=getList></printcode>
+  </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import rawDialog from "./addRawDialog.vue";
+import printcode from './printCode.vue'
+import {delRawRecord, doEntryRaw, getRawRecord, getRawWarehouseRecord} from "@/api/hazardousChemicals/rawRecord";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const dialogRef = ref();
+const codeRef = ref();
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  },
+  total: 0,
+  dataList: []
+});
+
+const { queryParams, total, dataList } = toRefs(data);
+const classHourRef = ref();
+onMounted(()=>{
+  getList()
+})
+
+const getList = async () => {
+  loading.value = true
+  const res = await getRawRecord(data.queryParams)
+  if(res.code == 200){
+    data.dataList = res.data.list
+    data.total = res.data.total
+  }else{
+    ElMessage.warning(res.message)
+  }
+  loading.value = false
+}
+
+const openDialog = (type, value) => {
+  dialogRef.value.openDialog(type, value);
+}
+
+/** 重置新增的表单以及其他数据  */
+function reset() {
+  data.queryParams = {
+    pageNum: 1,
+    pageSize: 10,
+    name: '',
+    productSn: ''
+  }
+  getList()
+}
+const handleDelete = (val) => {
+  ElMessageBox.confirm(
+      '确定删除此条数据?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await delRawRecord(val.id)
+        if(res.code == 200){
+          ElMessage.success('数据删除成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+const doEntry = (val) => {
+  ElMessageBox.confirm(
+      '确定入库该危化品?',
+      '提示',
+      {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+      .then( async() => {
+        const res = await doEntryRaw(val.id)
+        if(res.code == 200){
+          ElMessage.success('入库成功')
+          await getList()
+        }else{
+          ElMessage.warning(res.message)
+        }
+      })
+}
+
+const printCode = (val) => {
+  console.log("val",val)
+  codeRef.value.openDialog('raw',val);
+
+}
+defineExpose({
+  getList
+});
+
+</script>
diff --git a/src/views/hazardousChemicals/warehouseManage/index.vue b/src/views/hazardousChemicals/warehouseManage/index.vue
index 8f64b3a..114e99c 100644
--- a/src/views/hazardousChemicals/warehouseManage/index.vue
+++ b/src/views/hazardousChemicals/warehouseManage/index.vue
@@ -1,9 +1,45 @@
 <template>
-  <div>入库管理</div>
+  <div>
+    <el-tabs v-model="data.activeName" class="demo-tabs" @click="clickTab" style="margin: 10px 10px">
+      <el-tab-pane label="成品" name="finishPro" v-if="showFinishPro">
+        <pro-table ref="proRef"></pro-table>
+      </el-tab-pane>
+      <el-tab-pane label="原材料" name="rawMaterial">
+        <raw-table ref="rawRef"></raw-table>
+      </el-tab-pane>
+    </el-tabs>
+  </div>
 
 </template>
 <script setup>
+import {onMounted, reactive, ref} from "vue";
+import proTable from './components/productTable.vue'
+import rawTable from './components/rawTable.vue'
+const showFinishPro = ref(false)
+const proRef = ref()
+const rawRef = ref()
+const data = reactive({
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+  },
+  total: 0,
+  dataList: [],
+  activeName: 'finishPro'
+})
 
+onMounted(()=>{
+  showFinishPro.value = true;
+  data.activeName = showFinishPro.value ? 'finishPro' : 'rawMaterial'
+})
+const clickTab = (tab,event) =>{
+  console.log('tab',data.activeName)
+  if(data.activeName == 'finishPro'){
+    proRef.value.getList()
+  }else {
+    rawRef.value.getList()
+  }
+}
 </script>
 
 <style scoped lang="scss">
diff --git a/src/views/homePage.vue b/src/views/homePage.vue
index 73c9b2e..e8e5894 100644
--- a/src/views/homePage.vue
+++ b/src/views/homePage.vue
@@ -58,7 +58,7 @@
                     <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
                   </el-input>
                   <div class="login-code">
-                    <img :src="codeUrl" @click="getCode" class="login-code-img"/>
+                    <img :src="codeUrl" @click="getCode" class="login-code-img" />
                   </div>
                 </div>
               </el-form-item>
@@ -207,6 +207,7 @@
 const openRegist = ()=>{
   regRef.value.dialogVisible = true
 }
+const imageBase64 = ref('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')
 
 watch(route, (newRoute) => {
   redirect.value = newRoute.query && newRoute.query.redirect;
@@ -288,11 +289,13 @@
 
 function getCode() {
   getCodeImg().then(res => {
-    captchaEnabled.value = res.data.captchaEnabled
-    if (captchaEnabled.value) {
-      codeUrl.value = "data:image/gif;base64," + res.data.image
+    // captchaEnabled.value = res.data.captchaEnabled
+    // debugger
+    // if (captchaEnabled.value) {
+      codeUrl.value = "data:image/*;base64," + res.data.image
+      console.log('res',codeUrl.value)
       loginForm.value.uuid = res.data.uuid
-    }
+    // }
   });
 }
 

--
Gitblit v1.9.2