Browse Source

新版调拨入库

lxf 2 years ago
parent
commit
7dd3318a16

+ 9 - 0
src/api/shengde/warehouse/outAndInWarehouse.js

@@ -126,3 +126,12 @@ export function getComeOrder(data) {
     data: data,
   })
 }
+
+// 出入库登记- 调拨登记
+export function allotSave(data) {
+  return request({
+    url: '/saas-wms/saas/wms/allot/save',
+    method: 'post',
+    data: data,
+  })
+}

+ 13 - 0
src/router/page/index.js

@@ -784,6 +784,19 @@ export default [
     ],
   },
   {
+    path: '/putInStorage/transfer',
+    component: Layout,
+    redirect: '/putInStorage/transfer',
+    children: [
+      {
+        path: '/putInStorage/transfer',
+        name: '调拨登记',
+        component: () => import(/* webpackChunkName: "page" */ '@/views/shengde/warehouse/putInStorage/transfer/register'),
+        props: true,
+      },
+    ],
+  },
+  {
     path: '/outbound/register',
     component: Layout,
     redirect: '/outbound/register',

+ 15 - 0
src/views/shengde/warehouse/putInStorage/details.vue

@@ -62,6 +62,7 @@
     <el-row :gutter="10" style="margin-bottom: 10px">
       <el-col :span="5">
         <el-button type="primary" size="mini" @click="handleAdd" v-db-click>入库登记</el-button>
+        <el-button type="primary" size="mini" @click="handleTransfer" v-db-click>调拨登记</el-button>
         <el-button type="primary" size="mini" @click="handleExcel" v-db-click>导出Excel</el-button>
       </el-col>
     </el-row>
@@ -232,6 +233,20 @@ export default {
         },
       })
     },
+    handleTransfer() {
+      let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
+      let maxPos = $chars.length
+      let random = ''
+      for (let i = 0; i < 32; i++) {
+        random += $chars.charAt(Math.floor(Math.random() * maxPos))
+      }
+      this.$router.push({
+        path: '/putInStorage/transfer',
+        query: {
+          random: random,
+        },
+      })
+    },
     clickPassword() {
       if (this.pwd) {
         if (this.pwd === 'sd2022') {

+ 4 - 30
src/views/shengde/warehouse/putInStorage/material.vue

@@ -14,7 +14,6 @@
             <span>{{ `${scope.row.productLong} * ${scope.row.productWide} * ${scope.row.productHigh}` }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="可调拨数量" prop="transferQuantity" width="120" v-if="form.type == '5'" />
         <el-table-column label="入库数量" width="180">
           <template slot-scope="scope">
             <el-form-item :prop="'details.' + scope.$index + '.quantity'" :rules="formRules.quantity" :inline-message="true">
@@ -39,7 +38,6 @@
 <script>
 import { mapGetters } from 'vuex'
 import SelectBOM from '@/components/shengde/SelectBOM/index'
-import { getComeOrder } from '@/api/shengde/warehouse/outAndInWarehouse'
 
 export default {
   props: {
@@ -70,14 +68,6 @@ export default {
       return flag
     },
     selectBOM() {
-      if (this.form.type == '5') {
-        if (!this.form.subsidiaryId) {
-          return this.msgInfo('请先选择事业部')
-        }
-        if (!this.form.oldWarehouseId) {
-          return this.msgInfo('请先选择原仓库')
-        }
-      }
       this.openSelect = true
     },
     handleSelect(data, index) {
@@ -86,23 +76,7 @@ export default {
         if (row && row.id) {
           let tableData = this.form.details.filter((item) => item.businessId === row.id)
           if (tableData && tableData.length > 0) {
-            return this.msgInfo('该物料已添加')
-          }
-          if (this.form.type == '5') {
-            getComeOrder({ warehouseId: this.form.oldWarehouseId, businessId: row.id, subsidiaryId: this.form.subsidiaryId }).then((res) => {
-              this.form.details.push({
-                businessId: row.id,
-                quantity: undefined,
-                genre: 2,
-                productLong: row.productLong,
-                productWide: row.productWide,
-                productHigh: row.productHigh,
-                nameChinese: row.nameChinese,
-                specCode: row.specCode,
-                transferQuantity: Number(res.data.data),
-              })
-              return this.msgSuccess('添加成功')
-            })
+            this.msgInfo('该物料已添加')
           } else {
             this.form.details.push({
               businessId: row.id,
@@ -114,13 +88,13 @@ export default {
               nameChinese: row.nameChinese,
               specCode: row.specCode,
             })
-            return this.msgSuccess('添加成功')
+            this.msgSuccess('添加成功')
           }
         } else {
-          return this.msgInfo('添加失败')
+          this.msgInfo('添加失败')
         }
       } else {
-        return this.msgInfo('添加失败')
+        this.msgInfo('添加失败')
       }
     },
     clickRemove(index) {

+ 20 - 30
src/views/shengde/warehouse/putInStorage/register.vue

@@ -57,7 +57,6 @@ export default {
         details: [],
         warehouseStatus: '',
         purchaseContractId: '',
-        oldWarehouseId: '',
       },
     }
   },
@@ -77,39 +76,30 @@ export default {
         flagMaterial = this.$refs.material.validateForm()
       }
       if (flagStorage && flagProduct && flagMaterial) {
-        if (this.form.type == '5' && this.form.warehouseId === this.form.oldWarehouseId) {
-          return this.msgInfo('调拨仓库不能相同')
-        }
-        if (!(this.form.details && this.form.details.length > 0)) {
+        if (this.form.details && this.form.details.length > 0) {
+          this.loadingText = '提交数据中,请稍后'
+          this.loadingStatus = true
+          API.registrationSave(this.form).then(
+            () => {
+              Utils.$emit('refreshPutList', true)
+              this.msgSuccess('提交完成')
+              this.$store.dispatch('delView', this.$route)
+              this.$router.replace({
+                path: '/shengde/warehouse/putInStorage/index',
+              })
+            },
+            (err) => {
+              console.log('registrationSave: ' + err)
+              this.loadingStatus = false
+            }
+          )
+        } else {
           if (status === 1) {
-            return this.msgInfo('请选择产品信息')
+            this.msgInfo('请选择产品信息')
           } else {
-            return this.msgInfo('请选择BOM信息')
-          }
-        }
-        if (this.form.type == '5') {
-          for (let i = 0; i < this.form.details.length; i++) {
-            if (this.form.details[i].transferQuantity < this.form.details[i].quantity) {
-              return this.msgInfo('入库数量不可大于可调拨数量')
-            }
+            this.msgInfo('请选择BOM信息')
           }
         }
-        this.loadingText = '提交数据中,请稍后'
-        this.loadingStatus = true
-        API.registrationSave(this.form).then(
-          () => {
-            Utils.$emit('refreshPutList', true)
-            this.msgSuccess('提交完成')
-            this.$store.dispatch('delView', this.$route)
-            this.$router.replace({
-              path: '/shengde/warehouse/putInStorage/index',
-            })
-          },
-          (err) => {
-            console.log('registrationSave: ' + err)
-            this.loadingStatus = false
-          }
-        )
       } else {
         setTimeout(() => {
           const errorDiv = document.getElementsByClassName('is-error')

+ 15 - 0
src/views/shengde/warehouse/putInStorage/single.vue

@@ -53,6 +53,7 @@
     <el-row :gutter="10" style="margin-bottom: 10px">
       <el-col :span="1.5">
         <el-button type="primary" size="mini" @click="handleAdd" v-db-click>入库登记</el-button>
+        <el-button type="primary" size="mini" @click="handleTransfer" v-db-click>调拨登记</el-button>
       </el-col>
     </el-row>
 
@@ -210,6 +211,20 @@ export default {
         },
       })
     },
+    handleTransfer() {
+      let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'
+      let maxPos = $chars.length
+      let random = ''
+      for (let i = 0; i < 32; i++) {
+        random += $chars.charAt(Math.floor(Math.random() * maxPos))
+      }
+      this.$router.push({
+        path: '/putInStorage/transfer',
+        query: {
+          random: random,
+        },
+      })
+    },
     clickPassword() {
       if (this.pwd) {
         if (this.pwd === 'sd2022') {

+ 3 - 18
src/views/shengde/warehouse/putInStorage/storage.vue

@@ -14,7 +14,7 @@
           </el-form-item>
           <el-form-item label="事业部:" prop="subsidiaryId">
             <!-- <el-select v-model="form.subsidiaryId" placeholder="请选择事业部" size="small" style="width: 100%" @change="changeSubsidiary"> -->
-            <el-select v-model="form.subsidiaryId" placeholder="请选择事业部" size="small" style="width: 100%" @change="changeSubsidiary">
+            <el-select v-model="form.subsidiaryId" placeholder="请选择事业部" size="small" style="width: 100%">
               <el-option v-for="item in companyList" :key="item.id" :label="item.name" :value="item.id" />
             </el-select>
           </el-form-item>
@@ -25,15 +25,10 @@
             </el-select>
           </el-form-item>
           <el-form-item label="入库类型:" prop="type">
-            <el-select v-model="form.type" placeholder="请选择入库类型" size="small" style="width: 100%" @change="changeType()">
+            <el-select v-model="form.type" placeholder="请选择入库类型" size="small" style="width: 100%">
               <el-option v-for="item in stockType" :key="item.dictKey" :label="item.dictValue" :value="item.dictKey" />
             </el-select>
           </el-form-item>
-          <el-form-item label="原仓库:" prop="oldWarehouseId" v-if="form.type == '5'">
-            <el-select v-model="form.oldWarehouseId" placeholder="请选择原仓库" size="small" style="width: 100%" @change="changePurchase">
-              <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
-            </el-select>
-          </el-form-item>
           <el-form-item label="申请人:" prop="proposer">
             <el-input v-model="form.proposer" size="small" placeholder="请输入申请人" />
           </el-form-item>
@@ -66,7 +61,6 @@ export default {
       formRules: {
         subsidiaryId: [{ required: true, message: '请选择事业部', trigger: 'change' }],
         warehouseId: [{ required: true, message: '请选择仓库', trigger: 'change' }],
-        oldWarehouseId: [{ required: true, message: '请选择原仓库', trigger: 'change' }],
         type: [{ required: true, message: '请选择入库类型', trigger: 'change' }],
         proposer: [{ required: true, message: '请输入申请人', trigger: 'blur' }],
       },
@@ -88,7 +82,7 @@ export default {
         }
       })
     })
-    this.stockType = this.dictData.filter((item) => item.code === 'put_stock_type')[0].children
+    this.stockType = this.dictData.filter((item) => item.code === 'put_stock_type')[0].children.filter((item) => item.dictKey !== '5')
   },
   mounted() {},
   computed: mapGetters(['dictData']),
@@ -131,15 +125,6 @@ export default {
     changePurchase() {
       this.form.details = []
     },
-    changeType() {
-      this.form.oldWarehouseId = ''
-      this.form.details = []
-    },
-    changeSubsidiary() {
-      if (this.form.type == '5') {
-        this.form.details = []
-      }
-    },
   },
 }
 </script>

+ 133 - 0
src/views/shengde/warehouse/putInStorage/transfer/material.vue

@@ -0,0 +1,133 @@
+<template>
+  <div style="padding: 20px 2vw">
+    <el-form ref="ruleForm" :model="form" :rules="formRules" label-width="0">
+      <div style="display: flex; align-items: center">
+        <a class="choose-product"></a>
+        <el-button type="text" style="color: #02a7f0; font-weight: 700" @click="selectBOM" v-db-click>选择BOM</el-button>
+      </div>
+
+      <el-table
+        :data="form.allotDetailList"
+        :cell-style="{ padding: '0' }"
+        :row-style="{ height: '35px' }"
+        v-loading="loading"
+        header-row-class-name="tableHeader"
+      >
+        <el-table-column label="品号" prop="specCode" width="180" />
+        <el-table-column label="品名" prop="nameChinese" min-width="180" />
+        <el-table-column label="单品尺寸(L*W*H)" width="220">
+          <template slot-scope="scope">
+            <span>{{ `${scope.row.productLong} * ${scope.row.productWide} * ${scope.row.productHigh}` }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="入库数量" width="180">
+          <template slot-scope="scope">
+            <el-form-item :prop="'allotDetailList.' + scope.$index + '.quantity'" :rules="formRules.quantity" :inline-message="true">
+              <el-input-number size="small" v-model="scope.row.quantity" :controls="false" :min="1" :max="999999999" :precision="0" />
+            </el-form-item>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="80" fixed="right">
+          <template slot-scope="scope">
+            <el-button type="text" @click="clickRemove(scope.$index)" v-db-click>删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-form>
+
+    <el-dialog title="选择BOM" v-if="openSelect" top="50px" :visible.sync="openSelect" width="90%" append-to-body center>
+      <SelectBOM :putInStorageStatus="true" @selectBOM="handleSelect"></SelectBOM>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import SelectBOM from '@/components/shengde/SelectBOM/index'
+
+export default {
+  props: {
+    form: Object,
+  },
+  components: { SelectBOM },
+  data() {
+    return {
+      formRules: {
+        quantity: [{ required: true, message: '请输入入库数量', trigger: 'blur' }],
+      },
+      openSelect: false,
+    }
+  },
+  created() {},
+  mounted() {},
+  computed: mapGetters(['dictData']),
+  methods: {
+    validateForm() {
+      let flag = null
+      this.$refs.ruleForm.validate((valid) => {
+        if (valid) {
+          flag = true
+        } else {
+          flag = false
+        }
+      })
+      return flag
+    },
+    selectBOM() {
+      this.openSelect = true
+    },
+    handleSelect(data, index) {
+      if (data && data.bomColors && data.bomColors.length >= index) {
+        let row = data.bomColors[index]
+        if (row && row.id) {
+          let tableData = this.form.allotDetailList.filter((item) => item.businessId === row.id)
+          if (tableData && tableData.length > 0) {
+            this.msgInfo('该物料已添加')
+          } else {
+            this.form.allotDetailList.push({
+              businessId: row.id,
+              quantity: undefined,
+              genre: 2,
+              productLong: row.productLong,
+              productWide: row.productWide,
+              productHigh: row.productHigh,
+              nameChinese: row.nameChinese,
+              specCode: row.specCode,
+            })
+            this.msgSuccess('添加成功')
+          }
+        } else {
+          this.msgInfo('添加失败')
+        }
+      } else {
+        this.msgInfo('添加失败')
+      }
+    },
+    clickRemove(index) {
+      this.form.allotDetailList.splice(index, 1)
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+.choose-product {
+  display: inline-block;
+  width: 25px;
+  height: 15px;
+  background-image: url('/ShengDeImg/selectProduct.png');
+  background-position: center center;
+  background-size: 25px 15px;
+}
+::v-deep {
+  .el-input-number {
+    .el-input__inner {
+      text-align: left !important;
+    }
+  }
+  .el-dialog {
+    margin: 0 auto;
+    margin-top: 0 !important;
+  }
+}
+</style>

+ 130 - 0
src/views/shengde/warehouse/putInStorage/transfer/register.vue

@@ -0,0 +1,130 @@
+<template>
+  <div class="box-card">
+    <el-form ref="form" :model="form" v-loading="loadingStatus" :element-loading-text="loadingText" element-loading-background="rgba(0, 0, 0, 0.2)">
+      <el-card>
+        <LabelTemplate title="入库信息"></LabelTemplate>
+        <Storage :form="form" ref="storage"></Storage>
+      </el-card>
+      <div class="interval">
+        <div></div>
+      </div>
+      <el-card>
+        <LabelTemplate title="物料信息"></LabelTemplate>
+        <Material :form="form" ref="material"></Material>
+        <div style="width: 100%; text-align: center">
+          <el-button type="primary" @click="clickSubmit()" size="small" v-db-click>提 交</el-button>
+          <el-button @click="clickCancel" size="small" v-db-click>取 消</el-button>
+        </div>
+        <br />
+      </el-card>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import LabelTemplate from '@/components/LabelTemplate'
+import Storage from './storage'
+import Material from './material'
+import * as API from '@/api/shengde/warehouse/outAndInWarehouse'
+import Utils from '@/util/transit'
+import { mapGetters } from 'vuex'
+
+export default {
+  name: 'putInStorageRegister',
+  components: { LabelTemplate, Storage, Material },
+  data() {
+    return {
+      loadingText: '',
+      loadingStatus: false,
+      form: {
+        comeSubsidiaryId: '',
+        comeWarehouseId: '',
+        putSubsidiaryId: '',
+        putWarehouseId: '',
+        proposer: '',
+        content: '',
+        allotDetailList: [],
+      },
+    }
+  },
+  created() {
+    this.form.proposer = this.userInfo.real_name
+  },
+  mounted() {},
+  computed: mapGetters(['userInfo']),
+  methods: {
+    clickSubmit() {
+      let flagStorage = this.$refs.storage.validateForm()
+      let flagProduct = true
+      let flagMaterial = true
+      flagMaterial = this.$refs.material.validateForm()
+      if (flagStorage && flagProduct && flagMaterial) {
+        if (this.form.allotDetailList && this.form.allotDetailList.length > 0) {
+          this.loadingText = '提交数据中,请稍后'
+          this.loadingStatus = true
+          API.allotSave(this.form).then(
+            () => {
+              Utils.$emit('refreshPutList', true)
+              this.msgSuccess('提交完成')
+              this.$store.dispatch('delView', this.$route)
+              this.$router.replace({
+                path: '/shengde/warehouse/putInStorage/index',
+              })
+            },
+            (err) => {
+              console.log('allotSave: ' + err)
+              this.loadingStatus = false
+            }
+          )
+        } else {
+          this.msgInfo('请选择BOM信息')
+        }
+      } else {
+        setTimeout(() => {
+          const errorDiv = document.getElementsByClassName('is-error')
+          errorDiv[0].scrollIntoView()
+        }, 0)
+      }
+    },
+    clickCancel() {
+      this.$store.dispatch('delView', this.$route)
+      this.$router.replace({
+        path: '/shengde/warehouse/putInStorage/index',
+      })
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped>
+* {
+  font-size: 12px;
+}
+
+.box-card {
+  height: calc(100vh - 110px);
+  overflow-y: auto;
+}
+
+::v-deep {
+  .el-input__inner {
+    border-radius: 1px;
+  }
+  .el-button--mini {
+    border-radius: 1px;
+  }
+  .tableHeader th {
+    background-color: #edf0f5;
+    height: 35px;
+    padding: 0;
+  }
+}
+
+.interval {
+  div {
+    height: 12px;
+    background-color: #f2f2f2;
+    box-shadow: var(--devui-shadow-fullscreen-overlay, 0 10px 40px 0) var(--devui-shadow, rgba(0, 0, 0, 0.08));
+  }
+}
+</style>

+ 98 - 0
src/views/shengde/warehouse/putInStorage/transfer/storage.vue

@@ -0,0 +1,98 @@
+<template>
+  <div style="padding: 20px 2vw">
+    <el-form ref="ruleForm" :model="form" :rules="formRules" label-width="120px">
+      <el-row>
+        <el-col :span="12" style="padding-right: 8px">
+          <el-form-item label="出库事业部:" prop="comeSubsidiaryId">
+            <el-select v-model="form.comeSubsidiaryId" placeholder="请选择出库事业部" size="small" style="width: 100%">
+              <el-option v-for="item in companyList" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="出库仓库:" prop="comeWarehouseId">
+            <el-select v-model="form.comeWarehouseId" placeholder="请选择出库仓库" size="small" style="width: 100%">
+              <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="入库事业部:" prop="putSubsidiaryId">
+            <el-select v-model="form.putSubsidiaryId" placeholder="请选择入库事业部" size="small" style="width: 100%">
+              <el-option v-for="item in companyList" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="入库仓库:" prop="putWarehouseId">
+            <el-select v-model="form.putWarehouseId" placeholder="请选择入库仓库" size="small" style="width: 100%">
+              <el-option v-for="item in warehouseList" :key="item.id" :label="item.name" :value="item.id" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="申请人:" prop="proposer">
+            <el-input v-model="form.proposer" size="small" placeholder="请输入申请人" />
+          </el-form-item>
+        </el-col>
+        <el-col :span="12" style="padding-left: 8px">
+          <el-form-item label="备注:" prop="content">
+            <el-input type="textarea" :rows="4" placeholder="请输入备注" size="small" v-model="form.content" />
+          </el-form-item>
+        </el-col>
+      </el-row>
+    </el-form>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { getList } from '@/api/shengde/group/subcompany/subcompanyManagement/index.js'
+import { warehouseList } from '@/api/shengde/warehouse/management'
+import { purchaseContractList } from '@/api/shengde/productionSystem/purchase/contract'
+
+export default {
+  props: {
+    form: Object,
+  },
+  data() {
+    return {
+      companyList: [{ id: '0', name: '胜德体育' }],
+      warehouseList: [],
+      formRules: {
+        comeSubsidiaryId: [{ required: true, message: '请选择出库事业部', trigger: 'change' }],
+        comeWarehouseId: [{ required: true, message: '请选择出库仓库', trigger: 'change' }],
+        putSubsidiaryId: [{ required: true, message: '请选择入库事业部', trigger: 'change' }],
+        putWarehouseId: [{ required: true, message: '请选择入库仓库', trigger: 'change' }],
+        proposer: [{ required: true, message: '请输入申请人', trigger: 'blur' }],
+      },
+      purchaseContract: [],
+    }
+  },
+  created() {
+    getList({ pageNum: 1, pageSize: 9999 }).then((res) => {
+      this.companyList = this.companyList.concat(res.data.data.records)
+    })
+    warehouseList({ pageNum: 1, pageSize: 9999 }).then((res) => {
+      this.warehouseList = res.data.data.list
+    })
+    purchaseContractList({ pageNum: 1, pageSize: 99999, purchaseStatus: 20 }).then((res) => {
+      this.purchaseContract = res.data.data.records.map((item) => {
+        return {
+          ...item,
+          text: item.code + ', ' + item.deliveryTime + ', ' + item.supplyName,
+        }
+      })
+    })
+  },
+  mounted() {},
+  computed: mapGetters(['dictData']),
+  methods: {
+    validateForm() {
+      let flag = null
+      this.$refs.ruleForm.validate((valid) => {
+        if (valid) {
+          flag = true
+        } else {
+          flag = false
+        }
+      })
+      return flag
+    },
+  },
+}
+</script>
+
+<style lang="scss" scoped></style>