upgrade.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. <template>
  2. <div v-loading="loading">
  3. <div class="white-box">
  4. <el-form :model="form" ref="form" label-width="250px" class="form-page">
  5. <div class="hr-tip"><span>Member information<!-- 会员信息 --></span></div>
  6. <el-form-item label="Member code" prop="insertUserName"><!-- 会员编号 -->
  7. <el-input v-model="form.insertUserName"
  8. placeholder="Please enter member code."
  9. :rules="{ required: true, message: 'Please enter member code.', trigger: 'blur' }"
  10. @blur="upgradeInfo()"
  11. ><!-- 请输入升级的会员编号 -->
  12. </el-input>
  13. </el-form-item>
  14. <el-form-item label="Member level"><!-- 会员级别 -->
  15. <el-input v-model="form.userDecName"
  16. disabled
  17. >
  18. </el-input>
  19. </el-form-item>
  20. <el-form-item label="Member name"><!-- 会员姓名 -->
  21. <el-input v-model="form.userRealName"
  22. disabled
  23. >
  24. </el-input>
  25. </el-form-item>
  26. <el-form-item label="Joining date"><!-- 加入日期 -->
  27. <el-input v-model="form.addAt"
  28. disabled
  29. >
  30. </el-input>
  31. </el-form-item>
  32. <el-form-item v-if="!isMax" label="Upgrade way"><!-- 升级方式 -->
  33. <el-input v-model="form.upgradeFunc"
  34. disabled
  35. >
  36. </el-input>
  37. </el-form-item>
  38. <el-form-item v-if="!isMax" label="To upgrade level " prop="upgradeValue"><!-- 升级级别 -->
  39. <el-select v-model="form.upgradeValue" placeholder="Please select a level" @change="changeLevel"><!-- 请选择级别 -->
  40. <el-option
  41. v-for="item in upgradeOption"
  42. :key="item.ID"
  43. :label="item.LEVEL_NAME"
  44. :value="{value:item.ID, diffPv:item.REPAIR_PV}">
  45. </el-option>
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item v-if="!isMax" label="Payment"><!-- 升级补差业绩 -->
  49. <el-input v-model="needDiffPv"
  50. disabled
  51. >
  52. </el-input>
  53. </el-form-item>
  54. <el-form-item v-if="!isMax">
  55. <template slot="label">
  56. Upgrade purchase product<!-- 升级购买商品 -->
  57. </template>
  58. <el-tabs type="border-card" v-model="decWay" style="position: relative;width: 100%;">
  59. <!--<el-tab-pane name="1">
  60. <span slot="label">套餐</span>
  61. <el-table class="table-box" :data="_tableData" stripe style="width: 100%;" highlight-current-row @current-change="handleCurrentChange">
  62. <el-table-column
  63. type="index"
  64. width="50">
  65. </el-table-column>
  66. <el-table-column label=" " width="50">
  67. <template slot-scope="scope">
  68. <span class="el-checkbox__input" :class="{'is-checked':scope && scope.row && currentRow && scope.row.ID==currentRow.ID}">
  69. <span class="el-checkbox__inner">
  70. </span>
  71. <input type="checkbox" aria-hidden="false" class="el-checkbox__original" value="">
  72. </span>
  73. </template>
  74. </el-table-column>
  75. <el-table-column label="套餐名称" prop="PACKAGE_NAME">
  76. </el-table-column>
  77. <el-table-column label="套餐金额" prop="AMOUNT">
  78. </el-table-column>
  79. <el-table-column label="套餐PV" prop="PV">
  80. <template>
  81. </template>
  82. </el-table-column>
  83. <el-table-column label="所属报单级别" prop="LEVEL_NAME">
  84. <template>
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="套餐内容" prop="PACKAGE_CONTENT">
  88. <template >
  89. </template>
  90. </el-table-column>
  91. </el-table>
  92. </el-tab-pane> -->
  93. <el-tab-pane label="product" name="2"><!-- 商品 -->
  94. <el-table class="table-box" v-if="numList.length > 0" :data="tableDatas" stripe style="width: 100%;" highlight-current-row @selection-change="handleSelectionChange">
  95. <el-table-column
  96. type="selection"
  97. width="55">
  98. </el-table-column>
  99. <el-table-column label="product Name" prop="GOODS_NAME"><!-- 商品名称 -->
  100. </el-table-column>
  101. <el-table-column label="product Code" prop="GOODS_NO"><!-- 商品编号 -->
  102. </el-table-column>
  103. <el-table-column label="product Price" prop="SELL_PRICE"><!-- 产品价格 -->
  104. </el-table-column>
  105. <el-table-column label="product BV" prop="PRICE_PV"><!-- BV价格 -->
  106. </el-table-column>
  107. <el-table-column label="Tax Rate"><!--税率-->
  108. <template slot-scope="scope">
  109. <span>{{ Math.round(scope.row.TAX_RATE * 100) / 100 }}</span>
  110. </template>
  111. </el-table-column>
  112. <el-table-column label="Tax"><!--税额-->
  113. <template slot-scope="scope">
  114. <span>{{ Math.round(scope.row.TAX * 100) / 100 }}</span>
  115. </template>
  116. </el-table-column>
  117. <el-table-column label="Qty" width="150"><!-- 数量 -->
  118. <template slot-scope="scope">
  119. <el-input-number size="mini" v-model="numList[scope.$index]" :min="0" :max="Number(scope.row.STORE_NUMS)" @change="value=>{handleChange(value,scope.row.ID)}"></el-input-number>
  120. </template>
  121. </el-table-column>
  122. </el-table>
  123. <div class="white-box-footer flex">
  124. <el-button @click="getSum()">Total calculation<!-- 计算合计 --></el-button>
  125. <div class='flex data' style="flex:1;justify-content: flex-end;">
  126. <div style="margin-right:2rem"><!-- 商品价格 -->product price:₦ {{sell_price_sum}}</div>
  127. <div><!-- 商品PV -->product BV:{{price_pv_sum}}</div>
  128. </div>
  129. </div>
  130. </el-tab-pane>
  131. </el-tabs>
  132. </el-form-item>
  133. <el-form-item v-if="!isMax">
  134. <template slot="label">
  135. Recipient name<!-- 收货人 -->
  136. </template>
  137. <el-input v-model="form.consignee"></el-input>
  138. </el-form-item>
  139. <el-form-item v-if="!isMax">
  140. <template slot="label">
  141. Phone Number<!-- 收货人手机 -->
  142. </template>
  143. <el-input v-model="form.acceptMobile"></el-input>
  144. </el-form-item>
  145. <el-form-item v-if="!isMax" prop="areaSelected">
  146. <template slot="label">
  147. State<!-- 地区 -->
  148. </template>
  149. <el-cascader
  150. size="large"
  151. :options="regionData"
  152. v-model="form.areaSelected">
  153. </el-cascader>
  154. </el-form-item>
  155. <el-form-item v-if="!isMax">
  156. <template slot="label">
  157. Local Government Area
  158. </template>
  159. <el-input v-model="form.lgaName"></el-input>
  160. </el-form-item>
  161. <el-form-item v-if="!isMax">
  162. <template slot="label">
  163. City
  164. </template>
  165. <el-input v-model="form.cityName"></el-input>
  166. </el-form-item>
  167. <el-form-item v-if="!isMax">
  168. <template slot="label">
  169. Detailed address<!-- 详细地址 -->
  170. </template>
  171. <el-input v-model="form.address"></el-input>
  172. </el-form-item>
  173. <el-form-item v-if="!isMax" label="note"><!-- 备注 -->
  174. <el-input type="textarea" v-model="form.remark"></el-input>
  175. </el-form-item>
  176. <el-form-item v-if="!isMax" label="Payment method" required><!-- 支付方式 -->
  177. <el-radio-group v-model="form.payType" @change="payMethodChange">
  178. <el-radio v-for="(item, index) in payList" :key='index' :label="item.label">{{ item.name }}</el-radio>
  179. </el-radio-group>
  180. </el-form-item>
  181. <el-form-item v-if="!isMax">
  182. <el-button type="primary" @click="onSubmit" :loading="submitButtonStat">SAVE<!-- 保存 --></el-button>
  183. </el-form-item>
  184. </el-form>
  185. </div>
  186. <el-dialog title="Pay" v-if="visible" :visible.sync="visible" width="30%" v-loading="payStackLoading" :before-close="handleClose">
  187. <section>
  188. <div class="formcontainer">
  189. <el-divider></el-divider>
  190. <div class="container">
  191. <el-form :model="PayStackForm">
  192. <el-form-item label="Email" label-width="100px" required>
  193. <el-input v-model="PayStackForm.email" autocomplete="off"></el-input>
  194. </el-form-item>
  195. <el-form-item label="Amount" label-width="100px" required>
  196. <el-input v-model="PayStackForm.amount" autocomplete="off" readonly></el-input>
  197. </el-form-item>
  198. </el-form>
  199. </div>
  200. </div>
  201. </section>
  202. <paystack
  203. :firstname="PayStackForm.firstname"
  204. :lastname="PayStackForm.lastname"
  205. :amount="PayStackForm.amount * 100"
  206. :email="PayStackForm.email"
  207. :metadata="PayStackForm.metadata"
  208. :currency="PayStackForm.currency"
  209. :paystackkey="PayStackForm.publicKey"
  210. :reference="reference"
  211. :callback="processPayment"
  212. :close="processClose"
  213. >
  214. <el-button type="primary" size="small">Pay</el-button>
  215. </paystack>
  216. <el-button type="danger" size="small" class="cancelButton" @click="handleClose">Cancel</el-button>
  217. </el-dialog>
  218. <el-dialog title="Tips" :visible.sync="payDialog" :show-close="false" width="350px" :close="handleOrderList">
  219. <el-result icon="success" title="the order is successful">
  220. <template slot="extra">
  221. <span style="color: #008efa; font-size: 30px;">{{ countdown }}</span>
  222. </template>
  223. </el-result>
  224. </el-dialog>
  225. </div>
  226. </template>
  227. <script>
  228. import Vue from 'vue'
  229. import network from '@/utils/network'
  230. import baseInfo from '@/utils/baseInfo'
  231. import store from '@/utils/vuexStore'
  232. import tool from '@/utils/tool'
  233. import userInfo from '@/utils/userInfo'
  234. import { PAY_STACK_PUBLIC_KEY, PAY_STACK_CURRENCY } from '@/utils/config'
  235. import paystack from 'vue-paystack'
  236. export default {
  237. name: 'user_upgrade',
  238. mounted() {
  239. this.getData()
  240. },
  241. computed:{
  242. _tableData(){
  243. if(this.tableData==null){
  244. return [];
  245. }
  246. if(this.form.decLv==''){
  247. return this.tableData;
  248. }
  249. return this.tableData.filter(item=>{
  250. return item.LEVEL_ID == this.form.decLv
  251. })
  252. },
  253. reference() {
  254. let text = "";
  255. let possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
  256. for (let i = 0; i < 10; i++)
  257. text += possible.charAt(Math.floor(Math.random() * possible.length));
  258. return text;
  259. }
  260. },
  261. data() {
  262. return {
  263. nowPerf:'',
  264. nextPerf:'',
  265. decUserName:'',
  266. needDiffPv:'',
  267. isMax:true,
  268. upgradeOption:[],
  269. toLevel:'',
  270. currentRow:null,
  271. decWay:'2',
  272. regionData: store.state.regionInfo.regionData,
  273. form: {
  274. address:'',
  275. areaSelected:[],
  276. consignee:'',
  277. upgradeFunc:'',
  278. upgradeValue:'',
  279. addAt:'',
  280. userRealName:'',
  281. userDecName:'',
  282. remark:'',
  283. realName:'',
  284. decLv: '',
  285. insertUserName:'',
  286. decUserName:'',
  287. recUserName:'',
  288. conUserName:'',
  289. insertUserIdCard:'',
  290. packageId:'',
  291. goodsId:[],
  292. goodsNum:[],
  293. province:'',
  294. // city:'',
  295. // county:'',
  296. lgaName:'',
  297. cityName:'',
  298. acceptMobile:'',
  299. payType: '',
  300. },
  301. num: 1,
  302. tableData:null,
  303. tableDatas:null,
  304. allDecPackage:{},
  305. loading: false,
  306. submitButtonStat: false,
  307. submitButton:false,
  308. allGoods:[],
  309. multipleSelection: [],
  310. goodsNums:[],
  311. numList: [],
  312. sell_price_sum:0.00,
  313. price_pv_sum:0.00,
  314. payList: [],
  315. sn: '',
  316. payDialog: false,
  317. countdown: 5,
  318. visible: false,
  319. payStackLoading: false,
  320. PayStackForm: {
  321. publicKey: PAY_STACK_PUBLIC_KEY,
  322. currency: PAY_STACK_CURRENCY,
  323. firstname: userInfo.userName(),
  324. lastname: '',
  325. email: userInfo.userEmail(),
  326. amount: 0, // kobo
  327. orderSn: '',
  328. metadata: {
  329. cart_id: this.sn,
  330. custom_fields: [
  331. {
  332. display_name: 'orderSn',
  333. variable_name: 'orderSn',
  334. value: this.sn
  335. },
  336. ]
  337. },
  338. },
  339. }
  340. },
  341. components: {
  342. paystack
  343. },
  344. methods: {
  345. // 获取要升级的会员信息
  346. upgradeInfo() {
  347. if (this.form.insertUserName) {
  348. network.postData(`user/upgrade-info`,{userName:this.form.insertUserName}).then(response => {
  349. this.form.addAt=response.baseInfo.ADD_AT
  350. this.form.userRealName=response.baseInfo.REAL_NAME
  351. this.form.userDecName=response.baseInfo.DEC_NAME
  352. this.isMax = response.baseInfo.IS_MAX
  353. this.upgradeOption = response.baseInfo.LEVEL_LIST
  354. this.form.upgradeFunc = response.baseInfo.UPGRADE_FUNC //upgradeFunc升级方式
  355. this.nowPerf = response.baseInfo.NOW_PERF // 用户当前业绩
  356. this.nextPerf = response.baseInfo.NEXT_PERF
  357. })
  358. }
  359. },
  360. changeLevel(data) {
  361. let { value,diffPv } = data
  362. this.needDiffPv = diffPv
  363. this.toLevel = value
  364. },
  365. getSum(){
  366. let sell_price_sum=0,price_pv_sum=0;
  367. this.multipleSelection.map((item,index)=>{
  368. sell_price_sum+=Number(item.SELL_PRICE)*item.goodsNum;
  369. price_pv_sum+=Number(item.PRICE_PV)*item.goodsNum;
  370. })
  371. this.sell_price_sum=tool.formatPrice(sell_price_sum);
  372. this.price_pv_sum=tool.formatPrice(price_pv_sum);
  373. },
  374. getData () {
  375. network.getData(`user/upgrade`).then(response => {
  376. this.decUserName = response.decUserName
  377. this.loading = false;
  378. this.allDecPackage = response.allDecPackage;
  379. this.allGoods = response.allGoods;
  380. let settingObj=this.allDecPackage;
  381. let settingArr = Object.keys(settingObj).map(key => {
  382. //console.log(key); //为每个键名
  383. return settingObj[key]; //把每个对象返回出去生成一个新的数组中相当于0:{id:1}
  384. });
  385. this.tableData=settingArr;
  386. let settingObj1=this.allGoods;
  387. for(let i in settingObj1){
  388. this.numList[i] = 1;
  389. settingObj1[i].goodsNum= 1 ;
  390. }
  391. this.tableDatas=settingObj1;
  392. // 支付方式
  393. this.payList = response.sellType[0]['sell_type']
  394. // 支付方式的第一项默认选中
  395. this.form.payType = Object.values(this.payList)[0]['label']
  396. }).catch(() => {
  397. });
  398. },
  399. handleCurrentChange(val) {
  400. console.log(val)
  401. if(!val){return}
  402. this.currentRow = val;
  403. this.form.packageId=this.currentRow.ID;
  404. console.log(this.form.packageId)
  405. },
  406. handleSelectionChange(val) {
  407. let idx = -1,num;
  408. for(let i in this.tableDatas){
  409. for(let v in val){
  410. if(val[v].ID==this.tableDatas[i].ID){
  411. idx = i;
  412. num = this.numList[idx];
  413. val[v]["goodsNum"] = num;
  414. break;
  415. }
  416. }
  417. }
  418. console.log(val)
  419. this.multipleSelection = val;
  420. },
  421. handleChange(value,ID) {
  422. for(let i in this.multipleSelection){
  423. if(this.multipleSelection[i]['ID']==ID) {
  424. this.multipleSelection[i]["goodsNum"] = value;
  425. }
  426. }
  427. },
  428. getGoods(){
  429. this.form.goodsId=[];
  430. this.form.goodsNum=[];
  431. this.multipleSelection.map((item,index)=>{
  432. console.log(item);
  433. console.log('==');
  434. this.form.goodsId.push(item.ID)
  435. this.form.goodsNum.push(item.goodsNum)
  436. })
  437. },
  438. onSubmit() {
  439. if (!this.form.insertUserName) {
  440. this.$message({
  441. message: 'Please enter the member code',//请输入会员编号
  442. type: 'error'
  443. })
  444. return false;
  445. }
  446. if (!this.toLevel) {
  447. this.$message({
  448. message: 'Please select a level',//请选择级别
  449. type: 'error'
  450. })
  451. return false
  452. }
  453. this.getGoods();
  454. this.submitButtonStat = true
  455. let path = 'user/upgrade'
  456. let postData = {
  457. decUserName:this.decUserName,
  458. packageId: this.form.packageId,
  459. goodsId: this.form.goodsId,
  460. goodsNum: this.form.goodsNum,
  461. location: this.form.location,
  462. decWay:this.decWay,
  463. decLv:this.toLevel, // 用户想升级到什么级别
  464. insertUserName:this.form.insertUserName, // 要升级的用户的编号
  465. remark:this.form.remark,
  466. address: this.form.address,
  467. consignee: this.form.consignee,
  468. acceptMobile: this.form.acceptMobile,
  469. province: this.form.areaSelected[0] ? this.form.areaSelected[0] : '',
  470. // city: this.form.areaSelected[1] ? this.form.areaSelected[1] : '',
  471. // county: this.form.areaSelected[2] ? this.form.areaSelected[2] : '',
  472. lgaName: this.form.lgaName,
  473. cityName: this.form.cityName,
  474. nowPerf:this.nowPerf,
  475. nextPerf:this.nextPerf,
  476. payType: this.form.payType,
  477. }
  478. return network.postData(path, postData).then(response => {
  479. // 非PayStack支付
  480. if (this.form.payType !== 'pay_stack') {
  481. this.$message({
  482. message: response,
  483. type: 'success'
  484. })
  485. this.submitButtonStat = false
  486. this.$router.push({path: `/shop/order-list`})
  487. } else {
  488. // PayStack支付
  489. this.submitButtonStat = false
  490. this.PayStackForm.orderSn = response.SN
  491. this.PayStackForm.amount = response.ORDER_AMOUNT
  492. this.PayStackForm.metadata.custom_fields[0].value = response.SN
  493. this.visible = true
  494. }
  495. }).catch(() => {
  496. this.submitButtonStat = false
  497. })
  498. },
  499. selectOne(event, item) {
  500. network.getData(`user/upgrade`).then(response => {
  501. })
  502. },
  503. handleChkConUser() {
  504. if (this.form.conUserName) {
  505. this.loading = true
  506. network.getData('user/full-info', {userName: this.form.conUserName}).then(response => {
  507. this.conRealName = response.REAL_NAME + response.isLocation
  508. this.loading = false
  509. }).catch(response => {
  510. this.conRealName = '-'
  511. this.loading = false
  512. })
  513. }
  514. },
  515. handleChkRecUser() {
  516. if (this.form.recUserName) {
  517. this.loading = true
  518. network.getData('user/full-info', {userName: this.form.recUserName}).then(response => {
  519. this.recRealName = response.REAL_NAME
  520. this.loading = false
  521. }).catch(response => {
  522. this.recRealName = '-'
  523. this.loading = false
  524. })
  525. }
  526. },
  527. // 切换支付方式
  528. payMethodChange(type) {
  529. this.form.payType = type
  530. },
  531. // 关闭支付回调
  532. handleClose() {
  533. let _this = this
  534. _this.$confirm('Confirm to close?').then(() => {
  535. return network.postData('shop/delete-approach-order', {orderSn: this.PayStackForm.orderSn}).then(() => {
  536. // 关闭支付模态框
  537. _this.visible = false
  538. })
  539. }).catch(() => {
  540. // 关闭支付模态框
  541. _this.visible = false
  542. })
  543. },
  544. // 支付成功回调
  545. processPayment(response) {
  546. // 关闭支付页面
  547. this.visible = false
  548. this.payStackLoading = false
  549. // 显示支付成功模态框
  550. this.payDialog = true
  551. this.handleCountdown()
  552. },
  553. // 关闭支付回调
  554. processClose() {
  555. // 关闭支付模态框
  556. this.visible = false
  557. },
  558. // 支付tips结束,跳转到报单列表
  559. handleOrderList() {
  560. this.$router.push({path: `/shop/dec-order-list`})
  561. },
  562. // 启动倒计时
  563. handleCountdown() {
  564. //创建定时器
  565. setInterval(() => {
  566. // 每隔1秒把time的值减一,赋值给span标签
  567. this.countdown--
  568. if (this.countdown === 0) {
  569. // 倒计时结束,跳转到报单列表
  570. this.$router.push({path: `/shop/dec-order-list`})
  571. }
  572. }, 1000)
  573. },
  574. }
  575. }
  576. </script>
  577. <style>
  578. .hr-tip {
  579. font-size: 12px;
  580. position: relative;
  581. text-align: center;
  582. height: 30px;
  583. line-height: 30px;
  584. color: #999;
  585. margin-bottom: 20px;
  586. }
  587. .hr-tip:before {
  588. content: '';
  589. display: block;
  590. position: absolute;
  591. left: 0;
  592. right: 0;
  593. top: 14px;
  594. border-bottom: 1px dashed #ddd;
  595. height: 1px;
  596. }
  597. .hr-tip span {
  598. display: inline-block;
  599. background: #fff;
  600. position: relative;
  601. padding: 0 10px;
  602. }
  603. .el-input-number--mini .el-input-number__decrease, .el-input-number--mini .el-input-number__increase{width: 22px!important}
  604. .el-input-number.is-controls-right .el-input__inner{padding-left: 10px;
  605. padding-right: 30px;}
  606. .el-tabs--border-card{
  607. position: relative;
  608. width: 100%;
  609. /*width: 600px;*/
  610. }
  611. .flex{
  612. display: flex;
  613. }
  614. .form-page{
  615. width:100% !important;
  616. }
  617. .payButton {
  618. border: none;
  619. padding: 0;
  620. }
  621. </style>