Browse Source

bug修改

yuwenjun 4 years ago
parent
commit
4cdb798832

+ 1 - 1
src/settings.js

@@ -5,7 +5,7 @@ module.exports = {
    * @type {boolean} true | false
    * @description Whether show the settings right-panel
    */
-  showSettings: true,
+  showSettings: false,
 
   /**
    * @type {boolean} true | false

+ 3 - 3
src/views/supplier/components/uploadFile.vue

@@ -34,8 +34,8 @@ export default {
       default: -1
     },
     brandId: {
-      type: Number,
-      required: true
+      type: [Number, String],
+      default: 0
     }
   },
 
@@ -60,7 +60,7 @@ export default {
   },
   created() {
     this.headers['X-Token'] = this.token
-    this.params.brandId = this.brandId
+    this.params.brandId = this.brandId || 0
   },
   methods: {
     success(response) {

+ 1 - 1
src/views/supplier/components/uploadImage.vue

@@ -11,8 +11,8 @@
       :accept="accept"
       :auto-upload="true"
       :on-success="success"
-      :file-list="fileList"
       :on-remove="remove"
+      :file-list="fileList"
     >
       <!-- :class="{hidden:(hasUpload && fileList===[]) || !hasUpload}" -->
       <i class="el-icon-plus" />

+ 369 - 289
src/views/supplier/user/add.vue

@@ -1,45 +1,52 @@
 <template>
   <div v-loading="isLoading" class="addSupplier">
-    <el-form ref="addFormRef" :model="addFromData" :rules="addFromDataRules" label-width="120px" class="addForm">
+    <el-form ref="addFromDataRef" :model="addFromData" :rules="addFromDataRules" label-width="120px" class="addForm">
       <el-form-item label="供应商类型:" prop="shopType">
-        <el-select v-model="addFromData.shopType" placeholder="请选择供应商类型" style="width: 100%" @change="reGetBrandList">
+        <el-select
+          v-model="addFromData.shopType"
+          placeholder="请选择供应商类型"
+          style="width: 100%"
+          @change="handleTypeChange"
+        >
           <el-option label="品牌方" :value="1" />
           <el-option label="代理商" :value="2" />
         </el-select>
       </el-form-item>
 
       <!-- 供应商名称 -->
-      <el-form-item v-if="addFromData.shopType===2" label="供应商名称:" prop="shopName">
-        <el-input v-model="addFromData.shopName" placeholder="请输入供应商名称" />
+      <el-form-item v-if="addFromData.shopType === 2" label="供应商名称:" prop="shopName">
+        <el-input v-model="addFromData.shopName" placeholder="请输入供应商名称" maxlength="50" show-word-limit />
       </el-form-item>
 
-      <el-form-item v-if="addFromData.shopType===1" label="供应商名称:" prop="brandId">
-        <el-select v-model="addFromData.brandId" placeholder="请选择品牌" style="width: 100%" filterable @change="setShopName">
-          <el-option
-            v-for="(item) in brandList"
-            :key="item.id"
-            :label="item.name"
-            :value="item.id"
-          />
+      <el-form-item v-if="addFromData.shopType === 1" label="供应商名称:" prop="brandId">
+        <el-select
+          v-model="addFromData.brandId"
+          placeholder="请选择品牌"
+          style="width: 100%"
+          filterable
+          @change="setShopName"
+        >
+          <el-option v-for="item in brandList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
       <!-- 供应商名称END -->
 
       <el-form-item label="手机号:" prop="mobile">
-        <el-input v-model="addFromData.mobile" placeholder="请输入手机号" />
+        <el-input v-model="addFromData.mobile" placeholder="请输入手机号" maxlength="11" show-word-limit />
       </el-form-item>
+
       <el-form-item label="联系人:" prop="linkMan">
         <el-input v-model="addFromData.linkMan" placeholder="请输入联系人" />
       </el-form-item>
 
-      <el-form-item v-if="addFromData.shopType === 2" label="代理品牌:" class="brand-box">
-        <template v-if="supplierBrands">
-          <el-tag v-for="(brand,index) in supplierBrands" :key="index" type="success" closable @click="handleTagClick(index)" @close="handleTagClose(index)">{{ brand.brandName }}</el-tag>
+      <el-form-item v-if="addFromData.shopType === 2" label="代理品牌:" prop="shopInfo" class="brand-list">
+        <template v-if="supplierBrands !== []">
+          <el-tag v-for="(brand , index) in supplierBrands" :key="index" closable type="success" @close="handleRemove(index)" @click="handleShowInfo(index)">{{ brand.brandName }}</el-tag>
         </template>
-        <el-tag @click="handleAddBrand()">添加品牌<span class="el-icon-plus" /></el-tag>
+        <el-tag type="primary" @click="handleShowDialog">添加品牌<span class="el-icon-plus" /></el-tag>
       </el-form-item>
 
-      <template v-if="addFromData.shopType===1">
+      <template v-if="addFromData.shopType === 1">
         <el-form-item label="产地:" prop="countryId">
           <el-select v-model="addFromData.countryId" placeholder="产地" style="width: 100%" filterable>
             <el-option
@@ -50,10 +57,18 @@
             />
           </el-select>
         </el-form-item>
+
         <el-form-item label="品牌logo:" class="no-input" prop="brandAuthLogo">
-          <upload-image ref="uploadImageRef1" :file-list="fileList1" @success="imageUploadSuccess1" @error="imageUploadFaild1" />
+          <upload-image
+            ref="uploadImageRef1"
+            :file-list="fileList1"
+            @success="imageUploadSuccess1"
+            @error="imageUploadFaild1"
+            @remove="imageRemove1"
+          />
           <el-input v-model="addFromData.brandAuthLogo" type="hidden" class="hiddenInput" />
         </el-form-item>
+
         <el-form-item label="官网认证链接:">
           <el-input v-model="addFromData.securityLink" placeholder="请输入官网认证链接" />
         </el-form-item>
@@ -71,14 +86,10 @@
       <el-button type="warning" @click="$_back()">返回</el-button>
     </div>
 
-    <!-- 添加代理商品牌dialog -->
-    <el-dialog
-      title="添加品牌信息"
-      :visible.sync="showAddDialog"
-      @closed="addBrandDialogClosed"
-    >
-      <el-form v-if="addFromData.shopType===2" ref="addBrandFormRef" :model="brandData" :rules="brandDataRules" label-width="120px">
-        <el-form-item label="产地" prop="countryId">
+    <!-- 供应商添加品牌的对话框 -->
+    <el-dialog v-loading="dialogLoading" title="添加代理品牌" :visible.sync="showDialog" width="width" @closed="dialogClosed">
+      <el-form ref="brandDataRef" :model="brandData" :rules="brandDataRules" label-width="100px">
+        <el-form-item label="产地:" prop="countryId">
           <el-select v-model="brandData.countryId" placeholder="产地" style="width: 100%" filterable>
             <el-option
               v-for="item in countryList"
@@ -88,58 +99,86 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="所属品牌:" prop="brandId">
-          <el-select v-model="brandData.brandId" placeholder="请选择所属品牌" style="width: 100%" filterable @change="handleSetName">
-            <el-option
-              v-for="item in brandList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            />
+
+        <el-form-item label="选择品牌:" prop="brandId">
+          <el-select
+            v-model="brandData.brandId"
+            placeholder="请选择品牌"
+            style="width: 100%"
+            filterable
+            @change="setShopName"
+          >
+            <el-option v-for="item in brandListCody" :key="item.id" :label="item.name" :value="item.id" />
           </el-select>
         </el-form-item>
 
-        <el-form-item ref="brandAuthLogo" label="品牌logo:" class="no-input" prop="brandAuthLogo">
-          <upload-image ref="uploadImageRef1" :file-list="fileList1" @success="imageUploadSuccess1" @error="imageUploadFaild1" />
+        <el-form-item label="品牌logo:" class="no-input" prop="brandAuthLogo">
+          <upload-image
+            ref="uploadImageRef1"
+            :file-list="fileList1"
+            @success="imageUploadSuccess1"
+            @error="imageUploadFaild1"
+          />
           <el-input v-model="brandData.brandAuthLogo" type="hidden" class="hiddenInput" />
         </el-form-item>
 
-        <el-form-item label="官网认证链接:">
-          <el-input v-model="brandData.securityLink" placeholder="请输入官网认证链接" />
-        </el-form-item>
-
         <el-form-item label="代理声明:">
-          <el-radio-group v-model="brandData.statementType" @change="handleRadioChange">
+          <el-radio-group v-model="brandData.statementType" @change="handleStatementChange">
             <el-radio :label="1">弹窗</el-radio>
             <el-radio :label="2">链接</el-radio>
             <el-radio :label="3">图片</el-radio>
             <el-radio :label="4">文件</el-radio>
           </el-radio-group>
-
         </el-form-item>
 
-        <el-form-item v-if="brandData.statementType === 1" ref="statementContent" label="弹窗:" prop="statementContent">
-          <el-input v-model="brandData.statementContent" type="textarea" />
+        <el-form-item v-if="brandData.statementType === 1" ref="statement1" label="弹窗:" prop="statementContent">
+          <el-input
+            v-if="brandData.statementType === 1"
+            v-model="brandData.statementContent"
+            type="textarea"
+          />
         </el-form-item>
 
-        <el-form-item v-if="brandData.statementType === 2" ref="statementLink" label="链接:" prop="statementLink">
-          <el-input v-model="brandData.statementLink" />
+        <el-form-item v-else-if="brandData.statementType === 2" ref="statement2" label="链接:" prop="statementLink">
+          <el-input v-if="brandData.statementType === 2" v-model="brandData.statementLink" />
         </el-form-item>
 
-        <el-form-item v-if="brandData.statementType === 3" ref="statementImage" label="图片:" class="no-input" prop="statementImage">
-          <upload-image ref="uploadImageRef2" :file-list="fileList2" @success="imageUploadSuccess2" />
+        <el-form-item
+          v-else-if="brandData.statementType === 3"
+          ref="statement3"
+          label="图片:"
+          class="no-input"
+          prop="statementImage"
+        >
+          <upload-image
+            v-if="brandData.statementType === 3"
+            ref="uploadImageRef2"
+            :file-list="fileList2"
+            @success="imageUploadSuccess2"
+            @error="imageUploadFaild2"
+            @remove="imageRemove2"
+          />
           <el-input v-model="brandData.statementImage" type="hidden" class="hiddenInput" />
         </el-form-item>
 
-        <el-form-item v-if="brandData.statementType === 4" ref="statementFileId" label="文件:" prop="statementFileId">
-          <upload-file ref="uploadFileRef" :brand-id="brandData.brandId" :file-list="fileList3" :auth-user-id="addFromData.authUserId" @success="fileUploadSuccess" @error="fileUploadFaild" />
+        <el-form-item v-else ref="statement4" label="文件:" prop="statementFileId">
+          <upload-file
+            v-if="brandData.statementType === 4"
+            ref="uploadFileRef"
+            :auth-user-id="brandData.authUserId"
+            :brand-id="brandData.brandId"
+            :file-list="fileList3"
+            @success="fileUploadSuccess"
+            @error="fileUploadFaild"
+            @remove="fileRemove"
+          />
           <el-input v-model="brandData.statementFileId" type="hidden" class="hiddenInput" />
         </el-form-item>
-
       </el-form>
+
       <div slot="footer">
-        <el-button @click="showAddDialog = false">取 消</el-button>
-        <el-button type="primary" @click="handleSaveBrandInfo">确 定</el-button>
+        <el-button @click="showDialog = false">取 消</el-button>
+        <el-button type="primary" @click="handleAddBrand">确 定</el-button>
       </div>
     </el-dialog>
 
@@ -165,72 +204,76 @@ export default {
       }
     }
     return {
+      dialogLoading: false,
       isLoading: false,
-      // 是否显示代理商商添加品牌
-      showAddDialog: false,
+      // 是否显示对话框
+      showDialog: false,
+      // 需要排除的品牌列表
+      excludeBrand: [],
+      // 上1个选中的品牌
+      prevBrandId: -1,
       // 品牌列表
       brandList: [],
-
-      // 品牌表单校验数据
-      brandData: {
-        isNew: true, // 是否是新添加的
-        index: '', // 当前元素的索引
-        brandId: '', // 品牌id
-        countryId: 1, // 产地国家id
-        brandAuthLogo: '', //	品牌授权logo
-        securityLink: '', // 官网认证链接
-        statementContent: '', // 声明弹窗内容
-        statementLink: '', // 声明链接
-        statementFileId: -1, //	声明文件id
-        statementImage: '', // 声明图片
-        statementType: 1 // 代理声明类型:1弹窗 2链接 3图片 4文件(.doc .ppt .pdf)
-      },
-      // 品牌集合
+      // 品牌列表处理后的结果
+      brandListCody: [],
+      // 加入的品牌列表
       supplierBrands: [],
-      // 表单校验的数据
+      // 当前选中的品牌索引在数组中的id
+      currentBrandIndex: '',
+      // 表单校验数据1
       addFromData: {
         authUserId: null, // 供应商id
         shopType: 1, //	供应商类型:1品牌方,2代理商
-        createBy: '', // 创建人用户id
         brandId: '', // 品牌id
         shopName: '', // 供应商名称
         mobile: '', // 手机号
         linkMan: '', // 联系人
         countryId: 1, // 产地国家id
         brandAuthLogo: '', //	品牌授权logo
+        createBy: '', // 创建人用户id
         securityLink: '', // 官网认证链接
         shopStatus: 1, // 供应商状态:0停用 1启用
-        shopInfo: []
+        shopInfo: 1
       },
-
-      // 表单数据校验规则
+      // 表单校验数据2
+      brandData: {
+        isNew: true,
+        brandId: '', // 供应商id
+        countryId: 1, // 产地国家id
+        brandAuthLogo: '', //	品牌授权logo
+        brandName: '',
+        securityLink: '', // 官网认证链接
+        statementType: 1, // 声明类型
+        statementContent: '', // 声明弹窗内容
+        statementFileId: null, // 声明文件id
+        statementImage: '', // 声明图片
+        statementLink: '' // 声明链接
+      },
+      // 表单校验规则1
       addFromDataRules: {
-        shopType: { required: true, message: '请选择供应商类型', trigger: 'change' },
-        brandId: { required: true, message: '请选择品牌', trigger: 'change' },
-        shopName: [
-          { required: true, message: '请输入供应商名称', trigger: 'blur' },
-          { maxLength: 50, message: '最大字符长度为50个字符', trigger: 'blur' }
-        ],
+        shopType: { required: true, message: '供应商类型不能为空', trigger: 'change' },
+        brandId: { required: true, message: '品牌不能为空', trigger: 'change' },
+        shopName: { required: true, message: '请输入供应商名称', trigger: 'change' },
         mobile: [
           { required: true, message: '请输入手机号', trigger: 'blur' },
           { validator: valideMobile, trigger: 'blur' }
         ],
-        linkMan: { required: true, message: '请输入联系人', trigger: 'blur' },
-        countryId: { required: true, message: '请选择国家', trigger: 'change' },
-        brandAuthLogo: { required: true, message: '请上传品牌logo图片', trigger: 'change' }
+        linkMan: { required: true, message: '联系人不能为空', trigger: 'blur' },
+        countryId: { required: true, message: '产地不能为空', trigger: 'change' },
+        brandAuthLogo: { required: true, message: '品牌logo不能为空', trigger: 'change' }
       },
+      // 表单校验规则2
       brandDataRules: {
-        brandId: { required: true, message: '请选择品牌', trigger: 'change' },
-        countryId: { required: true, message: '请选择国家', trigger: 'change' },
-        brandAuthLogo: { required: true, message: '请上传品牌logo图片', trigger: 'change' },
-        statementContent: { required: true, message: '请输入声明内容', trigger: 'blur' },
-        statementLink: { required: true, message: '请输入声明链接', trigger: 'blur' },
-        statementImage: { required: true, message: '请上传声明图片', trigger: 'change' },
-        statementFileId: { required: true, message: '请上传声明文件', trigger: 'change' }
+        brandId: { required: true, message: '品牌不能为空', trigger: 'change' },
+        countryId: { required: true, message: '产地不能为空', trigger: 'change' },
+        brandAuthLogo: { required: true, message: '品牌logo不能为空', trigger: 'change' },
+        statementContent: { required: true, message: '声明内容不能为空', trigger: 'blur' },
+        statementLink: { required: true, message: '声明链接不能为空', trigger: 'blur' },
+        statementFileId: { required: true, message: '请上传声明文件', trigger: 'change' },
+        statementImage: { required: true, message: '请上传声明图片', trigger: 'change' }
       },
-
-      // 上传的图片列表
-      fileList1: [], // 已上传的图片列表 品牌logo图片
+      // 上传成功的文件列表
+      fileList1: [], // 已上传的图片列表 品牌logo
       fileList2: [], // 已上传的图片列表 声明图片
       fileList3: [] // 已上传的图片列表 声明文件
     }
@@ -238,242 +281,268 @@ export default {
   computed: {
     ...mapGetters(['userIdentity', 'name', 'countryList', 'authUserId'])
   },
+  watch: {
+    excludeBrand() {
+      this.excludeBrandHandle()
+    }
+  },
   created() {
     this.initAddForm()
   },
   methods: {
-    // 创建添加数据对象
+
+    // 初始添加供应商时的表单数据
+    initAddForm() {
+      // this.addFromData.authUserId = this.authUserId
+      this.getBrandList(1)
+      this.addFromData.shopName = ''
+    },
+    // 提交表单数据
+    submit() {
+      this.$refs.addFromDataRef.validate(valide => {
+        if (valide) {
+          console.log('校验通过')
+          if (this.addFromData.shopType === 1) {
+            this.save()
+          } else if (this.addFromData.shopType === 2) {
+            if (this.supplierBrands.length < 1) {
+              this.$alert('请至少添加一个代理品牌', '不满足提交要求', { type: 'warning' })
+              return
+            }
+            this.save()
+          }
+        }
+      })
+    },
+    // 保存
+    save() {
+      this.isLoading = true
+      addSupplier(this.createAddData())
+        .then(res => {
+          console.log(res)
+          this.$message.success('添加成功')
+          this.$router.replace('/supplier')
+        })
+        .finally(() => {
+          this.isLoading = false
+        })
+    },
+    // 创建请求参数
     createAddData() {
-      const addData = {
-        authUserId: null, // 供应商id
-        createBy: '', // 创建人用户id
-        linkMan: '', // 联系人
-        mobile: '', // 手机号
-        shopName: '设置', // 供应商名称
-        shopStatus: 1, // 供应商状态:0停用 1启用
-        shopType: 1, //	供应商类型:1品牌方,2代理商
+      let addData = {}
+      // 参数模板
+      const temp1 = {
+        authUserId: '',
+        createBy: '',
+        linkMan: '',
+        mobile: '',
+        shopName: '',
+        shopStatus: '',
+        shopType: '',
         shopInfo: []
       }
-
-      // 循环赋值
-      for (const key in addData) {
-        if (Object.hasOwnProperty.call(addData, key)) {
-          addData[key] = this.addFromData[key]
+      const temp2 = {
+        brandId: 1,
+        countryId: 2,
+        brandAuthLogo: '',
+        securityLink: '',
+        statementType: 1,
+        statementContent: '',
+        statementFileId: null,
+        statementImage: '',
+        statementLink: ''
+      }
+      // 指定创建者为当前登录的账号id
+      this.addFromData.createBy = this.authUserId
+      for (const key in temp1) {
+        if (Object.hasOwnProperty.call(temp1, key)) {
+          temp1[key] = this.addFromData[key]
         }
       }
-      // 添加品牌方 shopInfo 里面只有一个对象
+      // 如果为品牌方
       if (this.addFromData.shopType === 1) {
-        addData.shopInfo.push({
-          brandId: this.addFromData.brandId, // 品牌id
-          countryId: this.addFromData.countryId, // 产地国家id
-          brandAuthLogo: this.addFromData.brandAuthLogo, //	品牌授权logo
-          securityLink: this.addFromData.securityLink, // 官网认证链接
-          statementContent: '', // 声明弹窗内容
-          statementLink: '', // 声明链接
-          statementFileId: -1, //	声明文件id
-          statementImage: '', // 声明图片
-          statementType: 1 // 代理声明类型:1弹窗 2链接 3图片 4文件(.doc .ppt .pdf)
-        })
+        for (const key in temp2) {
+          if (Object.hasOwnProperty.call(temp2, key)) {
+            temp2[key] = this.addFromData[key] || ''
+          }
+        }
+        temp2.statementType = 1
+        temp2.statementFileId = null
+        addData = {
+          ...temp1,
+          shopInfo: [temp2]
+        }
       }
-      // 添加代理商
+      // 如果为代理商
       if (this.addFromData.shopType === 2) {
-        addData.shopInfo = this.supplierBrands
+        addData = {
+          ...temp1,
+          shopInfo: this.supplierBrands
+        }
       }
-      addData.createBy = this.authUserId
+
       return addData
     },
-    // 初始添加供应商时的表单数据
-    initAddForm() {
-      // this.addFromData.authUserId = this.authUserId
-      this.getBrandList()
-      this.addFromData.shopName = ''
-    },
     // 获取品牌列表
-    getBrandList() {
+    getBrandList(type) {
       // 获取品牌列表
-      fetchBrandList({ type: this.addFromData.shopType }).then(res => {
-        console.log(res)
-        if (res.code === 0) {
-          this.brandList = res.data
-        }
-      }).catch(err => console.log(err))
+      fetchBrandList({ type })
+        .then(res => {
+          console.log(res)
+          if (res.code === 0) {
+            this.brandList = res.data
+            this.brandListCody = res.data
+          }
+        })
+        .catch(err => console.log(err))
     },
-    // 重新获取品牌列表
-    reGetBrandList(id) {
-      const shopType = id
-      this.fileList2 = []
-      this.fileList1 = []
-      this.fileList3 = []
+    // 供应商类型切换
+    handleTypeChange(id) {
+      const type = id
+      this.$refs.addFromDataRef.clearValidate()
       this.addFromData = {
         authUserId: null, // 供应商id
-        brandAuthLogo: '', //	品牌授权logo
+        shopType: type, //	供应商类型:1品牌方,2代理商
         brandId: '', // 品牌id
+        shopName: '', // 供应商名称
+        mobile: '', // 手机号
+        linkMan: '', // 联系人
         countryId: 1, // 产地国家id
+        brandAuthLogo: '', //	品牌授权logo
         createBy: '', // 创建人用户id
-        linkMan: '', // 联系人
-        mobile: '', // 手机号
         securityLink: '', // 官网认证链接
-        shopName: '', // 供应商名称
         shopStatus: 1, // 供应商状态:0停用 1启用
-        shopType: 1 //	供应商类型:1品牌方,2代理商
+        shopInfo: 1
       }
-      this.$refs.addFormRef?.clearValidate()
-      this.addFromData.shopType = shopType
-      this.getBrandList()
-    },
-
-    // 提交表单数据
-    submit() {
-      this.$refs.addFormRef.validate(valide => {
-        if (!valide) {
-          this.isLoading = false
-          return
-        }
-        // this.addFromData.shopInfo = [this.brandData]
-        // console.log(this.addFromData)
-        // return
-        this.save()
-      })
-    },
-    // 保存
-    save() {
-      addSupplier(this.createAddData()).then(res => {
-        console.log(res)
-        this.$message.success('保存成功')
-        this.$router.replace('/supplier')
-      }).finally(() => {
-        this.isLoading = false
-        this.addFromData.securityLink = ''
-      })
+      this.fileList1 = []
+      this.getBrandList(type)
     },
     // 设置品牌名称
     setShopName(id) {
-      const fileList = []
-      let selectBrand = {}
-      this.brandList.forEach((item, index) => {
-        if (item.id === id) {
-          selectBrand = item
-          return
-        }
-      })
-      console.log(selectBrand)
-      if (this.addFromData.shopType === 1) {
-        this.addFromData.shopName = selectBrand.name
+      const selectBrand = this.brandList.filter(item => {
+        return item.id === id
+      })[0]
+      const str = this.addFromData.shopType === 1 ? 'addFromData' : 'brandData'
+      this[str].shopName = selectBrand.name
+      this[str].brandAuthLogo = selectBrand.authLogo
+      this[str].brandId = selectBrand.id
+      if (str === 'brandData') {
+        this[str].brandName = selectBrand.name
       }
-      this.addFromData.brandAuthLogo = selectBrand.authLogo
       if (selectBrand.authLogo) {
-        fileList.push({ name: this.addFromData.shopName, url: selectBrand.authLogo || '' })
+        this.fileList1 = [{ name: '文件已上传', url: selectBrand.authLogo }]
       }
-      this.fileList1 = fileList
     },
-    // 重置表单项
-    handleRadioChange() {
-      this.$refs.statementContent?.clearValidate()
-      this.$refs.statementLink?.clearValidate()
-      this.$refs.statementFileId?.clearValidate()
-      this.$refs.statementImage?.clearValidate()
+    // 添加品牌对话框开启
+    handleShowDialog() {
+      this.showDialog = true
     },
-    handleSaveBrandInfo() {
-      // 如果为代理商 && 声明类型为文件
-      if (this.addFromData.shopType === 2 && this.brandData.statementType === 4) {
-        console.log(this.brandData.statementFileId)
-        if (this.brandData.statementFileId !== -1) {
-          this.saveBrandInfo()
-        } else {
-          this.$refs.uploadFileRef.$refs.upload.submit()
-        }
+    // 添加品牌
+    handleAddBrand() {
+      // 如果声明类型为文件
+      if (this.brandData.statementType === 4 && (this.brandData.statementFileId === null || this.brandData.statementFileId === '')) {
+        this.brandData.statementFileId = this.brandData.statementFileId === null ? '' : null
+        this.$refs.uploadFileRef.$refs.upload.submit()
       } else {
-        this.saveBrandInfo()
+        this.saveBrand()
       }
     },
-    // 代理商保存品牌信息
-    saveBrandInfo() {
-      this.$refs.addBrandFormRef.validate(valide => {
-        if (!valide) return
-        // 提交保存
-        if (this.brandData.isNew) {
-          this.supplierBrands.push(this.cloneData(this.brandData))
-        } else {
-          this.supplierBrands.splice(this.brandData.index, 1, this.cloneData(this.brandData))
-        }
-        this.showAddDialog = false
-      })
-    },
-    // brandData
-    // 添加品牌信息对话框关闭事件
-    addBrandDialogClosed() {
-      this.fileList1 = []
-      this.fileList2 = []
-      this.fileList3 = []
-      this.$refs.addBrandFormRef.resetFields()
-    },
-    handleSetName(id) {
-      const fileList = []
-      let brandInfo = null
-      this.brandList.forEach(item => {
-        if (item.id === id) {
-          brandInfo = item
-          return
+    // 保存品牌信息
+    saveBrand() {
+      this.$refs.brandDataRef.validate(valide => {
+        if (valide) {
+          const brandInfo = this.clone(this.brandData)
+          console.log(brandInfo)
+          if (brandInfo.isNew) {
+            brandInfo.isNew = false
+            this.supplierBrands.push(brandInfo)
+          } else {
+            this.supplierBrands.splice(this.currentBrandIndex, 1, brandInfo)
+          }
+
+          if (this.addFromData.shopType === 2) {
+            this.excludeBrand.push(this.brandData.brandId)
+            this.prevBrandId = -1
+            console.log('添加:' + this.excludeBrand)
+          }
+
+          this.showDialog = false
         }
       })
-      this.brandData.brandName = brandInfo.name
-      this.brandData.brandId = brandInfo.id
-      this.brandData.brandAuthLogo = brandInfo.authLogo
-      fileList.push({ name: brandInfo.name, url: brandInfo.authLogo })
-      this.fileList1 = fileList
     },
-
-    // 供应商代理品牌标签关闭时间
-    handleTagClose(index) {
-      this.supplierBrands.splice(index, 1)
-    },
-
-    // 查看品牌信息
-    handleTagClick(index) {
-      this.brandData = this.cloneData(this.supplierBrands[index])
+    // 修改
+    handleShowInfo(index) {
+      this.currentBrandIndex = index
+      this.brandData = this.clone(this.supplierBrands[index])
       this.brandData.isNew = false
-      this.brandData.index = index
-      this.showAddDialog = true
-      console.log(this.brandData)
-      if (this.brandData.statementFileId !== -1) {
-        this.fileList3 = [{ name: '文件已上传', url: '' }]
+      this.prevBrandId = this.brandData.brandId
+      if (this.addFromData.shopType === 2) {
+        const i = this.excludeBrand.indexOf(this.brandData.brandId)
+        this.excludeBrand.splice(i, 1)
+      }
+      if (this.brandData.brandAuthLogo) {
+        this.fileList1 = [{ name: '文件已上传', url: this.brandData.brandAuthLogo }]
       }
-      if (this.brandData.statementImage !== '') {
+      if (this.brandData.statementImage) {
         this.fileList2 = [{ name: '文件已上传', url: this.brandData.statementImage }]
       }
-      if (this.brandData.brandAuthLogo !== '') {
-        this.fileList1 = [{ name: '', url: this.brandData.brandAuthLogo }]
+      if (this.brandData.statementFileId) {
+        this.fileList3 = [{ name: '文件已上传', url: '' }]
       }
-      console.log(this.fileList1)
-      console.log(this.fileList2)
-      console.log(this.fileList3)
+      this.showDialog = true
     },
-    // 添加品牌
-    handleAddBrand() {
+    // 删除
+    handleRemove(index) {
+      const i = this.excludeBrand.indexOf(this.supplierBrands[index].brandId)
+      this.excludeBrand.splice(i, 1)
+      this.supplierBrands.splice(index, 1)
+      console.log('删除:' + this.excludeBrand)
+    },
+    // 对话框关闭
+    dialogClosed() {
+      this.$refs.brandDataRef.resetFields()
+      this.fileList1 = []
+      this.fileList2 = []
+      this.fileList3 = []
       this.brandData.isNew = true
-      this.showAddDialog = true
+      // 如果部位-1 代表没有保存 则恢复到上一次的排除结果
+      if (this.prevBrandId !== -1) {
+        this.excludeBrand.push(this.prevBrandId)
+        this.prevBrandId = -1
+      }
+    },
+    // 声明类型切换
+    handleStatementChange(index) {
+      console.log(index)
+      const ref = 'statement' + index
+      this.$refs[ref].clearValidate()
     },
     // 文件上传成功
     fileUploadSuccess(data) {
       this.brandData.statementFileId = data.data
-      console.log(data)
-      this.saveBrandInfo()
+      this.saveBrand()
     },
     fileUploadFaild(err, file, fileList) {
       console.log(err)
     },
+    fileRemove() {
+      console.log('删除文件')
+      this.brandData.statementFileId = null
+    },
 
     // 图片上传成功 品牌logo
     imageUploadSuccess1(data) {
-      if (this.addFromData.shopType === 1) {
-        this.addFromData.brandAuthLogo = data.data
-      } else if (this.addFromData.shopType === 2) {
-        this.brandData.brandAuthLogo = data.data
-      }
+      const str = this.addFromData.shopType === 1 ? 'addFromData' : 'brandData'
+      this[str].brandAuthLogo = data.data
     },
     imageUploadFaild1(err, file, fileList) {
       console.log(err)
     },
+    imageRemove1() {
+      const str = this.addFromData.shopType === 1 ? 'addFromData' : 'brandData'
+      this[str].brandAuthLogo = ''
+      console.log('删除文件')
+    },
 
     // 图片上传成功 声明图片
     imageUploadSuccess2(data) {
@@ -482,15 +551,26 @@ export default {
     imageUploadFaild2(err, file, fileList) {
       console.log(err)
     },
+    imageRemove2() {
+      this.brandData.statementImage = ''
+      console.log('删除文件')
+    },
+    // 对品牌列表做排除操作
+    excludeBrandHandle() {
+      this.brandListCody = this.brandList.filter((item, index) => {
+        return this.excludeBrand.indexOf(item.id) === -1
+      })
+    },
+
     // 克隆
-    cloneData(data) {
-      const resutl = {}
+    clone(data) {
+      const result = {}
       for (const key in data) {
         if (Object.hasOwnProperty.call(data, key)) {
-          resutl[key] = data[key]
+          result[key] = data[key]
         }
       }
-      return resutl
+      return result
     }
   }
 }
@@ -498,26 +578,26 @@ export default {
 
 <style lang="scss" scoped>
 .addSupplier {
-  margin-bottom: 80px;
+    margin-bottom: 80px;
 }
 .addForm {
-  width: 500px;
-  margin: 0 auto;
-  margin-top: 80px;
-  .brand-box{
-    .el-tag{
-      margin-left: 10px;
-      cursor: pointer;
+    width: 500px;
+    margin: 0 auto;
+    margin-top: 80px;
+    .brand-list{
+      .el-tag{
+        margin-right: 5px;
+        cursor: pointer;
+      }
     }
-  }
 }
 .submit-btn {
-  text-align: center;
-  .el-button {
-    width: 140px;
-  }
+    text-align: center;
+    .el-button {
+        width: 140px;
+    }
 }
-.hiddenInput{
-  display: none;
+.hiddenInput {
+    display: none;
 }
 </style>

+ 394 - 337
src/views/supplier/user/edit.vue

@@ -1,45 +1,54 @@
 <template>
   <div v-loading="isLoading" class="addSupplier">
-    <el-form ref="addFormRef" :model="addFromData" :rules="addFromDataRules" label-width="120px" class="addForm">
+    <el-form ref="addFromDataRef" :model="addFromData" :rules="addFromDataRules" label-width="120px" class="addForm">
       <el-form-item label="供应商类型:" prop="shopType">
-        <el-select v-model="addFromData.shopType" placeholder="请选择供应商类型" style="width: 100%" disabled @change="reGetBrandList">
+        <el-select
+          v-model="addFromData.shopType"
+          placeholder="请选择供应商类型"
+          style="width: 100%"
+          disabled
+          @change="handleTypeChange"
+        >
           <el-option label="品牌方" :value="1" />
           <el-option label="代理商" :value="2" />
         </el-select>
       </el-form-item>
 
       <!-- 供应商名称 -->
-      <el-form-item v-if="addFromData.shopType===2" label="供应商名称:" prop="shopName">
+      <el-form-item v-if="addFromData.shopType === 2" label="供应商名称:" prop="shopName">
         <el-input v-model="addFromData.shopName" placeholder="请输入供应商名称" disabled />
       </el-form-item>
 
-      <el-form-item v-if="addFromData.shopType===1" label="供应商名称:" prop="brandId">
-        <el-select v-model="addFromData.brandId" placeholder="请选择品牌" style="width: 100%" filterable disabled @change="setShopName">
-          <el-option
-            v-for="(item) in brandList"
-            :key="item.id"
-            :label="item.name"
-            :value="item.id"
-          />
+      <el-form-item v-if="addFromData.shopType === 1" label="供应商名称:" prop="brandId">
+        <el-select
+          v-model="addFromData.brandId"
+          disabled
+          placeholder="请选择品牌"
+          style="width: 100%"
+          filterable
+          @change="setShopName"
+        >
+          <el-option v-for="item in brandList" :key="item.id" :label="item.name" :value="item.id" />
         </el-select>
       </el-form-item>
       <!-- 供应商名称END -->
 
       <el-form-item label="手机号:" prop="mobile">
-        <el-input v-model="addFromData.mobile" placeholder="请输入手机号" />
+        <el-input v-model="addFromData.mobile" placeholder="请输入手机号" maxlength="11" show-word-limit />
       </el-form-item>
+
       <el-form-item label="联系人:" prop="linkMan">
         <el-input v-model="addFromData.linkMan" placeholder="请输入联系人" />
       </el-form-item>
 
-      <el-form-item v-if="addFromData.shopType === 2" label="代理品牌:" class="brand-box">
-        <template v-if="supplierBrands">
-          <el-tag v-for="(brand,index) in supplierBrands" :key="index" type="success" closable @click="handleTagClick(index)" @close="handleTagClose(index)">{{ brand.brandName }}</el-tag>
+      <el-form-item v-if="addFromData.shopType === 2" label="代理品牌:" prop="shopInfo" class="brand-list">
+        <template v-if="supplierBrands !== []">
+          <el-tag v-for="(brand , index) in supplierBrands" :key="index" closable type="success" @close="handleRemove(index)" @click="handleShowInfo(index)">{{ brand.brandName }}</el-tag>
         </template>
-        <el-tag @click="handleAddBrand()">添加品牌<span class="el-icon-plus" /></el-tag>
+        <el-tag type="primary" @click="handleShowDialog">添加品牌<span class="el-icon-plus" /></el-tag>
       </el-form-item>
 
-      <template v-if="addFromData.shopType===1">
+      <template v-if="addFromData.shopType === 1">
         <el-form-item label="产地:" prop="countryId">
           <el-select v-model="addFromData.countryId" placeholder="产地" style="width: 100%" filterable>
             <el-option
@@ -50,10 +59,18 @@
             />
           </el-select>
         </el-form-item>
+
         <el-form-item label="品牌logo:" class="no-input" prop="brandAuthLogo">
-          <upload-image ref="uploadImageRef1" :file-list="fileList1" @success="imageUploadSuccess1" @error="imageUploadFaild1" />
+          <upload-image
+            ref="uploadImageRef1"
+            :file-list="fileList1"
+            @success="imageUploadSuccess1"
+            @error="imageUploadFaild1"
+            @remove="imageRemove1"
+          />
           <el-input v-model="addFromData.brandAuthLogo" type="hidden" class="hiddenInput" />
         </el-form-item>
+
         <el-form-item label="官网认证链接:">
           <el-input v-model="addFromData.securityLink" placeholder="请输入官网认证链接" />
         </el-form-item>
@@ -71,14 +88,10 @@
       <el-button type="warning" @click="$_back()">返回</el-button>
     </div>
 
-    <!-- 添加代理商品牌dialog -->
-    <el-dialog
-      title="添加品牌信息"
-      :visible.sync="showAddDialog"
-      @closed="addBrandDialogClosed"
-    >
-      <el-form v-if="addFromData.shopType===2" ref="addBrandFormRef" :model="brandData" :rules="brandDataRules" label-width="120px">
-        <el-form-item label="产地" prop="countryId">
+    <!-- 供应商添加品牌的对话框 -->
+    <el-dialog v-loading="dialogLoading" title="添加代理品牌" :visible.sync="showDialog" width="width" @closed="dialogClosed">
+      <el-form ref="brandDataRef" :model="brandData" :rules="brandDataRules" label-width="100px">
+        <el-form-item label="产地:" prop="countryId">
           <el-select v-model="brandData.countryId" placeholder="产地" style="width: 100%" filterable>
             <el-option
               v-for="item in countryList"
@@ -88,58 +101,86 @@
             />
           </el-select>
         </el-form-item>
-        <el-form-item label="所属品牌:" prop="brandId">
-          <el-select v-model="brandData.brandId" placeholder="请选择所属品牌" style="width: 100%" filterable @change="handleSetName">
-            <el-option
-              v-for="item in brandList"
-              :key="item.id"
-              :label="item.name"
-              :value="item.id"
-            />
+
+        <el-form-item label="选择品牌:" prop="brandId">
+          <el-select
+            v-model="brandData.brandId"
+            placeholder="请选择品牌"
+            style="width: 100%"
+            filterable
+            @change="setShopName"
+          >
+            <el-option v-for="item in brandListCody" :key="item.id" :label="item.name" :value="item.id" />
           </el-select>
         </el-form-item>
 
-        <el-form-item ref="brandAuthLogo" label="品牌logo:" class="no-input" prop="brandAuthLogo">
-          <upload-image ref="uploadImageRef1" :file-list="fileList1" @success="imageUploadSuccess1" @error="imageUploadFaild1" />
+        <el-form-item label="品牌logo:" class="no-input" prop="brandAuthLogo">
+          <upload-image
+            ref="uploadImageRef1"
+            :file-list="fileList1"
+            @success="imageUploadSuccess1"
+            @error="imageUploadFaild1"
+          />
           <el-input v-model="brandData.brandAuthLogo" type="hidden" class="hiddenInput" />
         </el-form-item>
 
-        <el-form-item label="官网认证链接:">
-          <el-input v-model="brandData.securityLink" placeholder="请输入官网认证链接" />
-        </el-form-item>
-
         <el-form-item label="代理声明:">
-          <el-radio-group v-model="brandData.statementType" @change="handleRadioChange">
+          <el-radio-group v-model="brandData.statementType" @change="handleStatementChange">
             <el-radio :label="1">弹窗</el-radio>
             <el-radio :label="2">链接</el-radio>
             <el-radio :label="3">图片</el-radio>
             <el-radio :label="4">文件</el-radio>
           </el-radio-group>
-
         </el-form-item>
 
-        <el-form-item v-if="brandData.statementType === 1" ref="statementContent" label="弹窗:" prop="statementContent">
-          <el-input v-model="brandData.statementContent" type="textarea" />
+        <el-form-item v-if="brandData.statementType === 1" ref="statement1" label="弹窗:" prop="statementContent">
+          <el-input
+            v-if="brandData.statementType === 1"
+            v-model="brandData.statementContent"
+            type="textarea"
+          />
         </el-form-item>
 
-        <el-form-item v-if="brandData.statementType === 2" ref="statementLink" label="链接:" prop="statementLink">
-          <el-input v-model="brandData.statementLink" />
+        <el-form-item v-else-if="brandData.statementType === 2" ref="statement2" label="链接:" prop="statementLink">
+          <el-input v-if="brandData.statementType === 2" v-model="brandData.statementLink" />
         </el-form-item>
 
-        <el-form-item v-if="brandData.statementType === 3" ref="statementImage" label="图片:" class="no-input" prop="statementImage">
-          <upload-image ref="uploadImageRef2" :file-list="fileList2" @success="imageUploadSuccess2" />
+        <el-form-item
+          v-else-if="brandData.statementType === 3"
+          ref="statement3"
+          label="图片:"
+          class="no-input"
+          prop="statementImage"
+        >
+          <upload-image
+            v-if="brandData.statementType === 3"
+            ref="uploadImageRef2"
+            :file-list="fileList2"
+            @success="imageUploadSuccess2"
+            @error="imageUploadFaild2"
+            @remove="imageRemove2"
+          />
           <el-input v-model="brandData.statementImage" type="hidden" class="hiddenInput" />
         </el-form-item>
 
-        <el-form-item v-if="brandData.statementType === 4" ref="statementFileId" label="文件:" prop="statementFileId">
-          <upload-file ref="uploadFileRef" :brand-id="brandData.brandId" :file-list="fileList3" :auth-user-id="addFromData.authUserId" @success="fileUploadSuccess" @error="fileUploadFaild" @remove="removeFile" />
+        <el-form-item v-else ref="statement4" label="文件:" prop="statementFileId">
+          <upload-file
+            v-if="brandData.statementType === 4"
+            ref="uploadFileRef"
+            :auth-user-id="brandData.authUserId"
+            :brand-id="brandData.brandId"
+            :file-list="fileList3"
+            @success="fileUploadSuccess"
+            @error="fileUploadFaild"
+            @remove="fileRemove"
+          />
           <el-input v-model="brandData.statementFileId" type="hidden" class="hiddenInput" />
         </el-form-item>
-
       </el-form>
+
       <div slot="footer">
-        <el-button @click="showAddDialog = false">取 消</el-button>
-        <el-button type="primary" @click="handleSaveBrandInfo">确 定</el-button>
+        <el-button @click="showDialog = false">取 消</el-button>
+        <el-button type="primary" @click="handleAddBrand">确 定</el-button>
       </div>
     </el-dialog>
 
@@ -165,72 +206,76 @@ export default {
       }
     }
     return {
+      dialogLoading: false,
       isLoading: false,
-      // 是否显示代理商商添加品牌
-      showAddDialog: false,
+      // 是否显示对话框
+      showDialog: false,
+      // 需要排除的品牌列表
+      excludeBrand: [],
+      // 上1个选中的品牌
+      prevBrandId: -1,
       // 品牌列表
       brandList: [],
-      selectBrandIndex: '',
-      // 品牌表单校验数据
-      brandData: {
-        isNew: true, // 是否是新添加的
-        index: '', // 当前元素的索引
-        brandId: '', // 品牌id
-        countryId: 1, // 产地国家id
-        brandAuthLogo: '', //	品牌授权logo
-        securityLink: '', // 官网认证链接
-        statementContent: '', // 声明弹窗内容
-        statementLink: '', // 声明链接
-        statementFileId: -1, //	声明文件id
-        statementImage: '', // 声明图片
-        statementType: 1 // 代理声明类型:1弹窗 2链接 3图片 4文件(.doc .ppt .pdf)
-      },
-      // 品牌集合
+      // 品牌列表处理后的结果
+      brandListCody: [],
+      // 加入的品牌列表
       supplierBrands: [],
-      // 表单校验的数据
+      // 当前选中的品牌索引在数组中的id
+      currentBrandIndex: '',
+      // 表单校验数据1
       addFromData: {
         authUserId: null, // 供应商id
         shopType: 1, //	供应商类型:1品牌方,2代理商
-        createBy: '', // 创建人用户id
         brandId: '', // 品牌id
         shopName: '', // 供应商名称
         mobile: '', // 手机号
         linkMan: '', // 联系人
         countryId: 1, // 产地国家id
         brandAuthLogo: '', //	品牌授权logo
+        createBy: '', // 创建人用户id
         securityLink: '', // 官网认证链接
         shopStatus: 1, // 供应商状态:0停用 1启用
-        shopInfo: []
+        shopInfo: 1
       },
-
-      // 表单数据校验规则
+      // 表单校验数据2
+      brandData: {
+        isNew: true,
+        brandId: '', // 供应商id
+        countryId: 1, // 产地国家id
+        brandAuthLogo: '', //	品牌授权logo
+        brandName: '',
+        securityLink: '', // 官网认证链接
+        statementType: 1, // 声明类型
+        statementContent: '', // 声明弹窗内容
+        statementFileId: null, // 声明文件id
+        statementImage: '', // 声明图片
+        statementLink: '' // 声明链接
+      },
+      // 表单校验规则1
       addFromDataRules: {
-        shopType: { required: true, message: '请选择供应商类型', trigger: 'change' },
-        brandId: { required: true, message: '请选择品牌', trigger: 'change' },
-        shopName: [
-          { required: true, message: '请输入供应商名称', trigger: 'blur' },
-          { maxLength: 50, message: '最大字符长度为50个字符', trigger: 'blur' }
-        ],
+        shopType: { required: true, message: '供应商类型不能为空', trigger: 'change' },
+        brandId: { required: true, message: '品牌不能为空', trigger: 'change' },
+        shopName: { required: true, message: '请输入供应商名称', trigger: 'change' },
         mobile: [
           { required: true, message: '请输入手机号', trigger: 'blur' },
           { validator: valideMobile, trigger: 'blur' }
         ],
-        linkMan: { required: true, message: '请输入联系人', trigger: 'blur' },
-        countryId: { required: true, message: '请选择国家', trigger: 'change' },
-        brandAuthLogo: { required: true, message: '请上传品牌logo图片', trigger: 'change' }
+        linkMan: { required: true, message: '联系人不能为空', trigger: 'blur' },
+        countryId: { required: true, message: '产地不能为空', trigger: 'change' },
+        brandAuthLogo: { required: true, message: '品牌logo不能为空', trigger: 'change' }
       },
+      // 表单校验规则2
       brandDataRules: {
-        brandId: { required: true, message: '请选择品牌', trigger: 'change' },
-        countryId: { required: true, message: '请选择国家', trigger: 'change' },
-        brandAuthLogo: { required: true, message: '请上传品牌logo图片', trigger: 'change' },
-        statementContent: { required: true, message: '请输入声明内容', trigger: 'blur' },
-        statementLink: { required: true, message: '请输入声明链接', trigger: 'blur' },
-        statementImage: { required: true, message: '请上传声明图片', trigger: 'change' },
-        statementFileId: { required: true, message: '请上传声明文件', trigger: 'change' }
+        brandId: { required: true, message: '品牌不能为空', trigger: 'change' },
+        countryId: { required: true, message: '产地不能为空', trigger: 'change' },
+        brandAuthLogo: { required: true, message: '品牌logo不能为空', trigger: 'change' },
+        statementContent: { required: true, message: '声明内容不能为空', trigger: 'blur' },
+        statementLink: { required: true, message: '声明链接不能为空', trigger: 'blur' },
+        statementFileId: { required: true, message: '请上传声明文件', trigger: 'change' },
+        statementImage: { required: true, message: '请上传声明图片', trigger: 'change' }
       },
-
-      // 上传的图片列表
-      fileList1: [], // 已上传的图片列表 品牌logo图片
+      // 上传成功的文件列表
+      fileList1: [], // 已上传的图片列表 品牌logo
       fileList2: [], // 已上传的图片列表 声明图片
       fileList3: [] // 已上传的图片列表 声明文件
     }
@@ -238,321 +283,333 @@ export default {
   computed: {
     ...mapGetters(['userIdentity', 'name', 'countryList', 'authUserId'])
   },
+  watch: {
+    excludeBrand(list) {
+      console.log(list)
+      this.brandListCody = this.excludeBrandHandle()
+    }
+  },
   created() {
-    // 获取供应商id
-    this.addFromData.authUserId = this.$route.query.id
-    this.getInfoById(this.addFromData.authUserId)
+    this.getSupplierData()
+    this.initAddForm()
   },
   methods: {
     // 初始添加供应商时的表单数据
-    initAddForm(data) {
-      this.getBrandList(data.shopType)
-      this.setFormData(data)
+    initAddForm() {
+      // this.addFromData.authUserId = this.authUserId
+
+      this.addFromData.shopName = ''
     },
-    // 查询供应商信息
-    getInfoById(id) {
+    // 接口通过id获取数据
+    getSupplierData() {
       this.isLoading = true
-      getSupplierById({ authUserId: id })
-        .then(res => {
-          if (res.code === 0) {
-            this.initAddForm(res.data)
-          }
-        })
-        .catch(err => { console.log(err) })
-        .finally(() => {
-          this.isLoading = false
-        })
+      const id = this.$route.query.id
+      getSupplierById({ authUserId: id }).then(res => {
+        this.getBrandList(res.data.shopType)
+        this.setFormData(res.data)
+      })
     },
-    // 为表单设置数据
+    // 将返回结果绑定到对应的表单
     setFormData(data) {
-      // 如果返回的是品牌方信息
-      if (data.shopType === 1) {
+      this.addFromData = {
+        ...this.addFromData,
+        ...data
+      }
+      if (this.addFromData.shopType === 1) {
         this.addFromData = {
-          ...data,
+          ...this.addFromData,
           ...data.shopInfo[0]
         }
+        this.addFromData.shopInfo = []
       }
-      if (data.shopType === 2) {
-        this.addFromData = {
-          ...data,
-          shopInfo: []
-        }
+      if (this.addFromData.shopType === 2) {
+        this.addFromData.shopInfo = []
         data.shopInfo.forEach((item, index) => {
           item.index = index
           item.isNew = false
-          if (item.statementFileId === null) {
-            item.statementFileId = -1
-          }
+          this.excludeBrand.push(item.brandId)
         })
         this.supplierBrands = data.shopInfo
       }
-      console.log(this.addFromData)
-      if (this.addFromData.brandAuthLogo) {
-        this.fileList1.push({ name: 'authLogo', url: this.addFromData.brandAuthLogo })
-      }
-      if (this.addFromData.statementImage) {
-        this.fileList2.push({ name: '声明图片', url: this.addFromData.statementImage })
-      }
-      if (data.statementFileName) {
-        // this.fileList3.push({ name: '您已上传文件,不支持预览,可删除后重新上传', url: '' })
-        this.fileList3.push({ name: data.statementFileName, url: '' })
-      }
+      this.isLoading = false
     },
-    // 获取品牌列表
-    getBrandList(shopType) {
-      fetchBrandList({ type: shopType }).then(res => {
-        if (res.code === 0) {
-          this.brandList = res.data
-        }
-      }).catch(err => console.log(err))
-    },
-
     // 提交表单数据
     submit() {
-      this.$refs.addFormRef.validate(valide => {
-        if (!valide) {
-          this.isLoading = false
-          return
+      this.$refs.addFromDataRef.validate(valide => {
+        if (valide) {
+          console.log('校验通过')
+          if (this.addFromData.shopType === 1) {
+            this.save()
+          } else if (this.addFromData.shopType === 2) {
+            if (this.supplierBrands.length < 1) {
+              this.$alert('请至少添加一个代理品牌', '不满足提交要求', { type: 'warning' })
+              return
+            }
+            this.save()
+          }
         }
-        // this.addFromData.shopInfo = [this.brandData]
-        // console.log(this.addFromData)
-        // return
-        this.save()
       })
     },
-    // 创建添加数据对象
+    // 保存
+    save() {
+      this.isLoading = true
+      addSupplier(this.createAddData())
+        .then(res => {
+          console.log(res)
+          this.$message.success('保存成功')
+          this.$router.replace('/supplier')
+        })
+        .finally(() => {
+          this.isLoading = false
+        })
+    },
+    // 创建请求参数
     createAddData() {
-      const addData = {
-        authUserId: null, // 供应商id
-        createBy: '', // 创建人用户id
-        linkMan: '', // 联系人
-        mobile: '', // 手机号
-        shopName: '设置', // 供应商名称
-        shopStatus: 1, // 供应商状态:0停用 1启用
-        shopType: 1, //	供应商类型:1品牌方,2代理商
+      let addData = {}
+      // 参数模板
+      const temp1 = {
+        authUserId: '',
+        createBy: '',
+        linkMan: '',
+        mobile: '',
+        shopName: '',
+        shopStatus: '',
+        shopType: '',
         shopInfo: []
       }
-
-      // 循环赋值
-      for (const key in addData) {
-        if (Object.hasOwnProperty.call(addData, key)) {
-          addData[key] = this.addFromData[key]
+      const temp2 = {
+        brandId: 1,
+        countryId: 2,
+        brandAuthLogo: '',
+        securityLink: '',
+        statementType: 1,
+        statementContent: '',
+        statementFileId: null,
+        statementImage: '',
+        statementLink: ''
+      }
+      // 指定创建者为当前登录的账号id
+      this.addFromData.createBy = this.authUserId
+      for (const key in temp1) {
+        if (Object.hasOwnProperty.call(temp1, key)) {
+          temp1[key] = this.addFromData[key]
         }
       }
-      // 添加品牌方 shopInfo 里面只有一个对象
+      // 如果为品牌方
       if (this.addFromData.shopType === 1) {
-        addData.shopInfo.push({
-          brandId: this.addFromData.brandId, // 品牌id
-          countryId: this.addFromData.countryId, // 产地国家id
-          brandAuthLogo: this.addFromData.brandAuthLogo, //	品牌授权logo
-          securityLink: this.addFromData.securityLink, // 官网认证链接
-          statementContent: '', // 声明弹窗内容
-          statementLink: '', // 声明链接
-          statementFileId: -1, //	声明文件id
-          statementImage: '', // 声明图片
-          statementType: 1 // 代理声明类型:1弹窗 2链接 3图片 4文件(.doc .ppt .pdf)
-        })
+        for (const key in temp2) {
+          if (Object.hasOwnProperty.call(temp2, key)) {
+            temp2[key] = this.addFromData[key] || ''
+          }
+        }
+        temp2.statementType = 1
+        temp2.statementFileId = null
+        addData = {
+          ...temp1,
+          shopInfo: [temp2]
+        }
       }
-      // 添加代理商
+      // 如果为代理商
       if (this.addFromData.shopType === 2) {
-        addData.shopInfo = this.supplierBrands
+        addData = {
+          ...temp1,
+          shopInfo: this.supplierBrands
+        }
       }
-      addData.createBy = this.authUserId
+
       return addData
     },
-    // 保存
-    save() {
-      addSupplier(this.createAddData()).then(res => {
-        console.log(res)
-        this.$message.success('保存成功')
-        this.$router.replace('/supplier')
-      }).finally(() => {
-        this.isLoading = false
-        this.addFromData.securityLink = ''
-      })
-    },
-    // 设置品牌名称
-    setShopName(id) {
-      const fileList = []
-      let selectBrand = {}
-      this.brandList.forEach((item, index) => {
-        if (item.id === id) {
-          selectBrand = item
-          return
-        }
-      })
-      console.log(selectBrand)
-      if (this.addFromData.shopType === 1) {
-        this.addFromData.shopName = selectBrand.name
-      }
-      this.addFromData.brandAuthLogo = selectBrand.authLogo
-      if (selectBrand.authLogo) {
-        fileList.push({ name: this.addFromData.shopName, url: selectBrand.authLogo || '' })
-      }
-      this.fileList1 = fileList
-      // const fileList = []
-      // if (this.addFromData.shopType === 1) {
-      //   this.addFromData.shopName = this.brandList[index]?.name
-      // }
-      // this.addFromData.brandAuthLogo = this.brandList[index]?.authLogo || ''
-      // if (this.brandList[index]?.authLogo) {
-      //   fileList.push({ name: this.addFromData.shopName, url: this.brandList[index]?.authLogo || '' })
-      // }
-      // this.fileList1 = fileList
+    // 获取品牌列表
+    getBrandList(type) {
+      // 获取品牌列表
+      fetchBrandList({ type })
+        .then(res => {
+          this.brandList = res.data
+          this.brandListCody = this.excludeBrandHandle()
+        })
+        .catch(err => console.log(err))
     },
-    // 重新获取品牌列表
-    reGetBrandList(id) {
-      const shopType = id
-      this.fileList2 = []
-      this.fileList1 = []
-      this.fileList3 = []
+    // 供应商类型切换
+    handleTypeChange(id) {
+      const type = id
+      this.$refs.addFromDataRef.clearValidate()
       this.addFromData = {
         authUserId: null, // 供应商id
-        brandAuthLogo: '', //	品牌授权logo
+        shopType: type, //	供应商类型:1品牌方,2代理商
         brandId: '', // 品牌id
+        shopName: '', // 供应商名称
+        mobile: '', // 手机号
+        linkMan: '', // 联系人
         countryId: 1, // 产地国家id
+        brandAuthLogo: '', //	品牌授权logo
         createBy: '', // 创建人用户id
-        linkMan: '', // 联系人
-        mobile: '', // 手机号
         securityLink: '', // 官网认证链接
-        shopName: '', // 供应商名称
         shopStatus: 1, // 供应商状态:0停用 1启用
-        shopType: 1 //	供应商类型:1品牌方,2代理商
+        shopInfo: 1
       }
-      this.$refs.addFormRef?.clearValidate()
-      this.addFromData.shopType = shopType
-      this.getBrandList()
-    },
-    // 添加品牌信息对话框关闭事件
-    addBrandDialogClosed() {
       this.fileList1 = []
-      this.fileList2 = []
-      this.fileList3 = []
-      this.$refs.addBrandFormRef.resetFields()
+      this.getBrandList(type)
+    },
+    // 设置品牌名称
+    setShopName(id) {
+      const selectBrand = this.brandList.filter(item => {
+        return item.id === id
+      })[0]
+      const str = this.addFromData.shopType === 1 ? 'addFromData' : 'brandData'
+      this[str].shopName = selectBrand.name
+      this[str].brandAuthLogo = selectBrand.authLogo
+      this[str].brandId = selectBrand.id
+      if (str === 'brandData') {
+        this[str].brandName = selectBrand.name
+      }
+
+      if (selectBrand.authLogo) {
+        this.fileList1 = [{ name: '文件已上传', url: selectBrand.authLogo }]
+      }
+    },
+    // 添加品牌对话框开启
+    handleShowDialog() {
+      this.showDialog = true
     },
     // 添加品牌
     handleAddBrand() {
-      this.brandData.isNew = true
-      this.showAddDialog = true
-    },
-    handleSaveBrandInfo() {
-      // 如果为代理商 && 声明类型为文件
-      console.log(this.brandData)
-      debugger
-      if (this.addFromData.shopType === 2 && this.brandData.statementType === 4) {
-        // this.$refs.uploadFileRef.$refs.upload.submit()
-        if (this.brandData.statementFileId !== -1) {
-          this.saveBrandInfo()
-        } else {
-          this.$refs.uploadFileRef.$refs.upload.submit()
-        }
+      // 如果声明类型为文件
+      if (this.brandData.statementType === 4 && (this.brandData.statementFileId === null || this.brandData.statementFileId === '')) {
+        this.brandData.statementFileId = this.brandData.statementFileId === null ? '' : null
+        this.$refs.uploadFileRef.$refs.upload.submit()
       } else {
-        this.saveBrandInfo()
+        this.saveBrand()
       }
     },
-    handleSetName(id) {
-      const fileList = []
-      let brandInfo = null
-      this.brandList.forEach(item => {
-        if (item.id === id) {
-          brandInfo = item
-          return
+    // 保存品牌信息
+    saveBrand() {
+      this.$refs.brandDataRef.validate(valide => {
+        if (valide) {
+          const brandInfo = this.clone(this.brandData)
+          // brandInfo.brandName = brandInfo.shopName
+          console.log(brandInfo)
+          if (brandInfo.isNew) {
+            brandInfo.isNew = false
+            this.supplierBrands.push(brandInfo)
+          } else {
+            this.supplierBrands.splice(this.currentBrandIndex, 1, brandInfo)
+          }
+          if (this.addFromData.shopType === 2) {
+            this.excludeBrand.push(this.brandData.brandId)
+            this.prevBrandId = -1
+            console.log('添加:' + this.excludeBrand)
+          }
         }
+        this.showDialog = false
       })
-      this.brandData.brandName = brandInfo.name
-      this.brandData.brandId = brandInfo.id
-      this.brandData.brandAuthLogo = brandInfo.authLogo
-      fileList.push({ name: brandInfo.name, url: brandInfo.authLogo })
-      this.fileList1 = fileList
-    },
-    // 重置表单项
-    handleRadioChange() {
-      this.$refs.statementContent?.clearValidate()
-      this.$refs.statementLink?.clearValidate()
-      this.$refs.statementFileId?.clearValidate()
-      this.$refs.statementImage?.clearValidate()
     },
-    // 供应商代理品牌标签关闭时间
-    handleTagClose(index) {
-      this.supplierBrands.splice(index, 1)
-    },
-
-    // 查看品牌信息
-    handleTagClick(index) {
-      this.selectBrandIndex = index
-      this.brandData = this.cloneData(this.supplierBrands[index])
+    // 修改
+    handleShowInfo(index) {
+      this.currentBrandIndex = index
+      this.brandData = this.clone(this.supplierBrands[index])
       this.brandData.isNew = false
-      this.brandData.index = index
-      this.showAddDialog = true
+      this.prevBrandId = this.brandData.brandId
       console.log(this.brandData)
-      if (this.brandData.statementFileName) {
-        this.fileList3 = [{ name: this.brandData.statementFileName, url: '' }]
+      if (this.addFromData.shopType === 2) {
+        const i = this.excludeBrand.indexOf(this.brandData.brandId)
+        this.excludeBrand.splice(i, 1)
+      }
+      if (this.brandData.brandAuthLogo) {
+        this.fileList1 = [{ name: '文件已上传', url: this.brandData.brandAuthLogo }]
       }
-      if (this.brandData.statementImage !== '') {
+      if (this.brandData.statementImage) {
         this.fileList2 = [{ name: '文件已上传', url: this.brandData.statementImage }]
       }
-      if (this.brandData.brandAuthLogo !== '') {
-        this.fileList1 = [{ name: '', url: this.brandData.brandAuthLogo }]
+      if (this.brandData.statementFileId) {
+        const name = this.brandData.statementFileName || '文件已上传'
+        this.fileList3 = [{ name: name, url: '' }]
       }
-      console.log(this.brandData)
+      this.showDialog = true
     },
-    // 代理商保存品牌信息
-    saveBrandInfo() {
-      this.$refs.addBrandFormRef.validate(valide => {
-        if (!valide) return
-        // 提交保存
-        if (this.brandData.isNew) {
-          this.supplierBrands.push(this.cloneData(this.brandData))
-        } else {
-          this.supplierBrands.splice(this.brandData.index, 1, this.cloneData(this.brandData))
-        }
-        this.showAddDialog = false
-      })
+    // 删除
+    handleRemove(index) {
+      const i = this.excludeBrand.indexOf(this.supplierBrands[index].brandId)
+      this.excludeBrand.splice(i, 1)
+      this.supplierBrands.splice(index, 1)
+      console.log('删除:' + this.excludeBrand)
+    },
+    // 对话框关闭
+    dialogClosed() {
+      this.$refs.brandDataRef.resetFields()
+      this.fileList1 = []
+      this.fileList2 = []
+      this.fileList3 = []
+      this.brandData.isNew = true
+      // 如果部位-1 代表没有保存 则恢复到上一次的排除结果
+      if (this.prevBrandId !== -1) {
+        this.excludeBrand.push(this.prevBrandId)
+        this.prevBrandId = -1
+      }
+    },
+    // 声明类型切换
+    handleStatementChange(index) {
+      console.log(index)
+      const ref = 'statement' + index
+      this.$refs[ref].clearValidate()
+      // this.brandData.statementContent = ''
+      // this.brandData.statementLink = ''
+      // this.brandData.statementFileId = ''
+      // this.brandData.statementImage = ''
     },
     // 文件上传成功
     fileUploadSuccess(data) {
       this.brandData.statementFileId = data.data
-      console.log(data)
-      this.saveBrandInfo()
+      this.saveBrand()
     },
     fileUploadFaild(err, file, fileList) {
       console.log(err)
     },
-    removeFile() {
-      console.log('删除上传的文件')
-      this.brandData.statementFileId = -1
-      console.log(this.brandData.statementFileId)
+    fileRemove() {
+      console.log('删除文件')
+      this.brandData.statementFileId = null
     },
+
     // 图片上传成功 品牌logo
     imageUploadSuccess1(data) {
-      if (this.addFromData.shopType === 1) {
-        this.addFromData.brandAuthLogo = data.data
-      } else if (this.addFromData.shopType === 2) {
-        this.brandData.brandAuthLogo = data.data
-      }
+      const str = this.addFromData.shopType === 1 ? 'addFromData' : 'brandData'
+      this[str].brandAuthLogo = data.data
     },
     imageUploadFaild1(err, file, fileList) {
       console.log(err)
     },
+    imageRemove1() {
+      const str = this.addFromData.shopType === 1 ? 'addFromData' : 'brandData'
+      this[str].brandAuthLogo = ''
+      console.log('删除文件')
+    },
+
     // 图片上传成功 声明图片
     imageUploadSuccess2(data) {
-      this.addFromData.statementImage = data.data
+      this.brandData.statementImage = data.data
     },
     imageUploadFaild2(err, file, fileList) {
       console.log(err)
     },
-    removeImage() {
-      this.addFromData.statementImage = ''
+    imageRemove2() {
+      this.brandData.statementImage = ''
+      console.log('删除文件')
+    },
+    // 对品牌列表做排除操作
+    excludeBrandHandle() {
+      return this.brandList.filter((item, index) => {
+        return this.excludeBrand.indexOf(item.id) === -1
+      })
     },
+
     // 克隆
-    cloneData(data) {
-      const resutl = {}
+    clone(data) {
+      const result = {}
       for (const key in data) {
         if (Object.hasOwnProperty.call(data, key)) {
-          resutl[key] = data[key]
+          result[key] = data[key]
         }
       }
-      return resutl
+      return result
     }
   }
 }
@@ -560,26 +617,26 @@ export default {
 
 <style lang="scss" scoped>
 .addSupplier {
-  margin-bottom: 80px;
+    margin-bottom: 80px;
 }
 .addForm {
-  width: 500px;
-  margin: 0 auto;
-  margin-top: 80px;
-  .brand-box{
-    .el-tag{
-      margin-left: 10px;
-      cursor: pointer;
+    width: 500px;
+    margin: 0 auto;
+    margin-top: 80px;
+    .brand-list{
+      .el-tag{
+        margin-right: 5px;
+        cursor: pointer;
+      }
     }
-  }
 }
 .submit-btn {
-  text-align: center;
-  .el-button {
-    width: 140px;
-  }
+    text-align: center;
+    .el-button {
+        width: 140px;
+    }
 }
-.hiddenInput{
-  display: none;
+.hiddenInput {
+    display: none;
 }
 </style>

+ 5 - 3
src/views/supplier/user/index.vue

@@ -5,11 +5,13 @@
       <el-input v-model="listQuery.shopName" placeholder="供应商名称" style="width: 200px;" class="filter-item" @keyup.enter.native="handleFilter" />
       <span>供应商类型:</span>
       <el-select v-model="listQuery.shopType" placeholder="供应商类型" clearable style="width: 200px" class="filter-item">
-        <el-option label="代理商" :value="1" />
-        <el-option label="品牌方" :value="2" />
+        <el-option label="所有类型" value="" />
+        <el-option label="代理商" :value="2" />
+        <el-option label="品牌方" :value="1" />
       </el-select>
       <span>所属品牌:</span>
       <el-select v-model="listQuery.brandId" placeholder="所属品牌" clearable class="filter-item" style="width: 200px">
+        <el-option label="所有品牌" value="" />
         <el-option
           v-for="item in brandList"
           :key="item.id"
@@ -42,7 +44,7 @@
           <span v-if="row.shopType === 2">代理商</span>
         </template>
       </el-table-column>
-      <el-table-column label="所属品牌" width="150px" align="center" prop="brandName" />
+      <!-- <el-table-column label="所属品牌" width="150px" align="center" prop="brandName" /> -->
       <el-table-column label="手机号" width="120px" align="center" prop="mobile" />
       <el-table-column label="联系人" width="100px" align="center" prop="linkMan" />
       <el-table-column label="供应商状态" align="center" width="100px">