giveMemberModel.vue 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <div class="chioseWrap">
  3. <p>
  4. 您将为以下<span>{{ tableList.length }}</span
  5. >位学员激活云教练,激活金额<span>{{
  6. selectStudentMoney | moneyFormat
  7. }}</span
  8. >元
  9. </p>
  10. <el-form :inline="true" ref="payForm" :model="payForm">
  11. <el-form-item
  12. prop="payType"
  13. :rules="[
  14. { required: true, message: '请选择支付方式', trigger: 'change' }
  15. ]"
  16. >
  17. <el-select
  18. v-model.trim="payForm.payType"
  19. style="width: 180px"
  20. clearable
  21. filterable
  22. placeholder="请选择支付方式"
  23. >
  24. <el-option label="支付宝支付" value="alipay_qr"></el-option>
  25. <el-option label="微信支付" value="wx_pub"></el-option>
  26. </el-select>
  27. </el-form-item>
  28. </el-form>
  29. <el-table
  30. style="width: 100%"
  31. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  32. :data="tableList"
  33. >
  34. <el-table-column align="center" prop="name" label="学员姓名">
  35. </el-table-column>
  36. <el-table-column align="center" prop="phone" label="手机号">
  37. </el-table-column>
  38. <el-table-column align="center" prop="type" label="云教练类型">
  39. <template slot-scope="scope">
  40. {{ scope.row.type | memberEnumType }}
  41. </template>
  42. </el-table-column>
  43. <el-table-column
  44. align="center"
  45. prop="time"
  46. label="数量"
  47. ></el-table-column>
  48. <el-table-column align="center" label="缴费金额(元)">
  49. <template slot-scope="scope">
  50. {{ scope.row.amount | hasMoneyFormat }}
  51. </template>
  52. </el-table-column>
  53. </el-table>
  54. <span slot="footer" class="dialog-footer">
  55. <el-button
  56. @click="
  57. $listeners.close();
  58. $listeners.getList();
  59. "
  60. >取 消</el-button
  61. >
  62. <el-button @click="onMemberPay" type="primary">确 定</el-button>
  63. </span>
  64. <el-dialog
  65. title="激活云教练"
  66. :visible.sync="payMentVisible"
  67. :before-close="onClose"
  68. v-if="payMentVisible"
  69. width="500px"
  70. append-to-body
  71. >
  72. <giveMemberPayment
  73. :tableList="tableList"
  74. v-on="$listeners"
  75. :orderNo="orderNo"
  76. :codeUrl="codeUrl"
  77. @close="onPaymentClose"
  78. />
  79. </el-dialog>
  80. </div>
  81. </template>
  82. <script>
  83. import { cloudPay } from "../api";
  84. import { vaildStudentUrl } from "@/utils/validate";
  85. import giveMemberPayment from "@/views/resetTeaming/modals/giveMemberPayment";
  86. export default {
  87. props: ["tableList"],
  88. components: { giveMemberPayment },
  89. data() {
  90. return {
  91. payForm: {
  92. payType: null
  93. },
  94. pay_channel: null, //支付渠道
  95. selectStudentMoney: 0, // 选中学生金额
  96. payMentVisible: false,
  97. codeUrl: null,
  98. orderNo: null
  99. };
  100. },
  101. async mounted() {
  102. let tableList = this.tableList || [];
  103. for (let i of tableList) {
  104. this.selectStudentMoney += parseFloat(i.amount);
  105. }
  106. },
  107. methods: {
  108. onMemberPay() {
  109. this.$refs.payForm.validate(async _ => {
  110. if (_) {
  111. try {
  112. const res = await cloudPay(this.tableList);
  113. console.log(res);
  114. if (res.data.amount == 0 && res.data.orderNo) {
  115. this.$message.success("您已成功缴费");
  116. this.onPaymentClose(true);
  117. this.$listeners.getList();
  118. return;
  119. }
  120. const payForm = this.payForm;
  121. // // 二维码页面, 唤起支付页面
  122. const {
  123. orderNo,
  124. sign,
  125. amount,
  126. orderBody,
  127. orderSubject,
  128. tenantId,
  129. returnUrl,
  130. notifyUrl
  131. } = res.data.payMap;
  132. this.orderNo = orderNo;
  133. this.codeUrl =
  134. vaildStudentUrl() +
  135. "/#/payCenter?orderNo=" +
  136. orderNo +
  137. "&sign=" +
  138. sign +
  139. "&amount=" +
  140. amount +
  141. "&payType=" +
  142. payForm.payType +
  143. "&orderBody=" +
  144. orderBody +
  145. "&orderSubject=" +
  146. orderSubject +
  147. "&platform=cloudTeacherOrder" +
  148. "&tenantId=" +
  149. tenantId +
  150. "&returnUrl=" +
  151. returnUrl +
  152. "&notifyUrl=" +
  153. notifyUrl;
  154. console.log(this.codeUrl, "codeUrl");
  155. this.payMentVisible = true;
  156. } catch (e) {}
  157. }
  158. });
  159. },
  160. onClose(done) {
  161. this.onPaymentClose(false, done);
  162. },
  163. onPaymentClose(hideTip = false, callBack) {
  164. if (hideTip) {
  165. this.payMentVisible = false;
  166. this.$emit("close");
  167. this.$emit("getList");
  168. return;
  169. }
  170. this.$confirm(`是否支付完成?`, "提示", {
  171. confirmButtonText: "已完成支付",
  172. cancelButtonText: "未完成支付",
  173. type: "warning"
  174. })
  175. .then(async res => {
  176. if (typeof callBack == "function") {
  177. callBack();
  178. }
  179. this.payMentVisible = false;
  180. })
  181. .catch(e => {
  182. if (typeof callBack == "function") {
  183. callBack();
  184. }
  185. this.payMentVisible = false;
  186. });
  187. }
  188. }
  189. };
  190. </script>
  191. <style lang="less" scoped>
  192. .chioseWrap {
  193. font-size: 16px;
  194. > p {
  195. font-weight: 500;
  196. padding-bottom: 15px;
  197. span {
  198. color: red;
  199. padding: 0 3px;
  200. }
  201. }
  202. }
  203. .dialog-footer {
  204. text-align: right;
  205. display: block;
  206. padding-top: 15px;
  207. }
  208. </style>