소스 검색

feat(发运管理): 新增库外调拨功能

liujt 6 달 전
부모
커밋
05f93506c2

+ 12 - 1
src/api/wms/index.js

@@ -247,4 +247,15 @@ export async function getCategoryPackageDisposition (data){
     return res.data.data;
   }
   return Promise.reject(new Error(res.data.message));
-}
+}
+
+// 库内调拨列表
+  export async function getAllotApplyPage(data) {
+    const res = await request.get(`/wms/allotApply/page`, {
+      params: data
+    });
+    if (res.data.code == 0) {
+      return res.data.data;
+    }
+    return Promise.reject(new Error(res.data.message));
+  }

+ 11 - 0
src/enum/dict.js

@@ -591,3 +591,14 @@ export const payAndReceiveEnum = [
     value: 99
   },
 ];
+
+export const allocationType = [
+  {
+    code: 1,
+    label: '库内调拨'
+  },
+  {
+    code: 2,
+    label: '库外调拨'
+  }
+];

+ 221 - 0
src/views/transportManager/shipManage/dispatchManage/components/inventoryAllocationDialog.vue

@@ -0,0 +1,221 @@
+<template>
+  <el-dialog title="选择调拨单" 
+    custom-class="ele-dialog-form long-dialog-form" 
+    :visible.sync="inventoryAllocationDialogFlag"
+    :before-close="handleClose" 
+    :close-on-click-modal="false" 
+    top="5vh"
+    :close-on-press-escape="false" 
+    append-to-body width="70%"
+  >
+    <el-card shadow="never">
+      <searchTable @search="reload"></searchTable>
+      <ele-pro-table ref="table" :columns="columns" :datasource="datasource" row-key="id"
+                     height="calc(100vh - 500px)" class="dict-table" @cell-click="cellClick">
+        <!-- 表头工具栏 -->
+        <template v-slot:action="{ row }">
+          <el-radio class="radio" v-model="radio" :label="row.id"><i></i></el-radio>
+        </template>
+      </ele-pro-table>
+    </el-card>
+
+    <div class="btns" slot="footer">
+      <el-button type="primary" size="small" @click="selected">选择</el-button>
+      <el-button size="small" @click="handleClose">关闭</el-button>
+    </div>
+
+  </el-dialog>
+</template>
+
+<script>
+
+
+import searchTable from './inventoryAllocationSearchTable.vue';
+import { getAllotApplyPage } from '@/api/wms';
+import { allocationType } from '@/enum/dict.js';
+
+export default {
+  components: {
+    searchTable
+  },
+  props: ['inventoryAllocationDialogFlag'],
+  data() {
+    return {
+      currentIndex: null,
+      allocationType,
+      stutusOptions: {
+          0: '未提交',
+          1: '审核中',
+          2: '已完成',
+          3: '已驳回'
+        },
+      // 表格列配置
+        columns: [
+          {
+            columnKey: 'index',
+            label: '序号',
+            type: 'index',
+            width: 55,
+            align: 'center',
+            showOverflowTooltip: true,
+            fixed: 'left'
+          },
+          {
+            action: 'action',
+            slot: 'action',
+            align: 'center',
+            label: '选择',
+            },
+          {
+            prop: 'name',
+            label: '调拨名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            slot: 'allotCode',
+            prop: 'allotCode',
+            label: '调拨单号',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 180
+          },
+          {
+            prop: 'type',
+            label: '调拨类型',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110,
+            formatter: (row, column, cellValue) => {
+              return this.allocationType.filter(
+                (item) => item.code == row.type
+              )[0].label;
+            }
+          },
+          {
+            prop: 'categoryName',
+            label: '物品名称',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'categoryCode',
+            label: '物品编码',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'sourceWarehouse',
+            label: '来源仓库',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'targetWarehouse',
+            label: '目标仓库',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'allotName',
+            label: '调拨人',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'createTime',
+            label: '调拨时间',
+            align: 'center',
+            showOverflowTooltip: true,
+            minWidth: 110
+          },
+          {
+            prop: 'status',
+            label: '状态',
+            align: 'center',
+            showOverflowTooltip: true,
+            formatter: (row, column, cellValue) => {
+              return this.stutusOptions[row.status];
+            }
+          },
+        ],
+      radio: null,
+    }
+  },
+
+  methods: {
+    /* 表格数据源 */
+    datasource({page, limit, where, order}) {
+      return getAllotApplyPage({
+        pageNum: page,
+        size: limit,
+        ...where,
+        status: 2,
+        type: 2
+      });
+    },
+
+    /* 刷新表格 */
+    reload(where) {
+      this.$refs.table.reload({pageNum: 1, where: where, status: 2, type: 2});
+    },
+
+    // 单击获取id
+    cellClick(row) {
+      this.current = row
+      this.radio = row.id
+    },
+    handleClose() {
+      this.$emit('update:inventoryAllocationDialogFlag', false)
+    },
+
+    selected() {
+      if (!this.current) {
+        return this.$message.warning('请至少选择一条数据')
+      }
+      this.$emit('changeParent', this.current, this.currentIndex)
+      this.handleClose()
+    },
+
+
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.tree_col {
+  border: 1px solid #eee;
+  padding: 10px 0;
+  box-sizing: border-box;
+  height: 500px;
+  overflow: auto;
+}
+
+.table_col {
+  padding-left: 10px;
+
+  ::v-deep .el-table th.el-table__cell {
+    background: #f2f2f2;
+  }
+}
+
+.pagination {
+  text-align: right;
+  padding: 10px 0;
+}
+
+.btns {
+  text-align: center;
+  padding: 10px 0;
+}
+
+.topsearch {
+  margin-bottom: 15px;
+}
+</style>

+ 276 - 0
src/views/transportManager/shipManage/dispatchManage/components/inventoryAllocationSearchTable.vue

@@ -0,0 +1,276 @@
+<!-- 搜索表单 -->
+<template>
+  <el-form
+    label-width="80px"
+    class="ele-form-search"
+    @keyup.enter.native="search"
+    @submit.native.prevent
+  >
+    <el-row :gutter="15">
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="所属工厂" prop="factoryId">
+          <el-select
+            filterable
+            placeholder="请选择"
+            @change="getWarehouseListHandle"
+            v-model="where.factoryId"
+            clearable
+            class="w100"
+          >
+            <el-option
+              v-for="item in factoryList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="调出仓库" prop="sourceWarehouse">
+          <el-select
+            filterable
+            placeholder="请选择"
+            v-model="where.sourceWarehouse"
+            clearable
+            class="w100"
+          >
+            <el-option
+              v-for="item in warehouseList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="调入仓库" prop="targetWarehouse">
+          <el-select
+            filterable
+            placeholder="请选择"
+            v-model="where.targetWarehouse"
+            clearable
+            class="w100"
+          >
+            <el-option
+              v-for="item in warehouseList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="调拨单号:">
+          <el-input
+            clearable
+            v-model="where.allotCode"
+            placeholder="请输入物品名称"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="调拨名称:">
+          <el-input
+            clearable
+            v-model="where.name"
+            placeholder="请输入物品名称"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="物品名称:">
+          <el-input
+            clearable
+            v-model="where.categoryName"
+            placeholder="请输入物品名称"
+          />
+        </el-form-item>
+      </el-col>
+      <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="物品编码:">
+          <el-input
+            clearable
+            v-model="where.categoryCode"
+            placeholder="请输入物品编码"
+          />
+        </el-form-item>
+      </el-col>
+      <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="调拨类型" prop="type">
+          <el-select
+            filterable
+            placeholder="请选择"
+            v-model="where.type"
+            clearable
+            class="w100"
+          >
+            <el-option
+              v-for="item in allocationType"
+              :key="item.code"
+              :label="item.label"
+              :value="item.code"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col> -->
+      <!-- <el-col v-bind="styleResponsive ? { lg: 6, md: 12 } : { span: 6 }">
+        <el-form-item label="调拨状态" prop="status">
+          <el-select
+            filterable
+            placeholder="请选择"
+            v-model="where.status"
+            clearable
+            class="w100"
+          >
+            <el-option
+              v-for="item in stutusOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+      </el-col> -->
+      <el-col v-bind="styleResponsive ? { lg: 18, md: 12 } : { span: 18 }">
+        <div class="ele-form-actions">
+          <el-button
+            type="primary"
+            icon="el-icon-search"
+            class="ele-btn-icon"
+            @click="search"
+            size="small"
+          >
+            查询
+          </el-button>
+          <el-button
+            @click="reset"
+            icon="el-icon-refresh-left"
+            size="small"
+            type="primary"
+            >重置</el-button
+          >
+        </div>
+      </el-col>
+    </el-row>
+  </el-form>
+</template>
+
+<script>
+  import { allocationType } from '@/enum/dict.js';
+  import { getFactoryarea } from '@/api/main/index'
+  import { getWarehouseTrees, getWarehouseList } from '@/api/wms';
+  export default {
+    data() {
+      // 默认表单数据
+      const defaultWhere = {
+        name: '',
+        allotCode: '',
+        type: '',
+        status: '',
+        factoryId: '',
+        categoryName: '',
+        categoryCode: '',
+        targetWarehouse: '',
+        sourceWarehouse: ''
+      };
+      return {
+        // 表单数据
+        where: { ...defaultWhere },
+        treeLoading: false,
+        allocationType,
+        treeData: [],
+        factoryList: [],
+        warehouseList: [],
+        allWarehouseList: [],
+        stutusOptions: [
+          {
+            value: 0,
+            label: '未提交'
+          },
+          {
+            value: 1,
+            label: '审核中'
+          },
+          {
+            value: 2,
+            label: '已完成'
+          }
+        ]
+      };
+    },
+    computed: {
+      // 是否开启响应式布局
+      styleResponsive() {
+        return this.$store.state.theme.styleResponsive;
+      }
+    },
+    created() {
+      this.getArguInfo();
+      this.getFactoryList();
+    },
+    methods: {
+      async getTreeData(val) {
+        this.where.targetWarehouse = '';
+        this.where.sourceWarehouse = '';
+        try {
+          this.treeLoading = true;
+          let res = await getWarehouseTrees({
+            factoriesId: val
+          });
+          this.treeLoading = false;
+          if (res?.code === '0') {
+            this.warehouseList = res.data;
+          }
+        } catch (error) {
+          console.log(error);
+        }
+        this.treeLoading = false;
+      },
+
+      async getArguInfo() {
+        const { data } = await getWarehouseList();
+        this.allWarehouseList = data;
+      },
+      //获取工厂列表
+      async getFactoryList() {
+        const res = await getFactoryarea({
+          pageNum: 1,
+          size: 9999,
+          type: 1
+        });
+        this.factoryList = res.list;
+      },
+
+      getWarehouseListHandle(val) {
+        this.where.targetWarehouse = '';
+        this.where.sourceWarehouse = '';
+        this.warehouseList = this.allWarehouseList.filter(
+          (item) => item.factoryId === val
+        );
+      },
+      /* 搜索 */
+      search() {
+        console.log(this.where);
+        this.$emit('search', this.where);
+      },
+      /*  重置 */
+      reset() {
+        this.where = { ...this.defaultWhere };
+        this.search();
+      }
+    }
+  };
+</script>
+<style lang="scss" scoped>
+  .ele-form-actions {
+    display: flex;
+    align-items: center;
+    justify-content: flex-end;
+  }
+  .el-form-item {
+    margin-bottom: 5px !important;
+  }
+</style>

+ 25 - 1
src/views/transportManager/shipManage/dispatchManage/components/taskInfoTable.vue

@@ -246,6 +246,13 @@
       ref="returnOrderDialogRef"
     >
     </return-order-dialog>
+    <!-- 调拨发货   -->
+    <inventory-allocation-dialog
+      ref="inventoryAllocationDialogRef"
+      :inventoryAllocationDialogFlag.sync="inventoryAllocationDialogFlag"
+      v-if="inventoryAllocationDialogFlag"
+      @changeParent="getTransferSendInfo"
+    ></inventory-allocation-dialog>
     <!-- 采购退货   -->
     <purchase-return-order-dialog
       :purchaseReturnOrderDialogFlag.sync="purchaseReturnOrderDialogFlag"
@@ -279,6 +286,7 @@
   import returnOrderDialog from '@/views/saleManage/saleOrder/customerReturnOrder/returnOrderDialog.vue';
   import purchaseReturnOrderDialog from './purchaseReturnOrderDialog.vue';
   import { checkDriverIsBusyAPI } from '@/api/transportManager/shipManage';
+  import inventoryAllocationDialog from './inventoryAllocationDialog.vue';
 
   export default {
     name: 'relatedInfoTable',
@@ -290,7 +298,8 @@
       purchaseReceivingGoodsDialog,
       purchaseReturnOrderDialog,
       selectCarDialog,
-      selectDriverDialog
+      selectDriverDialog,
+      inventoryAllocationDialog
     },
     props: {
       trakNoteList: {
@@ -311,6 +320,7 @@
         entrustedReceiveDialogFlag: false,
         returnOrderDialogFlag: false,
         purchaseReturnOrderDialogFlag: false,
+        inventoryAllocationDialogFlag: false,
         form: {
           datasource: []
         }
@@ -487,6 +497,8 @@
             break;
           case '6': //采购退货
             this.handlePurchaseReturnOrder(row);
+          case '7': //调拨发货
+            this.handleTransferSend(row);
             break;
         }
       },
@@ -592,6 +604,18 @@
         };
         this.setSelectData(row);
       },
+      //选择调拨发货单
+      handleTransferSend() {
+        this.inventoryAllocationDialogFlag = true;
+      },
+      //调拨发货单回调
+      getTransferSendInfo(params) {
+        let row = {
+          id: params.id,
+          code: params.allotCode
+        };
+        this.setSelectData(row);
+      },
 
       //选择司机
       handleDriver(row, index) {