CashierList.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. <template>
  2. <view class="cashier-list-content">
  3. <view v-if="show">
  4. <u-radio-group v-model="paymentMode" placement="row" icon-placement="right" @change="handleChangePaymentMode">
  5. <view v-for="payment in paymentList" :key="payment.id" class="cashier">
  6. <view class="cashier-item" @click="handleChangePaymentMode(payment.paymentMode, payment.disabled)">
  7. <view class="icon-text">
  8. <image class="pay-type-img-inner" :src="payment.icon" mode="widthFix" />
  9. {{ payment.label }}
  10. <span v-if="paymentMode === 3 && paymentMode === payment.paymentMode">
  11. (手续费:¥{{ flowerObj.hbServiceChargeTotal }})
  12. </span>
  13. </view>
  14. <view class="radio">
  15. <u-radio :disabled="payment.disabled" active-color="#c5aa7b" :name="payment.paymentMode" />
  16. </view>
  17. </view>
  18. <!-- 花呗分期 -->
  19. <view v-if="paymentMode === 3 && paymentMode === payment.paymentMode" class="ali-hb-content">
  20. <u-radio-group
  21. v-model="flowerObj.hbByStagesPeriods" placement="row" icon-placement="right"
  22. @change="handleChangePeriods"
  23. >
  24. <view v-for="(flowerItem, index) in flowerObj.hbByStagesList" :key="index" class="cashier">
  25. <view class="cashier-item" @click="handleChangePeriods(flowerItem.numberOfStages, flowerItem.disabled)">
  26. <view class="icon-text">
  27. {{ flowerItem.numberOfStages }}期(¥{{ flowerItem.price }}/期)
  28. </view>
  29. <view class="radio-context">
  30. 手续费:¥{{ flowerItem.serviceCharge }}/期
  31. <u-radio
  32. class="radio" active-color="#c5aa7b" :disabled="flowerItem.disabled"
  33. :name="flowerItem.numberOfStages"
  34. />
  35. </view>
  36. </view>
  37. </view>
  38. </u-radio-group>
  39. </view>
  40. </view>
  41. </u-radio-group>
  42. </view>
  43. </view>
  44. </template>
  45. <script>
  46. import { getOrderHuabeiConfigApi } from '../../api/user'
  47. export default {
  48. name: 'CashierList',
  49. props: {
  50. totalPrice: {
  51. type: Number,
  52. default: () => 200
  53. },
  54. // 是否显示,用于默认某一个支付
  55. show: {
  56. type: Boolean,
  57. default: false
  58. }
  59. },
  60. data() {
  61. return {
  62. paymentMode: 1, // 支付方式 1微信 2支付宝 3花呗分期
  63. paymentList: [
  64. // {
  65. // id: 1,
  66. // label: '微信支付',
  67. // paymentMode: 1,
  68. // icon: require('../../static/images/user/pay/wechat_pay.png'),
  69. // disabled: false
  70. // },
  71. // {
  72. // id: 2,
  73. // label: '支付宝支付',
  74. // paymentMode: 2,
  75. // icon: require('../../static/images/user/pay/alipay.png'),
  76. // disabled: false
  77. // },
  78. // {
  79. // id: 3,
  80. // label: '花呗分期',
  81. // paymentMode: 3,
  82. // icon: require('../../static/images/user/pay/huabei.png'),
  83. // disabled: false
  84. // },
  85. {
  86. id: 4,
  87. label: '通联支付',
  88. paymentMode: 4,
  89. icon: require('../../static/images/user/pay/tonglian.png'),
  90. disabled: false
  91. }
  92. ],
  93. // 花呗相关
  94. flowerObj: {
  95. hbChargeType: 1, // 花呗手续费支付方式 1-商户支付 2-用户支付 后端接口返回
  96. hbByStagesPeriods: -1, // 花呗分期期数 3 6 12
  97. hbByStagesList: [
  98. {
  99. rate: 0,
  100. price: 0,
  101. numberOfStages: 3,
  102. serviceCharge: 0,
  103. disabled: false
  104. },
  105. {
  106. rate: 0,
  107. price: 0,
  108. numberOfStages: 6,
  109. serviceCharge: 0,
  110. disabled: false
  111. },
  112. {
  113. rate: 0,
  114. price: 0,
  115. numberOfStages: 12,
  116. serviceCharge: 0,
  117. disabled: false
  118. }
  119. ], // 花呗手续费比例列表 【{3期},{6期},{12期}】
  120. hbServiceChargeTotal: 0 // 花呗支付总手续费
  121. }
  122. }
  123. },
  124. mounted() {
  125. this.getTheFlowerConfig()
  126. this.handleSetDisable()
  127. this.handleNoticeFather()
  128. },
  129. methods: {
  130. /**
  131. * 根据环境更改可选支付项
  132. */
  133. handleSetDisable() {
  134. // #ifdef MP-WEIXIN
  135. // this.paymentList[0].disabled = false
  136. // this.paymentList[1].disabled = true
  137. // this.paymentList[2].disabled = true
  138. this.paymentList[0].disabled = false
  139. this.paymentMode = 4 // 1
  140. // #endif
  141. // #ifdef MP-ALIPAY
  142. // this.paymentList[0].disabled = true
  143. // this.paymentList[1].disabled = false
  144. // this.paymentList[2].disabled = false
  145. this.paymentList[0].disabled = false
  146. this.paymentMode = 4 // 2
  147. // #endif
  148. // #ifdef APP || H5
  149. // this.paymentList[0].disabled = false
  150. // this.paymentList[1].disabled = true
  151. // this.paymentList[2].disabled = true
  152. this.paymentList[0].disabled = false
  153. this.paymentMode = 4 // 1
  154. // #endif
  155. },
  156. /**
  157. * 支付方式改变事件
  158. * @param paymentMode
  159. * @param disabled
  160. */
  161. handleChangePaymentMode(paymentMode, disabled = false) {
  162. if (disabled) return
  163. this.paymentMode = paymentMode
  164. const { flowerObj } = this
  165. if ([1, 2].includes(paymentMode)) {
  166. // 支付宝支付,取消分期选择
  167. flowerObj.hbByStagesPeriods = -1
  168. // 3 6 12 全部禁止
  169. flowerObj.hbByStagesList.map((item) => {
  170. item.disabled = true
  171. })
  172. } else {
  173. // 分期支付,默认选三期
  174. flowerObj.hbByStagesPeriods = 3
  175. }
  176. this.handleHbStagesAndPrice()
  177. this.handleNoticeFather()
  178. },
  179. /**
  180. * 获取花呗分期配置
  181. */
  182. async getTheFlowerConfig() {
  183. const { data } = await getOrderHuabeiConfigApi({})
  184. const { flowerObj } = this
  185. flowerObj.hbChargeType = data.huabeiChargeType
  186. // 如果后端返回的是用户支付手续费,设置费率信息
  187. if (data.huabeiChargeType === 1) {
  188. data.huabeiFeeRateList.forEach((rate, index) => {
  189. flowerObj.hbByStagesList[index].rate = rate
  190. })
  191. }
  192. },
  193. /**
  194. * 处理花呗期数选择
  195. * @param periods 期数
  196. * @param disabled
  197. */
  198. handleChangePeriods(periods, disable = false) {
  199. if (disable) return
  200. const { flowerObj } = this
  201. flowerObj.hbByStagesPeriods = periods
  202. this.handleHbStagesAndPrice()
  203. this.handleNoticeFather()
  204. },
  205. /**
  206. * 处理花呗价格和手续费显示
  207. */
  208. handleHbStagesAndPrice() {
  209. // const { flowerObj, totalPrice } = this
  210. const flowerObj = this.flowerObj
  211. const totalPrice = this.totalPrice || 0
  212. if (this.paymentMode !== 3) return
  213. flowerObj.hbByStagesList.forEach((stages) => {
  214. // 根据价格填充每一期价格和手续费信息
  215. stages.price = ((totalPrice * (1 + stages.rate / 100)) / stages.numberOfStages).toFixed(2) // 每一期价格
  216. stages.serviceCharge = ((totalPrice * (stages.rate / 100)) / stages.numberOfStages).toFixed(2) // 每一期手续费
  217. // 计算总手续费
  218. if (stages.numberOfStages === Number(flowerObj.hbByStagesPeriods)) {
  219. flowerObj.hbServiceChargeTotal = (totalPrice * (stages.rate / 100)).toFixed(2)
  220. }
  221. // 处理允许分期的区间,公式为总价格要大于分期数/100
  222. this.totalPrice < stages.numberOfStages / 100 ? stages.disabled = true : stages.disabled = false
  223. })
  224. },
  225. /**
  226. * 通知父组件
  227. */
  228. handleNoticeFather() {
  229. const { paymentMode, flowerObj } = this
  230. const params = {
  231. paymentMode,
  232. huabeiPeriod: flowerObj.hbByStagesPeriods
  233. }
  234. this.$emit('change', params)
  235. }
  236. }
  237. }
  238. </script>
  239. <style
  240. lang="scss"
  241. scoped
  242. >
  243. .cashier-list-content {
  244. width: 100%;
  245. padding: 0rpx 15rpx;
  246. box-sizing: border-box;
  247. background: #fff;
  248. .u-radio-group {
  249. display: block !important;
  250. }
  251. .cashier {
  252. border-bottom: 2rpx solid #d0d0d0;
  253. &:last-child {
  254. border-bottom: none
  255. }
  256. .cashier-item {
  257. display: flex;
  258. align-items: center;
  259. justify-content: space-between;
  260. padding: 20rpx 0;
  261. box-sizing: border-box;
  262. position: relative;
  263. .icon-text {
  264. display: flex;
  265. align-items: center;
  266. justify-content: center;
  267. image {
  268. width: 50rpx;
  269. height: 50rpx;
  270. margin-right: 15rpx;
  271. }
  272. }
  273. .radio-context {
  274. display: flex;
  275. align-items: center;
  276. font-size: 14rpx;
  277. .radio {
  278. margin-left: 15rpx;
  279. }
  280. }
  281. }
  282. .ali-hb-content {
  283. padding: 10rpx 20px;
  284. box-sizing: border-box;
  285. border-top: 2rpx solid #d0d0d0;
  286. }
  287. }
  288. }
  289. </style>