Kaynağa Gözat

采购计划齐套性检查重构:简化表单结构,新增采购订单下发功能,优化表格列显示及供应商选择逻辑

yusheng 9 ay önce
ebeveyn
işleme
deb5324e5f

+ 167 - 347
src/BIZComponents/homogeneityInspect/orderHomogeneityInspectDialog.vue

@@ -10,178 +10,87 @@
       :maxable="true"
     >
       <div v-loading="loading">
-        <el-form label-width="80px" :model="dataObj" class="order_form">
+        <el-form label-width="80px" :model="form" class="order_form">
           <el-row :gutter="20" type="flex" style="flex-wrap: wrap">
             <el-col :span="8">
               <el-form-item label="单据编码:">
-                <el-input readonly v-model="dataObj.code"></el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="编码:">
-                <el-input readonly v-model="dataObj.productCode"></el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="名称:">
-                <el-input readonly v-model="dataObj.productName"></el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="规格:">
-                <el-input readonly v-model="dataObj.specification"></el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="型号:">
-                <el-input readonly v-model="dataObj.model"></el-input>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item label="数量:">
-                <el-input readonly v-model="dataObj.totalCount"></el-input>
+                <el-input readonly v-model="form.planCode"></el-input>
               </el-form-item>
             </el-col>
           </el-row>
         </el-form>
-        <div class="form-wrapper">
-          <div
-            class="left_tree"
-            v-show="leftShow"
-            :style="{ width: leftWidth }"
+        <div>
+          <ele-pro-table
+            ref="table"
+            :needPage="false"
+            :columns="columns"
+            key="checkTable"
+            :init-load="false"
+            :selection.sync="selection"
+            :datasource="datasourceList"
           >
-            <el-tree
-              ref="treeRef"
-              :expand-on-click-node="false"
-              :data="cardList"
-              :props="treeProps"
-              node-key="id"
-              highlight-current
-              @node-click="handleNodeClick"
-            ></el-tree>
-          </div>
-          <div :style="{ width: rightWidth }">
-            <div>
-              <ele-pro-table
-                ref="table"
-                :needPage="false"
-                :columns="columns"
-                key="checkTable"
-                :init-load="false"
-                :datasource="datasourceList"
+            <template v-slot:toolbar>
+              <el-button
+                size="small"
+                type="primary"
+                icon="el-icon-plus"
+                class="ele-btn-icon"
+                @click="issuePurchaseOrder"
+                v-if="form.status == 2"
+              >
+                下发采购订单
+              </el-button>
+            </template>
+            <template v-slot:inventoryQuantity="{ row }">
+              <el-link
+                type="primary"
+                :underline="false"
+                @click="stockDetail(row)"
+              >
+                {{ row.inventoryQuantity }}
+              </el-link>
+            </template>
+            <template v-slot:inTransitNum="{ row }">
+              <el-link
+                type="primary"
+                :underline="false"
+                @click="currentDetail(row)"
+              >
+                {{ row.inTransitNum }}
+              </el-link>
+            </template>
+            <template v-slot:inventoryStatusText="{ row }">
+              <div
+                :class="
+                  row.inventoryStatusText == '缺料'
+                    ? 'statusRed'
+                    : 'statusGreen'
+                "
+              >
+                {{ row.inventoryStatusText }}
+              </div>
+            </template>
+            <template v-slot:inTransitStatusText="{ row }">
+              <div
+                :class="
+                  row.inTransitStatusText == '缺料'
+                    ? 'statusRed'
+                    : 'statusGreen'
+                "
+              >
+                {{ row.inTransitStatusText }}
+              </div>
+            </template>
+            <template v-slot:finalStateText="{ row }">
+              <div
+                :class="
+                  row.finalStateText == '缺料' ? 'statusRed' : 'statusGreen'
+                "
               >
-                <template v-slot:toolkit>
-                  <el-form
-                    :inline="true"
-                    :model="formInline"
-                    class="demo-form-inline"
-                  >
-                    <el-form-item label="BOM类型">
-                      <el-select
-                        size="mini"
-                        v-model="formInline.bomType"
-                        placeholder="BOM类型"
-                        class="select-type"
-                        @change="bomTypeChange"
-                      >
-                        <el-option
-                          v-for="item in bomListType"
-                          :key="item.id"
-                          :label="item.bomName"
-                          :value="item.id"
-                        >
-                        </el-option>
-                      </el-select>
-                    </el-form-item>
-                    <el-form-item label="BOM版本">
-                      <el-select
-                        class="select-type"
-                        size="mini"
-                        v-model="formInline.bomId"
-                        placeholder="BOM版本"
-                        @change="bomVChange"
-                      >
-                        <el-option
-                          v-for="item in bomListV"
-                          :key="item.bomId"
-                          :label="item.versions"
-                          :value="item.bomId"
-                        >
-                        </el-option>
-                      </el-select>
-                    </el-form-item>
-                    <el-form-item label="最终状态">
-                      <el-select
-                        class="select-type"
-                        size="mini"
-                        v-model="formInline.finalState"
-                        placeholder="最终状态"
-                        @change="finalChange"
-                      >
-                        <el-option
-                          v-for="item in finalStateList"
-                          :key="item.value"
-                          :label="item.label"
-                          :value="item.value"
-                        >
-                        </el-option>
-                      </el-select>
-                    </el-form-item>
-                  </el-form>
-                </template>
-                <template v-slot:inventoryQuantity="{ row }">
-                  <el-link
-                    type="primary"
-                    :underline="false"
-                    @click="stockDetail(row)"
-                  >
-                    {{ row.inventoryQuantity }}
-                  </el-link>
-                </template>
-                <template v-slot:inTransitNum="{ row }">
-                  <el-link
-                    type="primary"
-                    :underline="false"
-                    @click="currentDetail(row)"
-                  >
-                    {{ row.inTransitNum }}
-                  </el-link>
-                </template>
-                <template v-slot:inventoryStatusText="{ row }">
-                  <div
-                    :class="
-                      row.inventoryStatusText == '缺料'
-                        ? 'statusRed'
-                        : 'statusGreen'
-                    "
-                  >
-                    {{ row.inventoryStatusText }}
-                  </div>
-                </template>
-                <template v-slot:inTransitStatusText="{ row }">
-                  <div
-                    :class="
-                      row.inTransitStatusText == '缺料'
-                        ? 'statusRed'
-                        : 'statusGreen'
-                    "
-                  >
-                    {{ row.inTransitStatusText }}
-                  </div>
-                </template>
-                <template v-slot:finalStateText="{ row }">
-                  <div
-                    :class="
-                      row.finalStateText == '缺料' ? 'statusRed' : 'statusGreen'
-                    "
-                  >
-                    {{ row.finalStateText }}
-                  </div>
-                </template>
-               
-              </ele-pro-table>
-            </div>
-          </div>
+                {{ row.finalStateText }}
+              </div>
+            </template>
+          </ele-pro-table>
         </div>
       </div>
       <div slot="footer">
@@ -197,12 +106,12 @@
 
 <script>
   import {
-    findBomSalesorderCategoryId,
-    getMaterialInfo
-  } from '@/api/aps/index.js';
+    getMaterialInfo,
+    issuePurchaseOrder
+  } from '@/api/purchasingManage/purchasePlanManage';
   import stockDetailDialog from './stockDetailDialog.vue';
   import currentDetailDialog from './currentDetailDialog.vue';
-  
+
   export default {
     components: {
       stockDetailDialog,
@@ -211,32 +120,11 @@
     data() {
       return {
         visible: false,
-        formInline: {
-          finalState: 0
-        },
-        finalStateList: [
-          {
-            label: '全部',
-            value: 0
-          },
-          {
-            label: '齐套',
-            value: 1
-          },
-          {
-            label: '缺料',
-            value: 2
-          }
-        ],
+
         loading: false,
-        datasourceAllList: [], // 表格物料全部数据
         datasourceList: [], // 表格物料数据
-        bomListV: [], // BOM版本
-        bomListType: [], // BOM 类型
-        form: {
-          homogeneityInspect: []
-        },
-
+        form: {},
+        selection: [],
         columns: [
           {
             columnKey: 'index',
@@ -252,39 +140,36 @@
             columnKey: 'selection',
             align: 'center',
             slot: 'selection',
-            fixed: 'left'
+            fixed: 'left',
+            selectable: (row, index) => {
+              return !row.hasIssued 
+            }
           },
           {
-            prop: 'batchNo',
-            label: '批次号',
+            prop: 'supplierName',
+            label: '供应商名称',
             align: 'center',
             minWidth: 100,
             showOverflowTooltip: true
           },
+
           {
             prop: 'productCode',
-            label: '编码',
-            align: 'center',
-            minWidth: 100,
-            showOverflowTooltip: true
-          },
-          {
-            prop: 'code',
             label: '物料编码',
             align: 'center',
             minWidth: 100,
             showOverflowTooltip: true
           },
           {
-            prop: 'name',
+            prop: 'productName',
             label: '物料名称',
             align: 'center',
             minWidth: 100,
             showOverflowTooltip: true
           },
           {
-            prop: 'demandQuantity',
-            label: '定额数量',
+            prop: 'totalCount',
+            label: '需求数量',
             showOverflowTooltip: true,
             align: 'center'
           },
@@ -346,6 +231,16 @@
             align: 'center',
             minWidth: 120
           },
+
+          {
+            prop: 'hasIssued',
+            label: '下发状态',
+            align: 'center',
+            minWidth: 80,
+            formatter: (row) => {
+              return row.hasIssued ? '已下发' : '未下发';
+            }
+          },
           {
             slot: 'finalStateText',
             prop: 'finalStateText',
@@ -362,172 +257,97 @@
           //   fixed: 'right',
           //   slot: 'action'
           // }
-        ],
-        ids: [],
-        leftShow: false,
-        leftWidth: '0%',
-        rightWidth: '100%',
-        cardList: [],
-        treeProps: {
-          label: 'productName',
-          children: 'children'
-        },
-        dataObj: {
-          code: '',
-          productCode: '',
-          productName: '',
-          totalCount: '',
-          specification: '',
-          model: ''
-        },
+        ]
       };
     },
-    watch: {
-      leftShow(newVal, oldVal) {
-        if (newVal) {
-          this.leftWidth = '250px';
-          this.rightWidth = 'calc(100% - 260px)';
-        } else {
-          this.leftWidth = '0';
-          this.rightWidth = '100%';
-        }
-      }
-    },
+
     methods: {
-      reload(where) {
-        this.$nextTick(() => {
-          this.$refs.table.reload({ page: 1, where });
-        });
-      },
       // 定额数量
       stockDetail(row) {
-        this.$refs.stockDetailDialog.open({ bomCode: row.code });
+        this.$refs.stockDetailDialog.open({ bomCode: row.productCode });
       },
       // 在途
       currentDetail(row) {
-        this.$refs.currentDetailDialog.open({ bomCode: row.code });
+        this.$refs.currentDetailDialog.open({ bomCode: row.productCode });
       },
-      open(dataList) {
-        this.visible = true;
-        this.cardList = dataList;
-
-        if (dataList.length === 1) {
-          this.leftShow = false;
+      async issuePurchaseOrder() {
+        if (!this.selection.length) {
+          return this.$message.warning('请选择一条数据!');
+        }
+        let productData = [];
+        this.selection.forEach((item) => {
+          if (!item.supplierName) {
+            productData.push(item.productName);
+          }
+        });
+        if (productData.length) {
+          this.$alert(
+            `物料${productData.join(',')}没有维护供应商,${
+              productData.length > 1 ? '会合并下发为一个采购订单,' : ''
+            }是否继续下发!`,
+            {
+              confirmButtonText: '确定',
+              callback: (action) => {
+                console.log(action);
+              }
+            }
+          );
         } else {
-          this.leftShow = true;
-          this.$nextTick(() => {
-            this.$refs.treeRef.setCurrentKey(dataList[0].id);
-          });
+          this.issuePurchaseOrderFn();
         }
-        this.handleNodeClick(this.cardList[0]);
-      },
-      cancel() {
-        this.clearData();
-        this.visible = false;
-      },
-
-      confirm() {
-        this.visible = false;
-      },
-
-      handleNodeClick(data) {
-        this.clearData();
-        this.dataObj = data;
-        this.getBomData();
       },
-      // 获取bom 数据
-      async getBomData() {
-        this.loading = true;
-        try {
-          const res = await findBomSalesorderCategoryId( this.dataObj.productId);
-          if (!res || res.length == 0) {
-            this.loading = false;
-            this.datasourceList = [];
-            return;
-          }
-          let obj = {};
-          let bomMap = {
-            1: 'PBOM',
-            2: 'MBOM',
-            3: 'ABOM',
-            4: 'EBOM'
-          };
-          res.map((el) => {
-            el.bomName = bomMap[el.bomType];
-            let OBMINFO = {
-              bomId: el.bomId,
-              bomType: el.type,
-              versions: `V${el.versions}.0`,
-              code: el.code
+      issuePurchaseOrderFn() {
+        issuePurchaseOrder({
+          planId: this.form.id,
+          detailList: this.selection.map((item) => {
+            return {
+              detailId: item.detailId,
+              finalShortageQuantity: item.finalShortageQuantity
             };
-            if (obj[el.bomType]) {
-              obj[el.bomType].bomList.unshift(OBMINFO);
-            } else {
-              obj[el.bomType] = { ...el, bomList: [OBMINFO] };
+          })
+        })
+          .then((res) => {
+            if (res) {
+              this.$message.success('下发成功');
+              this.visible = false;
+              this.$emit('reload');
             }
-          });
-          let list = Object.values(obj);
-          this.bomListType = list;
-          await this.bomTypeChange(list[0].id);
-          this.loading = false;
-        } catch (err) {
-          this.$message.error(err.message);
-          this.loading = false;
-        }
+          })
+          .catch(() => {});
       },
-      // 选择BOM类型
-      async bomTypeChange(e) {
-        this.formInline.bomType = e;
-        let data = this.bomListType.find((el) => el.id === e);
-        if (!data) return;
-        this.bomListV = data.bomList;
-        await this.bomVChange(data.bomList[0].bomId);
+
+      open(data) {
+        this.visible = true;
+        this.$set(this, 'form', data);
+        this.getMaterialData();
       },
-      // 选择BOM版本
-      async bomVChange(e) {
-        this.formInline.bomId = e;
-        let data = this.bomListV.find((el) => el.bomId === e);
-        if (!data) return;
-        await this.getMaterialData(data);
+      cancel() {
+        this.clearData();
+        this.visible = false;
       },
+
       // 获取物料数据信息
-      async getMaterialData(data) {
+      async getMaterialData() {
         const result = await getMaterialInfo({
-          categoryId: this.dataObj.productId,
-          bomVersionId: data.bomId,
-          requiredFormingNum: this.dataObj.totalCount
+          planId: this.form.id
         });
-        result.map((item) => {
-          item.batchNo = this.dataObj.batchNo;
-          item.productCode = this.dataObj.productCode;
-          item.finalState =
-            item.finalStateText == '齐套'
-              ? 1
-              : item.finalStateText == '缺料'
-              ? 2
-              : '';
-        });
-        this.datasourceAllList = result;
-        this.finalChange(0);
-      },
-      // 选择状态
-      finalChange(e) {
-        if (e === 0 || !e) {
-          this.datasourceList = this.datasourceAllList;
-          return;
-        }
-        this.datasourceList = this.datasourceAllList.filter(
-          (item) => item.finalState === e
-        );
+        // result.map((item) => {
+        //   item.batchNo = this.dataObj.batchNo;
+        //   item.productCode = this.dataObj.productCode;
+        //   item.finalState =
+        //     item.finalStateText == '齐套'
+        //       ? 1
+        //       : item.finalStateText == '缺料'
+        //       ? 2
+        //       : '';
+        // });
+        this.datasourceList = result;
       },
+
       clearData() {
-        this.formInline = {
-          finalState: 0
-        };
-        this.bomListV = [];
-        this.bomListType = [];
         this.datasourceList = [];
-        this.datasourceAllList = [];
+        this.form = {};
+        this.selection = [];
       }
     }
   };

+ 26 - 3
src/api/purchasingManage/purchasePlanManage.js

@@ -1,6 +1,5 @@
 import request from '@/utils/request';
 
-
 /**
  * 获取信息列表
  */
@@ -90,9 +89,12 @@ export async function isHasGeneratedContractPI(id) {
  * 拆分采购计划数据
  */
 export async function savePurchasePlanCutAPI(data) {
-  const res = await request.post(`/eom/purchaseplan/savePurchasePlanCutDetails`,data);
+  const res = await request.post(
+    `/eom/purchaseplan/savePurchasePlanCutDetails`,
+    data
+  );
   if (res.data) {
-    return res.data.code
+    return res.data.code;
   }
   return Promise.resolve(false);
 }
@@ -106,3 +108,24 @@ export async function isPlanPerson(id) {
   }
   return Promise.resolve(0);
 }
+
+/**
+ * 获取bom的齐套性检查数据
+ */
+export async function getMaterialInfo(params) {
+  const res = await request.get(`/eom/common/getMaterialInfo`, { params });
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.reject(new Error(res.data.message));
+}
+/**
+ * 下发采购订单
+ */
+export async function issuePurchaseOrder(data) {
+  const res = await request.post(`/eom/common/issuePurchaseOrder`, data);
+  if (res.data.code == 0) {
+    return res.data.data;
+  }
+  return Promise.resolve(false);
+}

+ 2 - 0
src/views/purchasingManage/purchaseOrder/invoice/components/detailDialog.vue

@@ -303,6 +303,7 @@
             {
               width: 150,
               prop: 'purchaseCount',
+              show: v != 2,
               label: '数量',
               slot: 'purchaseCount',
               headerSlot: 'headerTotalCount',
@@ -311,6 +312,7 @@
             {
               width: 150,
               prop: 'purchaseUnit',
+              show: v != 2,
               label: '单位',
               slot: 'purchaseUnit',
               headerSlot: 'headerTotalCount',

+ 8 - 7
src/views/purchasingManage/purchasePlanManage/index.vue

@@ -195,6 +195,7 @@
     ></process-submit-dialog>
     <orderHomogeneityInspectDialog
       ref="orderHomogeneityInspectRef"
+      @reload="reload"
     ></orderHomogeneityInspectDialog>
   </div>
 </template>
@@ -251,7 +252,7 @@
         params: {},
         cacheKeyUrl: 'eos-c2e9664a-purchasingManage-purchasePlanManage',
         columnsVersion: 1,
-        selection:[]
+        selection: []
       };
     },
     //客户管理数据
@@ -425,12 +426,12 @@
           return this.$message.warning('请选择一条单据!');
         }
 
-        let data = await getplanDetail(this.selection[0].id);
-        data.detailList = data.detailList.map((item) => {
-          item['code'] = data.planCode;
-          return item;
-        });
-        this.$refs.orderHomogeneityInspectRef.open(data.detailList);
+        // let data = await getplanDetail(this.selection[0].id);
+        // data.detailList = data.detailList.map((item) => {
+        //   item['code'] = data.planCode;
+        //   return item;
+        // });
+        this.$refs.orderHomogeneityInspectRef.open(this.selection[0]);
       },
       /* 表格数据源 */
       datasource({ page, limit, where, order }) {