From 33032d320cb75854def7391026b0401f1bfb8360 Mon Sep 17 00:00:00 2001
From: 黎星凯 <13949086503@163.com>
Date: 星期六, 11 五月 2024 17:26:02 +0800
Subject: [PATCH] 20240511修改: 分发单优化, 分类,物品,分发单明细,采购单明细数据导入

---
 admin-web/src/views/stock/procure/purchaseOrder/edit.vue |  328 +++++++++++++++++++++++++++++-------------------------
 1 files changed, 177 insertions(+), 151 deletions(-)

diff --git a/admin-web/src/views/stock/procure/purchaseOrder/edit.vue b/admin-web/src/views/stock/procure/purchaseOrder/edit.vue
index 9ed3d61..e08e183 100644
--- a/admin-web/src/views/stock/procure/purchaseOrder/edit.vue
+++ b/admin-web/src/views/stock/procure/purchaseOrder/edit.vue
@@ -1,24 +1,25 @@
 <template>
-  <win-md class="stock-edit" :title="`${setting.title}閲囪喘鍏ュ簱`" @close="close" :width="'800px'">
-    <el-form class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
+  <win-md class="stock-edit" :title="`${setting.title}閲囪喘鍏ュ簱`" @close="close" :width="'800px'" :loading="loading">
+    <el-form v-loading="loading" class="form" ref="ruleForm" :model="formData" :rules="rules" label-width="120px">
       <div class="main-w">
         <el-row :gutter="24" class="headerHeight">
           <el-col :span="12">
             <el-form-item label="鍏ュ簱浠撳簱" prop="warehouseId">
-              <el-select v-model="formData.warehouseId" placeholder="璇烽�夋嫨" style="width: 100%">
-                <el-option v-for="item in warehouses" :key="item.id" :label="item.warehouseName" :value="item.id" />
+              <el-select v-model="formData.warehouseId" placeholder="璇烽�夋嫨" clearable style="width: 100%">
+                <el-option v-for="item in warehouses" :key="item.id" :label="item.warehouseName" :value="item.id"/>
               </el-select>
             </el-form-item>
           </el-col>
           <el-col :span="12">
             <el-form-item label="閲囪喘鏃堕棿" prop="procureTime">
               <el-date-picker
-                v-model="formData.procureTime"
-                type="datetime"
-                value="yyyy-MM-dd HH:mm:ss"
-                value-format="yyyyMMddHHmmss"
-                placeholder="璇烽�夋嫨鏃ユ湡"
-                style="width: 100%"
+                  v-model="formData.procureTime"
+                  type="datetime"
+                  clearable
+                  value="yyyy-MM-dd HH:mm:ss"
+                  value-format="yyyyMMddHHmmss"
+                  placeholder="璇烽�夋嫨鏃ユ湡"
+                  style="width: 100%"
               >
               </el-date-picker>
             </el-form-item>
@@ -28,7 +29,7 @@
           <el-col :span="12">
             <el-form-item label="閲囪喘绫诲瀷" prop="buyType">
               <el-select v-model="formData.buyType" placeholder="璇烽�夋嫨" style="width: 100%">
-                <el-option v-for="item in buyTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
+                <el-option v-for="item in buyTypeOptions" :key="item.value" :label="item.label" :value="item.value"/>
               </el-select>
             </el-form-item>
           </el-col>
@@ -44,42 +45,46 @@
           <el-row :gutter="24">
             <el-col :span="12">
               <el-form-item
-                label="鐗╁搧鍒嗙被"
-                :prop="`procureGoods[${goodsIndex}].baseCategoryIds`"
-                :rules="{
+                  label="鐗╁搧鍒嗙被"
+                  :prop="`procureGoods.${goodsIndex}.baseCategoryId`"
+                  :rules="{
                   required: true,
-                  message: '璇烽�夋嫨',
+                  message: '璇烽�夋嫨鐗╁搧鍒嗙被',
                   trigger: 'change',
                 }"
               >
                 <el-cascader
-                  v-model="goodsItem.baseCategoryIds"
-                  :options="categoryOptions"
-                  :props="{ value: 'id' }"
-                  @change="categoryChange($event, goodsIndex)"
-                  style="width: 100%"
+                    v-model="goodsItem.baseCategoryId"
+                    :options="categoryOptions"
+                    :props="{ value: 'id',emitPath: false }"
+                    :show-all-levels="false"
+                    filterable
+                    clearable
+                    @change="categoryChange($event, goodsIndex)"
+                    style="width: 100%"
                 ></el-cascader>
               </el-form-item>
             </el-col>
             <el-col :span="12">
               <el-form-item
-                label="鐗╁搧鍚嶇О"
-                :prop="`procureGoods[${goodsIndex}].baseGoodsTemplateId`"
-                :rules="rules.baseGoodsTemplateId"
+                  label="鐗╁搧鍚嶇О"
+                  :prop="`procureGoods.${goodsIndex}.baseGoodsTemplateId`"
+                  :rules="rules.baseGoodsTemplateId"
               >
                 <el-select
-                 v-model="goodsItem.baseGoodsTemplateId"
-                  placeholder="璇峰厛鎷╃墿鍝佸垎绫�"
-                  filterable
-                  :disabled="!goodsItem.baseCategoryId"
-                  style="width: 100%"
-                  @change="goodsTemplateChange($event, goodsIndex)"
+                    v-model="goodsItem.baseGoodsTemplateId"
+                    :placeholder="goodsItem.baseCategoryId?'璇烽�夋嫨鐗╁搧':'璇峰厛閫夋嫨鐗╁搧鍒嗙被'"
+                    filterable
+                    clearable
+                    :disabled="!goodsItem.baseCategoryId"
+                    style="width: 100%"
+                    @change="goodsTemplateChange($event, goodsIndex)"
                 >
                   <el-option
-                    v-for="item in goodsItem.goodsOptions"
-                    :key="item.id"
-                    :label="item.goodsName"
-                    :value="item.id"
+                      v-for="item in goodsItem.goodsOptions"
+                      :key="item.id"
+                      :label="item.goodsName"
+                      :value="item.id"
                   />
                 </el-select>
               </el-form-item>
@@ -88,35 +93,37 @@
           <el-row :gutter="24">
             <el-col :span="12">
               <el-form-item
-                label="瑙勬牸鍨嬪彿"
-                :prop="`procureGoods[${goodsIndex}].modelsIds`"
-                :rules="{
+                  label="瑙勬牸鍨嬪彿"
+                  :prop="`procureGoods.${goodsIndex}.modelsIds`"
+                  :rules="{
                   required: true,
-                  message: '璇烽�夋嫨',
+                  message: '璇烽�夋嫨瑙勬牸鍨嬪彿',
                   trigger: 'change',
                 }"
               >
                 <el-select
-                  v-model="goodsItem.modelsIds"
-                  multiple
-                  placeholder="璇峰厛鎷╃墿鍝佸悕绉�"
-                  :disabled="!goodsItem.baseCategoryId"
-                  @change="modelChange($event, goodsIndex)"
-                  @remove-tag="modelRemoveTag($event, goodsIndex)"
-                  style="width: 100%"
+                    v-model="goodsItem.modelsIds"
+                    multiple
+                    clearable
+                    :placeholder="goodsItem.baseGoodsTemplateId?'璇烽�夋嫨瑙勬牸鍨嬪彿':'璇峰厛閫夋嫨鐗╁搧鍚嶇О'"
+                    :disabled="!goodsItem.baseGoodsTemplateId"
+                    @change="modelChange($event, goodsIndex)"
+                    @remove-tag="modelRemoveTag($event, goodsIndex)"
+                    @clear="modelRemoveTag(-1, goodsIndex)"
+                    style="width: 100%"
                 >
                   <el-option
-                    v-for="item in goodsItem.modelsOptions"
-                    :key="item.id"
-                    :label="item.modelName"
-                    :value="item.id"
+                      v-for="item in goodsItem.modelsOptions"
+                      :key="item.id"
+                      :label="item.modelName"
+                      :value="item.id"
                   />
                 </el-select>
               </el-form-item>
             </el-col>
             <el-col :span="12">
               <el-form-item label="渚涜揣鍟�" prop="supplier">
-                <el-input v-model="goodsItem.supplier" clearable maxlength="20" show-word-limit />
+                <el-input v-model="goodsItem.supplier" clearable maxlength="20" show-word-limit/>
               </el-form-item>
             </el-col>
           </el-row>
@@ -131,25 +138,29 @@
                 {{ scope.row.unit }}
               </template>
             </el-table-column>
-            <el-table-column prop="price" label="鍗曚环锛堝厓锛�" align="center">
+            <el-table-column prop="priceYuan" label="鍗曚环锛堝厓锛�" align="center">
               <template slot-scope="scope">
                 <el-form-item
-                  label-width="0"
-                  style="margin-bottom: 0"
-                  :prop="`procureGoods[${goodsIndex}].models[${scope.$index}].price`"
-                  :rules="rules.price"
+                    label-width="0"
+                    style="margin-bottom: 0"
+                    :prop="`procureGoods[${goodsIndex}].models[${scope.$index}].priceYuan`"
+                    :rules="rules.priceYuan"
                 >
-                  <el-input type="number" v-model.number="scope.row.price"></el-input>
+                  <el-input
+                      type="number"
+                      v-model.number="scope.row.priceYuan"
+                      @change="priceChange($event, goodsIndex, scope.$index)"
+                  ></el-input>
                 </el-form-item>
               </template>
             </el-table-column>
             <el-table-column prop="counts" label="閲囪喘鏁伴噺" align="center">
               <template slot-scope="scope">
                 <el-form-item
-                  label-width="0"
-                  style="margin-bottom: 0"
-                  :prop="`procureGoods[${goodsIndex}].models[${scope.$index}].counts`"
-                  :rules="rules.counts"
+                    label-width="0"
+                    style="margin-bottom: 0"
+                    :prop="`procureGoods[${goodsIndex}].models[${scope.$index}].counts`"
+                    :rules="rules.counts"
                 >
                   <el-input v-model.number="scope.row.counts"></el-input>
                 </el-form-item>
@@ -158,56 +169,60 @@
           </el-table>
           <div class="btn-group">
             <el-button
-              v-if="formData.procureGoods.length > 1"
-              name="绉婚櫎"
-              type="danger"
-              plain
-              size="mini"
-              @click="removeGoods(goodsIndex)"
-              >绉婚櫎</el-button
+                v-if="formData.procureGoods.length > 1"
+                name="绉婚櫎"
+                type="danger"
+                plain
+                size="mini"
+                @click="removeGoods(goodsIndex)"
+            >绉婚櫎
+            </el-button
             >
             <el-button
-              v-if="formData.procureGoods.length - 1 == goodsIndex"
-              name="鏂板鐗╁搧"
-              type="primary"
-              plain
-              size="mini"
-              @click="addGoods"
-              >鏂板鐗╁搧</el-button
+                v-if="formData.procureGoods.length - 1 == goodsIndex"
+                name="鏂板鐗╁搧"
+                type="primary"
+                plain
+                size="mini"
+                @click="addGoods"
+            >鏂板鐗╁搧
+            </el-button
             >
           </div>
         </div>
       </div>
     </el-form>
     <div slot="footer" align="center" class="dialog-footer">
-      <my-button name="鍙栨秷" site="form" @click="close" />
-      <my-button name="淇濆瓨" site="form" @click="handleSubmit" />
+      <my-button name="鍙栨秷" site="form" @click="close"/>
+      <my-button name="淇濆瓨" site="form" @click="handleSubmit"/>
     </div>
   </win-md>
 </template>
 <script>
 import {
+  goodsModel,
   goodsTemplate,
   procureAdd,
+  procureDetail,
   procureEdit,
   selectTenantWarehouse,
-  goodsModel,
-  procureDetail,
 } from '@/api/stock/procure/purchaseOrder';
-import { getTree } from '@/api/foudation/classification';
+import {getTree} from '@/api/foudation/classification';
 import MyButton from '@/components/myButton/myButton';
 import winMd from '@/components/win/win-md';
 import upload from '@/components/upload/index';
-import { getUploadUrl, getDownUrl } from '@/utils/base';
-import { findParentIds } from '@/utils/index';
-import { mapGetters } from 'vuex';
+import {getUploadUrl} from '@/utils/base';
+import {findParentIds} from '@/utils/index';
+import {mapGetters} from 'vuex';
+import * as DateFormatter from "@/utils/DateFormatter";
 
 export default {
-  components: { MyButton, winMd, upload },
+  components: {MyButton, winMd, upload},
   props: {
     setting: {
       type: Object,
-      default: () => {},
+      default: () => {
+      },
     },
   },
   data() {
@@ -218,7 +233,7 @@
         return callback(new Error('璇烽�夋嫨'));
       }
       let temp = this.formData.procureGoods.filter((v) => v.baseGoodsTemplateId == value);
-      if (!temp || temp.length!=1) {
+      if (!temp || temp.length != 1) {
         return callback(new Error('宸查�夎繃姝ょ墿鍝�'));
       }
       callback();
@@ -236,7 +251,6 @@
     };
     // 鏁伴噺鏍¢獙
     var checkCounts = (rule, value, callback) => {
-      console.log(value)
       if (!value) {
         return callback(new Error('璇疯緭鍏�'));
       }
@@ -251,7 +265,7 @@
       callback();
     };
     return {
-      loading: false,
+      loading: true,
       buyTypeOptions: [
         {
           label: '闆嗛噰',
@@ -269,7 +283,7 @@
       formData: {
         procureDoc: '',
         warehouseId: '', // 鍏ュ簱浠撳簱id
-        procureTime: '', // 閲囪喘鏃堕棿
+        procureTime: DateFormatter.formatDate(new Date(), 'yyyyMMddhhmmss'), // 閲囪喘鏃堕棿
         buyType: '2', // 閲囪喘鏂瑰紡锛�1锛氶泦閲囷紱2=鑷噰锛�
         procureGoods: [],
       },
@@ -287,33 +301,31 @@
       },
       modelsItem: {
         baseGoodsModelsId: '', // 瑙勬牸鍨嬪彿缂栧彿
-        price: null, // 鍗曚环(閲囪喘闇�瑕侊紝璋冩嫧涓嶉渶瑕�)
+        priceYuan: null, // 鍗曚环(鍏�)
+        price: null, // 鍗曚环(鍒� 閲囪喘闇�瑕侊紝璋冩嫧涓嶉渶瑕�)
         counts: null, // 鎿嶄綔鏁伴噺
         unit: null, //鍗曚綅
       },
       rules: {
-        warehouseId: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        procureTime: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        buyType: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
+        warehouseId: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
+        procureTime: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
+        buyType: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
 
-        procureDoc: [{ required: true, message: '璇蜂笂浼�', trigger: 'change' }],
-        baseCategoryIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        baseGoodsTemplateId: [{ validator: checkGoodsTemplateId, trigger: ['blur', 'change'] }],
-        modelsIds: [{ required: true, message: '璇烽�夋嫨', trigger: 'change' }],
-        price: [{ validator: checkPrice, trigger: 'blur' }],
-        counts: [{ validator: checkCounts, trigger: 'blur' }],
+        procureDoc: [{required: true, message: '璇蜂笂浼�', trigger: 'change'}],
+        baseCategoryIds: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
+        baseGoodsTemplateId: [{required: true, message: '璇烽�夋嫨', trigger: 'change'},{validator: checkGoodsTemplateId, trigger: ['blur', 'change']}],
+        modelsIds: [{required: true, message: '璇烽�夋嫨', trigger: 'change'}],
+        priceYuan: [{validator: checkPrice, trigger: 'blur'}],
+        counts: [{validator: checkCounts, trigger: 'blur'}],
       },
 
       uploadSettings: {
         title: '涓婁紶',
         max: 20, // 鏈�澶уぇ灏忥紝鍗曚綅M
         num: 10, // 鏀寔涓婁紶鍥剧墖涓暟
-        accept: '.jpg,.png', // 闄愬埗鏍煎紡
         tip: '', // 鎻愮ず 榛樿锛歚鍙兘涓婁紶${this.defaultSettings.num}涓�${this.defaultSettings.accept}鏂囦欢锛屼笖涓嶈秴杩�${this.defaultSettings.max}kb`
         uploadUrl: getUploadUrl(), // 涓婁紶璺緞
         multiple: true, // 鏄惁鏀寔鎵归噺涓婁紶
-        disabled: false, // 鏄惁绂佺敤
-        type: 'picture', // text/picture
       },
     };
   },
@@ -325,51 +337,56 @@
   },
   methods: {
     async init() {
-      this.getWarehouseList();
-      this.getgoodsTemplate();
-      this.getgoodsModel();
+      await this.getWarehouseList();
+      await this.getgoodsTemplate();
+      await this.getgoodsModel();
+
       // 鑾峰彇鐗╁搧鍒嗙被鍒楄〃
       const treeRes = await getTree();
       this.categoryOptions = this.removeEmptyChildren(treeRes);
       if (this.setting.id) {
-        const detail = await procureDetail({ id: this.setting.id });
+        const detail = await procureDetail({id: this.setting.id});
         this.formData = Object.assign(this.formData, detail);
         if (this.formData.procureDoc) {
           this.fileList = JSON.parse(this.formData.procureDoc);
         }
         this.$set(this.formData, 'buyType', this.formData.buyType.toString());
         this.formData.procureTime = this.formData.procureTime.toString();
-        this.formData.procureGoods.map((item, index) => {
+        this.formData.procureGoods.map(async (item, index) => {
           // 鏍规嵁瀛愰泦ID鎷兼帴鐗╁搧鍒嗙被鍒楄〃
           item.baseCategoryIds = findParentIds(this.categoryOptions, item.baseCategoryId);
           this.$set(
-            this.formData.procureGoods[index],
-            'modelsIds',
-            item.models.map((v) => v.baseGoodsModelsId),
+              this.formData.procureGoods[index],
+              'modelsIds',
+              item.models.map((v) => v.baseGoodsModelsId),
           );
-          this.getgoodsTemplate(item.baseCategoryId, index);
-          this.getgoodsModel(item.baseGoodsTemplateId, index);
+          await this.getgoodsTemplate(item.baseCategoryId, index);
+          await this.getgoodsModel(item.baseGoodsTemplateId, index);
+          await item.models.forEach((child, childIndex) => {
+            this.$set(this.formData.procureGoods[index].models[childIndex], 'priceYuan', child.price / 100);
+          });
           return item;
         });
       }
+      this.loading = false;
     },
 
     // 鑾峰彇鍏ュ簱浠撳簱鍒楄〃
-    getWarehouseList() {
-      selectTenantWarehouse({ agencyId: this.userInfo.tenantId })
-        .then((res) => {
-          this.warehouses = res;
-          if (!this.setting.id && res.length) {
-            this.formData.procureGoods.push(JSON.parse(JSON.stringify(this.goodsItem)));
-          }
-          if (this.warehouses.length && !this.formData.warehouseId) {
-            // 榛樿閫変腑绗竴涓粨搴�
-            this.formData.warehouseId = this.warehouses[0].id;
-          }
-        })
-        .catch((err) => {
-          console.log('err', err);
-        });
+    async getWarehouseList() {
+      await selectTenantWarehouse({agencyId: this.userInfo.tenantId})
+          .then((res) => {
+            this.warehouses = res;
+            if (!this.setting.id && res.length) {
+              this.formData.procureGoods.push(JSON.parse(JSON.stringify(this.goodsItem)));
+            }
+            if (this.warehouses.length && !this.formData.warehouseId) {
+              // 榛樿閫変腑绗竴涓粨搴�
+              this.formData.warehouseId = this.warehouses[0].id;
+            }
+          })
+          .catch((err) => {
+            console.log('err', err);
+          });
     },
 
     removeEmptyChildren(arr) {
@@ -384,8 +401,8 @@
     },
 
     // 鑾峰彇鐗╁搧鍚嶇О鍒楄〃
-    getgoodsTemplate(id, index) {
-      goodsTemplate({ categoryId: id || '' }).then((res) => {
+    async getgoodsTemplate(id, index) {
+      await goodsTemplate({agencyId: this.userInfo.tenantId, categoryId: id || ''}).then((res) => {
         if (index || index == 0) {
           this.$set(this.formData.procureGoods[index], 'goodsOptions', res);
         } else {
@@ -395,8 +412,8 @@
     },
 
     // 瑙勬牸鍨嬪彿
-    getgoodsModel(id, index) {
-      goodsModel({ goodsTemplatesId: id || '' }).then((res) => {
+    async getgoodsModel(id, index) {
+      await goodsModel({goodsTemplatesId: id || ''}).then((res) => {
         if (index || index == 0) {
           this.$set(this.formData.procureGoods[index], 'modelsOptions', res);
         } else {
@@ -432,9 +449,8 @@
       this.formData.procureGoods[index].modelsIds = [];
       this.formData.procureGoods[index].models = [];
 
-      this.formData.procureGoods[index].baseCategoryId = e[e.length - 1];
       // 鏍规嵁閫変腑鍒嗙被璇锋眰鐗╁搧鍚嶇О鍒楄〃
-      this.getgoodsTemplate(e[e.length - 1], index);
+      this.getgoodsTemplate(e, index);
     },
 
     // 鐗╁搧鍚嶇О鍒楄〃
@@ -455,7 +471,7 @@
       e.forEach((item) => {
         if (str.indexOf(item) == -1) {
           let temp = this.goodsModelAll.find((v) => v.id == item);
-          arr.push({ ...this.modelsItem, baseGoodsModelsId: item, unit: temp.unit });
+          arr.push({...this.modelsItem, baseGoodsModelsId: item, unit: temp.unit});
         }
       });
       this.formData.procureGoods[index].models = arr;
@@ -463,9 +479,18 @@
 
     // 瑙勬牸鍨嬪彿绉婚櫎
     modelRemoveTag(e, index) {
+      if(e===-1){
+        this.formData.procureGoods[index].models = []
+        return
+      }
       let arr = this.formData.procureGoods[index].models;
       let delIndex = arr.findIndex((v) => v.baseGoodsModelsId == e);
       this.formData.procureGoods[index].models.splice(delIndex, 1);
+    },
+
+    // 浠锋牸input鐩戝惉 杞负鍒�
+    priceChange(e, goodsIndex, index) {
+      this.formData.procureGoods[goodsIndex].models[index].price = e * 100;
     },
 
     // 涓婁紶
@@ -488,29 +513,30 @@
     handleSubmit() {
       this.$refs['ruleForm'].validate((valid) => {
         if (valid) {
-          console.log('this.formData', this.formData);
+          if (this.loading) return
+          this.loading = true;
           if (!this.setting.id) {
             procureAdd(this.formData)
-              .then((res) => {
-                this.$message.success('淇濆瓨鎴愬姛锛�');
-                this.close();
-                this.$emit('search');
-              })
-              .catch((err) => {
-                console.log('create err', err);
-                this.$message.error('淇濆瓨澶辫触');
-              });
+                .then((res) => {
+                  this.$message.success('淇濆瓨鎴愬姛锛�');
+                  this.close();
+                  this.$emit('search');
+                })
+                .catch((err) => {
+                  this.loading = false;
+                  this.$message.error('淇濆瓨澶辫触');
+                });
           } else {
             procureEdit(this.formData)
-              .then((res) => {
-                this.$message.success('淇濆瓨鎴愬姛锛�');
-                this.close();
-                this.$emit('search');
-              })
-              .catch((err) => {
-                console.log('edit err', err);
-                this.$message.error('淇濆瓨澶辫触');
-              });
+                .then((res) => {
+                  this.$message.success('淇濆瓨鎴愬姛锛�');
+                  this.close();
+                  this.$emit('search');
+                })
+                .catch((err) => {
+                  this.loading = false;
+                  this.$message.error('淇濆瓨澶辫触');
+                });
           }
         } else {
           this.$message.error('鏍¢獙鏈�氳繃锛岃妫�鏌ャ��');

--
Gitblit v1.9.1