多租户商城-商户小程序端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

320 lines
8.6 KiB

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