فهرست منبع

新建BA会员功能发布

kevin_zhangl 3 سال پیش
والد
کامیت
7e87d540a4

+ 0 - 9
src/api/finance.js

@@ -36,15 +36,6 @@ export function fetchBalance() {
   })
   })
 }
 }
 
 
-// 查询用户
-export function fetchFullInfo(data) {
-  return request({
-    url: '/v1/user/full-info',
-    method: 'get',
-    params: data
-  })
-}
-
 // 获取转账授权吗
 // 获取转账授权吗
 export function fetchTransferCode() {
 export function fetchTransferCode() {
   return request({
   return request({

+ 76 - 27
src/api/user.js

@@ -1,6 +1,11 @@
 import request from '@/utils/request'
 import request from '@/utils/request'
 
 
-
+/**
+ * 登录
+ * @param data
+ * @param pageId
+ * @returns {*}
+ */
 export function login(data, pageId = '') {
 export function login(data, pageId = '') {
   let url = pageId ? '/v1/oauth/login?page_id='+pageId : '/v1/oauth/login'
   let url = pageId ? '/v1/oauth/login?page_id='+pageId : '/v1/oauth/login'
   return request({
   return request({
@@ -10,6 +15,11 @@ export function login(data, pageId = '') {
   })
   })
 }
 }
 
 
+/**
+ * 快速登录
+ * @param params
+ * @returns {*}
+ */
 export function backendQuickLogin(params) {
 export function backendQuickLogin(params) {
   let url = '/v1/oauth/login-by-backend'
   let url = '/v1/oauth/login-by-backend'
   return request({
   return request({
@@ -21,6 +31,11 @@ export function backendQuickLogin(params) {
   })
   })
 }
 }
 
 
+/**
+ * 登录校验
+ * @param data
+ * @returns {*}
+ */
 export function isLoginVerify(data) {
 export function isLoginVerify(data) {
   return request({
   return request({
     url: '/v1/oauth/is-login-verify',
     url: '/v1/oauth/is-login-verify',
@@ -29,6 +44,11 @@ export function isLoginVerify(data) {
   })
   })
 }
 }
 
 
+/**
+ * 用户信息
+ * @param data
+ * @returns {*}
+ */
 export function getUserInfo(data) {
 export function getUserInfo(data) {
   return request({
   return request({
     url: '/v1/oauth/info',
     url: '/v1/oauth/info',
@@ -37,6 +57,10 @@ export function getUserInfo(data) {
   })
   })
 }
 }
 
 
+/**
+ * 系统信息
+ * @returns {*}
+ */
 export function getBaseInfo() {
 export function getBaseInfo() {
   return request({
   return request({
     url: '/v1/site/base-info',
     url: '/v1/site/base-info',
@@ -44,6 +68,10 @@ export function getBaseInfo() {
   })
   })
 }
 }
 
 
+/**
+ * 消息列表
+ * @returns {*}
+ */
 export function getMessageData() {
 export function getMessageData() {
   return request({
   return request({
     url: '/v1/message/unread-num',
     url: '/v1/message/unread-num',
@@ -51,30 +79,11 @@ export function getMessageData() {
   })
   })
 }
 }
 
 
-// export function login(data) {
-//   return request({
-//     url: '/vue-element-admin/user/login',
-//     method: 'post',
-//     data
-//   })
-// }
-
-export function getInfo(token) {
-  return request({
-    url: '/vue-element-admin/user/info',
-    method: 'get',
-    params: { token }
-  })
-}
-
-// export function logout() {
-//   return request({
-//     url: '/vue-element-admin/user/logout',
-//     method: 'post'
-//   })
-// }
-
-// 修改用户
+/**
+ * 修改用户
+ * @param data
+ * @returns {*}
+ */
 export function updateInfo(data) {
 export function updateInfo(data) {
   return request({
   return request({
     url: '/v1/user/edit',
     url: '/v1/user/edit',
@@ -83,7 +92,11 @@ export function updateInfo(data) {
   })
   })
 }
 }
 
 
-// 修改登录密码
+/**
+ * 修改登录密码
+ * @param data
+ * @returns {*}
+ */
 export function updateLoginPassword(data) {
 export function updateLoginPassword(data) {
   return request({
   return request({
     url: '/v1/user/password',
     url: '/v1/user/password',
@@ -92,7 +105,11 @@ export function updateLoginPassword(data) {
   })
   })
 }
 }
 
 
-// 修改支付密码
+/**
+ * 修改支付密码
+ * @param data
+ * @returns {*}
+ */
 export function updatePaymentPassword(data) {
 export function updatePaymentPassword(data) {
   return request({
   return request({
     url: '/v1/user/pay-password',
     url: '/v1/user/pay-password',
@@ -100,3 +117,35 @@ export function updatePaymentPassword(data) {
     data
     data
   })
   })
 }
 }
+
+/**
+ * BA报单
+ * @returns {*}
+ */
+export function fetchBrandAmbassador() {
+  return request({
+    url: '/v1/user/ba-dec',
+    method: 'get',
+  })
+}
+
+/**
+ * BA报单
+ * @returns {*}
+ */
+export function createBrandAmbassador(data) {
+  return request({
+    url: '/v1/user/ba-dec',
+    method: 'post',
+    data
+  })
+}
+
+// 查询用户
+export function fetchFullInfo(data) {
+  return request({
+    url: '/v1/user/full-info',
+    method: 'get',
+    params: data
+  })
+}

+ 16 - 1
src/lang/en.js

@@ -245,6 +245,7 @@ export default {
   },
   },
 
 
   shop: {
   shop: {
+    product: 'Product',
     productCode: 'Product Code',
     productCode: 'Product Code',
     productName: 'Product Name',
     productName: 'Product Name',
     productPicture: 'Product Picture',
     productPicture: 'Product Picture',
@@ -265,6 +266,7 @@ export default {
     recipientName: 'Recipient Name',
     recipientName: 'Recipient Name',
     phoneNumber: 'Phone Number',
     phoneNumber: 'Phone Number',
     shippingAddress: 'Shipping Address',
     shippingAddress: 'Shipping Address',
+    shipping: 'Shipping',
     payment: 'Payment',
     payment: 'Payment',
     createdTime: 'Created Time',
     createdTime: 'Created Time',
     payTime: 'Pay Time',
     payTime: 'Pay Time',
@@ -283,6 +285,7 @@ export default {
     confirmClose: 'Confirm to close?',
     confirmClose: 'Confirm to close?',
     inputPasswordTips: 'Please enter your payment password',
     inputPasswordTips: 'Please enter your payment password',
     selfPickUp: 'Self Pick-up',
     selfPickUp: 'Self Pick-up',
+    delivery: 'Delivery',
     selectAddress: 'Please select the shipping address',
     selectAddress: 'Please select the shipping address',
     selectPayment: 'Please select payment method',
     selectPayment: 'Please select payment method',
     freight: 'Freight',
     freight: 'Freight',
@@ -294,10 +297,20 @@ export default {
     balanceNotAllow: 'insufficient, unable to buy products',
     balanceNotAllow: 'insufficient, unable to buy products',
     paymentError: 'Payment or Account Balance error',
     paymentError: 'Payment or Account Balance error',
     successOrderTips: 'The order is successful',
     successOrderTips: 'The order is successful',
+    paymentMethod: 'Payment Method',
   },
   },
 
 
   user: {
   user: {
-    email: 'Email'
+    email: 'Email',
+    accountInformation: 'Account Information',
+    newMemberCode: 'New Member Code',
+    selectWelcomePack: 'Select Welcome Pack',
+    sponsorCode: 'Sponsor Code',
+    payInfo: 'Pay Info',
+  },
+
+  atlas: {
+    networkInformation: 'Network Information',
   },
   },
 
 
   config: {
   config: {
@@ -331,6 +344,8 @@ export default {
     whetherUpgrade: 'Whether Upgrade',
     whetherUpgrade: 'Whether Upgrade',
     loginPasswordSuccessTips: 'User login password has been updated successfully.',
     loginPasswordSuccessTips: 'User login password has been updated successfully.',
     paymentPasswordSuccessTips: 'User payment password has been updated successfully.',
     paymentPasswordSuccessTips: 'User payment password has been updated successfully.',
+    enterLoginPassword: 'Enter Login Password',
+    enterPaymentPassword: 'Enter Payment Password',
   },
   },
   article: {
   article: {
     title: 'Title',
     title: 'Title',

+ 17 - 1
src/lang/zh.js

@@ -243,6 +243,7 @@ export default {
     close: '关闭',
     close: '关闭',
   },
   },
   shop: {
   shop: {
+    product: '商品',
     productCode: '编号',
     productCode: '编号',
     productName: '名称',
     productName: '名称',
     productPrice: '单价',
     productPrice: '单价',
@@ -263,6 +264,7 @@ export default {
     recipientName: '收货人',
     recipientName: '收货人',
     phoneNumber: '收货电话',
     phoneNumber: '收货电话',
     shippingAddress: '收货地址',
     shippingAddress: '收货地址',
+    shipping: '收货方式',
     payment: '支付方式',
     payment: '支付方式',
     createdTime: '下单时间',
     createdTime: '下单时间',
     payTime: '支付时间',
     payTime: '支付时间',
@@ -281,6 +283,7 @@ export default {
     confirmClose: '确定要关闭页面吗?',
     confirmClose: '确定要关闭页面吗?',
     inputPasswordTips: '请输入支付密码',
     inputPasswordTips: '请输入支付密码',
     selfPickUp: '自提',
     selfPickUp: '自提',
+    delivery: '收货地址',
     selectAddress: '请选择收货地址',
     selectAddress: '请选择收货地址',
     selectPayment: '请选择支付方式',
     selectPayment: '请选择支付方式',
     freight: '运费',
     freight: '运费',
@@ -292,10 +295,21 @@ export default {
     balanceNotAllow: '不足,无法购买商品',
     balanceNotAllow: '不足,无法购买商品',
     paymentError: '支付方式或账户类型错误',
     paymentError: '支付方式或账户类型错误',
     successOrderTips: '订单支付成功',
     successOrderTips: '订单支付成功',
+    paymentMethod: '支付方式',
   },
   },
   user: {
   user: {
-    email: '电子邮箱'
+    email: '电子邮箱',
+    accountInformation: '账号信息',
+    newMemberCode: '会员编号',
+    selectWelcomePack: '报单方式',
+    sponsorCode: '报单中心编号',
+    payInfo: '支付信息',
   },
   },
+
+  atlas: {
+    networkInformation: '网络信息',
+  },
+
   config: {
   config: {
     consignee: '收货人',
     consignee: '收货人',
     detailedAddress: '详细地址',
     detailedAddress: '详细地址',
@@ -326,6 +340,8 @@ export default {
     whetherUpgrade: '是否已升级',
     whetherUpgrade: '是否已升级',
     loginPasswordSuccessTips: '登录密码已修改成功',
     loginPasswordSuccessTips: '登录密码已修改成功',
     paymentPasswordSuccessTips: '支付密码已修改成功',
     paymentPasswordSuccessTips: '支付密码已修改成功',
+    enterLoginPassword: '请输入登录密码',
+    enterPaymentPassword: '请支付登录密码',
   },
   },
   article: {
   article: {
     title: '标题',
     title: '标题',

+ 5 - 0
src/layout/index.vue

@@ -19,9 +19,14 @@ import RightPanel from '@/components/RightPanel'
 import { AppMain, Navbar, Settings, Sidebar } from './components'
 import { AppMain, Navbar, Settings, Sidebar } from './components'
 import ResizeMixin from './mixin/ResizeHandler'
 import ResizeMixin from './mixin/ResizeHandler'
 import { mapState } from 'vuex'
 import { mapState } from 'vuex'
+import initRegion from "@/utils/region"
 
 
 export default {
 export default {
   name: 'Layout',
   name: 'Layout',
+	beforeCreate() {
+		// 获取地区信息
+		initRegion(this)
+	},
   components: {
   components: {
     AppMain,
     AppMain,
     Navbar,
     Navbar,

+ 2 - 25
src/router/index.js

@@ -18,6 +18,7 @@ import atlasRouter from "@/router/modules/atlas";
 import articleRouter from "@/router/modules/article";
 import articleRouter from "@/router/modules/article";
 import bonusRouter from "@/router/modules/bonus";
 import bonusRouter from "@/router/modules/bonus";
 import financeRouter from "@/router/modules/finance";
 import financeRouter from "@/router/modules/finance";
+import userRouter from "@/router/modules/user";
 
 
 /**
 /**
  * Note: sub-menu only appear when route children.length >= 1
  * Note: sub-menu only appear when route children.length >= 1
@@ -109,31 +110,6 @@ export const constantRoutes = [
       }
       }
     ]
     ]
   },
   },
-  // {
-  //   path: '/documentation',
-  //   component: Layout,
-  //   children: [
-  //     {
-  //       path: 'index',
-  //       component: () => import('@/views/documentation/index'),
-  //       name: 'Documentation',
-  //       meta: { title: 'documentation', icon: 'documentation', affix: true }
-  //     }
-  //   ]
-  // },
-  // {
-  //   path: '/guide',
-  //   component: Layout,
-  //   redirect: '/guide/index',
-  //   children: [
-  //     {
-  //       path: 'index',
-  //       component: () => import('@/views/guide/index'),
-  //       name: 'Guide',
-  //       meta: { title: 'guide', icon: 'guide', noCache: true }
-  //     }
-  //   ]
-  // },
 ]
 ]
 
 
 /**
 /**
@@ -207,6 +183,7 @@ export const asyncRoutes = [
   articleRouter,
   articleRouter,
   bonusRouter,
   bonusRouter,
   financeRouter,
   financeRouter,
+  userRouter,
 
 
   {
   {
     path: '/error',
     path: '/error',

+ 17 - 0
src/router/modules/user.js

@@ -0,0 +1,17 @@
+import Layout from '@/layout'
+
+const userRouter = {
+  path: '/user',
+  component: Layout,
+  redirect: '/user/dec',
+  hidden: true,
+  children: [
+    {
+      path: 'ba-dec',  // 新建BA会员
+      component: () => import('@/views/user/brand-ambassador'),
+      name: 'brandAmbassador',
+      meta: { title: 'Welcome BA', icon: 'user', noCache: true }
+    },
+  ]
+}
+export default userRouter

+ 1 - 0
src/store/getters.js

@@ -17,5 +17,6 @@ const getters = {
   decLv: state => state.user.decLv,
   decLv: state => state.user.decLv,
   empLv: state => state.user.empLv,
   empLv: state => state.user.empLv,
   crownLv: state => state.user.crownLv,
   crownLv: state => state.user.crownLv,
+  regionInfo: state => state.regionInfo,
 }
 }
 export default getters
 export default getters

+ 21 - 0
src/store/modules/region.js

@@ -0,0 +1,21 @@
+// import {backendQuickLogin} from '@/api/user' // TODO: 改为从服务端读取
+import Vuex from 'vuex'
+
+const moduleRegionInfo = {
+  state: {
+    provinceAndCityData: [],
+    regionData: [],
+    provinceAndCityDataPlus: [],
+    regionDataPlus: [],
+    CodeToText: {
+      '': null,
+    },
+    TextToCode: {},
+  }
+}
+
+export default new Vuex.Store({
+  modules: {
+    regionInfo: moduleRegionInfo,
+  }
+})

+ 23 - 0
src/utils/importScript.js

@@ -0,0 +1,23 @@
+const importScript = function (path, success, error) {
+  let isLoaded = false
+  let scriptElements = document.getElementsByTagName('script')
+  for(let i in scriptElements){
+    if(scriptElements[i].src === path){
+      isLoaded = true
+    }
+  }
+  if(isLoaded === false){
+    let oS = document.createElement('script')
+    oS.src = path
+    document.getElementsByTagName('head')[0].appendChild(oS)
+    oS.onload = function () {
+      success && success()
+    }
+
+    oS.onerror = function () {
+      error && error()
+    }
+  }
+}
+
+export default importScript

+ 119 - 0
src/utils/region.js

@@ -0,0 +1,119 @@
+//ANRAN_REGION_DATA from cdn/jsdata
+// 深拷贝数组
+// let scriptEle = document.createElement('script')
+// scriptEle.setAttribute('src', 'http://upload.ar.wqcms.com/cdn/jsdata/ar_region_data.js?ver=0.1')
+// document.getElementsByTagName('head')[0].appendChild(scriptEle)
+// // document.write("<script language='javascript' src='http://upload.ar.wqcms.com/cdn/jsdata/ar_region_data.js?ver=0.1'></script>");
+// require('http://tool.anran.io/cdn/jsdata/ar_region_data.js')
+import importScript from "@/utils/importScript"
+import store from "@/store"
+
+let regionScriptLoaded = false
+
+const initRegion = function (vueObj) {
+  importScript(process.env.VUE_APP_CDN_API + `/cdn/jsdata/ar_region_data.js?ver=0.1`, () => {
+    if (regionScriptLoaded) return true
+    regionScriptLoaded = true
+    let ANRAN_REGION_DATA = AR_REGION_DATA
+
+    // 汉字转code大对象
+    const rootCode = '86'
+
+    // console.log('ANRAN_REGION_DATA', ANRAN_REGION_DATA)
+    // console.log('store.state', store.state)
+    // console.log('store.state.regionInfo', store.state.regionInfo)
+
+    vueObj.$set(store.state.regionInfo.CodeToText, '', '全部')
+
+    // 计算省
+    for (const prop in ANRAN_REGION_DATA[rootCode]) {
+      store.state.regionInfo.regionData.push({
+        value: prop,
+        label: ANRAN_REGION_DATA[rootCode][prop]
+      })
+      store.state.regionInfo.CodeToText[prop] = ANRAN_REGION_DATA[rootCode][prop]
+      store.state.regionInfo.TextToCode[ANRAN_REGION_DATA[rootCode][prop]] = {
+        code: prop
+      }
+      store.state.regionInfo.TextToCode[ANRAN_REGION_DATA[rootCode][prop]]['全部'] = {
+        code: ''
+      }
+    }
+
+    // 计算市
+    for (let i = 0, len = store.state.regionInfo.regionData.length; i < len; i++) {
+      const provinceCode = store.state.regionInfo.regionData[i].value
+      const provinceText = store.state.regionInfo.regionData[i].label
+      const provinceChildren = []
+      for (const prop in ANRAN_REGION_DATA[provinceCode]) {
+        provinceChildren.push({
+          value: prop,
+          label: ANRAN_REGION_DATA[provinceCode][prop]
+        })
+        store.state.regionInfo.CodeToText[prop] = ANRAN_REGION_DATA[provinceCode][prop]
+        store.state.regionInfo.TextToCode[provinceText][ANRAN_REGION_DATA[provinceCode][prop]] = {
+          code: prop
+        }
+        store.state.regionInfo.TextToCode[provinceText][ANRAN_REGION_DATA[provinceCode][prop]]['全部'] = {
+          code: ''
+        }
+      }
+      if (provinceChildren.length) {
+        store.state.regionInfo.regionData[i].children = provinceChildren
+      }
+    }
+
+    store.state.regionInfo.provinceAndCityData = cloneArray(store.state.regionInfo.regionData)
+
+    // 计算区
+    for (let i = 0, len = store.state.regionInfo.regionData.length; i < len; i++) {
+      const province = store.state.regionInfo.regionData[i].children
+      const provinceText = store.state.regionInfo.regionData[i].label
+      if (province) {
+        for (let j = 0, len = province.length; j < len; j++) {
+          const cityCode = province[j].value
+          const cityText = province[j].label
+          const cityChildren = []
+          for (const prop in ANRAN_REGION_DATA[cityCode]) {
+            cityChildren.push({
+              value: prop,
+              label: ANRAN_REGION_DATA[cityCode][prop]
+            })
+            store.state.regionInfo.CodeToText[prop] = ANRAN_REGION_DATA[cityCode][prop]
+            store.state.regionInfo.TextToCode[provinceText][cityText][ANRAN_REGION_DATA[cityCode][prop]] = {
+              code: prop
+            }
+          }
+          if (cityChildren.length) {
+            province[j].children = cityChildren
+          }
+        }
+      }
+    }
+
+    // 添加“全部”选项
+    store.state.regionInfo.provinceAndCityDataPlus = cloneArray(store.state.regionInfo.provinceAndCityData)
+    store.state.regionInfo.provinceAndCityDataPlus.unshift({
+      value: '',
+      label: '全部'
+    })
+
+    store.state.regionInfo.regionDataPlus = cloneArray(store.state.regionInfo.regionData)
+    store.state.regionInfo.regionDataPlus.unshift({
+      value: '',
+      label: '全部'
+    })
+  })
+}
+
+
+//let ANRAN_REGION_DATA = AR_REGION_DATA
+const cloneArray = function (obj) {
+  const newArray = []
+  for (const i in obj) {
+    newArray[i] = typeof obj[i] === 'object' ? cloneArray(obj[i]) : obj[i]
+  }
+  return newArray
+}
+
+export default initRegion

+ 1 - 1
src/utils/request.js

@@ -77,7 +77,7 @@ service.interceptors.request.use(
 // response interceptor
 // response interceptor
 service.interceptors.response.use(
 service.interceptors.response.use(
   response => {
   response => {
-    console.log(response)
+    // console.log(response)
     const responseData = response.data
     const responseData = response.data
     const data = responseData.data
     const data = responseData.data
     if (responseData.success === false) {
     if (responseData.success === false) {

+ 0 - 1
src/views/dashboard/admin/components/BoxCard.vue

@@ -54,7 +54,6 @@ export default {
   computed: {
   computed: {
     ...mapGetters([
     ...mapGetters([
       'name',
       'name',
-      'avatar',
       'roles'
       'roles'
     ])
     ])
   }
   }

+ 3 - 3
src/views/finance/transfer-list.vue

@@ -150,15 +150,15 @@ import {
 	fetchApplyTransfer,
 	fetchApplyTransfer,
 	fetchBalance,
 	fetchBalance,
 	fetchChkTransferUser,
 	fetchChkTransferUser,
-	fetchFullInfo,
 	fetchTransferCode,
 	fetchTransferCode,
 	fetchTransferList
 	fetchTransferList
 } from '@/api/finance'
 } from '@/api/finance'
 import waves from '@/directive/waves'
 import waves from '@/directive/waves'
 import Pagination from '@/components/Pagination'
 import Pagination from '@/components/Pagination'
 import tool from "@/utils/tool"
 import tool from "@/utils/tool"
-import usersInfo from "@/utils/usersInfo";
-import {getScreenWidth} from "@/utils";
+import usersInfo from "@/utils/usersInfo"
+import {getScreenWidth} from "@/utils"
+import {fetchFullInfo} from "@/api/user"
 
 
 export default {
 export default {
 	name: 'Transfer',
 	name: 'Transfer',

+ 1 - 1
src/views/shop/ba-dec-order-list.vue

@@ -132,7 +132,7 @@ export default {
 			return tool.calculateTax(row.REAL_PRICE, row.BUY_NUMS)
 			return tool.calculateTax(row.REAL_PRICE, row.BUY_NUMS)
 		},
 		},
 		priceAmountFilter(row) {
 		priceAmountFilter(row) {
-			return tool.formatPrice(row.REAL_PRICE, row.BUY_NUMS)
+			return tool.formatPrice(row.REAL_PRICE * row.BUY_NUMS)
 		},
 		},
 		amountFilter(amount) {
 		amountFilter(amount) {
 			return formatAmount(amount)
 			return formatAmount(amount)

+ 661 - 0
src/views/user/brand-ambassador.vue

@@ -0,0 +1,661 @@
+<template>
+	<div v-loading="loading">
+		<div class="white-box" style="padding: 0 25px;">
+			<el-row :gutter="20">
+				<el-col :xs="24" :sm="14" :lg="14">
+					<el-form ref="form" label-width="180px" :label-position="labelPosition" class="form-page">
+						<el-divider content-position="left">{{ $t('user.accountInformation') }}</el-divider>
+						<el-form-item :label="$t('user.newMemberCode')">
+							<el-input v-model="form.insertUserName" readonly="readonly"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('user.sponsorCode')">
+							<el-input v-model="form.decUserName" readonly></el-input>
+						</el-form-item>
+
+						<el-form-item>
+							<template slot="label">
+								{{ $t('user.selectWelcomePack') }}
+							</template>
+							<el-tabs type="border-card" v-model="decWay" style="position: relative; width: 100%;">
+								<el-tab-pane :label="$t('shop.product')" name="2">
+									<el-table :data="tableData" :show-header="false" @selection-change="handleSelectionChange">
+										<el-table-column type="selection" width="50" align="center"></el-table-column>
+										<el-table-column align="center">
+											<template slot-scope="{row, $index}">
+												<el-container>
+													<el-aside width="80px" style="background-color: #ffffff; padding: 10px 0;">
+														<el-image style="width: 80px; height: 80px" :src="tool.getArImage(row.COVER, '/files/')"></el-image>
+													</el-aside>
+													<el-main style="padding: 0;">
+														<div style="text-align: left; line-height: 25px;">
+															<span style="font-weight: bold;" @click="handleProduct(row)">{{ row.GOODS_NAME }}</span><br />
+															<span>{{ row.GOODS_NO }}</span><br />
+															<span style="color: tomato;">{{ $t('shop.productPrice') }}:{{ $t('currency.sign') }} {{ row.SELL_PRICE }}</span><br />
+															<span>{{ $t('shop.productBV') }}:{{ $t('currency.sign') }} {{ row.PRICE_PV }}</span><br />
+															<span style="display: inline-block; float: right; ">
+																<el-input-number size="mini" v-model="storeNums[$index]" :min="1" :max="Number(row.STORE_NUMS)" @change="handleInputNumber($event, row)"></el-input-number>
+															</span>
+																<br />
+														</div>
+													</el-main>
+												</el-container>
+											</template>
+										</el-table-column>
+									</el-table>
+
+									<div class="white-box-footer">
+										<div class="flex data" style="float: right; display: inline-block; line-height: 35px; font-size: 14px; margin-top: 20px; border: 1px solid #dcdfe6; border-radius: 4px; padding: 0 15px;">
+											<div style="margin-right: 2rem; display: inline-block;">{{ $t('shop.productPrice') }}:{{ $t('currency.sign') }} {{ sellPriceSum }}</div>
+											<div style="margin-right: 2rem; display: inline-block;">{{ $t('shop.productBV') }}:{{ $t('currency.sign') }} {{ pricePvSum }}</div>
+											<div style="display: inline-block;">{{ $t('shop.taxAmount') }}:{{ $t('currency.sign') }} {{ taxSum }}</div>
+										</div>
+									</div>
+								</el-tab-pane>
+							</el-tabs>
+						</el-form-item>
+
+						<el-divider content-position="left">{{ $t('atlas.networkInformation') }}</el-divider>
+						<el-form-item :label="$t('shop.sponsorCode')">
+							<el-input v-model="form.recUserName" @change="handleChkRecUser">
+								<template slot="append">【{{recRealName}}】</template>
+							</el-input>
+						</el-form-item>
+
+						<el-divider content-position="left">{{ $t('profile.personalInformation') }}</el-divider>
+						<el-form-item :label="$t('shop.memberName')">
+							<el-input v-model="form.realName"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('shop.phoneNumber')">
+							<el-input v-model="form.mobile"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('user.email')">
+							<el-input v-model="form.email"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('profile.loginPassword')">
+							<el-input v-model="form.password" maxlength="32" :placeholder="$t('profile.enterLoginPassword')"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('profile.paymentPassword')">
+							<el-input v-model="form.payPassword" maxlength="32" :placeholder="$t('profile.enterPaymentPassword')"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('shop.recipientName')">
+							<el-input v-model="form.consignee"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('shop.phoneNumber')">
+							<el-input v-model="form.acceptMobile"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('shop.shipping')">
+							<el-radio-group v-model="form.way" @change="wayChange">
+								<el-radio label="express">{{ $t('shop.delivery') }}</el-radio>
+								<el-radio label="pickup">{{ $t('shop.selfPickUp') }}</el-radio>
+							</el-radio-group>
+						</el-form-item>
+						<el-form-item prop="areaSelected" :label="$t('config.state')">
+							<el-select v-model="form.areaSelected" class="filter-item" style="width: 100%;">
+								<el-option v-for="item in regionData" :key="item.id" :label="item.address" :value="item.id" />
+							</el-select>
+						</el-form-item>
+						<el-form-item :label="$t('config.detailedAddress')">
+							<el-input :disabled="addressDisabled" v-model="form.address"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('config.city')">
+							<el-input :disabled="addressDisabled" v-model="form.cityName"></el-input>
+						</el-form-item>
+						<el-form-item :label="$t('config.localGovernmentArea')">
+							<el-input :disabled="addressDisabled" v-model="form.lgaName"></el-input>
+						</el-form-item>
+
+						<el-divider content-position="left">{{ $t('user.payInfo') }}</el-divider>
+						<el-form-item :label="$t('shop.paymentMethod')" required>
+							<el-radio-group v-model="form.payType" @change="chosePayType">
+								<el-radio border v-for="(item, index) in payList" :key='index' :label="item.label">
+									{{ item.name }}<span v-if="item.label === 'cash'" style="color: tomato;">({{ $t('currency.sign') }} {{ userBalance.cash }})</span>
+								</el-radio>
+							</el-radio-group>
+						</el-form-item>
+
+						<el-form-item>
+							<el-button size="small" type="primary" @click="onSubmit" :loading="submitButtonStat">{{ $t('common.save') }}</el-button>
+						</el-form-item>
+					</el-form>
+				</el-col>
+			</el-row>
+		</div>
+
+		<!-- payStack模态框 -->
+		<el-dialog :title="$t('shop.goPay')" :visible.sync="visible" :width="payStackScreenWidth" v-loading="payStackLoading" :before-close="handleClose">
+			<section>
+				<el-form :model="payForm">
+					<el-form-item :label="$t('user.email')" label-width="100px" required>
+						<el-input v-model="payForm.email" autocomplete="off"></el-input>
+					</el-form-item>
+					<el-form-item :label="$t('shop.amount')" label-width="100px" required>
+						<el-input v-model="payForm.amount" autocomplete="off" readonly></el-input>
+					</el-form-item>
+				</el-form>
+			</section>
+			<paystack
+				:firstname="payForm.firstname"
+				:lastname="payForm.lastname"
+				:amount="payForm.amount * 100"
+				:email="payForm.email"
+				:metadata="payForm.metadata"
+				:currency="payForm.currency"
+				:paystackkey="payForm.publicKey"
+				:reference="reference"
+				:channels="channels"
+				:callback="processPayment"
+				:close="handleClose"
+			>
+				<el-button type="primary" size="small">{{ $t('shop.goPay') }}</el-button>
+			</paystack>
+			<el-button type="danger" size="small" class="cancelButton" @click="handleClose" style="margin-left: 10px;">{{ $t('common.cancel') }}</el-button>
+		</el-dialog>
+
+		<!-- 倒计时页面 -->
+		<el-dialog :title="$t('common.hint')" :visible.sync="payDialog" :width="payStackScreenWidth" :show-close="false" :close="handleOrderList">
+			<el-card shadow="always">
+				<el-result icon="success" :title="$t('common.successfully')" :subTitle="$t('shop.successOrderTips')">
+					<template slot="extra">
+						<el-button type="primary" size="medium" @click="handleOrderList">{{ $t('shop.goBack') }}({{ countdown }})</el-button>
+					</template>
+				</el-result>
+			</el-card>
+		</el-dialog>
+
+		<!-- 商品详情 -->
+		<el-dialog :title="product.GOODS_NO" :visible.sync="visibleProduct" :width="screenWidth" style="margin-top: -95px;">
+			<el-row :gutter="20">
+				<el-col :xs="24" :sm="12" :lg="12">
+					<el-image style="width: 100%; height: 100%" :style="imageStyle" :src="tool.getArImage(product.COVER, '/files/')"></el-image>
+				</el-col>
+				<el-col :xs="24" :sm="12" :lg="12">
+					<div style="text-align: left; line-height: 50px; font-size: 16px;">
+						<span style="font-weight: bold; font-size: 20px;">{{ product.GOODS_NAME }}</span><br />
+						<span style="font-weight: bold; font-size: 15px;">{{ $t('shop.productCode') }}:{{ product.GOODS_NO }}</span><br />
+						<span style="color: tomato;">{{ $t('shop.productPrice') }}:{{ $t('currency.sign') }} {{ product.SELL_PRICE }}</span><br />
+						<span>{{ $t('shop.productBV') }}:{{ product.PRICE_PV }}</span><br />
+						<span>{{ $t('shop.taxRate') }}:{{ product.TAX_RATE / 100 }}</span><br />
+						<span>{{ $t('shop.taxAmount') }}:{{ $t('currency.sign') }} {{ product.taxAmount }}</span><br />
+						<span>{{ $t('shop.inventory') }}:{{ product.STORE_NUMS }}</span>
+					</div>
+				</el-col>
+			</el-row>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+import {fetchBrandAmbassador, createBrandAmbassador, fetchFullInfo} from '@/api/user'
+import waves from '@/directive/waves'
+import {formatAmount, getScreenWidth} from "@/utils"
+import Pagination from '@/components/Pagination'
+import paystack from 'vue-paystack'
+import tool from "@/utils/tool"
+import usersInfo from "@/utils/usersInfo"
+import {deleteApproachOrder} from "@/api/shop"
+import {mapGetters} from "vuex"
+
+export default {
+  name: 'brandAmbassador',
+  components: { Pagination, paystack },
+  directives: { waves },
+	filters: {
+		bvFilter(row) {
+			return tool.calculateBV(row.REAL_PV, row.BUY_NUMS)
+		},
+		taxAmountFilter(row) {
+			return tool.calculateTax(row.REAL_PRICE, row.BUY_NUMS)
+		},
+		priceAmountFilter(row) {
+			return tool.formatPrice(row.REAL_PRICE, row.BUY_NUMS)
+		},
+		amountFilter(amount) {
+			return formatAmount(amount)
+		},
+		statusFilter(status) {
+			const statusMap = {
+				Unpaid: 'info',
+				Paid: 'success'
+			}
+			return statusMap[status]
+		}
+	},
+	computed: {
+		...mapGetters([
+			'regionInfo',
+		]),
+		// PayStack混淆串
+		reference() {
+			let text = ''
+			let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
+			for (let i = 0; i < 10; i++) {
+				text += possible.charAt(Math.floor(Math.random() * possible.length))
+			}
+			return text
+		}
+	},
+  data() {
+    return {
+			loading: false,
+			tool: tool,
+
+			allGoods: [],
+			numList: [],
+			categoryType: '',
+			sellType: [],
+			payList: [],
+			screenWidth: getScreenWidth() > 600 ? '500px' : getScreenWidth() + 'px',
+			labelPosition: getScreenWidth() > 600 ? 'right' : 'top',
+			payStackScreenWidth: getScreenWidth() > 500 ? '450px' : getScreenWidth() + 'px',
+
+			dialog: false,
+			dialogLoading: false,
+
+			multipleSelection: [],
+			sellPriceSum: 0.00,
+			pricePvSum: 0.00,
+			taxSum: 0.00,
+			storeNums: [],
+			tableData: null,
+			payAmount: 0.00,
+
+			cashCurrency: '',
+			currency: {},
+			pointsSum: '',
+			cashSum: '',
+			pointFreight: '',
+			freeShipping: '',
+			goodsId: '',
+			goodsNum: '',
+			payPassword: '',
+			submitButtonStat: false,
+			sn: '',
+			orderType: '',
+			payDialog: false,
+			countdown: 5,
+			visible: false,
+			totalAmount: 0.00,
+			freight: 0.00,
+			userBalance: {},
+
+			payType: 'cash',
+			payStackLoading: false,
+			channels: ["card", "bank", "ussd", "qr"],
+			payForm: {
+				publicKey: process.env.VUE_APP_BASE_PAY_STACK_PUBLIC_KEY,
+				currency: 'NGN',
+				firstname: usersInfo.userName(),
+				lastname: '',
+				email: usersInfo.userEmail(),
+				amount: 0,
+				orderSn: '',
+				metadata: {
+					cart_id: '',
+					custom_fields: [
+						{
+							display_name: 'orderSn',
+							variable_name: 'orderSn',
+							value: this.sn,
+						},
+						{
+							display_name: 'orderType',
+							variable_name: 'orderType',
+							value: 'userOrder'
+						},
+					]
+				},
+			},
+
+			addressId: '',
+			selfPickUpAddressId: '100000000000000000',
+			shippingAddressList: [],
+
+			visibleProduct: false,
+			product: {
+				GOODS_NAME: '',
+				GOODS_NO: '',
+				COVER: '',
+				SELL_PRICE: '',
+				PRICE_PV: '',
+				TAX_RATE: '',
+				taxAmount: '',
+			},
+			imageStyle: 'margin-top: -50px;',
+
+			decWay: '2',
+			// TODO: 地区需处理
+			regionData: [
+				{
+					id: '10600',
+					address: 'test1',
+				},
+				{
+					id: '10601',
+					address: 'test2',
+				},
+			],
+			form: {
+				realName: '',
+				decLv: '',
+				insertUserName: '',
+				decUserName: usersInfo.userName(),
+				recUserName: '',
+				conUserName: '',
+				insertUserIdCard: '',
+				consignee: '',
+				acceptMobile: '',
+				areaSelected: [],
+				address: '',
+				openBank: '',
+				bankAddress: '',
+				bankProvince: '',
+				bankCity: '',
+				bankCounty: '',
+				bankNo: '',
+				bankAreaSelected: [],
+				password: '111111',
+				payPassword: '111111',
+				mobile: '',
+				email: '',
+				packageId: '',
+				goodsId: [],
+				goodsNum: [],
+				province: '',
+				cityName: '',
+				lgaName: '',
+				way: 'express',
+				payType: '',
+				autoPlace: '',
+				location: ''
+			},
+
+			conRealName: '-',
+			recRealName: '-',
+			areaDisabled: false,
+			addressDisabled: false,
+    }
+  },
+  created() {
+			let regionInfo = this.$store.getters.regionInfo
+		// console.log(this.$store.state.region)
+    this.fetchBrandAmbassador()
+  },
+	mounted() {
+	},
+  methods: {
+		fetchBrandAmbassador() {
+			this.loading = true
+			fetchBrandAmbassador().then(response => {
+				this.form.insertUserName = response.data.userName
+				this.allGoods = response.data.allGoods
+				this.userBalance = response.data.userBalance
+				this.currency = response.data.payList
+				this.categoryType = 1
+
+				let settingObj = this.allGoods
+				for (let i in this.allGoods) {
+					this.storeNums[i] = 1
+					settingObj[i].goodsNum = 0
+				}
+
+				this.tableData = Object.values(settingObj)
+				let pageList = this.multipleSelection
+				this.$nextTick(function () {
+					for (let i in this.tableData) {
+						for( let j in  pageList) {
+							if( pageList[j].ID === this.tableData[i].ID ) {
+								this.$data.storeNums[i] = pageList[j].goodsNum
+								this.tableData[i].goodsNum = pageList[j].goodsNum
+								break
+							}
+						}
+					}
+				})
+
+				// 支付方式
+				this.payList = response.data.sellType[0]['sell_type']
+				// 支付方式的第一项默认选中
+				this.form.payType = Object.values(this.payList)[1]['label']
+
+        setTimeout(() => {
+          this.loading = false
+        }, 0.5 * 1000)
+      })
+    },
+		// 商品详情
+		handleProduct(row) {
+			this.product = row
+			this.product.taxAmount = tool.calculateTax(row.SELL_PRICE, row.TAX_RATE)
+			this.visibleProduct = true
+		},
+		// 选择商品计数
+		handleInputNumber(current, row){
+			let pageList = this.multipleSelection
+			let selectStatus = false
+			for (let i in pageList) {
+				if (pageList[i].ID === row.ID) {
+					pageList[i].goodsNum = current
+					selectStatus = true
+					break
+				}
+			}
+			if (selectStatus) {
+				this.multipleSelection = pageList
+				this.handleSureChange()
+			}
+		},
+		// 统计商品
+		handleSureChange() {
+			if (this.multipleSelection.length > 0) {
+				let accumulatorSellPrice = 0, accumulatorPricePv = 0, accumulatorTax = 0
+				this.multipleSelection.forEach(accumulator => {
+					accumulatorSellPrice += accumulator.SELL_PRICE * accumulator.goodsNum;
+					accumulatorPricePv += Number(accumulator.PRICE_PV) * Number(accumulator.goodsNum);
+					accumulatorTax += tool.calculateTax(Number(accumulator.SELL_PRICE), Number(accumulator.TAX_RATE), Number(accumulator.goodsNum));
+				})
+
+				this.sellPriceSum = tool.formatPrice(accumulatorSellPrice)
+				this.pricePvSum = tool.formatPrice(accumulatorPricePv)
+				this.taxSum = tool.formatPrice(accumulatorTax)
+
+				this.display = true
+			} else {
+				this.sellPriceSum = this.pricePvSum = this.taxSum = 0.00
+				this.display = true
+			}
+		},
+		// 选择商品
+		handleSelectionChange(val) {
+			let idx = -1, num
+			for (let i in this.tableData) {
+				for (let v in val){
+					if (val[v].ID === this.tableData[i].ID) {
+						idx = i
+						num = this.storeNums[idx]
+						val[v]['goodsNum'] = num
+						break
+					}
+				}
+			}
+			this.multipleSelection = val
+			// 计算统计
+			this.handleSureChange()
+		},
+		// 选择收货地址
+		choseAddress (addressId) {
+			this.addressId = addressId
+			// 设置运费
+			this.setFreight()
+			// 计算价格
+			this.getSumMoney()
+		},
+		// 切换支付方式
+		chosePayType(type) {
+			this.payType = type
+		},
+		// 关闭支付回调
+		handleClose() {
+			this.$confirm(this.$t('shop.confirmClose')).then(_ => {
+				deleteApproachOrder({ orderSn: this.form.orderSn }).then(() => {
+					// 关闭支付模态框
+					this.visible = false
+					// 关闭购物车
+					this.visibleShoppingCart = false
+					this.submitButtonStat = false
+				})
+			})
+		},
+		// 支付成功回调
+		processPayment() {
+			// 关闭支付页面
+			this.visible = false
+			this.payStackLoading = false
+			// 显示支付成功模态框
+			this.payDialog = true;
+			// 启动支付成功倒计时
+			this.handleCountdown()
+		},
+		// 倒计时结束跳转
+		handleOrderList () {
+			this.$router.push({path: `/shop/ba-dec-order-list`})
+		},
+		// 启动倒计时
+		handleCountdown () {
+			// 创建定时器
+			setInterval(() => {
+				// 每隔1秒把time的值减一,赋值给span标签
+				this.countdown--
+				if (this.countdown === 0) {
+					// 倒计时结束,跳转到订单列表
+					this.$router.push({path: `/shop/order-list`});
+				}
+			}, 1000)
+		},
+		// 会员查询
+		handleChkRecUser () {
+			this.form.conUserName = ''
+			this.conRealName = '-'
+			this.form.autoPlace = ''
+			if (this.form.recUserName) {
+				this.loading = true
+				fetchFullInfo({ userName: this.form.recUserName }).then(response => {
+					this.recRealName = response.data.REAL_NAME
+					this.loading = false
+				}).catch(() => {
+					this.recRealName = '-'
+					this.loading = false
+				})
+			}
+		},
+		// 返回方式
+		wayChange () {
+			if (this.form.way === 'pickup') {
+				this.areaDisabled = true
+				this.addressDisabled = true
+			} else {
+				this.areaDisabled = false
+				this.addressDisabled = false
+			}
+		},
+		// 创建BA会员
+		onSubmit () {
+			// 已选择商品
+			this.selectProduct()
+			if (this.multipleSelection.length <= 0) {
+				this.$message.error(this.$t('shop.chooseTips'))
+				return false
+			}
+			// 余额
+			let amountBalance = this.userBalance[this.form.payType] || 0
+			// 账户类型提示信息
+			let accountType = this.currency[this.form.payType].name || ''
+			// 余额是否充足
+			if ((this.form.payType === 'cash') && ((amountBalance - this.payAmount) < 0)) {
+				this.$message({
+					message: accountType + this.$t('shop.balanceNotAllow'),
+					type: 'error'
+				})
+				return false
+			}
+
+			this.submitButtonStat = true
+
+			let params = {
+				consignee: this.form.consignee,
+				acceptMobile: this.form.acceptMobile,
+				province: this.form.areaSelected[0] ? this.form.areaSelected[0] : '',
+				city: this.form.areaSelected[1] ? this.form.areaSelected[1] : '',
+				county: this.form.areaSelected[2] ? this.form.areaSelected[2] : '',
+				address: this.form.address,
+				insertUserName: this.form.insertUserName,
+				decLv: this.form.decLv,
+				realName: this.form.realName,
+				decUserName: this.form.decUserName,
+				conUserName: this.form.conUserName,
+				recUserName: this.form.recUserName,
+				insertUserIdCard: this.form.insertUserIdCard,
+				openBank: this.form.openBank,
+				bankAddress: this.form.bankAddress,
+				mobile: this.form.mobile,
+				email: this.form.email,
+				cityName: this.form.cityName,
+				lgaName: this.form.lgaName,
+
+				bankProvince: this.form.bankAreaSelected[0] ? this.form.bankAreaSelected[0] : '',
+				bankCity: this.form.bankAreaSelected[1] ? this.form.bankAreaSelected[1] : '',
+				bankCounty: this.form.bankAreaSelected[2] ? this.form.bankAreaSelected[2] : '',
+
+				bankNo: this.form.bankNo,
+				password: this.form.password,
+				payPassword: this.form.payPassword,
+				packageId: this.form.packageId,
+				goodsId: this.form.goodsId,
+				goodsNum: this.form.goodsNum,
+				location: this.form.location,
+				decWay: this.decWay,
+				payType: this.form.payType
+			}
+			createBrandAmbassador(params).then(response => {
+				if (this.form.payType !== 'pay_stack') {
+					// 余额支付
+					this.$message({
+						message: this.$t('common.successfully'),
+						type: 'success'
+					})
+					this.submitButtonStat = false
+					this.$router.push({path: `/shop/ba-dec-order-list`})
+				} else {
+					// PayStack支付
+					this.submitButtonStat = false
+					this.payForm.orderSn = response.data.SN
+					this.payForm.amount = response.data.ORDER_AMOUNT
+					this.payForm.metadata.custom_fields[0].value = response.data.SN
+					this.visible = true
+				}
+			})
+		},
+		// 已选择商品
+		selectProduct() {
+			this.payAmount = 0
+			this.form.goodsId = []
+			this.form.goodsNum = []
+			this.multipleSelection.map((item) => {
+				this.form.goodsId.push(item.ID)
+				this.form.goodsNum.push(item.goodsNum)
+				this.payAmount += item.goodsNum * item.SELL_PRICE
+			})
+		},
+  }
+}
+</script>
+
+<style>
+.el-table th.el-table__cell > .cell {
+	white-space: nowrap;
+}
+
+.el-table td.el-table__cell > .cell {
+	word-break: keep-all;
+	white-space: pre-wrap;
+}
+</style>