welcome-pack.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791
  1. <template>
  2. <div v-loading="loading">
  3. <div class="white-box" style="padding: 0 25px; margin-top: 25px;">
  4. <el-row :gutter="20">
  5. <el-col :xs="24" :sm="24" :lg="14">
  6. <el-form ref="form" label-width="180px" :label-position="labelPosition" class="form-page">
  7. <el-form-item :label="$t('user.welcomePackWay')">
  8. <el-radio-group v-model="form.decType" @change="decTypeChange">
  9. <el-radio size="small" label="normal">{{ $t('user.normal') }}</el-radio>
  10. <el-radio size="small" label="ba">{{ $t('user.BAUpgrade') }}</el-radio>
  11. </el-radio-group>
  12. </el-form-item>
  13. <el-divider content-position="left">{{ $t('user.accountInformation') }}</el-divider>
  14. <el-form-item :label="$t('user.newMemberCode')">
  15. <el-input v-model.trim="form.insertUserName" @blur="checkBaUser" :readonly="userReadOnly"></el-input>
  16. </el-form-item>
  17. <el-form-item :label="$t('user.entryLevel')">
  18. <el-select v-model="form.decLv" :placeholder="$t('user.selectEntryLevel')" style="width: 100%;">
  19. <el-option v-for="item in allDecLevel" :key="item.ID" :label="item.LEVEL_NAME" :value="item.ID"></el-option>
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item :label="$t('user.stockistCode')">
  23. <el-input v-model.trim="form.decUserName" readonly></el-input>
  24. </el-form-item>
  25. <el-form-item>
  26. <template slot="label">
  27. {{ $t('user.selectWelcomePack') }}
  28. </template>
  29. <el-tabs type="border-card" v-model="decWay" style="position: relative; width: 100%;">
  30. <el-tab-pane :label="$t('shop.product')" name="2">
  31. <el-collapse accordion v-model="activeName">
  32. <el-collapse-item name="product">
  33. <el-table :data="tableData" :show-header="false" @selection-change="handleSelectionChange">
  34. <el-table-column type="selection" width="30" align="center" style="top: -30px;"></el-table-column>
  35. <el-table-column align="center">
  36. <template slot-scope="{row, $index}">
  37. <el-container>
  38. <el-aside width="80px" style=" padding: 0; margin-bottom: 0; background-color: #ffffff;">
  39. <el-image style="width: 80px; height: 80px" :src="tool.getArImage(row.COVER, '/files/')"></el-image>
  40. </el-aside>
  41. <el-main style="padding: 0;">
  42. <div style="text-align: left; line-height: 25px;">
  43. <span style="font-weight: bold; cursor: pointer;" @click="handleProduct(row)">{{ row.GOODS_NAME }}</span><br />
  44. <span>{{ row.GOODS_NO }}</span><br />
  45. <span style="color: tomato;">{{ $t('shop.productPrice') }}:{{ $t('currency.sign') }} {{ row.SELL_PRICE | amountFilter }}</span><br />
  46. <span>{{ $t('shop.productBV') }}:{{ row.PRICE_PV | amountFilter }}</span><br />
  47. <span style="display: inline-block; float: right; ">
  48. <el-input-number size="mini" v-model="storeNums[$index]" :min="1" :max="Number(row.STORE_NUMS)" @change="handleInputNumber($event, row)"></el-input-number>
  49. </span>
  50. <br />
  51. </div>
  52. </el-main>
  53. </el-container>
  54. </template>
  55. </el-table-column>
  56. </el-table>
  57. </el-collapse-item>
  58. </el-collapse>
  59. <div class="white-box-footer">
  60. <div class="flex data" style="float: right; display: inline-block; line-height: 30px; font-size: 14px; margin-top: 15px; margin-bottom: 10px; border: 1px solid #dcdfe6; border-radius: 4px; padding: 0 5px;">
  61. <div style="margin-right: 1rem; display: inline-block;">{{ $t('shop.productPrice') }}:{{ $t('currency.sign') }} {{ sellPriceSum | amountFilter }}</div>
  62. <div style="margin-right: 1rem; display: inline-block;">{{ $t('shop.productBV') }}:{{ pricePvSum | amountFilter }}</div>
  63. <div style="display: inline-block;">{{ $t('shop.taxAmount') }}:{{ $t('currency.sign') }} {{ taxSum }}</div>
  64. </div>
  65. </div>
  66. </el-tab-pane>
  67. </el-tabs>
  68. </el-form-item>
  69. <el-divider content-position="left">{{ $t('atlas.networkInformation') }}</el-divider>
  70. <el-form-item :label="$t('shop.sponsorCode')">
  71. <el-input v-model.trim="form.recUserName" @change="handleChkRecUser" :readonly="recReadOnly"></el-input>
  72. </el-form-item>
  73. <el-form-item>
  74. <el-input v-model="recRealName" :disabled="true"></el-input>
  75. </el-form-item>
  76. <el-form-item :label="$t('atlas.placementCode')">
  77. <el-input v-model.trim="form.conUserName" @change="handleChkConUser"></el-input>
  78. </el-form-item>
  79. <el-form-item>
  80. <el-input v-model="conRealName" :disabled="true"></el-input>
  81. </el-form-item>
  82. <el-form-item :label="$t('atlas.placementTree')">
  83. <el-radio-group border v-model="form.location">
  84. <el-radio :label="1">{{ $t('atlas.left') }}</el-radio>
  85. <el-radio :label="2">{{ $t('atlas.right') }}</el-radio>
  86. </el-radio-group>
  87. </el-form-item>
  88. <el-form-item><!--自动安置区位-->
  89. <el-row :gutter="5">
  90. <el-col :xs="24" :sm="24" :lg="12">
  91. <el-button size="small" type="primary" @click="setAutoPlace('left')">{{ $t('atlas.placementAutoLeft') }}</el-button>
  92. </el-col>
  93. <el-col :xs="24" :sm="24" :lg="12">
  94. <el-button size="small" type="primary" @click="setAutoPlace('right')">{{ $t('atlas.placementAutoRight') }}</el-button>
  95. </el-col>
  96. </el-row>
  97. </el-form-item>
  98. <el-divider content-position="left">{{ $t('profile.personalInformation') }}</el-divider>
  99. <el-form-item :label="$t('shop.memberName')">
  100. <el-input v-model.trim="form.realName"></el-input>
  101. </el-form-item>
  102. <el-form-item :label="$t('shop.phoneNumber')">
  103. <el-input v-model.trim="form.mobile"></el-input>
  104. </el-form-item>
  105. <el-form-item :label="$t('user.email')">
  106. <el-input v-model.trim="form.email"></el-input>
  107. </el-form-item>
  108. <el-form-item :label="$t('profile.loginPassword')">
  109. <el-input v-model.trim="form.password" maxlength="32" :placeholder="$t('profile.enterLoginPassword')"></el-input>
  110. </el-form-item>
  111. <el-form-item :label="$t('profile.paymentPassword')">
  112. <el-input v-model.trim="form.payPassword" maxlength="32" :placeholder="$t('profile.enterPaymentPassword')"></el-input>
  113. </el-form-item>
  114. <el-form-item :label="$t('shop.recipientName')">
  115. <el-input v-model.trim="form.consignee"></el-input>
  116. </el-form-item>
  117. <el-form-item :label="$t('shop.phoneNumber')">
  118. <el-input v-model.trim="form.acceptMobile"></el-input>
  119. </el-form-item>
  120. <el-form-item :label="$t('shop.shipping')">
  121. <el-radio-group v-model="form.way" @change="wayChange">
  122. <el-radio label="express">{{ $t('shop.delivery') }}</el-radio>
  123. <el-radio label="pickup">{{ $t('shop.selfPickUp') }}</el-radio>
  124. </el-radio-group>
  125. </el-form-item>
  126. <el-form-item prop="areaSelected" :label="$t('config.state')">
  127. <el-cascader :disabled="areaDisabled" size="large" :placeholder="$t('shop.delivery')" :options="regionData" v-model="form.areaSelected" style="width: 100%;"></el-cascader>
  128. </el-form-item>
  129. <el-form-item :label="$t('config.detailedAddress')">
  130. <el-input :disabled="addressDisabled" v-model.trim="form.address"></el-input>
  131. </el-form-item>
  132. <el-form-item :label="$t('config.city')">
  133. <el-input :disabled="addressDisabled" v-model.trim="form.cityName"></el-input>
  134. </el-form-item>
  135. <el-form-item :label="$t('config.localGovernmentArea')">
  136. <el-input :disabled="addressDisabled" v-model.trim="form.lgaName"></el-input>
  137. </el-form-item>
  138. <el-divider content-position="left">{{ $t('finance.bankInformation') }}</el-divider>
  139. <el-form-item :label="$t('finance.bankName')">
  140. <el-select v-model="form.openBank" :placeholder="$t('finance.selectBank')" style="width: 100%;">
  141. <el-option v-for="(item,index) in allOpenBank" :key="index" :label="item.BANK_NAME" :value="item.BANK_CODE"></el-option>
  142. </el-select>
  143. </el-form-item>
  144. <el-form-item :label="$t('finance.accountName')">
  145. <el-input v-model.trim="form.bankAddress"></el-input>
  146. </el-form-item>
  147. <el-form-item :label="$t('finance.bankAccount')">
  148. <el-input v-model.number="form.bankNo" maxlength="19"></el-input>
  149. </el-form-item>
  150. <el-divider content-position="left">{{ $t('user.payInfo') }}</el-divider>
  151. <el-form-item :label="$t('shop.paymentMethod')" required>
  152. <el-radio-group v-model="form.payType" @change="chosePayType">
  153. <el-radio border v-for="(item, index) in payList" :key='index' :label="item.label" style="margin: 5px;">
  154. {{ item.name }}<span v-if="item.label === 'cash'" style="color: tomato;">({{ $t('currency.sign') }} {{ userBalance.cash }})</span>
  155. </el-radio>
  156. </el-radio-group>
  157. </el-form-item>
  158. <el-form-item>
  159. <el-button size="small" type="primary" @click="onSubmit" :loading="submitButtonStat">{{ $t('common.save') }}</el-button>
  160. </el-form-item>
  161. </el-form>
  162. </el-col>
  163. </el-row>
  164. </div>
  165. <!-- payStack模态框 -->
  166. <el-dialog :title="$t('shop.goPay')" :visible.sync="visible" :width="payStackScreenWidth" v-loading="payStackLoading" :before-close="handleClose">
  167. <section>
  168. <el-form :model="payForm">
  169. <el-form-item :label="$t('user.email')" label-width="100px" required>
  170. <el-input v-model="payForm.email" autocomplete="off"></el-input>
  171. </el-form-item>
  172. <el-form-item :label="$t('shop.amount')" label-width="100px" required>
  173. <el-input v-model="payForm.amount" autocomplete="off" readonly></el-input>
  174. </el-form-item>
  175. </el-form>
  176. </section>
  177. <paystack
  178. :firstname="payForm.firstname"
  179. :lastname="payForm.lastname"
  180. :amount="payForm.amount * 100"
  181. :email="payForm.email"
  182. :metadata="payForm.metadata"
  183. :currency="payForm.currency"
  184. :paystackkey="payForm.publicKey"
  185. :reference="reference"
  186. :channels="channels"
  187. :callback="processPayment"
  188. :close="handleClose"
  189. >
  190. <el-button type="primary" size="small">{{ $t('shop.goPay') }}</el-button>
  191. </paystack>
  192. <el-button type="danger" size="small" class="cancelButton" @click="handleClose" style="margin-left: 10px;">{{ $t('common.cancel') }}</el-button>
  193. </el-dialog>
  194. <!-- 倒计时页面 -->
  195. <el-dialog :title="$t('common.hint')" :visible.sync="payDialog" :width="payStackScreenWidth" :show-close="false" :close="handleOrderList">
  196. <el-card shadow="always">
  197. <el-result icon="success" :title="$t('common.successfully')" :subTitle="$t('shop.successOrderTips')">
  198. <template slot="extra">
  199. <el-button type="primary" size="medium" @click="handleOrderList">{{ $t('shop.goBack') }}({{ countdown }})</el-button>
  200. </template>
  201. </el-result>
  202. </el-card>
  203. </el-dialog>
  204. <!-- 商品详情 -->
  205. <el-dialog :title="product.GOODS_NO" :visible.sync="visibleProduct" :width="screenWidth" style="margin-top: -95px;">
  206. <el-row :gutter="20">
  207. <el-col :xs="24" :sm="12" :lg="12">
  208. <el-image style="width: 100%; height: 100%" :style="imageStyle" :src="tool.getArImage(product.COVER, '/files/')"></el-image>
  209. </el-col>
  210. <el-col :xs="24" :sm="12" :lg="12">
  211. <div style="text-align: left; line-height: 50px; font-size: 16px;">
  212. <span style="font-weight: bold; font-size: 20px;">{{ product.GOODS_NAME }}</span><br />
  213. <span style="font-weight: bold; font-size: 15px;">{{ $t('shop.productCode') }}:{{ product.GOODS_NO }}</span><br />
  214. <span style="color: tomato;">{{ $t('shop.productPrice') }}:{{ $t('currency.sign') }} {{ product.SELL_PRICE }}</span><br />
  215. <span>{{ $t('shop.productBV') }}:{{ product.PRICE_PV }}</span><br />
  216. <span>{{ $t('shop.taxRate') }}:{{ product.TAX_RATE / 100 }}</span><br />
  217. <span>{{ $t('shop.taxAmount') }}:{{ $t('currency.sign') }} {{ product.taxAmount }}</span><br />
  218. <span>{{ $t('shop.inventory') }}:{{ product.STORE_NUMS }}</span>
  219. </div>
  220. </el-col>
  221. </el-row>
  222. </el-dialog>
  223. </div>
  224. </template>
  225. <script>
  226. import {fetchFullInfo, fetchBrandAmbassadorInfo, fetchAutoPlace, fetchWelcomePack, createWelcomePack} from '@/api/user'
  227. import waves from '@/directive/waves'
  228. import {formatAmount, getScreenWidth} from "@/utils"
  229. import Pagination from '@/components/Pagination'
  230. import paystack from 'vue-paystack'
  231. import tool from "@/utils/tool"
  232. import usersInfo from "@/utils/usersInfo"
  233. import {deleteApproachOrder} from "@/api/shop"
  234. import region from "@/store/modules/region"
  235. export default {
  236. name: 'welcomePack',
  237. components: { Pagination, paystack },
  238. directives: { waves },
  239. filters: {
  240. bvFilter(row) {
  241. return tool.calculateBV(row.REAL_PV, row.BUY_NUMS)
  242. },
  243. taxAmountFilter(row) {
  244. return tool.calculateTax(row.REAL_PRICE, row.BUY_NUMS)
  245. },
  246. priceAmountFilter(row) {
  247. return tool.formatPrice(row.REAL_PRICE * row.BUY_NUMS)
  248. },
  249. amountFilter(amount) {
  250. return formatAmount(amount)
  251. },
  252. statusFilter(status) {
  253. const statusMap = {
  254. Unpaid: 'info',
  255. Paid: 'success'
  256. }
  257. return statusMap[status]
  258. }
  259. },
  260. computed: {
  261. // PayStack混淆串
  262. reference() {
  263. let text = ''
  264. let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
  265. for (let i = 0; i < 10; i++) {
  266. text += possible.charAt(Math.floor(Math.random() * possible.length))
  267. }
  268. return text
  269. }
  270. },
  271. data() {
  272. return {
  273. loading: false,
  274. tool: tool,
  275. allGoods: [],
  276. numList: [],
  277. categoryType: '',
  278. sellType: [],
  279. payList: [],
  280. screenWidth: getScreenWidth() > 600 ? '500px' : getScreenWidth() + 'px',
  281. labelPosition: getScreenWidth() > 600 ? 'right' : 'top',
  282. payStackScreenWidth: getScreenWidth() > 500 ? '450px' : getScreenWidth() + 'px',
  283. dialog: false,
  284. dialogLoading: false,
  285. multipleSelection: [],
  286. sellPriceSum: 0.00,
  287. pricePvSum: 0.00,
  288. taxSum: 0.00,
  289. storeNums: [],
  290. tableData: null,
  291. payAmount: 0.00,
  292. cashCurrency: '',
  293. currency: {},
  294. pointsSum: 0,
  295. cashSum: 0,
  296. pointFreight: 0,
  297. freeShipping: '',
  298. goodsId: '',
  299. goodsNum: '',
  300. payPassword: '',
  301. submitButtonStat: false,
  302. sn: '',
  303. orderType: '',
  304. payDialog: false,
  305. countdown: 5,
  306. visible: false,
  307. totalAmount: 0.00,
  308. freight: 0.00,
  309. userBalance: {
  310. cash: 0,
  311. },
  312. payType: 'cash',
  313. payStackLoading: false,
  314. channels: ["card", "bank", "ussd", "qr"],
  315. payForm: {
  316. publicKey: process.env.VUE_APP_BASE_PAY_STACK_PUBLIC_KEY,
  317. currency: 'NGN',
  318. firstname: usersInfo.userName(),
  319. lastname: '',
  320. email: usersInfo.userEmail(),
  321. amount: 0,
  322. orderSn: '',
  323. metadata: {
  324. cart_id: '',
  325. custom_fields: [
  326. {
  327. display_name: 'orderSn',
  328. variable_name: 'orderSn',
  329. value: this.sn,
  330. },
  331. {
  332. display_name: 'orderType',
  333. variable_name: 'orderType',
  334. value: 'baDec'
  335. },
  336. ]
  337. },
  338. },
  339. addressId: '',
  340. selfPickUpAddressId: '100000000000000000',
  341. shippingAddressList: [],
  342. visibleProduct: false,
  343. product: {
  344. GOODS_NAME: '',
  345. GOODS_NO: '',
  346. COVER: '',
  347. SELL_PRICE: 0,
  348. PRICE_PV: 0,
  349. TAX_RATE: 0,
  350. taxAmount: 0,
  351. },
  352. imageStyle: 'margin-top: -50px;',
  353. decWay: '2',
  354. regionData: region.regionInfo.regionData,
  355. form: {
  356. decType: 'normal',
  357. realName: '',
  358. decLv: '',
  359. insertUserName: '',
  360. decUserName: usersInfo.userName(),
  361. recUserName: '',
  362. conUserName: '',
  363. insertUserIdCard: '',
  364. consignee: '',
  365. acceptMobile: '',
  366. areaSelected: [],
  367. address: '',
  368. openBank: '',
  369. bankAddress: '',
  370. bankProvince: '',
  371. bankCity: '',
  372. bankCounty: '',
  373. bankNo: '',
  374. bankAreaSelected: [],
  375. password: '111111',
  376. payPassword: '111111',
  377. mobile: '',
  378. email: '',
  379. packageId: '',
  380. goodsId: [],
  381. goodsNum: [],
  382. province: '',
  383. cityName: '',
  384. lgaName: '',
  385. way: 'express',
  386. payType: '',
  387. autoPlace: '',
  388. location: ''
  389. },
  390. conRealName: '-',
  391. recRealName: '-',
  392. areaDisabled: false,
  393. addressDisabled: false,
  394. userReadOnly: true,
  395. recReadOnly: false,
  396. allDecLevel: usersInfo.getBaseInfo().decLevels,
  397. allOpenBank: [],
  398. activeName: 'product',
  399. }
  400. },
  401. created() {
  402. let regionInfo = this.$store.getters.regionInfo
  403. // console.log(this.$store.state.region)
  404. this.fetchWelcomePack()
  405. },
  406. methods: {
  407. // 会员报单/BA升级
  408. fetchWelcomePack() {
  409. this.loading = true
  410. fetchWelcomePack().then(response => {
  411. this.form.insertUserName = response.data.userName
  412. this.allOpenBank = response.data.allOpenBank
  413. this.allDecPackage = response.data.allDecPackage
  414. this.allGoods = response.data.allGoods
  415. this.userBalance = response.data.userBalance
  416. this.categoryType = 1
  417. let settingObj = this.allGoods
  418. for (let i in this.allGoods) {
  419. this.storeNums[i] = 1
  420. settingObj[i].goodsNum = 0
  421. }
  422. this.tableData = Object.values(settingObj)
  423. let pageList = this.multipleSelection
  424. this.$nextTick(function () {
  425. for (let i in this.tableData) {
  426. for( let j in pageList) {
  427. if( pageList[j].ID === this.tableData[i].ID ) {
  428. this.$data.storeNums[i] = pageList[j].goodsNum
  429. this.tableData[i].goodsNum = pageList[j].goodsNum
  430. break
  431. }
  432. }
  433. }
  434. })
  435. // 支付方式
  436. this.payList = response.data.sellType[0]['sell_type']
  437. // 支付方式的第一项默认选中
  438. this.form.payType = Object.values(this.payList)[1]['label']
  439. setTimeout(() => {
  440. this.loading = false
  441. }, 0.5 * 1000)
  442. })
  443. },
  444. // 商品详情
  445. handleProduct(row) {
  446. this.product = row
  447. this.product.taxAmount = tool.calculateTax(row.SELL_PRICE, row.TAX_RATE)
  448. this.visibleProduct = true
  449. },
  450. // 选择商品计数
  451. handleInputNumber(current, row){
  452. let pageList = this.multipleSelection
  453. let selectStatus = false
  454. for (let i in pageList) {
  455. if (pageList[i].ID === row.ID) {
  456. pageList[i].goodsNum = current
  457. selectStatus = true
  458. break
  459. }
  460. }
  461. if (selectStatus) {
  462. this.multipleSelection = pageList
  463. this.handleSureChange()
  464. }
  465. },
  466. // 统计商品
  467. handleSureChange() {
  468. if (this.multipleSelection.length > 0) {
  469. let accumulatorSellPrice = 0, accumulatorPricePv = 0, accumulatorTax = 0
  470. this.multipleSelection.forEach(accumulator => {
  471. accumulatorSellPrice += accumulator.SELL_PRICE * accumulator.goodsNum;
  472. accumulatorPricePv += Number(accumulator.PRICE_PV) * Number(accumulator.goodsNum);
  473. accumulatorTax += tool.calculateTax(Number(accumulator.SELL_PRICE), Number(accumulator.TAX_RATE), Number(accumulator.goodsNum));
  474. })
  475. this.sellPriceSum = tool.formatPrice(accumulatorSellPrice)
  476. this.pricePvSum = tool.formatPrice(accumulatorPricePv)
  477. this.taxSum = tool.formatPrice(accumulatorTax)
  478. this.display = true
  479. } else {
  480. this.sellPriceSum = this.pricePvSum = this.taxSum = 0.00
  481. this.display = true
  482. }
  483. },
  484. // 选择商品
  485. handleSelectionChange(val) {
  486. let idx = -1, num
  487. for (let i in this.tableData) {
  488. for (let v in val){
  489. if (val[v].ID === this.tableData[i].ID) {
  490. idx = i
  491. num = this.storeNums[idx]
  492. val[v]['goodsNum'] = num
  493. break
  494. }
  495. }
  496. }
  497. this.multipleSelection = val
  498. // 计算统计
  499. this.handleSureChange()
  500. },
  501. // 选择收货地址
  502. choseAddress (addressId) {
  503. this.addressId = addressId
  504. // 设置运费
  505. this.setFreight()
  506. // 计算价格
  507. this.getSumMoney()
  508. },
  509. // 切换支付方式
  510. chosePayType(type) {
  511. this.payType = type
  512. },
  513. // 关闭支付回调
  514. handleClose() {
  515. this.$confirm(this.$t('shop.confirmClose')).then(_ => {
  516. deleteApproachOrder({ orderSn: this.form.orderSn }).then(() => {
  517. // 关闭支付模态框
  518. this.visible = false
  519. // 关闭购物车
  520. this.visibleShoppingCart = false
  521. this.submitButtonStat = false
  522. })
  523. })
  524. },
  525. // 支付成功回调
  526. processPayment() {
  527. // 关闭支付页面
  528. this.visible = false
  529. this.payStackLoading = false
  530. // 显示支付成功模态框
  531. this.payDialog = true;
  532. // 启动支付成功倒计时
  533. this.handleCountdown()
  534. },
  535. // 倒计时结束跳转
  536. handleOrderList () {
  537. this.$router.push({path: `/shop/dec-order-list`})
  538. },
  539. // 启动倒计时
  540. handleCountdown () {
  541. // 创建定时器
  542. setInterval(() => {
  543. // 每隔1秒把time的值减一,赋值给span标签
  544. this.countdown--
  545. if (this.countdown === 0) {
  546. // 倒计时结束,跳转到订单列表
  547. this.$router.push({path: `/shop/dec-order-list`});
  548. }
  549. }, 1000)
  550. },
  551. // 会员查询
  552. handleChkRecUser() {
  553. this.form.conUserName = ''
  554. this.conRealName = '-'
  555. this.form.autoPlace = ''
  556. if (this.form.recUserName) {
  557. this.loading = true
  558. fetchFullInfo({ userName: this.form.recUserName }).then(response => {
  559. this.recRealName = response.data.REAL_NAME
  560. this.loading = false
  561. }).catch(() => {
  562. this.recRealName = '-'
  563. this.loading = false
  564. })
  565. }
  566. },
  567. // 返回方式
  568. wayChange () {
  569. if (this.form.way === 'pickup') {
  570. this.areaDisabled = true
  571. this.addressDisabled = true
  572. } else {
  573. this.areaDisabled = false
  574. this.addressDisabled = false
  575. }
  576. },
  577. // 会员报单/BA升级
  578. onSubmit() {
  579. if (!this.form.decLv) {
  580. this.$message({
  581. message: this.$t('profile.selectLevel'),
  582. type: 'error'
  583. })
  584. return false
  585. }
  586. // 已选择商品
  587. this.selectProduct()
  588. if (this.multipleSelection.length <= 0) {
  589. this.$message.error(this.$t('shop.chooseTips'))
  590. return false
  591. }
  592. // 余额
  593. let amountBalance = this.userBalance[this.form.payType] || 0
  594. // 余额是否充足
  595. if ((this.form.payType === 'cash') && ((amountBalance - this.payAmount) < 0)) {
  596. // 账户类型提示信息
  597. let accountType = this.currency[this.form.payType].name || ''
  598. this.$message({
  599. message: accountType + this.$t('shop.balanceNotAllow'),
  600. type: 'error'
  601. })
  602. return false
  603. }
  604. this.submitButtonStat = true
  605. let params = {
  606. consignee: this.form.consignee,
  607. acceptMobile: this.form.acceptMobile,
  608. province: this.form.areaSelected[0] ? this.form.areaSelected[0] : '',
  609. city: this.form.areaSelected[1] ? this.form.areaSelected[1] : '',
  610. county: this.form.areaSelected[2] ? this.form.areaSelected[2] : '',
  611. address: this.form.address,
  612. decType: this.form.decType,
  613. insertUserName: this.form.insertUserName,
  614. decLv: this.form.decLv,
  615. realName: this.form.realName,
  616. decUserName: this.form.decUserName,
  617. conUserName: this.form.conUserName,
  618. recUserName: this.form.recUserName,
  619. insertUserIdCard: this.form.insertUserIdCard,
  620. openBank: this.form.openBank,
  621. bankAddress: this.form.bankAddress,
  622. mobile: this.form.mobile,
  623. email: this.form.email,
  624. cityName: this.form.cityName,
  625. lgaName: this.form.lgaName,
  626. bankProvince: this.form.bankAreaSelected[0] ? this.form.bankAreaSelected[0] : '',
  627. bankCity: this.form.bankAreaSelected[1] ? this.form.bankAreaSelected[1] : '',
  628. bankCounty: this.form.bankAreaSelected[2] ? this.form.bankAreaSelected[2] : '',
  629. bankNo: this.form.bankNo,
  630. password: this.form.password,
  631. payPassword: this.form.payPassword,
  632. packageId: this.form.packageId,
  633. goodsId: this.form.goodsId,
  634. goodsNum: this.form.goodsNum,
  635. location: this.form.location,
  636. decWay: this.decWay,
  637. payType: this.form.payType
  638. }
  639. createWelcomePack(params).then(response => {
  640. if (this.form.payType !== 'pay_stack') {
  641. // 余额支付
  642. this.$message({
  643. message: this.$t('common.successfully'),
  644. type: 'success'
  645. })
  646. this.submitButtonStat = false
  647. this.$router.push({path: `/shop/order-list`})
  648. } else {
  649. this.submitButtonStat = false
  650. this.payForm.orderSn = response.data.SN
  651. this.payForm.amount = response.data.ORDER_AMOUNT
  652. this.payForm.metadata.custom_fields[0].value = response.data.SN
  653. if (this.form.decType === 'ba') {
  654. this.payForm.metadata.custom_fields[1].value = 'baUpgrade';
  655. } else {
  656. this.payForm.metadata.custom_fields[1].value = 'userDec';
  657. }
  658. this.visible = true
  659. }
  660. })
  661. },
  662. // 已选择商品
  663. selectProduct() {
  664. this.payAmount = 0
  665. this.form.goodsId = []
  666. this.form.goodsNum = []
  667. this.multipleSelection.map((item) => {
  668. this.form.goodsId.push(item.ID)
  669. this.form.goodsNum.push(item.goodsNum)
  670. this.payAmount += item.goodsNum * item.SELL_PRICE
  671. })
  672. },
  673. // 报单方式
  674. decTypeChange() {
  675. if (this.form.decType === 'ba') {
  676. this.form.insertUserName = ''
  677. this.userReadOnly = false
  678. } else {
  679. this.form.recUserName = ''
  680. this.recRealName = '-'
  681. this.recReadOnly = false
  682. this.userReadOnly = true
  683. this.fetchWelcomePack()
  684. }
  685. },
  686. // BA会员查询
  687. checkBaUser() {
  688. if (this.form.decType === 'ba' && this.form.insertUserName !== '') {
  689. this.loading = true
  690. fetchBrandAmbassadorInfo({ userName: this.form.insertUserName }).then(response => {
  691. this.form.recUserName = response.data.REC_USER_NAME
  692. this.form.realName = response.data.REAL_NAME
  693. this.handleChkRecUser()
  694. this.recReadOnly = true
  695. this.loading = false
  696. }).catch(() => {
  697. this.loading = false
  698. })
  699. }
  700. },
  701. // 查询安置人
  702. handleChkConUser() {
  703. if (this.form.conUserName) {
  704. this.loading = true
  705. fetchFullInfo( { userName: this.form.conUserName }).then(response => {
  706. this.conRealName = response.data.REAL_NAME + response.data.isLocation
  707. this.loading = false
  708. }).catch(() => {
  709. this.conRealName = '-'
  710. this.loading = false
  711. })
  712. }
  713. },
  714. // 自动设置区位
  715. setAutoPlace(side) {
  716. if (this.recRealName !== '-') {
  717. this.loading = true
  718. fetchAutoPlace( { userName: this.form.recUserName, side: side }).then(response => {
  719. this.form.conUserName = response.data.USER_NAME
  720. this.handleChkConUser()
  721. this.form.location = 1
  722. this.form.autoPlace = side
  723. this.loading = false
  724. }).catch(() => {
  725. this.conRealName = '-'
  726. this.loading = false
  727. })
  728. } else {
  729. this.form.autoPlace = ''
  730. return false
  731. }
  732. },
  733. }
  734. }
  735. </script>
  736. <style>
  737. .el-table th.el-table__cell > .cell {
  738. white-space: nowrap;
  739. }
  740. .el-table td.el-table__cell > .cell {
  741. word-break: keep-all;
  742. white-space: pre-wrap;
  743. }
  744. .el-tabs--border-card > .el-tabs__content {
  745. padding: 5px;
  746. }
  747. .el-radio.is-bordered + .el-radio.is-bordered {
  748. margin: 5px 0;
  749. }
  750. .el-radio--medium.is-bordered {
  751. margin: 5px 0;
  752. }
  753. </style>