edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  1. <template>
  2. <div v-loading="isLoading" class="addSupplier">
  3. <el-form ref="addFormRef" :model="addData" :rules="rules" label-width="120px" class="addForm">
  4. <el-form-item label="供应商类型:" prop="shopType">
  5. <el-select v-model="addData.shopType" placeholder="请选择供应商类型" style="width: 100%" @change="getBrandList">
  6. <el-option label="品牌方" :value="1" />
  7. <el-option label="代理商" :value="2" />
  8. </el-select>
  9. </el-form-item>
  10. <!-- 供应商名称 -->
  11. <el-form-item v-if="addData.shopType===2" label="供应商名称:" prop="shopName">
  12. <el-input v-model="addData.shopName" placeholder="请输入供应商名称" />
  13. </el-form-item>
  14. <el-form-item v-if="addData.shopType===1" label="供应商名称:" prop="shopName">
  15. <el-select v-model="selectedBrandIndex" placeholder="请选择品牌" style="width: 100%" filterable @change="setShopName">
  16. <el-option
  17. v-for="(item,index) in brandList"
  18. :key="item.id"
  19. :label="item.name"
  20. :value="index"
  21. />
  22. </el-select>
  23. </el-form-item>
  24. <!-- 供应商名称END -->
  25. <el-form-item label="手机号:" prop="mobile">
  26. <el-input v-model="addData.mobile" placeholder="请输入手机号" />
  27. </el-form-item>
  28. <el-form-item label="联系人:" prop="linkMan">
  29. <el-input v-model="addData.linkMan" placeholder="请输入联系人" />
  30. </el-form-item>
  31. <el-form-item v-if="addData.shopType===2" label="所属品牌:" prop="brandId">
  32. <el-select v-model="addData.brandId" placeholder="请选择所属品牌" style="width: 100%" filterable @change="setShopName">
  33. <el-option
  34. v-for="(item,index) in brandList"
  35. :key="item.id"
  36. :label="item.name"
  37. :value="index"
  38. />
  39. </el-select>
  40. </el-form-item>
  41. <el-form-item label="产地:" prop="countryId">
  42. <el-select v-model="addData.countryId" placeholder="产地" style="width: 100%" filterable>
  43. <el-option
  44. v-for="item in countryList"
  45. :key="item.countryId"
  46. :label="item.countryName"
  47. :value="item.countryId"
  48. />
  49. </el-select>
  50. </el-form-item>
  51. <el-form-item label="品牌logo:" class="no-input" prop="brandAuthLogo">
  52. <upload-image ref="uploadImageRef1" :file-list="fileList1" @success="imageUploadSuccess1" @error="imageUploadFaild1" />
  53. <el-input v-model="addData.brandAuthLogo" type="hidden" class="hiddenInput" />
  54. </el-form-item>
  55. <el-form-item label="官网认证链接:">
  56. <el-input v-model="addData.securityLink" placeholder="请输入官网认证链接" />
  57. </el-form-item>
  58. <template v-if="addData.shopType===2">
  59. <el-form-item label="代理声明:">
  60. <el-radio v-model="addData.statementType" :label="1">弹窗</el-radio>
  61. <el-radio v-model="addData.statementType" :label="2">链接</el-radio>
  62. <el-radio v-model="addData.statementType" :label="3">图片</el-radio>
  63. <el-radio v-model="addData.statementType" :label="4">文件</el-radio>
  64. </el-form-item>
  65. <el-form-item v-if="addData.statementType === 1" label="弹窗:" prop="statementContent">
  66. <el-input v-if="addData.statementType === 1" v-model="addData.statementContent" type="textarea" />
  67. </el-form-item>
  68. <el-form-item v-else-if="addData.statementType === 2" label="链接:" prop="statementLink">
  69. <el-input v-if="addData.statementType === 2" v-model="addData.statementLink" />
  70. </el-form-item>
  71. <el-form-item v-else-if="addData.statementType === 3" label="图片:" class="no-input" prop="statementImage">
  72. <upload-image v-if="addData.statementType === 3" ref="uploadImageRef2" :file-list="fileList2" @success="imageUploadSuccess2" @error="imageUploadFaild2" />
  73. <el-input v-model="addData.statementImage" type="hidden" class="hiddenInput" />
  74. </el-form-item>
  75. <el-form-item v-else label="文件:" prop="statementFileId">
  76. <upload-file v-if="addData.statementType === 4" ref="uploadFileRef" :file-list="fileList3" @success="fileUploadSuccess" @error="fileUploadFaild" />
  77. <el-input v-model="addData.statementFileId" type="hidden" class="hiddenInput" />
  78. </el-form-item>
  79. </template>
  80. <el-form-item label="供应商状态:">
  81. <el-select v-model="addData.shopStatus" placeholder="请选择供应商状态" style="width: 100%">
  82. <el-option label="启用" :value="1" />
  83. <el-option label="禁用" :value="0" />
  84. </el-select>
  85. </el-form-item>
  86. </el-form>
  87. <div class="submit-btn">
  88. <el-button type="primary" @click="save">保存</el-button>
  89. <el-button type="warning" @click="$_back()">返回</el-button>
  90. </div>
  91. </div>
  92. </template>
  93. <script>
  94. import UploadImage from '../components/uploadImage'
  95. import UploadFile from '../components/uploadFile'
  96. import { mapGetters } from 'vuex'
  97. import { isMobile } from '@/utils/validate'
  98. import { fetchBrandList } from '@/api/brand'
  99. import { addSupplier, getSupplierById } from '@/api/supplier'
  100. export default {
  101. components: { UploadImage, UploadFile },
  102. data() {
  103. var valideMobile = (rule, value, callback) => {
  104. if (!isMobile(value)) {
  105. callback(new Error('手机号格式不正确'))
  106. } else {
  107. callback()
  108. }
  109. }
  110. return {
  111. isLoading: false,
  112. addData: {
  113. authUserId: '', // 供应商id
  114. brandAuthLogo: '', // 品牌授权logo
  115. brandId: '', // 品牌id
  116. countryId: 1, // 产地国家id
  117. createBy: '', // 创建人用户id
  118. linkMan: '', // 联系人
  119. mobile: '', // 手机号
  120. securityLink: '', // 官网认证链接
  121. shopName: '', // 供应商名称
  122. shopStatus: 1, // 供应商状态:0停用 1启用
  123. shopType: 1, // 供应商类型:1品牌方,2代理商
  124. statementContent: '', // 声明弹窗内容
  125. statementLink: '', // 声明链接
  126. statementFileId: 'no file', // 声明文件id
  127. statementImage: '', // 声明图片
  128. statementType: 1 // 代理声明类型:1弹窗 2链接 3图片 4文件(.doc .ppt .pdf)
  129. },
  130. selectedBrandIndex: '',
  131. brandList: [], // 品牌列表
  132. // 表单校验规则
  133. rules: {
  134. shopType: [{ required: true, message: '供应商类型不能为空', trigger: 'change' }],
  135. shopName: [{ required: true, message: '供应商名称不能为空', trigger: ['blur', 'change'] }],
  136. mobile: [
  137. { required: true, message: '手机号不能为空', trigger: 'blur' },
  138. { validator: valideMobile, trigger: 'blur' }
  139. ], // 手机号格式校验
  140. linkMan: [{ required: true, message: '联系人不能为空', trigger: 'blur' }],
  141. countryId: [{ required: true, message: '产地不能为空', trigger: 'change' }],
  142. brandAuthLogo: [{ required: true, message: '品牌logo不能为空' }],
  143. brandId: [{ required: true, message: '所属品牌不能为空', trigger: 'change' }],
  144. statementContent: [{ required: true, message: '声明不能为空', trigger: 'blur' }],
  145. statementLink: [{ required: true, message: '声明链接不能为空', trigger: 'blur' }],
  146. statementImage: [{ required: true, message: '声明图片不能为空' }],
  147. statementFileId: [{ required: true, message: '声明文件不能为空' }]
  148. },
  149. fileList1: [], // 已上传的图片列表 品牌logo
  150. fileList2: [], // 已上传的图片列表 声明图片
  151. fileList3: [] // 已上传的图片列表 声明文件
  152. // countryList: []
  153. }
  154. },
  155. computed: {
  156. ...mapGetters(['userIdentity', 'name', 'countryList', 'authUserId'])
  157. },
  158. created() {
  159. // 获取供应商id
  160. this.addData.authUserId = this.$route.query.id
  161. this.getInfoById(this.addData.authUserId)
  162. },
  163. methods: {
  164. // 初始添加供应商时的表单数据
  165. initAddForm(data) {
  166. this.setFormData(data)
  167. this.getBrandList(data.type)
  168. },
  169. // 查询供应商信息
  170. getInfoById(id) {
  171. this.isLoading = true
  172. getSupplierById({ authUserId: id })
  173. .then(res => {
  174. if (res.code === 0) {
  175. this.initAddForm(res.data)
  176. }
  177. })
  178. .catch(err => { console.log(err) })
  179. .finally(() => {
  180. this.isLoading = false
  181. })
  182. },
  183. // 为表单设置数据
  184. setFormData(data) {
  185. for (const key in this.addData) {
  186. if (Object.hasOwnProperty.call(data, key)) {
  187. this.addData[key] = data[key] || ''
  188. }
  189. }
  190. if (this.addData.brandAuthLogo) {
  191. this.fileList1.push({ name: 'authLogo', url: this.addData.brandAuthLogo })
  192. }
  193. if (this.addData.statementImage) {
  194. this.fileList2.push({ name: '声明图片', url: this.addData.statementImage })
  195. }
  196. if (data.statementFileName) {
  197. // this.fileList3.push({ name: '您已上传文件,不支持预览,可删除后重新上传', url: '' })
  198. this.fileList3.push({ name: data.statementFileName, url: '' })
  199. }
  200. },
  201. // 获取品牌列表
  202. getBrandList(type) {
  203. fetchBrandList({ type }).then(res => {
  204. if (res.code === 0) {
  205. this.brandList = res.data
  206. }
  207. }).catch(err => console.log(err))
  208. },
  209. // 保存表单数据
  210. async save() {
  211. this.isLoading = true
  212. this.addData.createBy = this.authUserId
  213. // this.uploadFile()
  214. await this.$refs.addFormRef.validate(valide => {
  215. if (!valide) {
  216. this.isLoading = false
  217. return
  218. }
  219. if (this.addData.statementFileId === 'no file') {
  220. this.addData.statementFileId = null
  221. }
  222. addSupplier(this.addData).then(res => {
  223. this.$message.success('修改成功')
  224. // this.$refs.addFormRef.resetFields()
  225. }).catch(err => {
  226. console.log(err)
  227. this.$message.danger('修改失败')
  228. }).finally(() => {
  229. this.isLoading = false
  230. this.$refs.addFormRef.resetFields()
  231. this.addData.securityLink = ''
  232. })
  233. })
  234. },
  235. // 设置品牌名称
  236. setShopName(index) {
  237. const fileList = []
  238. if (this.addData.shopType === 1) {
  239. this.addData.shopName = this.brandList[index]?.name
  240. }
  241. this.addData.brandAuthLogo = this.brandList[index]?.authLogo || ''
  242. if (this.brandList[index]?.authLogo) {
  243. fileList.push({ name: this.addData.shopName, url: this.brandList[index]?.authLogo || '' })
  244. }
  245. this.fileList1 = fileList
  246. },
  247. // 文件上传成功
  248. fileUploadSuccess(data) {
  249. this.addData.statementFileId = data.data
  250. },
  251. fileUploadFaild(err, file, fileList) {
  252. console.log(err)
  253. },
  254. // 图片上传成功 品牌logo
  255. imageUploadSuccess1(data) {
  256. this.addData.brandAuthLogo = data.data
  257. },
  258. imageUploadFaild1(err, file, fileList) {
  259. console.log(err)
  260. },
  261. // 图片上传成功 声明图片
  262. imageUploadSuccess2(data) {
  263. this.addData.statementImage = data.data
  264. },
  265. imageUploadFaild2(err, file, fileList) {
  266. console.log(err)
  267. }
  268. }
  269. }
  270. </script>
  271. <style lang="scss" scoped>
  272. .addSupplier {
  273. margin-bottom: 80px;
  274. }
  275. .addForm {
  276. width: 500px;
  277. margin: 0 auto;
  278. margin-top: 80px;
  279. }
  280. .submit-btn {
  281. text-align: center;
  282. .el-button {
  283. width: 140px;
  284. }
  285. }
  286. .hiddenInput{
  287. display: none;
  288. }
  289. </style>