yangg пре 1 година
родитељ
комит
f7d29ec40a

+ 302 - 0
src/api/goodsExchange.js

@@ -0,0 +1,302 @@
+/**
+ * 商品换货相关API
+ */
+
+import request from '@/utils/request'
+
+/**
+ * 归还商品换货
+ * @param id
+ * @param parmas
+ */
+export function returnGoodsExchange(id, parmas) {
+  return request({
+    url: `admin/change/form/return/${id}`,
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: parmas
+  })
+}
+
+/**
+ * 批量确认商品换货单
+ * @param id
+ */
+export function changeFormConfirm(ids) {
+  return request({
+    url: `admin/change/form/confirm/${ids}`,
+    method: 'post'
+  })
+}
+
+/**
+ * 修改商品换货
+ * @param id
+ * @param parmas
+ */
+export function editgoodsExchangeAdd(id, parmas) {
+  return request({
+    url: `admin/change/form/${id}`,
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: parmas
+  })
+}
+
+/**
+ * 添加商品换货
+ * @param params
+ */
+export function addgoodsExchangeAdd(params) {
+  return request({
+    url: 'admin/change/form',
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+
+/**
+ * 提交审核商品换货单
+ * @param ids
+ */
+export function submitAuditGoodsExchange(ids) {
+  return request({
+    url: `admin/change/form/submit/${ids}`,
+    method: 'post'
+  })
+}
+
+/**
+ * 撤回商品换货
+ * @param ids
+ */
+export function cancelGoodsExchange(ids) {
+  return request({
+    url: `admin/change/form/cancel/${ids}`,
+    method: 'post'
+  })
+}
+
+/**
+ * 审核商品换货
+ * @param params
+ */
+export function auditGoodsExchange(ids, parmas) {
+  return request({
+    url: `admin/change/form/audit/${ids}`,
+    method: 'post',
+    data: parmas
+  })
+}
+
+/**
+ *入库查询
+ * @param params
+ */
+export function getGoodsExchangeInfo(id) {
+  return request({
+    url: `/admin/erp/warehouseEntry/${id}`,
+    method: 'get',
+    loaidng: false
+  })
+}
+/**
+ *出库查询
+ * @param params
+ */
+ export function getGoodsWarehouseOut(id) {
+  return request({
+    url: `/admin/erp/warehouseOut/${id}`,
+    method: 'get',
+    loaidng: false
+  })
+}
+/**
+ * 获取商品换货列表
+ * @param params
+ */
+export function getGoodsExchangeList(params) {
+  return request({
+    url: 'admin/change/form',
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}
+
+/**
+ * 更新商品换货
+ * @param id
+ * @param parmas
+ */
+export function editGoodsExchange(id, parmas) {
+  return request({
+    url: `admin/change/form/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: parmas
+  })
+}
+
+/**
+ * 删除商品换货
+ * @param id
+ */
+export function deleteGoodsExchange(ids) {
+  return request({
+    url: `admin/change/form/${ids}`,
+    method: 'delete'
+  })
+}
+
+
+// 新增入库
+export function warehouseEntry(parmas) {
+  return request({
+    url: `/admin/erp/warehouseEntry`,
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: parmas
+  })
+}
+// 编辑入库 /admin/erp/warehouseEntry/{id}
+export function editWarehouseEntry(id, parmas) {
+  return request({
+    url: `/admin/erp/warehouseEntry/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: parmas
+  })
+}
+
+
+// 新增出库
+export function warehouseOut(parmas) {
+  return request({
+    url: `/admin/erp/warehouseOut`,
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: parmas
+  })
+}
+
+// 获取商品档案/admin/erp/goods
+
+export function getGoodsInfo(params,id) {
+  return request({
+    url: `/admin/erp/goods/getSkuByWarehouse/${id}`,
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}
+
+// 导出入库单 /admin/erp/warehouseEntry/export
+export function getGoodsExport(params) {
+  return request({
+    url: '/admin/erp/warehouseEntry/export',
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}
+
+// 出库列表 /admin/erp/warehouseOut
+
+export function getWarehouseOut(params) {
+  return request({
+    url: '/admin/erp/warehouseOut',
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}
+
+/* 获取入库列表 /admin/erp/warehouseEntry */
+
+export function getWarehouseEntry(params) {
+  return request({
+    url: '/admin/erp/warehouseEntry',//'/admin/erp/warehouseEntryProduct/query',
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}
+//获取用户信息 /admin/systems/admin-users/info
+export function getInfo(params) {
+  return request({
+    url: '/admin/systems/admin-users/info',
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}
+
+//获取商品信息
+
+export function getStockByWarehouseGood(params) {
+  return request({
+    url: '/admin/erp/warehouseEntryProduct/getStockByWarehouseGood',
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: params
+  })
+}
+//查询库存商品 /admin/erp/productStock
+export function getProductStock(params) {
+  return request({
+    url: '/admin/erp/productStock',
+    method: 'get',
+    loaidng: false,
+    params
+  })
+}
+
+//编辑出库 /admin/erp/warehouseOut
+
+export function editWarehouseOut(id, parmas) {
+  return request({
+    url: `/admin/erp/warehouseOut/${id}`,
+    method: 'put',
+    headers: { 'Content-Type': 'application/json' },
+    data: parmas
+  })
+}
+
+/* 扫条形码 /admin/erp/scancode/getProduct/{warehouseId}/{productCode}*/
+
+export function getProduct(warehouseId,productCode) {
+  return request({
+    url: `/admin/erp/scancode/getProduct/${warehouseId}/${productCode}`,
+    method: 'get',
+    loaidng: false
+  })
+}
+/* 扫序列号 /admin/erp/scancode/getsnCode/{sku}/{snCode} */
+export function getSnCode(type,sku,snCode) {
+  return request({
+    url: `/admin/erp/scancode/getsnCode/${type}/${sku}/${snCode}`,
+    method: 'get',
+    loaidng: false
+  })
+}
+
+/* 订单扫描 */
+
+export function getOneBySn(orderCode) {
+  return request({
+    url: `/admin/erp/order/getOneBySn/${orderCode}`,
+    method: 'get',
+    loaidng: false
+  })
+}
+/* 缓存序列号/admin/erp/scancode/skuRedis */
+export function skuRedis(parmas) {
+  return request({
+    url: `/admin/erp/scancode/skuRedis`,
+    method: 'post',
+    headers: { 'Content-Type': 'application/json' },
+    data: parmas
+  })
+}

+ 6 - 0
src/components/layout/Sidebar.vue

@@ -56,6 +56,12 @@
                   <li>
                     <router-link to="/stock/goodsTransfer" @click="toggleMobileMenu">{{ $t('goodsTransfer') }}</router-link>
                   </li>
+                  <li>
+                    <router-link to="/stock/goodsExchange" @click="toggleMobileMenu">{{ $t('goodsExchange') }}</router-link>
+                  </li>
+                  <li>
+                    <router-link to="/stock/goodsOutBound" @click="toggleMobileMenu">{{ $t('goodsOutBound') }}</router-link>
+                  </li>
                 </ul>
               </vue-collapsible>
             </li>

+ 9 - 0
src/composables/global-components.js

@@ -0,0 +1,9 @@
+import EnTableLayout from '@/components/TableLayout/index.vue';
+import EnTableSearch from '@/components/TableSearch/index.vue';
+
+export default {
+  install(app) {
+    app.component('EnTableLayout', EnTableLayout);
+    app.component('EnTableSearch', EnTableSearch);
+  }
+};

+ 3 - 1
src/locales/zh.json

@@ -3,7 +3,9 @@
     "warehouseList":"仓库列表",
     "goodsLend":"库位管理",
     "goodsTransfer":"库存列表",
-
+    "goodsExchange":"入库管理",
+    "goodsOutBound":"出库管理",
+    
     "sales": "销售量",
     "analytics": "分析",
     "apps": "应用",

+ 4 - 0
src/main.ts

@@ -90,4 +90,8 @@ app.config.globalProperties.checkPermission = (value: any): boolean => {
     }
 };
 
+/* 全局注册表格及搜索组件 */
+import globalComponents from '../src/composables/global-components'; // 引入全局组件插件
+app.use(globalComponents); // 使用全局组件插件
+
 app.mount('#app');

+ 2 - 0
src/router/index.ts

@@ -28,6 +28,8 @@ const asyncRouterMap: RouteRecordRaw[] = [
             { path: 'warehouseList', component: () => import('@/views/stock/warehouseList.vue'), name: 'warehouseList', meta: { title: 'warehouseList',layout: 'app' } },
             { path: 'goodsLend', component: () => import('@/views/stock/goodsLend.vue'), name: 'goodsLend', meta: { title: 'goodsLend',layout: 'app' } },
             { path: 'goodsTransfer', component: () => import('@/views/stock/goodsTransfer.vue'), name: 'goodsTransfer', meta: { title: 'goodsTransfer',layout: 'app' } },
+            { path: 'goodsExchange', component: () => import('@/views/stock/warehousing.vue'), name: 'goodsExchange', meta: { title: 'goodsExchange' } },
+            { path: 'goodsOutBound', component: () => import('@/views/stock/outbound.vue'), name: 'goodsOutBound', meta: { title: 'goodsOutBound' } },
         ]
     },
 ]

+ 3 - 1
src/views/stock/goodsLend.vue

@@ -115,7 +115,7 @@
       </div>
     </el-dialog>
     <el-dialog :title="title" v-model="dialogVisibleForm" width="940px" center @close="addHandleCancle" style="width: 30%;border-radius: 10px">
-      <el-form :model="addLendForm" ref="addLendForm"  :rules="rules" label-width="90px">
+      <el-form :model="addLendForm" ref="addLendFormRef"  :rules="rules" label-width="90px">
         <el-form-item label="仓库" prop="warehouse_id">
           <el-select v-model="addLendForm.warehouse_id" clearable @change="selWarehouse">
             <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
@@ -154,6 +154,7 @@ import { useRouter, useRoute } from 'vue-router';
 import QRCode from 'qrcode';
 import EnTableLayout from '@/components/TableLayout/index.vue';
 import EnTableSearch from '@/components/TableSearch/index.vue';
+import { ElMessageBox } from 'element-plus';
 
 const router = useRouter();
 const route = useRoute();
@@ -179,6 +180,7 @@ const addLendForm = reactive({
   code: '',
   intro: ''
 });
+
 const rules = reactive({
   warehouse_id: [{ required: true, message: '请选择仓库', trigger: 'change' }],
   name: [{ required: true, message: '请选择输入仓库名称', trigger: 'blur' }],

+ 315 - 0
src/views/stock/outbound.vue

@@ -0,0 +1,315 @@
+<template>
+  <div>
+    <div class="search">
+      <el-form ref="advancedFormRef" :model="advancedForm" label-width="160px">
+        <el-row>
+          <el-col :span="activeName === 'first' ? 12 : 8">
+            <el-form-item label="出入时间">
+              <el-date-picker
+                v-model="advancedForm.goodsExchange_time_range"
+                type="daterange"
+                align="center"
+                :editable="false"
+                unlink-panels
+                :clearable="true"
+                :default-time="['00:00:00', '23:59:59']"
+                range-separator="-"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="timestamp"
+                :picker-options="{
+                  disabledDate(time) {
+                    return time.getTime() - 1 >= new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()).getTime() + 86400000 - 1;
+                  },
+                  shortcuts: MixinPickerShortcuts,
+                }"
+              ></el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="仓库">
+              <el-select v-model="advancedForm.warehouse_id" clearable>
+                <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!--   <el-col :span="6" v-if="activeName === 'second'">
+              <el-form-item label="入库类型">
+                <el-select v-model="advancedForm.type" clearable>
+                  <el-option v-for="item in entryList" :key="item.id" :label="item.label" :value="item.value" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8" v-if="activeName === 'second'">
+              <el-form-item label="客户名称">
+                <el-input v-model="advancedForm.customer_name" clearable placeholder="请输入客户名称"></el-input>
+              </el-form-item>
+            </el-col>
+            <el-col :span="8" v-if="activeName === 'second'">
+              <el-form-item label="手机号">
+                <el-input v-model="advancedForm.customer_phone" clearable placeholder="请输入手机号"></el-input>
+              </el-form-item>
+            </el-col> -->
+        </el-row>
+      </el-form>
+      <el-button @click="advancedSearchEvent"> 搜索 </el-button>
+    </div>
+
+    <en-table-layout :tableData="tableData.data" :loading="loading" @selection-change="handleSelectionChange">
+      <template #toolbar>
+        <div class="inner-toolbar">
+          <div class="toolbar-btns">
+            <!-- <el-button size="mini" v-if="checkPermission(['addInventory']) && activeName === 'second'" type="primary" @click="handleAddGoodsExchange"
+                >新增入库</el-button
+              > -->
+            <el-button size="mini" v-if="checkPermission(['goodsExchangeAdd'])" type="primary" @click="handleShiftGoodsExchange">新增出库</el-button>
+          </div>
+        </div>
+      </template>
+
+      <template #table-columns>
+        <el-table-column type="selection" width="55" />
+        <el-table-column prop="sn" label="出库单号">
+          <template #default="scope">
+            {{ scope.row.sn }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="warehouse_id" label="仓库名称">
+          <template #default="scope">
+            {{ warehouseName(scope.row.warehouse_id) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="warehouse_id" label="客户名称">
+          <template #default="scope">
+            {{ scope.row.customer_name }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="warehouse_id" label="客户手机号">
+          <template #default="scope">
+            {{ scope.row.customer_phone }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="memo" label="出库类型">
+          <template #default="scope">
+            <span>{{ outName(scope.row.type) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="order_id_list" label="订单编号" />
+        <el-table-column label="状态">
+          <template #default="scope">
+            <span>{{ scope.row.has_submit === 'Y' ? '已出库' : '未出库' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="memo" label="出库时间">
+          <template #default="scope">
+            <span>{{ scope.row.create_time }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="memo" label="备注">
+          <template #default="scope">
+            <span>{{ scope.row.notes }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="450">
+          <template #default="scope">
+            <el-button size="mini" v-if="checkPermission(['checkInventory'])" @click="handleAuditGoodsExchange(scope.row)">查看</el-button>
+            <el-button
+              size="mini"
+              v-if="scope.row.has_submit === 'N' && checkPermission(['editInventory']) && checkPermission(['goodsExchangeEdit'])"
+              @click="handleEditGoodsExchange(scope.row)"
+              >出库</el-button
+            >
+          </template>
+        </el-table-column>
+      </template>
+
+      <el-pagination
+        v-if="tableData.data && tableData.data.length"
+        @size-change="handlePageSizeChange"
+        @current-change="handlePageCurrentChange"
+        :current-page="tableData.page_no"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="tableData.page_size"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="tableData.data_total"
+      ></el-pagination>
+    </en-table-layout>
+  </div>
+</template>
+    
+    <script setup>
+import { ref, reactive, onMounted, watchEffect } from 'vue';
+import { useRouter, useRoute } from 'vue-router';
+import * as API_GoodsExchange from '@/api/goodsExchange';
+import * as API_Setting from '@/api/setting';
+import * as API_BasicSetting from '@/api/basicSetting';
+
+const router = useRouter();
+const route = useRoute();
+
+const warehouseList = ref([]);
+const deptList = ref([]);
+const loading = ref(false);
+const params = reactive({
+  page_no: 1,
+  page_size: 10,
+});
+const advancedForm = reactive({});
+const tableData = ref('');
+const dialogVisible = ref(false);
+const multipleSelection = ref([]);
+const goodsExchangeForm = reactive({});
+const activeName = ref('second');
+const entryList = ref([]);
+const outList = ref([]);
+const advancedFormRef = ref(null);
+
+const GET_WarehouseList = () => {
+  API_BasicSetting.getWarehouseListAll().then((response) => {
+    warehouseList.value = response;
+  });
+};
+
+const GET_DeptList = () => {
+  /* API_Setting.getPage({ dictType: 'warehouse_entry_type' }).then((res) => {
+    entryList.value = res.data;
+  }); */
+  API_Setting.getPage({ dictType: 'out_warehouse_type' }).then((res) => {
+    outList.value = res.data;
+  });
+};
+
+const GET_GoodsExchangeList = () => {
+  loading.value = true;
+  API_GoodsExchange.getWarehouseOut(params)
+    .then((response) => {
+      loading.value = false;
+      tableData.value = response;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+
+const GET_WarehouseEntry = () => {
+  loading.value = true;
+  API_GoodsExchange.getWarehouseEntry(params)
+    .then((response) => {
+      loading.value = false;
+      tableData.value = response;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+
+const handleClick = (tab) => {
+  activeName.value = tab.name;
+  params.page_no = 1;
+  GET_GoodsExchangeList();
+};
+
+const handleEditGoodsExchange = (row) => {
+  router.push({
+    name: 'goodsExchangeEdit',
+    params: { id: row.id },
+  });
+};
+
+const handleAuditGoodsExchange = (row) => {
+  router.push({
+    name: 'checkInventory',
+    params: {
+      id: row.id,
+      type: activeName.value,
+    },
+  });
+};
+
+const handleSelectionChange = (val) => {
+  multipleSelection.value = val;
+};
+
+const handlePageSizeChange = (size) => {
+  params.page_size = size;
+  GET_GoodsExchangeList();
+};
+
+const handlePageCurrentChange = (page) => {
+  params.page_no = page;
+  GET_GoodsExchangeList();
+};
+
+const handleShiftGoodsExchange = () => {
+  router.push({
+    name: 'goodsExchangeAdd',
+    params: { callback: GET_GoodsExchangeList, type: 'first' },
+  });
+};
+
+const handleAddGoodsExchange = () => {
+  router.push({
+    name: 'addInventory',
+    params: { callback: GET_GoodsExchangeList, type: 'second' },
+  });
+};
+
+const advancedSearchEvent = () => {
+  Object.assign(params, advancedForm);
+  delete params.start_time;
+  delete params.end_time;
+  if (advancedForm.goodsExchange_time_range) {
+    params.start_time = parseInt(Number(advancedForm.goodsExchange_time_range[0]) / 1000);
+    params.end_time = parseInt(Number(advancedForm.goodsExchange_time_range[1]) / 1000);
+  }
+  delete params.goodsExchange_time_range;
+  params.page_no = 1;
+  GET_GoodsExchangeList();
+};
+
+const warehouseName = (val) => {
+  let name = '';
+  warehouseList.value.map((el) => {
+    if (el.id === val) {
+      name = el.name;
+    }
+  });
+  return name;
+};
+
+const outName = (val) => {
+  let name = '';
+  outList.value.map((el) => {
+    if (el.value === val) {
+      name = el.label;
+    }
+  });
+  return name;
+};
+
+const entryName = (val) => {
+  let name = '';
+  entryList.value.map((el) => {
+    if (el.value === val) {
+      name = el.label;
+    }
+  });
+  return name;
+};
+
+onMounted(() => {
+  GET_GoodsExchangeList();
+  GET_DeptList();
+  GET_WarehouseList();
+});
+
+watchEffect(() => {
+  if (route.query.status) {
+    params.status = route.query.status;
+    advancedForm.status = route.query.status;
+  }
+  params.page_no = 1;
+
+  GET_GoodsExchangeList();
+});
+</script>

+ 7 - 8
src/views/stock/warehouseList.vue

@@ -52,7 +52,7 @@
       :close-on-click-modal="false"
       :close-on-press-escape="false"
     >
-      <el-form :model="stockForm" :rules="stockRules" ref="stockForm" label-width="120px">
+      <el-form :model="stockForm" :rules="stockRules" ref="stockFormRef" label-width="120px">
         <el-form-item label="仓库编号" prop="sn">
           <el-input v-model="stockForm.sn" :minlength="2" :maxlength="4" clearable placeholder="请输入仓库编号"></el-input>
         </el-form-item>
@@ -88,14 +88,12 @@
 <script lang="ts" setup>
 import { ref, onMounted } from 'vue';
 import { useStore } from 'vuex';
-import { ElMessageBox } from 'element-plus';
+import { ElMessageBox,FormInstance,ElMessage } from 'element-plus';
 import * as API_BasicSetting from '@/api/basicSetting';
 import * as API_Setting from '@/api/setting';
 import * as API_Auth from '@/api/auth';
 import Storage from '@/utils/storage';
 import router from '@/router';
-import EnTableLayout from '@/components/TableLayout/index.vue';
-import EnTableSearch from '@/components/TableSearch/index.vue';
 import { provinceAndCityData, pcTextArr, regionData, pcaTextArr, codeToText } from 'element-china-area-data';
 
 const store = useStore();
@@ -129,7 +127,7 @@ const params = ref({
   page_size: 10,
   keyword: '',
 });
-
+const stockFormRef = ref();
 const checkPermission = (permissions: string[]): boolean => {
   // Implement your permission check logic here
   return true;
@@ -170,12 +168,12 @@ const handlePageCurrentChange = (page: number) => {
 
 const handleDialogOpen = () => {
   setTimeout(() => {
-    stockForm.value.clearValidate();
+    stockFormRef.value.clearValidate();
   });
 };
 
 const submitWarehouseForm = () => {
-  stockForm.value.validate((valid: boolean) => {
+  stockFormRef.value.validate((valid: boolean) => {
     if (valid) {
       const { id } = stockForm.value;
       const params = { ...stockForm.value };
@@ -199,7 +197,8 @@ const submitWarehouseForm = () => {
         });
       }
     } else {
-      store.dispatch('showMessage', { message: '表单填写有误,请核对!', type: 'error' });
+      ElMessage.error('表单填写有误,请核对!')
+   /*    store.dispatch('showMessage', { message: '表单填写有误,请核对!', type: 'error' }); */
       return false;
     }
   });

+ 319 - 0
src/views/stock/warehousing.vue

@@ -0,0 +1,319 @@
+<template>
+  <div>
+    <div class="search flex items-center bg-white pt-2">
+      <el-form ref="advancedFormRef" :model="advancedForm" label-width="100px">
+        <el-row>
+          <el-col :span="activeName === 'first' ? 12 : 8">
+            <el-form-item label="出入时间">
+              <el-date-picker
+                v-model="advancedForm.goodsExchange_time_range"
+                type="daterange"
+                align="center"
+                :editable="false"
+                unlink-panels
+                :clearable="true"
+                :default-time="['00:00:00', '23:59:59']"
+                range-separator="-"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期"
+                value-format="timestamp"
+                :picker-options="{
+                  disabledDate(time) {
+                    return time.getTime() - 1 >= new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate()).getTime() + 86400000 - 1;
+                  },
+                  shortcuts: MixinPickerShortcuts,
+                }"
+              ></el-date-picker>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="仓库">
+              <el-select v-model="advancedForm.warehouse_id" clearable>
+                <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="6" v-if="activeName === 'second'">
+            <el-form-item label="入库类型">
+              <el-select v-model="advancedForm.type" clearable>
+                <el-option v-for="item in entryList" :key="item.id" :label="item.label" :value="item.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8" v-if="activeName === 'second'">
+            <el-form-item label="客户名称">
+              <el-input v-model="advancedForm.customer_name" clearable placeholder="请输入客户名称"></el-input>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8" v-if="activeName === 'second'">
+            <el-form-item label="手机号">
+              <el-input v-model="advancedForm.customer_phone" clearable placeholder="请输入手机号"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <el-button class="mr-3" @click="advancedSearchEvent"> 搜索 </el-button>
+    </div>
+
+    <en-table-layout :tableData="tableData.data" :loading="loading" @selection-change="handleSelectionChange">
+      <template #toolbar>
+        <div class="inner-toolbar">
+          <div class="toolbar-btns">
+            <el-button size="mini" v-if="checkPermission(['addInventory']) && activeName === 'second'" type="primary" @click="handleAddGoodsExchange"
+              >新增入库</el-button
+            >
+          </div>
+        </div>
+      </template>
+
+      <template #table-columns>
+        <el-table-column type="selection" width="55" />
+        <el-table-column v-if="activeName === 'first'" prop="sn" label="出库单号">
+          <template #default="scope">
+            {{ scope.row.sn }}
+          </template>
+        </el-table-column>
+        <el-table-column v-else prop="sn" label="入库单号">
+          <template #default="scope">
+            {{ scope.row.sn }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="warehouse_id" label="仓库名称">
+          <template #default="scope">
+            {{ warehouseName(scope.row.warehouse_id) }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="warehouse_id" label="客户名称">
+          <template #default="scope">
+            {{ scope.row.customer_name }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="warehouse_id" label="客户手机号">
+          <template #default="scope">
+            {{ scope.row.customer_phone }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="memo" label="入库类型">
+          <template #default="scope">
+            <span>{{ entryName(scope.row.type) }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="memo" label="入库时间">
+          <template #default="scope">
+            <span>{{ scope.row.create_time }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="order_id_list" label="订单编号" />
+        <el-table-column label="状态">
+          <template #default="scope">
+            <span>{{ scope.row.has_submit === 'Y' ? '已入库' : '未入库' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="memo" label="备注">
+          <template #default="scope">
+            <span>{{ scope.row.memo }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" >
+          <template #default="scope">
+            <el-button class="mr-1 mt-1" size="mini" v-if="checkPermission(['checkInventory'])" @click="handleAuditGoodsExchange(scope.row)">查看</el-button>
+            <el-button
+              size="mini"
+              class="!ml-0 mt-1"
+              v-if="scope.row.has_submit === 'N' && checkPermission(['editInventory']) && checkPermission(['goodsExchangeEdit'])"
+              @click="handleEditGoodsExchange(scope.row)"
+              >入库</el-button
+            >
+          </template>
+        </el-table-column>
+      </template>
+
+      <el-pagination
+        v-if="tableData.data && tableData.data.length"
+        @size-change="handlePageSizeChange"
+        @current-change="handlePageCurrentChange"
+        :current-page="tableData.page_no"
+        :page-sizes="[10, 20, 50, 100]"
+        :page-size="tableData.page_size"
+        layout="total, sizes, prev, pager, next, jumper"
+        :total="tableData.data_total"
+      ></el-pagination>
+    </en-table-layout>
+  </div>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted, watchEffect } from 'vue';
+import { useRouter, useRoute } from 'vue-router';
+import * as API_GoodsExchange from '@/api/goodsExchange';
+import * as API_Setting from '@/api/setting';
+import * as API_BasicSetting from '@/api/basicSetting';
+
+const router = useRouter();
+const route = useRoute();
+
+const warehouseList = ref([]);
+const deptList = ref([]);
+const loading = ref(false);
+const params = reactive({
+  page_no: 1,
+  page_size: 10,
+});
+const advancedForm = reactive({});
+const tableData = ref('');
+const dialogVisible = ref(false);
+const multipleSelection = ref([]);
+const goodsExchangeForm = reactive({});
+const activeName = ref('second');
+const entryList = ref([]);
+const outList = ref([]);
+const advancedFormRef = ref(null);
+
+const GET_WarehouseList = () => {
+  API_BasicSetting.getWarehouseListAll().then((response) => {
+    warehouseList.value = response;
+  });
+};
+
+const GET_DeptList = () => {
+  API_Setting.getPage({ dictType: 'warehouse_entry_type' }).then((res) => {
+    entryList.value = res.data;
+  });
+/*   API_Setting.getPage({ dictType: 'out_warehouse_type' }).then((res) => {
+    outList.value = res.data;
+  }); */
+};
+
+const GET_GoodsExchangeList = () => {
+  loading.value = true;
+  API_GoodsExchange.getWarehouseOut(params)
+    .then((response) => {
+      loading.value = false;
+      tableData.value = response;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+
+const GET_WarehouseEntry = () => {
+  loading.value = true;
+  API_GoodsExchange.getWarehouseEntry(params)
+    .then((response) => {
+      loading.value = false;
+      tableData.value = response;
+    })
+    .catch(() => {
+      loading.value = false;
+    });
+};
+
+const handleClick = (tab) => {
+  activeName.value = tab.name;
+  params.page_no = 1;
+  GET_WarehouseEntry();
+};
+
+const handleEditGoodsExchange = (row) => {
+  router.push({
+    name: 'editInventory',
+    params: { id: row.id },
+  });
+};
+
+const handleAuditGoodsExchange = (row) => {
+  router.push({
+    name: 'checkInventory',
+    params: {
+      id: row.id,
+      type: activeName.value,
+    },
+  });
+};
+
+const handleSelectionChange = (val) => {
+  multipleSelection.value = val;
+};
+
+const handlePageSizeChange = (size) => {
+  params.page_size = size;
+  GET_WarehouseEntry();
+};
+
+const handlePageCurrentChange = (page) => {
+  params.page_no = page;
+  GET_WarehouseEntry();
+};
+
+const handleShiftGoodsExchange = () => {
+  router.push({
+    name: 'goodsExchangeAdd',
+    params: { callback: GET_GoodsExchangeList, type: 'first' },
+  });
+};
+
+const handleAddGoodsExchange = () => {
+  router.push({
+    name: 'addInventory',
+    params: { callback: GET_GoodsExchangeList, type: 'second' },
+  });
+};
+
+const advancedSearchEvent = () => {
+  Object.assign(params, advancedForm);
+  delete params.start_time;
+  delete params.end_time;
+  if (advancedForm.goodsExchange_time_range) {
+    params.start_time = parseInt(Number(advancedForm.goodsExchange_time_range[0]) / 1000);
+    params.end_time = parseInt(Number(advancedForm.goodsExchange_time_range[1]) / 1000);
+  }
+  delete params.goodsExchange_time_range;
+  params.page_no = 1;
+  GET_WarehouseEntry();
+};
+
+const warehouseName = (val) => {
+  let name = '';
+  warehouseList.value.map((el) => {
+    if (el.id === val) {
+      name = el.name;
+    }
+  });
+  return name;
+};
+
+const outName = (val) => {
+  let name = '';
+  outList.value.map((el) => {
+    if (el.value === val) {
+      name = el.label;
+    }
+  });
+  return name;
+};
+
+const entryName = (val) => {
+  let name = '';
+  entryList.value.map((el) => {
+    if (el.value === val) {
+      name = el.label;
+    }
+  });
+  return name;
+};
+
+onMounted(() => {
+  GET_WarehouseEntry();
+  GET_DeptList();
+  GET_WarehouseList();
+});
+
+watchEffect(() => {
+  if (route.query.status) {
+    params.status = route.query.status;
+    advancedForm.status = route.query.status;
+  }
+  params.page_no = 1;
+  GET_WarehouseEntry();
+});
+</script>