index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. <template>
  2. <view class="container b-f p-b">
  3. <view class="base">
  4. <view class="merchant-name">
  5. <view class="name">{{ storeInfo ? storeInfo.name : systemName }}</view>
  6. </view>
  7. </view>
  8. <view class="pay-form">
  9. <u-form :model="form" label-width="100rpx">
  10. <u-form-item class="input" prop="payAmount" :border-bottom="false" label="金额" rules="[{ required: true, message: '请输入支付金额', trigger: 'blur' }]">
  11. <view class="amount-icon">¥</view>
  12. <view class="amount">{{ form.payAmount }}</view>
  13. </u-form-item>
  14. <u-form-item class="input" v-if="form.remark" :border-bottom="false" label="备注">
  15. <u-input v-model="form.remark" type="text" placeholder="请输入备注信息"/>
  16. </u-form-item>
  17. <u-form-item :border-bottom="false">
  18. <view class="remark" @click="showRemarkPop()"><text class="iconfont icon-edit"></text>添加备注</view>
  19. </u-form-item>
  20. </u-form>
  21. </view>
  22. <neoceansoft-keyboard keyboardType="payment" behaviorBgColor="#113a28" @result="changeAmount" @paymentClick="doPay"></neoceansoft-keyboard>
  23. <view class="remark-popup">
  24. <uni-popup ref="remarkPopup" type="dialog">
  25. <uni-popup-dialog mode="input" focus="false" v-model="form.remark" title="备注信息" type="info" placeholder="请输入备注信息" :before-close="true" @close="cancelRemark" @confirm="doRemark"></uni-popup-dialog>
  26. </uni-popup>
  27. </view>
  28. <Popup v-if="!isLoading" v-model="showPopup" :payInfo="payInfo" @modifyChoice="modifyChoice"/>
  29. </view>
  30. </template>
  31. <script>
  32. import jyfParser from '@/components/jyf-parser/jyf-parser'
  33. import * as SettlementApi from '@/api/settlement'
  34. import * as settingApi from '@/api/setting'
  35. import PayTypeEnum from '@/common/enum/order/PayType'
  36. import { checkLogin, needLogin } from '@/utils/app'
  37. import Popup from './components/Popup'
  38. import config from '@/config'
  39. export default {
  40. components: {
  41. Popup
  42. },
  43. data() {
  44. return {
  45. systemName: config.name,
  46. // 加载中
  47. isLoading: false,
  48. showPopup: false,
  49. form: {'payAmount': '', 'remark' : ''},
  50. payInfo: {'usePoint': 0, 'pointAmount': 0, 'payAmount': 0, 'totalAmount': 0, 'payDiscount': 1, 'maxPoint': 0, 'couponInfo': null, 'couponAmount': 0, "isLogin": false, "canUsedAsMoney": "false"},
  51. canUsedAsMoney: false,
  52. exchangeNeedPoint: 0,
  53. canUsePointAmount: 0,
  54. storeInfo: null
  55. }
  56. },
  57. /**
  58. * 生命周期函数--监听页面显示
  59. */
  60. onShow(options) {
  61. this.prePay();
  62. this.systemConfig();
  63. // 判断是否已登录
  64. this.payInfo.isLogin = checkLogin();
  65. },
  66. methods: {
  67. showRemarkPop() {
  68. this.$refs.remarkPopup.open('top');
  69. },
  70. doRemark(remark) {
  71. this.form.remark = remark
  72. this.$refs.remarkPopup.close();
  73. },
  74. cancelRemark() {
  75. this.$refs.remarkPopup.close();
  76. },
  77. // 支付金额改变
  78. changeAmount(e) {
  79. this.form.payAmount = e;
  80. },
  81. systemConfig() {
  82. const app = this;
  83. settingApi.systemConfig()
  84. .then(result => {
  85. app.storeInfo = result.data.storeInfo;
  86. })
  87. },
  88. // 支付前查询
  89. prePay() {
  90. const app = this
  91. // 请求api
  92. SettlementApi.prePay()
  93. .then(result => {
  94. if (result.data) {
  95. app.canUsedAsMoney = result.data.canUsedAsMoney;
  96. app.exchangeNeedPoint = result.data.exchangeNeedPoint;
  97. app.canUsePointAmount = result.data.canUsePointAmount;
  98. app.payInfo.maxPoint = result.data.canUsePointAmount;
  99. app.payInfo.couponInfo = result.data.canUseCouponInfo;
  100. app.payInfo.couponAmount = (result.data.canUseCouponInfo === null) ? 0 : result.data.canUseCouponInfo.amount;
  101. app.payInfo.usePoint = result.data.canUsePointAmount;
  102. app.payInfo.totalAmount = app.form.payAmount;
  103. app.payInfo.payDiscount = result.data.payDiscount;
  104. app.payInfo.canUsedAsMoney = result.data.canUsedAsMoney;
  105. app.payInfo.isLogin = checkLogin();
  106. app.payInfo.exchangeNeedPoint = app.exchangeNeedPoint;
  107. app.modifyChoice(app.payInfo);
  108. }
  109. })
  110. .catch(err => {
  111. if (err.result) {
  112. const errData = err.result.data;
  113. if (errData) {
  114. return false;
  115. }
  116. }
  117. })
  118. },
  119. // 修改支付选择
  120. modifyChoice(payInfo) {
  121. const app = this;
  122. app.payInfo = payInfo;
  123. if (app.canUsedAsMoney == 'true') {
  124. app.payInfo.usePoint = parseInt(app.payInfo.usePoint);
  125. }
  126. if (app.canUsedAsMoney == 'true' && parseFloat(app.form.payAmount) > 0.1) {
  127. app.payInfo.pointAmount = parseInt(app.payInfo.usePoint) / parseInt(app.exchangeNeedPoint);
  128. }
  129. app.payInfo.payAmount = parseFloat(app.form.payAmount);
  130. // 会员等级折扣金额
  131. if (app.payInfo.payDiscount !== null && app.payInfo.payDiscount > 0) {
  132. let memberDiscount = parseFloat(app.payInfo.payAmount) - (parseFloat(app.payInfo.payAmount) * parseFloat(app.payInfo.payDiscount));
  133. app.payInfo.payAmount = app.payInfo.payAmount - parseFloat(memberDiscount);
  134. }
  135. // 积分金额不能大于支付金额
  136. if (parseFloat(app.payInfo.pointAmount) > parseFloat(app.payInfo.payAmount)) {
  137. app.payInfo.pointAmount = parseFloat(app.payInfo.payAmount);
  138. app.payInfo.usePoint = parseInt(app.exchangeNeedPoint) * parseFloat(app.payInfo.payAmount);
  139. }
  140. app.payInfo.payAmount = parseFloat(app.payInfo.payAmount) - parseFloat(app.payInfo.pointAmount);
  141. let useCoupon = true;
  142. if (app.payInfo.payAmount <= 0) {
  143. app.payInfo.couponAmount = 0;
  144. useCoupon = false;
  145. }
  146. // 使用了卡券进行抵扣
  147. if (app.payInfo.couponInfo !== null && app.payInfo.payAmount > 0 && useCoupon) {
  148. if (parseFloat(app.payInfo.couponAmount) > app.payInfo.payAmount) {
  149. app.payInfo.couponAmount = app.payInfo.payAmount;
  150. }
  151. app.payInfo.payAmount = app.payInfo.payAmount - parseFloat(app.payInfo.couponAmount);
  152. }
  153. // 支付金额不能小于0
  154. if (app.payInfo.payAmount < 0) {
  155. app.payInfo.payAmount = 0;
  156. }
  157. },
  158. // 提交支付
  159. doPay() {
  160. const app = this;
  161. if (!app.payInfo.isLogin) {
  162. needLogin();
  163. return false;
  164. }
  165. app.prePay();
  166. if (app.form.payAmount.length < 1) {
  167. app.$error('支付金额不能为空');
  168. return false;
  169. }
  170. if (parseFloat(app.form.payAmount) < 0.01) {
  171. app.$error('支付金额不能小于0.01元');
  172. return false;
  173. }
  174. if (app.canUsedAsMoney == 'true' && parseInt(app.canUsePointAmount) > 0 && parseFloat(app.form.payAmount) > 0.1) {
  175. app.payInfo.usePoint = parseInt(app.canUsePointAmount);
  176. }
  177. if (app.canUsedAsMoney == 'true' && parseInt(app.canUsePointAmount) > 0 && parseFloat(app.form.payAmount) > 0.1) {
  178. app.payInfo.pointAmount = parseInt(app.canUsePointAmount) / parseInt(app.exchangeNeedPoint);
  179. }
  180. app.payInfo.payAmount = parseFloat(app.form.payAmount);
  181. // 会员等级折扣金额
  182. if (app.payInfo.payDiscount !== null && app.payInfo.payDiscount > 0 && parseFloat(app.form.payAmount) > 0.1) {
  183. let memberDiscount = parseFloat(app.payInfo.payAmount) - (parseFloat(app.payInfo.payAmount) * parseFloat(app.payInfo.payDiscount));
  184. app.payInfo.payAmount = app.payInfo.payAmount - parseFloat(memberDiscount);
  185. }
  186. // 积分金额不能大于支付金额
  187. if (parseFloat(app.payInfo.pointAmount) > parseFloat(app.payInfo.payAmount) && parseFloat(app.form.payAmount) > 0.01) {
  188. app.payInfo.pointAmount = parseFloat(app.payInfo.payAmount);
  189. app.payInfo.usePoint = parseInt(app.exchangeNeedPoint) * parseFloat(app.payInfo.payAmount);
  190. }
  191. // 减去积分金额
  192. app.payInfo.payAmount = parseFloat(app.payInfo.payAmount) - parseFloat(app.payInfo.pointAmount)
  193. if (app.payInfo.payAmount <= 0) {
  194. app.payInfo.couponAmount = 0;
  195. }
  196. // 使用卡券进行抵扣
  197. if (app.payInfo.couponAmount > 0 && app.payInfo.payAmount > 0 && app.payInfo.couponInfo !== null) {
  198. if (parseFloat(app.payInfo.couponAmount) > app.payInfo.payAmount) {
  199. app.payInfo.couponAmount = app.payInfo.payAmount;
  200. }
  201. app.payInfo.payAmount = app.payInfo.payAmount - parseFloat(app.payInfo.couponInfo.amount);
  202. }
  203. if (app.payInfo.payAmount < 0) {
  204. app.payInfo.payAmount = 0;
  205. }
  206. app.payInfo = { "remark": app.form.remark, "pointAmount": parseFloat(app.payInfo.pointAmount).toFixed(2),
  207. "usePoint": app.payInfo.usePoint, "payAmount": parseFloat(app.payInfo.payAmount).toFixed(2),
  208. "maxPoint": app.payInfo.maxPoint, "couponInfo": app.payInfo.couponInfo, couponAmount: app.payInfo.couponAmount,
  209. "totalAmount": app.form.payAmount, "payDiscount": app.payInfo.payDiscount, "canUsedAsMoney": app.canUsedAsMoney, "isLogin": checkLogin(),
  210. "exchangeNeedPoint": app.exchangeNeedPoint };
  211. app.showPopup = !app.showPopup;
  212. return true;
  213. }
  214. }
  215. }
  216. </script>
  217. <style lang="scss" scoped>
  218. .container {
  219. min-height: 100vh;
  220. padding: 20rpx;
  221. background: #fff;
  222. color:#666666;
  223. }
  224. .base {
  225. background: $fuint-theme;
  226. padding: 30rpx;
  227. border-radius: 10rpx;
  228. color: #ffffff;
  229. margin: 20rpx;
  230. height: 100rpx;
  231. .merchant-name {
  232. margin-left: 30rpx;
  233. overflow: hidden;
  234. text-align: center;
  235. font-weight: bold;
  236. font-size: 30rpx;
  237. }
  238. }
  239. .pay-form {
  240. border: solid 3rpx $fuint-theme;
  241. padding: 30rpx;
  242. border-radius: 10rpx;
  243. margin: 60rpx 20rpx 20rpx 20rpx;
  244. .remark-popup {
  245. border: #cccccc solid 1px;
  246. background: red;
  247. }
  248. .input {
  249. padding-left: 20rpx;
  250. padding-right: 20rpx;
  251. margin-top: 30rpx;
  252. margin-bottom: 20rpx;
  253. width: 94%;
  254. display: inline-flex;
  255. }
  256. .amount {
  257. font-weight: bold;
  258. font-size: 70rpx;
  259. float: left;
  260. min-width: 330rpx;
  261. display: block;
  262. height: 88rpx;
  263. border-bottom: solid 1rpx #CCCCCC;
  264. }
  265. .amount-icon {
  266. font-size: 38rpx;
  267. font-weight: bold;
  268. float: left;
  269. }
  270. .remark {
  271. width: 100%;
  272. text-align: right;
  273. }
  274. }
  275. /* 底部操作栏 */
  276. .footer-fixed {
  277. position: fixed;
  278. bottom: var(--window-bottom);
  279. left: 0;
  280. right: 0;
  281. display: flex;
  282. height: 180rpx;
  283. padding-bottom: 30rpx;
  284. z-index: 11;
  285. box-shadow: 0 -4rpx 40rpx 0 rgba(144, 52, 52, 0.1);
  286. background: #fff;
  287. }
  288. .footer-container {
  289. width: 100%;
  290. display: flex;
  291. }
  292. // 操作按钮
  293. .foo-item-btn {
  294. flex: 1;
  295. .btn-wrapper {
  296. height: 100%;
  297. display: flex;
  298. align-items: center;
  299. }
  300. .btn-item {
  301. flex: 1;
  302. font-size: 28rpx;
  303. height: 80rpx;
  304. line-height: 80rpx;
  305. margin-right: 16rpx;
  306. margin-left: 16rpx;
  307. text-align: center;
  308. color: #fff;
  309. border-radius: 8rpx;
  310. }
  311. // 立即领取按钮
  312. .btn-item-main {
  313. background: linear-gradient(to right, #f9211c, #ff6335);
  314. }
  315. }
  316. </style>