Просмотр исходного кода

调拨单,换货单页面添加

sunlupeng 7 месяцев назад
Родитель
Сommit
2cf6ef4720

+ 49 - 0
src/api/requisition.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+export function listRequisition(query) {
+  return request({
+    url: '/warehouse-entry/page',
+    method: 'get',
+    params: query
+  })
+}
+
+export function executeRequisition(query) {
+  return request({
+    url: '/warehouse-entry/execute',
+    method: 'post',
+    params:query
+  })
+}
+
+export function createRequisition(data) {
+  return request({
+    url: '/warehouse-entry/add',
+    method: 'post',
+    data
+  })
+}
+
+export function readRequisition(query) {
+  return request({
+    url: '/warehouse-entry/info',
+    method: 'get',
+    params:query
+  })
+}
+
+export function updateRequisition(data) {
+  return request({
+    url: '/warehouse-entry/edit',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteRequisition(query) {
+  return request({
+    url: '/warehouse-entry/remove',
+    method: 'post',
+    params:query
+  })
+}

+ 6 - 6
src/api/retrieval.js

@@ -1,6 +1,6 @@
 import request from '@/utils/request'
 
-export function listWarehousing(query) {
+export function listRetrieval(query) {
   return request({
     url: '/warehouse-entry/page',
     method: 'get',
@@ -8,7 +8,7 @@ export function listWarehousing(query) {
   })
 }
 
-export function executeWarehousing(query) {
+export function executeRetrieval(query) {
   return request({
     url: '/warehouse-entry/execute',
     method: 'post',
@@ -16,7 +16,7 @@ export function executeWarehousing(query) {
   })
 }
 
-export function createWarehousing(data) {
+export function createRetrieval(data) {
   return request({
     url: '/warehouse-entry/add',
     method: 'post',
@@ -24,7 +24,7 @@ export function createWarehousing(data) {
   })
 }
 
-export function readWarehousing(query) {
+export function readRetrieval(query) {
   return request({
     url: '/warehouse-entry/info',
     method: 'get',
@@ -32,7 +32,7 @@ export function readWarehousing(query) {
   })
 }
 
-export function updateWarehousing(data) {
+export function updateRetrieval(data) {
   return request({
     url: '/warehouse-entry/edit',
     method: 'post',
@@ -40,7 +40,7 @@ export function updateWarehousing(data) {
   })
 }
 
-export function deleteWarehousing(query) {
+export function deleteRetrieval(query) {
   return request({
     url: '/warehouse-entry/remove',
     method: 'post',

+ 49 - 0
src/api/swap.js

@@ -0,0 +1,49 @@
+import request from '@/utils/request'
+
+export function listSwap(query) {
+  return request({
+    url: '/warehouse-entry/page',
+    method: 'get',
+    params: query
+  })
+}
+
+export function executeSwap(query) {
+  return request({
+    url: '/warehouse-entry/execute',
+    method: 'post',
+    params:query
+  })
+}
+
+export function createSwap(data) {
+  return request({
+    url: '/warehouse-entry/add',
+    method: 'post',
+    data
+  })
+}
+
+export function readSwap(query) {
+  return request({
+    url: '/warehouse-entry/info',
+    method: 'get',
+    params:query
+  })
+}
+
+export function updateSwap(data) {
+  return request({
+    url: '/warehouse-entry/edit',
+    method: 'post',
+    data
+  })
+}
+
+export function deleteSwap(query) {
+  return request({
+    url: '/warehouse-entry/remove',
+    method: 'post',
+    params:query
+  })
+}

+ 8 - 0
src/permission.js

@@ -124,6 +124,14 @@ const myRoles = [
   'retrievalAdd',
   'retrievalEdit',
   'retrievalDetail',
+  'requisition',
+  'requisitionAdd',
+  'requisitionEdit',
+  'requisitionDetail',
+  'swap',
+  'swapAdd',
+  'swapEdit',
+  'swapDetail',
 
   'dictManage', 
   'dictList', 

+ 10 - 0
src/router/index.js

@@ -101,6 +101,16 @@ export const asyncRouterMap = [
         { path: 'retrievalAdd', component: _import('stock/retrieval/retrievalAdd'), name: 'retrievalAdd', meta: { title: '新增出库单', noCache: false, hideTag: true, hidden: true }},
         { path: 'retrievalEdit/:id', component: _import('stock/retrieval/retrievalAdd'), name: 'retrievalEdit', meta: { title: '编辑出库单', noCache: false, hideTag: true, hidden: true }},
         { path: 'retrievalDetail/:id', component: _import('stock/retrieval/retrievalAdd'), name: 'retrievalDetail', meta: { title: '出库单详情', noCache: false, hideTag: true, hidden: true }},
+        // 调拨单
+        { path: 'requisition', component: _import('stock/requisition/requisition'), name: 'requisition', meta: { title: '调拨单', noCache: true }},
+        { path: 'requisitionAdd', component: _import('stock/requisition/requisitionAdd'), name: 'requisitionAdd', meta: { title: '新增调拨单', noCache: false, hideTag: true, hidden: true }},
+        { path: 'requisitionEdit/:id', component: _import('stock/requisition/requisitionAdd'), name: 'requisitionEdit', meta: { title: '编辑调拨单', noCache: false, hideTag: true, hidden: true }},
+        { path: 'requisitionDetail/:id', component: _import('stock/requisition/requisitionAdd'), name: 'requisitionDetail', meta: { title: '调拨单详情', noCache: false, hideTag: true, hidden: true }},
+        // 换货单
+        { path: 'swap', component: _import('stock/swap/swap'), name: 'swap', meta: { title: '换货单', noCache: true }},
+        { path: 'swapAdd', component: _import('stock/swap/swapAdd'), name: 'swapAdd', meta: { title: '新增换货单', noCache: false, hideTag: true, hidden: true }},
+        { path: 'swapEdit/:id', component: _import('stock/swap/swapAdd'), name: 'swapEdit', meta: { title: '编辑换货单', noCache: false, hideTag: true, hidden: true }},
+        { path: 'swapDetail/:id', component: _import('stock/swap/swapAdd'), name: 'swapDetail', meta: { title: '换货单详情', noCache: false, hideTag: true, hidden: true }},
       ]
     },
   

+ 282 - 0
src/views/stock/requisition/requisition.vue

@@ -0,0 +1,282 @@
+<template>
+  <div class="app-container calendar-list-container">
+    <!-- 查询和其他操作 -->
+    <div class="filter-container">
+      <el-date-picker v-model="listQuery.startDate" value-format="yyyy-MM-dd" type="date" placeholder="开始日期"
+        style="width:200px">
+      </el-date-picker>
+      <el-date-picker v-model="listQuery.endDate" value-format="yyyy-MM-dd" type="date" placeholder="结束日期"
+        style="width:200px">
+      </el-date-picker>
+      <el-select v-model="listQuery.warehouseId" clearable placeholder="请选择仓库" class="filter-item" style="width: 200px">
+        <el-option :key="item.id" v-for="item in warehouseList" :label="item.warehouseName" :value="item.id">
+        </el-option>
+      </el-select>
+      <el-select v-model="listQuery.isRunFinish" clearable placeholder="请选择状态" class="filter-item" style="width: 200px">
+        <el-option :key="item.type" v-for="item in typeList" :label="item.name" :value="item.type">
+        </el-option>
+      </el-select>
+      <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查找</el-button>
+      <el-button class="filter-item" v-waves icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      <el-button class="filter-item" type="primary" @click="handleCreate" icon="el-icon-plus">添加</el-button>
+      <!-- <el-button class="filter-item" :loading="downloadLoading" v-waves icon="el-icon-download"
+        @click="handleDownload">导出</el-button> -->
+      <!-- <el-button class="filter-item" type="success" icon="el-icon-takeaway-box" @click="executeAll">批量入库</el-button> -->
+      <el-button class="filter-item" type="warning" icon="el-icon-delete" @click="delAll">批量删除</el-button>
+    </div>
+
+    <!-- 查询结果 -->
+    <el-table size="small" :data="list" @selection-change="handleSelectionChange" v-loading="listLoading"
+      element-loading-text="正在查询中。。。" border fit highlight-current-row>
+      <el-table-column type="selection" width="55px"> </el-table-column>
+      <el-table-column type="index" label="序号" header-align="center" align="center">
+      </el-table-column>
+      <el-table-column align="center" min-width="150px" label="入库单号">
+        <template slot-scope="scope">
+          <router-link :to="{ name: 'requisitionDetail', params: { id: scope.row.id } }">
+            <div style="color: #337ab7;cursor: pointer;">{{ scope.row.serialCode }}</div>
+          </router-link>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="入库时间" prop="serialDate">
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="供应商" prop="supplierName">
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="仓库" prop="warehouseName">
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="经手人" prop="addHandlerName">
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="入库状态">
+        <template slot-scope="props">
+            <span v-if="props.row.isRunFinish == '0'" style="color: #67C23A;font-weight: bold;">已入库</span>
+            <span v-if="props.row.isRunFinish == '1'" style="color: #E6A23C;font-weight: bold;">待入库</span>
+          </template>
+      </el-table-column>
+      <el-table-column align="center" label="操作" width="240px" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button v-if="scope.row.isRunFinish == '1'" type="success" size="small" @click="handleExecute(scope.row)">入库</el-button>
+          <el-button type="primary" size="small" @click="handleUpdate(scope.row)">编辑</el-button>
+          <el-button type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <div class="pagination-container">
+      <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        :current-page="listQuery.page" :page-sizes="[10, 20, 30, 50]" :page-size="listQuery.limit"
+        layout="total, sizes, prev, pager, next, jumper" :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+<script>
+import { listRequisition, deleteRequisition, executeRequisition } from "@/api/requisition";
+import { warehouseList } from "@/api/warehouse";
+import waves from "@/directive/waves"; // 水波纹指令
+
+export default {
+  directives: { waves },
+  data() {
+    return {
+      downloadLoading: false,
+      warehouseList: [],
+      typeList: [
+        {
+          type: '0',
+          name: "已入库",
+        },
+        {
+          type: '1',
+          name: "待入库",
+        },
+      ],
+      list: [
+
+      ],
+      delarr: [],
+      multipleSelection: [],
+      total: 0,
+      listLoading: false,
+      listQuery: {
+        page: 1,
+        limit: 10,
+        startDate: '',
+        endDate: '',
+        warehouseId: '',
+        isRunFinish: '',
+      },
+    }
+  },
+  created() {
+    this.getStoreList();
+    this.getList();
+  },
+  methods: {
+    /** 获取仓库列表数据 */
+    getStoreList() {
+      warehouseList().then(response => {
+        this.warehouseList = response.data.data;
+      }).catch(() => { });
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.listQuery = {
+        page: 1,
+        limit: 10,
+        startDate: '',
+        endDate: '',
+        warehouseId: '',
+        isRunFinish: '',
+      },
+        this.getList()
+    },
+    handleDownload() {
+      this.downloadLoading = true
+      import('@/vendor/Export2Excel').then(excel => {
+        const tHeader = ['用户ID', '用户名称', '用户昵称', '用户头像']
+        const filterVal = ['id', 'username', 'nickname', 'avatar']
+        excel.export_json_to_excel2(tHeader, this.list, filterVal, '用户信息')
+        this.downloadLoading = false
+      })
+    },
+    handleCreate() {
+      this.$router.push({
+        name: 'requisitionAdd',
+        // params: { callback: this.getList }
+      })
+    },
+    getList() {
+      this.listLoading = true
+      listRequisition(this.listQuery).then(response => {
+        this.list = response.data.data.items
+        this.total = response.data.data.total
+        this.listLoading = false
+      }).catch(() => {
+        this.list = []
+        this.total = 0
+        this.listLoading = false
+      })
+    },
+
+    handleFilter() {
+      this.listQuery.page = 1
+      this.getList()
+    },
+
+    handleSizeChange(val) {
+      this.listQuery.limit = val
+      this.getList()
+    },
+
+    handleCurrentChange(val) {
+      this.listQuery.page = val
+      this.getList()
+    },
+
+    handleUpdate(row) {
+      this.$router.push({
+        name: 'requisitionEdit',
+        params: { id: row.id }
+      })
+    },
+    handleExecute(row) {
+      this.$confirm('确认入库吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        executeRequisition({ ids: row.id }).then(response => {
+          this.$notify({
+            title: '成功',
+            message: '入库成功',
+            type: 'success',
+            duration: 2000
+          })
+          this.getList()
+        })
+      }).catch(() => { })
+    },
+    executeAll() {
+      const length = this.multipleSelection.length;
+      if (length > 0) {
+        this.$confirm("确认入库吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(() => {
+          for (let i = 0; i < length; i++) {
+            this.delarr.push(this.multipleSelection[i].id);
+          }
+          const ids = this.delarr.join(",");
+          executeRequisition({ ids: ids }).then(() => {
+            this.$notify({
+              title: "成功",
+              message: "入库成功",
+              type: "success",
+              duration: 2000,
+            });
+            this.getList();
+          })
+        })
+      } else {
+        this.$notify({
+          title: "提示",
+          message: "请选择要入库的信息!",
+          type: "warning",
+        });
+      }
+    },
+    handleDelete(row) {
+      this.$confirm('确认删除吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        deleteRequisition({ ids: row.id }).then(response => {
+          this.$notify({
+            title: '成功',
+            message: '删除成功',
+            type: 'success',
+            duration: 2000
+          })
+          this.getList()
+        })
+      }).catch(() => { })
+    },
+    delAll() {
+      const length = this.multipleSelection.length;
+      if (length > 0) {
+        this.$confirm("确认删除吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(() => {
+          for (let i = 0; i < length; i++) {
+            this.delarr.push(this.multipleSelection[i].id);
+          }
+          const ids = this.delarr.join(",");
+          deleteRequisition({ ids: ids }).then(() => {
+            this.$notify({
+              title: "成功",
+              message: "删除成功",
+              type: "success",
+              duration: 2000,
+            });
+            this.getList();
+          })
+        })
+      } else {
+        this.$notify({
+          title: "提示",
+          message: "请选择要删除的信息!",
+          type: "warning",
+        });
+      }
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+  }
+}
+</script>

+ 335 - 0
src/views/stock/requisition/requisitionAdd.vue

@@ -0,0 +1,335 @@
+<template>
+    <div class="app-container">
+        <el-form ref="dataForm" :model="dataForm" :rules="rules" label-width="120px" inline>
+            <h3>通用入库单</h3>
+            <!-- <el-form-item label="名称" prop="name">
+                <el-input v-model="dataForm.name" :minlength="2" :maxlength="20" clearable
+                    placeholder="请输入名称" style="width:200px" :disabled="type === 'detail'"></el-input>
+            </el-form-item> -->
+            <el-form-item label="入库时间" prop="serialDate">
+                <el-date-picker v-model="dataForm.serialDate" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
+                    placeholder="选择日期时间" style="width:200px" :disabled="type === 'detail'">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item label="供应商" prop="supplierId">
+                <el-select v-model="dataForm.supplierId" clearable placeholder="请选择" style="width: 200px;" :disabled="type === 'detail'">
+                    <el-option :key="item.id" v-for="item in supplierList" :label="item.businessName" :value="item.id">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="仓库" prop="warehouseId">
+                <el-select v-model="dataForm.warehouseId" clearable placeholder="请选择" style="width: 200px;" :disabled="type === 'detail'">
+                    <el-option :key="item.id" v-for="item in warehouseList" :label="item.warehouseName" :value="item.id">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="经手人" prop="addHandlerId">
+                <el-select v-model="dataForm.addHandlerId" clearable filterable placeholder="请选择" style="width: 200px" :disabled="type === 'detail'">
+                    <el-option :key="item.loginId" v-for="item in recipientsList" :label="item.deptName+'_'+item.userName" :value="item.loginId">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            
+
+            <!-- <el-form-item label="采购说明" prop="desc">
+                <el-input style="width:535px" v-model="dataForm.desc" :maxlength="120"
+                    type="textarea" :disabled="type === 'detail'" :autosize="{ minRows: 1, maxRows: 4 }"
+                    placeholder="请输入采购说明 最大120字"></el-input>
+            </el-form-item> -->
+            <el-form-item label="附件:" prop="fileIds">
+                <el-upload :limit="1" :action="fileUrl" :file-list="dataForm.fileList" :on-success="handleFileSuccess"
+                    :before-upload="beforeUploadFile" :on-remove="handleRemove">
+                    <el-button size="small" type="primary" :disabled="type === 'detail'">点击上传</el-button>
+                </el-upload>
+            </el-form-item>
+            <div class="mx">
+        <h3>入库明细</h3>
+        <el-button size="small" type="primary" v-if="type !== 'detail'"
+          @click="handleSelectGoods" icon="el-icon-plus">商品/物料</el-button>
+      </div>
+      <el-table size="small" :data="dataForm.inventoryEntryInfos" border :cell-style="{ textAlign: 'center' }"
+            :header-cell-style="{ textAlign: 'center' }" style="width: 100%">
+            <el-table-column label="商品编号">
+              <template slot-scope="scope">
+                {{ scope.row.productCode }}
+              </template>
+            </el-table-column>
+            <el-table-column label="商品名称">
+              <template slot-scope="scope">
+                {{ scope.row.productName }}
+              </template>
+            </el-table-column>
+            <el-table-column label="单价(¥)">
+              <template slot-scope="scope">
+                {{ scope.row.createPrice.toFixed(2) }}
+              </template>
+            </el-table-column>
+            <el-table-column label="库存数量">
+              <template slot-scope="scope">
+                {{ scope.row.createProductNumber }}
+              </template>
+            </el-table-column>
+            <el-table-column label="入库数量">
+              <template slot-scope="scope">
+                <el-form-item v-if="type !== 'detail'" :prop="'inventoryEntryInfos.'+scope.$index+'.updateNumber'" :rules="{ required: true, message: '入库数量不能为空', trigger: 'blur' }" class="tableFormItem">
+                    <el-input-number v-model="scope.row.updateNumber" @change="handleChange(scope.row)" size="small" :min="1" :max="10000" label="入库数量"></el-input-number>
+                </el-form-item>
+                <span v-else>{{ scope.row.updateNumber }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="合计(¥)">
+              <template slot-scope="scope">
+                {{ scope.row.sumPrice.toFixed(2) }}
+              </template>
+            </el-table-column>
+            <!-- <el-table-column label="备注">
+              <template slot-scope="scope">
+                <el-input :maxlength="99" v-model="scope.row.remark" :disabled="type === 'detail'" />
+              </template>
+            </el-table-column> -->
+            <el-table-column label="操作" width="150" v-if="type !== 'detail'">
+              <template slot-scope="scope">
+                <el-button size="mini" type="danger"
+                  @click="dataForm.inventoryEntryInfos.splice(scope.$index, 1)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form>
+        <div class="footer">
+            <el-button type="primary" @click="submitForm" v-if="type !== 'detail'">保存
+            </el-button>
+            <el-button @click="roBack()">返回
+            </el-button>
+        </div>
+    </div>
+</template>
+<script>
+import { createRequisition, updateRequisition, readRequisition } from "@/api/requisition";
+import { supplierList } from "@/api/supplier";
+import { warehouseList } from "@/api/warehouse";
+import { allUserList } from "@/api/public";
+import waves from "@/directive/waves"; // 水波纹指令
+
+export default {
+    directives: { waves },
+    data() {
+        return {
+            fileUrl:this.upLoadUrl,
+            recipientsList:[],
+            supplierList: [],
+            warehouseList: [],
+            id: '',
+            type: '',
+            /** 表单*/
+            dataForm: {
+                serialDate:'',
+                supplierId:undefined,
+                warehouseId:undefined,
+                addHandlerId:undefined,
+                fileIds:undefined,
+                fileList: [],
+                inventoryEntryInfos: []
+            },
+            rules: {
+                serialDate: [
+                    { required: true, message: '请选择入库时间', trigger: 'blur' }
+                ],
+                warehouseId: [
+                    { required: true, message: '请选择仓库', trigger: 'blur' }
+                ],
+                addHandlerId: [
+                    { required: true, message: '请选择经手人', trigger: 'blur' }
+                ],
+            },
+        }
+    },
+    watch: {
+        $route: {
+            immediate: true,
+            handler(newVal) {
+                if (this.$route.name === 'requisitionAdd') {
+                    this.dataForm = {
+                        serialDate:undefined,
+                        supplierId:undefined,
+                        warehouseId:undefined,
+                        addHandlerId:undefined,
+                        fileIds:undefined,
+                        fileList: [],
+                        inventoryEntryInfos: []
+                    }
+                } else if (this.$route.name === 'requisitionDetail') {
+                    this.type = 'detail'
+                }
+                if (this.$route.params.id) {
+                    this.id = this.$route.params.id
+                    this.getDataFormDetail()
+                }
+            }
+        }
+    },
+    mounted() {
+        this.getSupplierList();
+        this.getStoreList(); 
+        this.getAllUserList(); 
+    },
+    methods: {
+        /** 获取供应商列表数据 */
+        getSupplierList(){
+            supplierList().then(response => {
+                this.supplierList = response.data.data;
+            }).catch(() => { });
+        },
+        /** 获取仓库列表数据 */
+        getStoreList() {
+            warehouseList().then(response => {
+                this.warehouseList = response.data.data;
+            }).catch(() => {});
+        },
+        /** 获取人员列表数据 */
+        getAllUserList() {
+            allUserList().then(response => {
+                this.recipientsList = response.data.data;
+            }).catch(() => { });
+        },
+        /** 获取详情页面数据 */
+        getDataFormDetail() {
+            readRequisition({ id: this.id }).then(response => {
+                let dataForm = response.data.data;
+                dataForm.inventoryEntryInfos = dataForm.inventoryEntryInfos == null ? [] : dataForm.inventoryEntryInfos
+                dataForm.inventoryOutInfos = dataForm.inventoryOutInfos == null ? [] : dataForm.inventoryOutInfos
+                this.dataForm = dataForm;
+            }).catch(() => {})
+        },
+         // 选择商品
+        async handleSelectGoods() {
+            if (!this.dataForm.warehouseId) {
+                this.$message.error('请先选择仓库!')
+                return
+            }else{
+                console.log(this.dataForm.inventoryEntryInfos)
+                let selectedIds = this.dataForm.inventoryEntryInfos.map(item => item.id);
+                const Goods = await this.$EnPickerGoods({
+                    // goodsApi: '/warehouse-entry/info/inventory',
+                    selectedIds: selectedIds,
+                    goodsApiParams: { warehouseId: this.dataForm.warehouseId }
+                })
+                if (!Goods.length) return
+                const inventoryEntryInfos = Goods.map(item => {
+                    item.updateNumber = 1
+                    item.sumPrice = item.createPrice * 1
+                    return item
+                })
+                this.dataForm.inventoryEntryInfos = this.dataForm.inventoryEntryInfos && this.dataForm.inventoryEntryInfos.length ? this.dataForm.inventoryEntryInfos.concat(inventoryEntryInfos) : this.dataForm.inventoryEntryInfos = inventoryEntryInfos
+            }
+            
+        },
+        submitForm(){
+            this.$refs["dataForm"].validate((valid) => {
+                if (valid) {
+                    if(this.dataForm.inventoryEntryInfos.length == 0){
+                        this.$message.error('请选择商品/物料!')
+                        return
+                    }else{
+                        if(this.id){
+                            updateRequisition(this.dataForm).then(() => {
+                                this.$notify({
+                                    title: '成功',
+                                    message: '更新成功',
+                                    type: 'success',
+                                    duration: 2000
+                                })
+                                this.roBack();
+                            })
+                        }else{
+                            createRequisition(this.dataForm).then(() => {
+                                this.$notify({
+                                    title: "成功",
+                                    message: "创建成功",
+                                    type: "success",
+                                    duration: 2000,
+                                });
+                                this.roBack();
+                            })
+                        }
+                    }   
+                }
+            });
+        },
+        handleChange(row) {
+            if (row.createPrice && row.updateNumber) {
+                row.sumPrice = row.createPrice * row.updateNumber
+            }
+        },
+        roBack() {
+            // const { callback } = this.$route.params
+            // if (typeof callback === 'function') callback()
+            this.$store.dispatch('delVisitedViews', this.$route).then((views) => {
+                const latestView = views.slice(-1)[0]
+                if (latestView) {
+                    this.$router.push(latestView.path)
+                } else {
+                    this.$router.push('/')
+                }
+            })
+            // this.$router.push({ name: 'requisition' })
+        },
+        handleRemove(file, fileList) {
+        console.log(file, fileList);
+        let fileIds = [];
+        for (let i in fileList) {
+            let id = fileList[i].response.data.id;
+            fileIds.push(id);
+        }
+        this.dataForm.fileIds = fileIds.join(",");
+        },
+        beforeUploadFile(file) {
+        console.log(file);
+        const size = file.size / 1024 / 1024;
+        console.log(size);
+        if (size > 10) {
+            this.$message.error("文件大小不能超过10MB!");
+            return false;
+        }
+        },
+        handleFileSuccess(res, file, fileList) {
+        console.log(file, fileList);
+        console.log("------", "==========");
+        console.log("res = ", res);
+
+        let fileIds = [];
+        for (let i in fileList) {
+            let response = fileList[i].response;
+            if (response.errno && response.errno != "0") {
+            this.$message.error("该文件上传失败,已被移除,请重新上传!");
+            // 上传失败移除该 file 对象
+            fileList.splice(i, 1);
+            } else {
+            let id = fileList[i].response.data.id;
+            fileIds.push(id);
+            }
+        }
+        this.dataForm.fileIds = fileIds.join(",");
+        },
+    }
+}
+</script>
+<style>
+/** 底部步骤 */
+.footer {
+  width: 100%;
+  padding: 10px;
+  bottom: 0px;
+  text-align: center;
+  z-index: 999;
+}
+.mx {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+/** 表格中输入框样式 */
+.tableFormItem {
+  width: 100%;
+  margin-bottom: 0;
+}
+</style>

+ 13 - 13
src/views/stock/retrieval/retrieval.vue

@@ -9,7 +9,7 @@
         style="width:200px">
       </el-date-picker>
       <treeselect class="filter-item" default-expand-all v-model="listQuery.requireDepartmentId" :options="deptOptions"
-                :normalizer="normalizer" placeholder="要货部门" style="width: 200px" />
+                :normalizer="normalizer" placeholder="出库部门" style="width: 200px" />
       <el-select v-model="listQuery.storeId" clearable placeholder="门店" class="filter-item" style="width: 200px">
         <el-option :key="item.id" v-for="item in storeList" :label="item.storeName" :value="item.id">
         </el-option>
@@ -38,16 +38,16 @@
       <el-table-column type="selection" width="55px"> </el-table-column>
       <el-table-column type="index" label="序号" header-align="center" align="center">
       </el-table-column>
-      <el-table-column align="center" min-width="150px" label="要货单号">
+      <el-table-column align="center" min-width="150px" label="出库单号">
         <template slot-scope="scope">
-          <router-link :to="{ name: 'warehousingDetail', params: { id: scope.row.id } }">
+          <router-link :to="{ name: 'retrievalDetail', params: { id: scope.row.id } }">
             <div style="color: #337ab7;cursor: pointer;">{{ scope.row.serialCode }}</div>
           </router-link>
         </template>
       </el-table-column>
-      <el-table-column align="center" min-width="100px" label="要货时间" prop="serialDate">
+      <el-table-column align="center" min-width="100px" label="出库时间" prop="serialDate">
       </el-table-column>
-      <el-table-column align="center" min-width="100px" label="要货部门" prop="requireDepartmentName">
+      <el-table-column align="center" min-width="100px" label="出库部门" prop="requireDepartmentName">
       </el-table-column>
       <el-table-column align="center" min-width="100px" label="门店" prop="storeName">
       </el-table-column>
@@ -78,7 +78,7 @@
   </div>
 </template>
 <script>
-import { listWarehousing, deleteWarehousing, executeWarehousing } from "@/api/retrieval";
+import { listRetrieval, deleteRetrieval, executeRetrieval } from "@/api/retrieval";
 import { storeList } from "@/api/store";
 import { warehouseList } from "@/api/warehouse";
 import { listDept } from "@/api/dept";
@@ -187,13 +187,13 @@ export default {
     },
     handleCreate() {
       this.$router.push({
-        name: 'warehousingAdd',
+        name: 'retrievalAdd',
         // params: { callback: this.getList }
       })
     },
     getList() {
       this.listLoading = true
-      listWarehousing(this.listQuery).then(response => {
+      listRetrieval(this.listQuery).then(response => {
         this.list = response.data.data.items
         this.total = response.data.data.total
         this.listLoading = false
@@ -221,7 +221,7 @@ export default {
 
     handleUpdate(row) {
       this.$router.push({
-        name: 'warehousingEdit',
+        name: 'retrievalEdit',
         params: { id: row.id }
       })
     },
@@ -231,7 +231,7 @@ export default {
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
-        executeWarehousing({ ids: row.id }).then(response => {
+        executeRetrieval({ ids: row.id }).then(response => {
           this.$notify({
             title: '成功',
             message: '入库成功',
@@ -254,7 +254,7 @@ export default {
             this.delarr.push(this.multipleSelection[i].id);
           }
           const ids = this.delarr.join(",");
-          executeWarehousing({ ids: ids }).then(() => {
+          executeRetrieval({ ids: ids }).then(() => {
             this.$notify({
               title: "成功",
               message: "入库成功",
@@ -278,7 +278,7 @@ export default {
         cancelButtonText: '取消',
         type: 'warning'
       }).then(() => {
-        deleteWarehousing({ ids: row.id }).then(response => {
+        deleteRetrieval({ ids: row.id }).then(response => {
           this.$notify({
             title: '成功',
             message: '删除成功',
@@ -301,7 +301,7 @@ export default {
             this.delarr.push(this.multipleSelection[i].id);
           }
           const ids = this.delarr.join(",");
-          deleteWarehousing({ ids: ids }).then(() => {
+          deleteRetrieval({ ids: ids }).then(() => {
             this.$notify({
               title: "成功",
               message: "删除成功",

+ 13 - 13
src/views/stock/retrieval/retrievalAdd.vue

@@ -1,15 +1,15 @@
 <template>
     <div class="app-container">
         <el-form ref="dataForm" :model="dataForm" :rules="rules" label-width="120px" inline>
-            <h3>通用要货单</h3>
-            <el-form-item label="要货时间" prop="serialDate">
+            <h3>通用出库单</h3>
+            <el-form-item label="出库时间" prop="serialDate">
                 <el-date-picker v-model="dataForm.serialDate" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
                     placeholder="选择日期时间" style="width:200px" :disabled="type === 'detail'">
                 </el-date-picker>
             </el-form-item>
-            <el-form-item label="要货部门" prop="requireDepartmentId">
+            <el-form-item label="出库部门" prop="requireDepartmentId">
                 <treeselect class="filter-item" default-expand-all v-model="dataForm.requireDepartmentId" :options="deptOptions"
-                :normalizer="normalizer" placeholder="要货部门" style="width: 200px" :disabled="type === 'detail'"/>
+                :normalizer="normalizer" placeholder="出库部门" style="width: 200px" :disabled="type === 'detail'"/>
             </el-form-item>
             <el-form-item label="门店" prop="storeId">
                 <el-select v-model="dataForm.storeId" clearable placeholder="请选择" style="width: 200px;" :disabled="type === 'detail'">
@@ -29,7 +29,7 @@
                     placeholder="请输入备注 最大120字"></el-input>
             </el-form-item>
             <div class="mx">
-        <h3>要货明细</h3>
+        <h3>出库明细</h3>
         <el-button size="small" type="primary" v-if="type !== 'detail'"
           @click="handleSelectGoods" icon="el-icon-plus">商品/物料</el-button>
       </div>
@@ -99,7 +99,7 @@
     </div>
 </template>
 <script>
-import { createWarehousing, updateWarehousing, readWarehousing } from "@/api/retrieval";
+import { createRetrieval, updateRetrieval, readRetrieval } from "@/api/retrieval";
 import { storeList } from "@/api/store";
 import { warehouseList } from "@/api/warehouse";
 import { listDept } from "@/api/dept";
@@ -133,7 +133,7 @@ export default {
                     { required: true, message: '请选择出库时间', trigger: 'blur' }
                 ],
                 requireDepartmentId: [
-                    { required: true, message: '请选择要货部门', trigger: 'blur' }
+                    { required: true, message: '请选择出库部门', trigger: 'blur' }
                 ],
                 warehouseId: [
                     { required: true, message: '请选择仓库', trigger: 'blur' }
@@ -145,7 +145,7 @@ export default {
         $route: {
             immediate: true,
             handler(newVal) {
-                if (this.$route.name === 'warehousingAdd') {
+                if (this.$route.name === 'retrievalAdd') {
                     this.dataForm = {
                         serialDate:undefined,
                         storeId:undefined,
@@ -155,7 +155,7 @@ export default {
                         fileList: [],
                         inventoryOutInfos: []
                     }
-                } else if (this.$route.name === 'warehousingDetail') {
+                } else if (this.$route.name === 'retrievalDetail') {
                     this.type = 'detail'
                 }
                 if (this.$route.params.id) {
@@ -201,7 +201,7 @@ export default {
         },
         /** 获取详情页面数据 */
         getDataFormDetail() {
-            readWarehousing({ id: this.id }).then(response => {
+            readRetrieval({ id: this.id }).then(response => {
                 let dataForm = response.data.data;
                 dataForm.inventoryOutInfos = dataForm.inventoryOutInfos == null ? [] : dataForm.inventoryOutInfos
                 dataForm.inventoryOutInfos = dataForm.inventoryOutInfos == null ? [] : dataForm.inventoryOutInfos
@@ -239,7 +239,7 @@ export default {
                         return
                     }else{
                         if(this.id){
-                            updateWarehousing(this.dataForm).then(() => {
+                            updateRetrieval(this.dataForm).then(() => {
                                 this.$notify({
                                     title: '成功',
                                     message: '更新成功',
@@ -249,7 +249,7 @@ export default {
                                 this.roBack();
                             })
                         }else{
-                            createWarehousing(this.dataForm).then(() => {
+                            createRetrieval(this.dataForm).then(() => {
                                 this.$notify({
                                     title: "成功",
                                     message: "创建成功",
@@ -279,7 +279,7 @@ export default {
                     this.$router.push('/')
                 }
             })
-            // this.$router.push({ name: 'warehousing' })
+            // this.$router.push({ name: 'retrieval' })
         },
     }
 }

+ 282 - 0
src/views/stock/swap/swap.vue

@@ -0,0 +1,282 @@
+<template>
+  <div class="app-container calendar-list-container">
+    <!-- 查询和其他操作 -->
+    <div class="filter-container">
+      <el-date-picker v-model="listQuery.startDate" value-format="yyyy-MM-dd" type="date" placeholder="开始日期"
+        style="width:200px">
+      </el-date-picker>
+      <el-date-picker v-model="listQuery.endDate" value-format="yyyy-MM-dd" type="date" placeholder="结束日期"
+        style="width:200px">
+      </el-date-picker>
+      <el-select v-model="listQuery.warehouseId" clearable placeholder="请选择仓库" class="filter-item" style="width: 200px">
+        <el-option :key="item.id" v-for="item in warehouseList" :label="item.warehouseName" :value="item.id">
+        </el-option>
+      </el-select>
+      <el-select v-model="listQuery.isRunFinish" clearable placeholder="请选择状态" class="filter-item" style="width: 200px">
+        <el-option :key="item.type" v-for="item in typeList" :label="item.name" :value="item.type">
+        </el-option>
+      </el-select>
+      <el-button class="filter-item" type="primary" v-waves icon="el-icon-search" @click="handleFilter">查找</el-button>
+      <el-button class="filter-item" v-waves icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      <el-button class="filter-item" type="primary" @click="handleCreate" icon="el-icon-plus">添加</el-button>
+      <!-- <el-button class="filter-item" :loading="downloadLoading" v-waves icon="el-icon-download"
+        @click="handleDownload">导出</el-button> -->
+      <!-- <el-button class="filter-item" type="success" icon="el-icon-takeaway-box" @click="executeAll">批量入库</el-button> -->
+      <el-button class="filter-item" type="warning" icon="el-icon-delete" @click="delAll">批量删除</el-button>
+    </div>
+
+    <!-- 查询结果 -->
+    <el-table size="small" :data="list" @selection-change="handleSelectionChange" v-loading="listLoading"
+      element-loading-text="正在查询中。。。" border fit highlight-current-row>
+      <el-table-column type="selection" width="55px"> </el-table-column>
+      <el-table-column type="index" label="序号" header-align="center" align="center">
+      </el-table-column>
+      <el-table-column align="center" min-width="150px" label="入库单号">
+        <template slot-scope="scope">
+          <router-link :to="{ name: 'swapDetail', params: { id: scope.row.id } }">
+            <div style="color: #337ab7;cursor: pointer;">{{ scope.row.serialCode }}</div>
+          </router-link>
+        </template>
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="入库时间" prop="serialDate">
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="供应商" prop="supplierName">
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="仓库" prop="warehouseName">
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="经手人" prop="addHandlerName">
+      </el-table-column>
+      <el-table-column align="center" min-width="100px" label="入库状态">
+        <template slot-scope="props">
+            <span v-if="props.row.isRunFinish == '0'" style="color: #67C23A;font-weight: bold;">已入库</span>
+            <span v-if="props.row.isRunFinish == '1'" style="color: #E6A23C;font-weight: bold;">待入库</span>
+          </template>
+      </el-table-column>
+      <el-table-column align="center" label="操作" width="240px" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button v-if="scope.row.isRunFinish == '1'" type="success" size="small" @click="handleExecute(scope.row)">入库</el-button>
+          <el-button type="primary" size="small" @click="handleUpdate(scope.row)">编辑</el-button>
+          <el-button type="danger" size="small" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <div class="pagination-container">
+      <el-pagination background @size-change="handleSizeChange" @current-change="handleCurrentChange"
+        :current-page="listQuery.page" :page-sizes="[10, 20, 30, 50]" :page-size="listQuery.limit"
+        layout="total, sizes, prev, pager, next, jumper" :total="total">
+      </el-pagination>
+    </div>
+  </div>
+</template>
+<script>
+import { listSwap, deleteSwap, executeSwap } from "@/api/swap";
+import { warehouseList } from "@/api/warehouse";
+import waves from "@/directive/waves"; // 水波纹指令
+
+export default {
+  directives: { waves },
+  data() {
+    return {
+      downloadLoading: false,
+      warehouseList: [],
+      typeList: [
+        {
+          type: '0',
+          name: "已入库",
+        },
+        {
+          type: '1',
+          name: "待入库",
+        },
+      ],
+      list: [
+
+      ],
+      delarr: [],
+      multipleSelection: [],
+      total: 0,
+      listLoading: false,
+      listQuery: {
+        page: 1,
+        limit: 10,
+        startDate: '',
+        endDate: '',
+        warehouseId: '',
+        isRunFinish: '',
+      },
+    }
+  },
+  created() {
+    this.getStoreList();
+    this.getList();
+  },
+  methods: {
+    /** 获取仓库列表数据 */
+    getStoreList() {
+      warehouseList().then(response => {
+        this.warehouseList = response.data.data;
+      }).catch(() => { });
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.listQuery = {
+        page: 1,
+        limit: 10,
+        startDate: '',
+        endDate: '',
+        warehouseId: '',
+        isRunFinish: '',
+      },
+        this.getList()
+    },
+    handleDownload() {
+      this.downloadLoading = true
+      import('@/vendor/Export2Excel').then(excel => {
+        const tHeader = ['用户ID', '用户名称', '用户昵称', '用户头像']
+        const filterVal = ['id', 'username', 'nickname', 'avatar']
+        excel.export_json_to_excel2(tHeader, this.list, filterVal, '用户信息')
+        this.downloadLoading = false
+      })
+    },
+    handleCreate() {
+      this.$router.push({
+        name: 'swapAdd',
+        // params: { callback: this.getList }
+      })
+    },
+    getList() {
+      this.listLoading = true
+      listSwap(this.listQuery).then(response => {
+        this.list = response.data.data.items
+        this.total = response.data.data.total
+        this.listLoading = false
+      }).catch(() => {
+        this.list = []
+        this.total = 0
+        this.listLoading = false
+      })
+    },
+
+    handleFilter() {
+      this.listQuery.page = 1
+      this.getList()
+    },
+
+    handleSizeChange(val) {
+      this.listQuery.limit = val
+      this.getList()
+    },
+
+    handleCurrentChange(val) {
+      this.listQuery.page = val
+      this.getList()
+    },
+
+    handleUpdate(row) {
+      this.$router.push({
+        name: 'swapEdit',
+        params: { id: row.id }
+      })
+    },
+    handleExecute(row) {
+      this.$confirm('确认入库吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        executeSwap({ ids: row.id }).then(response => {
+          this.$notify({
+            title: '成功',
+            message: '入库成功',
+            type: 'success',
+            duration: 2000
+          })
+          this.getList()
+        })
+      }).catch(() => { })
+    },
+    executeAll() {
+      const length = this.multipleSelection.length;
+      if (length > 0) {
+        this.$confirm("确认入库吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(() => {
+          for (let i = 0; i < length; i++) {
+            this.delarr.push(this.multipleSelection[i].id);
+          }
+          const ids = this.delarr.join(",");
+          executeSwap({ ids: ids }).then(() => {
+            this.$notify({
+              title: "成功",
+              message: "入库成功",
+              type: "success",
+              duration: 2000,
+            });
+            this.getList();
+          })
+        })
+      } else {
+        this.$notify({
+          title: "提示",
+          message: "请选择要入库的信息!",
+          type: "warning",
+        });
+      }
+    },
+    handleDelete(row) {
+      this.$confirm('确认删除吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(() => {
+        deleteSwap({ ids: row.id }).then(response => {
+          this.$notify({
+            title: '成功',
+            message: '删除成功',
+            type: 'success',
+            duration: 2000
+          })
+          this.getList()
+        })
+      }).catch(() => { })
+    },
+    delAll() {
+      const length = this.multipleSelection.length;
+      if (length > 0) {
+        this.$confirm("确认删除吗?", "提示", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning",
+        }).then(() => {
+          for (let i = 0; i < length; i++) {
+            this.delarr.push(this.multipleSelection[i].id);
+          }
+          const ids = this.delarr.join(",");
+          deleteSwap({ ids: ids }).then(() => {
+            this.$notify({
+              title: "成功",
+              message: "删除成功",
+              type: "success",
+              duration: 2000,
+            });
+            this.getList();
+          })
+        })
+      } else {
+        this.$notify({
+          title: "提示",
+          message: "请选择要删除的信息!",
+          type: "warning",
+        });
+      }
+    },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+  }
+}
+</script>

+ 335 - 0
src/views/stock/swap/swapAdd.vue

@@ -0,0 +1,335 @@
+<template>
+    <div class="app-container">
+        <el-form ref="dataForm" :model="dataForm" :rules="rules" label-width="120px" inline>
+            <h3>通用入库单</h3>
+            <!-- <el-form-item label="名称" prop="name">
+                <el-input v-model="dataForm.name" :minlength="2" :maxlength="20" clearable
+                    placeholder="请输入名称" style="width:200px" :disabled="type === 'detail'"></el-input>
+            </el-form-item> -->
+            <el-form-item label="入库时间" prop="serialDate">
+                <el-date-picker v-model="dataForm.serialDate" value-format="yyyy-MM-dd HH:mm:ss" type="datetime"
+                    placeholder="选择日期时间" style="width:200px" :disabled="type === 'detail'">
+                </el-date-picker>
+            </el-form-item>
+            <el-form-item label="供应商" prop="supplierId">
+                <el-select v-model="dataForm.supplierId" clearable placeholder="请选择" style="width: 200px;" :disabled="type === 'detail'">
+                    <el-option :key="item.id" v-for="item in supplierList" :label="item.businessName" :value="item.id">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="仓库" prop="warehouseId">
+                <el-select v-model="dataForm.warehouseId" clearable placeholder="请选择" style="width: 200px;" :disabled="type === 'detail'">
+                    <el-option :key="item.id" v-for="item in warehouseList" :label="item.warehouseName" :value="item.id">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            <el-form-item label="经手人" prop="addHandlerId">
+                <el-select v-model="dataForm.addHandlerId" clearable filterable placeholder="请选择" style="width: 200px" :disabled="type === 'detail'">
+                    <el-option :key="item.loginId" v-for="item in recipientsList" :label="item.deptName+'_'+item.userName" :value="item.loginId">
+                    </el-option>
+                </el-select>
+            </el-form-item>
+            
+
+            <!-- <el-form-item label="采购说明" prop="desc">
+                <el-input style="width:535px" v-model="dataForm.desc" :maxlength="120"
+                    type="textarea" :disabled="type === 'detail'" :autosize="{ minRows: 1, maxRows: 4 }"
+                    placeholder="请输入采购说明 最大120字"></el-input>
+            </el-form-item> -->
+            <el-form-item label="附件:" prop="fileIds">
+                <el-upload :limit="1" :action="fileUrl" :file-list="dataForm.fileList" :on-success="handleFileSuccess"
+                    :before-upload="beforeUploadFile" :on-remove="handleRemove">
+                    <el-button size="small" type="primary" :disabled="type === 'detail'">点击上传</el-button>
+                </el-upload>
+            </el-form-item>
+            <div class="mx">
+        <h3>入库明细</h3>
+        <el-button size="small" type="primary" v-if="type !== 'detail'"
+          @click="handleSelectGoods" icon="el-icon-plus">商品/物料</el-button>
+      </div>
+      <el-table size="small" :data="dataForm.inventoryEntryInfos" border :cell-style="{ textAlign: 'center' }"
+            :header-cell-style="{ textAlign: 'center' }" style="width: 100%">
+            <el-table-column label="商品编号">
+              <template slot-scope="scope">
+                {{ scope.row.productCode }}
+              </template>
+            </el-table-column>
+            <el-table-column label="商品名称">
+              <template slot-scope="scope">
+                {{ scope.row.productName }}
+              </template>
+            </el-table-column>
+            <el-table-column label="单价(¥)">
+              <template slot-scope="scope">
+                {{ scope.row.createPrice.toFixed(2) }}
+              </template>
+            </el-table-column>
+            <el-table-column label="库存数量">
+              <template slot-scope="scope">
+                {{ scope.row.createProductNumber }}
+              </template>
+            </el-table-column>
+            <el-table-column label="入库数量">
+              <template slot-scope="scope">
+                <el-form-item v-if="type !== 'detail'" :prop="'inventoryEntryInfos.'+scope.$index+'.updateNumber'" :rules="{ required: true, message: '入库数量不能为空', trigger: 'blur' }" class="tableFormItem">
+                    <el-input-number v-model="scope.row.updateNumber" @change="handleChange(scope.row)" size="small" :min="1" :max="10000" label="入库数量"></el-input-number>
+                </el-form-item>
+                <span v-else>{{ scope.row.updateNumber }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="合计(¥)">
+              <template slot-scope="scope">
+                {{ scope.row.sumPrice.toFixed(2) }}
+              </template>
+            </el-table-column>
+            <!-- <el-table-column label="备注">
+              <template slot-scope="scope">
+                <el-input :maxlength="99" v-model="scope.row.remark" :disabled="type === 'detail'" />
+              </template>
+            </el-table-column> -->
+            <el-table-column label="操作" width="150" v-if="type !== 'detail'">
+              <template slot-scope="scope">
+                <el-button size="mini" type="danger"
+                  @click="dataForm.inventoryEntryInfos.splice(scope.$index, 1)">删除</el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form>
+        <div class="footer">
+            <el-button type="primary" @click="submitForm" v-if="type !== 'detail'">保存
+            </el-button>
+            <el-button @click="roBack()">返回
+            </el-button>
+        </div>
+    </div>
+</template>
+<script>
+import { createSwap, updateSwap, readSwap } from "@/api/swap";
+import { supplierList } from "@/api/supplier";
+import { warehouseList } from "@/api/warehouse";
+import { allUserList } from "@/api/public";
+import waves from "@/directive/waves"; // 水波纹指令
+
+export default {
+    directives: { waves },
+    data() {
+        return {
+            fileUrl:this.upLoadUrl,
+            recipientsList:[],
+            supplierList: [],
+            warehouseList: [],
+            id: '',
+            type: '',
+            /** 表单*/
+            dataForm: {
+                serialDate:'',
+                supplierId:undefined,
+                warehouseId:undefined,
+                addHandlerId:undefined,
+                fileIds:undefined,
+                fileList: [],
+                inventoryEntryInfos: []
+            },
+            rules: {
+                serialDate: [
+                    { required: true, message: '请选择入库时间', trigger: 'blur' }
+                ],
+                warehouseId: [
+                    { required: true, message: '请选择仓库', trigger: 'blur' }
+                ],
+                addHandlerId: [
+                    { required: true, message: '请选择经手人', trigger: 'blur' }
+                ],
+            },
+        }
+    },
+    watch: {
+        $route: {
+            immediate: true,
+            handler(newVal) {
+                if (this.$route.name === 'swapAdd') {
+                    this.dataForm = {
+                        serialDate:undefined,
+                        supplierId:undefined,
+                        warehouseId:undefined,
+                        addHandlerId:undefined,
+                        fileIds:undefined,
+                        fileList: [],
+                        inventoryEntryInfos: []
+                    }
+                } else if (this.$route.name === 'swapDetail') {
+                    this.type = 'detail'
+                }
+                if (this.$route.params.id) {
+                    this.id = this.$route.params.id
+                    this.getDataFormDetail()
+                }
+            }
+        }
+    },
+    mounted() {
+        this.getSupplierList();
+        this.getStoreList(); 
+        this.getAllUserList(); 
+    },
+    methods: {
+        /** 获取供应商列表数据 */
+        getSupplierList(){
+            supplierList().then(response => {
+                this.supplierList = response.data.data;
+            }).catch(() => { });
+        },
+        /** 获取仓库列表数据 */
+        getStoreList() {
+            warehouseList().then(response => {
+                this.warehouseList = response.data.data;
+            }).catch(() => {});
+        },
+        /** 获取人员列表数据 */
+        getAllUserList() {
+            allUserList().then(response => {
+                this.recipientsList = response.data.data;
+            }).catch(() => { });
+        },
+        /** 获取详情页面数据 */
+        getDataFormDetail() {
+            readSwap({ id: this.id }).then(response => {
+                let dataForm = response.data.data;
+                dataForm.inventoryEntryInfos = dataForm.inventoryEntryInfos == null ? [] : dataForm.inventoryEntryInfos
+                dataForm.inventoryOutInfos = dataForm.inventoryOutInfos == null ? [] : dataForm.inventoryOutInfos
+                this.dataForm = dataForm;
+            }).catch(() => {})
+        },
+         // 选择商品
+        async handleSelectGoods() {
+            if (!this.dataForm.warehouseId) {
+                this.$message.error('请先选择仓库!')
+                return
+            }else{
+                console.log(this.dataForm.inventoryEntryInfos)
+                let selectedIds = this.dataForm.inventoryEntryInfos.map(item => item.id);
+                const Goods = await this.$EnPickerGoods({
+                    // goodsApi: '/warehouse-entry/info/inventory',
+                    selectedIds: selectedIds,
+                    goodsApiParams: { warehouseId: this.dataForm.warehouseId }
+                })
+                if (!Goods.length) return
+                const inventoryEntryInfos = Goods.map(item => {
+                    item.updateNumber = 1
+                    item.sumPrice = item.createPrice * 1
+                    return item
+                })
+                this.dataForm.inventoryEntryInfos = this.dataForm.inventoryEntryInfos && this.dataForm.inventoryEntryInfos.length ? this.dataForm.inventoryEntryInfos.concat(inventoryEntryInfos) : this.dataForm.inventoryEntryInfos = inventoryEntryInfos
+            }
+            
+        },
+        submitForm(){
+            this.$refs["dataForm"].validate((valid) => {
+                if (valid) {
+                    if(this.dataForm.inventoryEntryInfos.length == 0){
+                        this.$message.error('请选择商品/物料!')
+                        return
+                    }else{
+                        if(this.id){
+                            updateSwap(this.dataForm).then(() => {
+                                this.$notify({
+                                    title: '成功',
+                                    message: '更新成功',
+                                    type: 'success',
+                                    duration: 2000
+                                })
+                                this.roBack();
+                            })
+                        }else{
+                            createSwap(this.dataForm).then(() => {
+                                this.$notify({
+                                    title: "成功",
+                                    message: "创建成功",
+                                    type: "success",
+                                    duration: 2000,
+                                });
+                                this.roBack();
+                            })
+                        }
+                    }   
+                }
+            });
+        },
+        handleChange(row) {
+            if (row.createPrice && row.updateNumber) {
+                row.sumPrice = row.createPrice * row.updateNumber
+            }
+        },
+        roBack() {
+            // const { callback } = this.$route.params
+            // if (typeof callback === 'function') callback()
+            this.$store.dispatch('delVisitedViews', this.$route).then((views) => {
+                const latestView = views.slice(-1)[0]
+                if (latestView) {
+                    this.$router.push(latestView.path)
+                } else {
+                    this.$router.push('/')
+                }
+            })
+            // this.$router.push({ name: 'swap' })
+        },
+        handleRemove(file, fileList) {
+        console.log(file, fileList);
+        let fileIds = [];
+        for (let i in fileList) {
+            let id = fileList[i].response.data.id;
+            fileIds.push(id);
+        }
+        this.dataForm.fileIds = fileIds.join(",");
+        },
+        beforeUploadFile(file) {
+        console.log(file);
+        const size = file.size / 1024 / 1024;
+        console.log(size);
+        if (size > 10) {
+            this.$message.error("文件大小不能超过10MB!");
+            return false;
+        }
+        },
+        handleFileSuccess(res, file, fileList) {
+        console.log(file, fileList);
+        console.log("------", "==========");
+        console.log("res = ", res);
+
+        let fileIds = [];
+        for (let i in fileList) {
+            let response = fileList[i].response;
+            if (response.errno && response.errno != "0") {
+            this.$message.error("该文件上传失败,已被移除,请重新上传!");
+            // 上传失败移除该 file 对象
+            fileList.splice(i, 1);
+            } else {
+            let id = fileList[i].response.data.id;
+            fileIds.push(id);
+            }
+        }
+        this.dataForm.fileIds = fileIds.join(",");
+        },
+    }
+}
+</script>
+<style>
+/** 底部步骤 */
+.footer {
+  width: 100%;
+  padding: 10px;
+  bottom: 0px;
+  text-align: center;
+  z-index: 999;
+}
+.mx {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+/** 表格中输入框样式 */
+.tableFormItem {
+  width: 100%;
+  margin-bottom: 0;
+}
+</style>