edit.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364
  1. <template>
  2. <div v-loading="isLoading" class="page-form-container">
  3. <el-form ref="submitForm" :model="formData" :rules="rules" label-width="140px">
  4. <el-form-item label="供应商名称:" prop="shopName">
  5. <el-input v-model="formData.shopName" placeholder="请输入供应商名称" maxlength="50" show-word-limit />
  6. </el-form-item>
  7. <el-form-item label="子账号前缀:" prop="prefix">
  8. <el-input
  9. v-model="formData.prefix"
  10. placeholder="用于避免供应商子账号重复"
  11. maxlength="10"
  12. show-word-limit
  13. :disabled="prefixDisabled"
  14. />
  15. </el-form-item>
  16. <el-form-item label="供应商类型:" prop="shopType">
  17. <el-select v-model="formData.shopType" placeholder="请选择供应商类型">
  18. <el-option label="品牌方" :value="1" />
  19. <el-option label="代理商" :value="2" />
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="关联采美供应商:">
  23. <el-select v-model="formData.cmShopId" placeholder="请选择需要关联的供应商" clearable filterable>
  24. <template v-for="shop in cmShopList">
  25. <el-option :key="shop.cmShopId" :label="shop.cmShopName" :value="shop.cmShopId" />
  26. </template>
  27. </el-select>
  28. </el-form-item>
  29. <el-form-item label="手机号:" prop="mobile">
  30. <div class="flex">
  31. <el-input
  32. v-model="formData.mobile"
  33. placeholder="请输入手机号"
  34. maxlength="11"
  35. show-word-limit
  36. @input="onMobileInput"
  37. />
  38. <div class="form-label-tip">(提示:该手机号为登录账号)</div>
  39. </div>
  40. </el-form-item>
  41. <el-form-item label="联系人:" prop="linkMan">
  42. <el-input v-model="formData.linkMan" placeholder="请输入联系人" maxlength="50" show-word-limit />
  43. </el-form-item>
  44. <el-form-item label="供应商logo:" prop="logo">
  45. <upload-image
  46. tip="建议尺寸:200px * 200px"
  47. :image-list="logoImageList"
  48. @success="onUploadLogoSuccess"
  49. @remove="onRemoveLogoImage"
  50. />
  51. <el-input v-show="false" v-model="formData.logo" />
  52. </el-form-item>
  53. <el-form-item label="旗下品牌:" prop="shopInfo">
  54. <template v-for="(item, index) in formData.shopInfo">
  55. <el-tag
  56. :key="index"
  57. effect="dark"
  58. closable
  59. type="success"
  60. @close="onRemoveBrand(index)"
  61. @click="onEditBrand('edit', item, index)"
  62. >
  63. <span>{{ item.brandName }}</span>
  64. </el-tag>
  65. </template>
  66. <el-tag type="primary" effect="dark" @click="onEditBrand('add')">添加品牌<span class="el-icon-plus" /></el-tag>
  67. <el-checkbox-group v-show="false" v-model="formData.shopInfo" />
  68. </el-form-item>
  69. <el-form-item label="微信公众号:" prop="wxAccountType">
  70. <el-select v-model="formData.wxAccountType" placeholder="请选择微信公众号类型" clearable>
  71. <el-option label="订阅号" :value="1" />
  72. <el-option label="服务号" :value="2" />
  73. </el-select>
  74. </el-form-item>
  75. <template v-if="formData.wxAccountType === 2">
  76. <el-form-item label="appID:" prop="appId">
  77. <el-input v-model="formData.appId" placeholder="请输入服务号appId" />
  78. </el-form-item>
  79. <el-form-item label="appSecret:" prop="appSecret">
  80. <el-input v-model="formData.appSecret" placeholder="请输入服务号appSecret" />
  81. </el-form-item>
  82. </template>
  83. <el-form-item label="供应商状态:" prop="shopStatus">
  84. <el-select v-model="formData.shopStatus" placeholder="请选择供应商状态">
  85. <el-option label="启用" :value="1" />
  86. <el-option label="禁用" :value="0" />
  87. </el-select>
  88. </el-form-item>
  89. </el-form>
  90. <div class="control-box">
  91. <el-button type="warning" @click="navigateBack">返回</el-button>
  92. <el-button type="primary" @click="onSubmit">提交</el-button>
  93. </div>
  94. <!-- 品牌编辑dialog -->
  95. <el-dialog
  96. title="编辑品牌信息"
  97. width="36%"
  98. :visible.sync="brandEditVisible"
  99. :close-on-click-modal="false"
  100. :close-on-press-escape="false"
  101. :show-close="false"
  102. >
  103. <brand-edit-form v-if="brandEditVisible" ref="brandEditForm" :model="brandModel" @change="onBrandFormChange" />
  104. <span slot="footer" class="dialog-footer">
  105. <el-button @click="onEditBrandCancel">取 消</el-button>
  106. <el-button type="primary" @click="onBrandSubmit">确 定</el-button>
  107. </span>
  108. </el-dialog>
  109. </div>
  110. </template>
  111. <script>
  112. import UploadImage from '@/components/UploadImage'
  113. import { BrandEditForm } from '@/views/components'
  114. import { deepClone } from '@/utils'
  115. import { isMobile, validLowerCase } from '@/utils/validate'
  116. import { fetchCmSupplierList, createSupplier, getSupplierById } from '@/api/supplier'
  117. import { mapGetters } from 'vuex'
  118. const generateBrandInfo = () => ({
  119. infoId: '',
  120. brandName: '',
  121. brandLogo: '',
  122. producePlace: '',
  123. manufacturer: ''
  124. })
  125. export default {
  126. components: {
  127. UploadImage,
  128. BrandEditForm
  129. },
  130. data() {
  131. const validMobile = (rule, value, callback) => {
  132. if (!isMobile(value)) {
  133. return callback(new Error('手机号格式不正确'))
  134. }
  135. return callback()
  136. }
  137. const prefixValidate = (rule, value, callback) => {
  138. if (!validLowerCase(value)) {
  139. return callback(new Error('标识符只能是小写字母'))
  140. }
  141. return callback()
  142. }
  143. return {
  144. isLoading: false,
  145. type: 'add',
  146. brandEditVisible: false,
  147. brandEditType: 'add',
  148. brandEditIndex: 0,
  149. prefix: '',
  150. formData: {
  151. prefix: '', // 供应商标记
  152. authUserId: '',
  153. createBy: '',
  154. shopName: '', // 供应商名称
  155. shopType: '', // 供应商类型
  156. mobile: '', // 手机号
  157. linkMan: '', // 联系人
  158. logo: '', // 代理商logo
  159. shopInfo: [],
  160. wxAccountType: '',
  161. appId: '',
  162. appSecret: '',
  163. shopStatus: 1, // 供应商状态,
  164. cmShopId: ''
  165. },
  166. rules: {
  167. shopName: [{ required: true, message: '请输入供应商名称', trigger: ['blur'] }],
  168. shopType: [{ required: true, message: '请选择供应商类型', trigger: ['change'] }],
  169. mobile: [
  170. { required: true, message: '请输入手机号', trigger: ['blur'] },
  171. { validator: validMobile, trigger: ['blur'] }
  172. ],
  173. linkMan: [{ required: true, message: '请输入联系人', trigger: ['blur'] }],
  174. prefix: [
  175. { required: true, message: '请输入供应商标识符', trigger: ['blur'] },
  176. { validator: prefixValidate, trigger: ['blur'] }
  177. ],
  178. logo: [{ required: true, message: '请上传供应商logo', trigger: ['change'] }],
  179. shopInfo: [{ required: true, type: 'array', message: '请至少添加一个品牌', trigger: ['change'] }],
  180. shopStatus: [{ required: true, message: '请选择供应商状态', trigger: ['change'] }],
  181. appId: [{ required: true, message: '请输入服务号appId', trigger: ['blur'] }],
  182. appSecret: [{ required: true, message: '请输入服务号appSecret', trigger: ['blur'] }]
  183. },
  184. brandModel: generateBrandInfo(),
  185. logoImageList: [],
  186. cmShopList: []
  187. }
  188. },
  189. computed: {
  190. ...mapGetters(['authUserId']),
  191. prefixDisabled() {
  192. return this.type === 'edit' && this.prefix && this.prefix.length > 0
  193. }
  194. },
  195. created() {
  196. this.fetchCmSupplierList()
  197. this.type = this.$route.query.type || 'add'
  198. console.log(this.type)
  199. if (this.type === 'edit') {
  200. this.fetchSupplierData()
  201. }
  202. },
  203. methods: {
  204. // 获取采美供应商列表
  205. async fetchCmSupplierList() {
  206. try {
  207. const res = await fetchCmSupplierList()
  208. this.cmShopList = res.data
  209. } catch (error) {
  210. console.log(error)
  211. }
  212. },
  213. // 获取供应商信息
  214. async fetchSupplierData() {
  215. try {
  216. this.isLoading = true
  217. this.formData.authUserId = this.$route.query.id
  218. const res = await getSupplierById({ authUserId: this.formData.authUserId })
  219. this.initFormData(res.data)
  220. } catch (error) {
  221. console.log(error)
  222. }
  223. },
  224. // 初始化表单信息
  225. initFormData(data) {
  226. for (const key in data) {
  227. if (Object.hasOwnProperty.call(this.formData, key)) {
  228. if (key === 'wxAccountType') {
  229. this.formData[key] = data[key] === 0 ? '' : data[key]
  230. } else if (key === 'cmShopId') {
  231. this.formData[key] = data[key] ? data[key] : ''
  232. } else {
  233. this.formData[key] = data[key]
  234. }
  235. }
  236. }
  237. if (this.formData.logo) {
  238. this.logoImageList = [{ url: this.formData.logo, name: '供应商logo' }]
  239. }
  240. this.prefix = data.prefix
  241. this.$nextTick(() => (this.isLoading = false))
  242. },
  243. // 保存
  244. async onSave() {
  245. try {
  246. this.isLoading = true
  247. await createSupplier(this.formatSubmitData())
  248. this.$message.success(`保存成功`)
  249. this.$store.dispatch('tagsView/delView', this.$route)
  250. this.$router.replace('/supplier/list')
  251. } catch (error) {
  252. console.log(error)
  253. } finally {
  254. this.isLoading = false
  255. }
  256. },
  257. // 请求字段格式处理
  258. formatSubmitData() {
  259. const data = deepClone(this.formData)
  260. if (data.wxAccountType === '') {
  261. data.wxAccountType = 0
  262. }
  263. if (data.createBy === '') {
  264. data.createBy = this.authUserId
  265. }
  266. return data
  267. },
  268. // 提交供应商信息
  269. async onSubmit() {
  270. try {
  271. await this.$refs.submitForm.validate()
  272. this.onSave()
  273. } catch (error) {
  274. console.log(error)
  275. }
  276. },
  277. // 品牌信息变化
  278. onBrandFormChange(data) {
  279. console.log(data)
  280. this.brandModel = data
  281. },
  282. // 品牌信息确认
  283. async onBrandSubmit() {
  284. try {
  285. await this.$refs.brandEditForm.validate()
  286. if (this.brandEditType === 'add') {
  287. this.formData.shopInfo.push(deepClone(this.brandModel))
  288. } else {
  289. this.formData.shopInfo.splice(this.brandEditIndex, 1, deepClone(this.brandModel))
  290. }
  291. this.brandEditVisible = false
  292. } catch (error) {
  293. console.log(error)
  294. }
  295. },
  296. // 编辑品牌事件
  297. onEditBrand(type, row, index) {
  298. this.brandEditType = type
  299. this.brandEditIndex = index
  300. this.brandModel = type === 'add' ? generateBrandInfo() : row
  301. this.brandEditVisible = true
  302. },
  303. // 品牌编辑取消
  304. onEditBrandCancel() {
  305. this.$refs.brandEditForm.clearValidate()
  306. this.brandEditVisible = false
  307. },
  308. // 删除品牌
  309. onRemoveBrand(index) {
  310. this.formData.shopInfo.splice(index, 1)
  311. },
  312. // 供应商logo上传成功
  313. onUploadLogoSuccess({ response, file, fileList }) {
  314. this.logoImageList = fileList
  315. this.formData.logo = response.data
  316. },
  317. // 移除供应商logo
  318. onRemoveLogoImage() {
  319. this.logoImageList = []
  320. this.formData.logo = ''
  321. },
  322. // 输入手机号时
  323. onMobileInput() {
  324. this.formData.mobile = this.formData.mobile.replace(/[^\w\.\/]/gi, '')
  325. }
  326. }
  327. }
  328. </script>
  329. <style lang="scss" scoped>
  330. .el-tag {
  331. cursor: pointer;
  332. margin-right: 8px;
  333. }
  334. .el-select {
  335. width: 100%;
  336. }
  337. .flex {
  338. display: flex;
  339. .form-label-tip {
  340. white-space: nowrap;
  341. margin-left: 6px;
  342. font-size: 12px;
  343. }
  344. }
  345. </style>