PaymentDialog.vue 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. <template>
  2. <el-dialog
  3. title="缴费"
  4. v-model="visible"
  5. width="400px"
  6. append-to-body
  7. align-center
  8. :center="true"
  9. :destroy-on-close="true"
  10. >
  11. <div class="payment-confirm-content">
  12. <div class="confirm-item">
  13. <el-icon class="warning-icon">
  14. <Warning />
  15. </el-icon>
  16. <span class="confirm-text">
  17. {{ getConfirmMessage() }}
  18. </span>
  19. </div>
  20. </div>
  21. <template #footer>
  22. <div class="dialog-footer">
  23. <el-button @click="handleCancel">取消</el-button>
  24. <el-button type="primary" @click="handleConfirm" :loading="loading"
  25. >确定</el-button
  26. >
  27. </div>
  28. </template>
  29. </el-dialog>
  30. </template>
  31. <script setup>
  32. import { ref, computed } from "vue";
  33. import { Warning } from "@element-plus/icons-vue";
  34. import { payCard, listCards } from "@/api/dz/cards";
  35. const props = defineProps({
  36. modelValue: {
  37. type: Boolean,
  38. default: false,
  39. },
  40. cardNo: {
  41. type: [String, Number, Array],
  42. default: "",
  43. // 卡号(字符串),缴费时会自动转换为 cardId
  44. },
  45. cardIds: {
  46. type: Array,
  47. default: () => [],
  48. // 卡ID(数字数组),直接用于缴费API
  49. },
  50. });
  51. const emit = defineEmits(["update:modelValue", "confirm", "success"]);
  52. const loading = ref(false);
  53. const visible = computed({
  54. get: () => props.modelValue,
  55. set: (value) => emit("update:modelValue", value),
  56. });
  57. // 获取确认消息
  58. function getConfirmMessage() {
  59. // 处理 cardNo 为数组的情况
  60. if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
  61. if (props.cardNo.length === 1) {
  62. return `是否确认缴费vip卡编号为${props.cardNo[0]}的数据项?`;
  63. } else {
  64. return `是否确认缴费以下${
  65. props.cardNo.length
  66. }张vip卡?\n${props.cardNo.join("、")}`;
  67. }
  68. }
  69. // 处理 cardNo 为单个值的情况
  70. else if (props.cardNo) {
  71. return `是否确认缴费vip卡编号为${props.cardNo}的数据项?`;
  72. }
  73. // 处理 cardIds 的情况
  74. else if (props.cardIds && props.cardIds.length > 0) {
  75. return `是否确认缴费选中的${props.cardIds.length}张学习卡?`;
  76. }
  77. return "是否确认缴费?";
  78. }
  79. // 取消
  80. function handleCancel() {
  81. visible.value = false;
  82. }
  83. // 确认缴费
  84. async function handleConfirm() {
  85. try {
  86. loading.value = true;
  87. // 确定要缴费的卡ID
  88. let cardIdsToPay = [];
  89. // 处理 cardNo 为数组的情况
  90. if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
  91. // 根据 cardNo 数组查询对应的 cardId
  92. for (const cardNo of props.cardNo) {
  93. const cardInfo = await getCardIdByCardNo(cardNo);
  94. if (cardInfo) {
  95. cardIdsToPay.push(cardInfo.cardId);
  96. }
  97. }
  98. }
  99. // 处理 cardNo 为单个值的情况
  100. else if (props.cardNo) {
  101. const cardInfo = await getCardIdByCardNo(props.cardNo);
  102. if (cardInfo) {
  103. cardIdsToPay.push(cardInfo.cardId);
  104. }
  105. }
  106. // 处理 cardIds 的情况(直接使用 cardId)
  107. else if (props.cardIds && props.cardIds.length > 0) {
  108. cardIdsToPay = props.cardIds;
  109. }
  110. if (cardIdsToPay.length === 0) {
  111. throw new Error("没有选择要缴费的卡片");
  112. }
  113. // 调用缴费API
  114. await payCard(cardIdsToPay);
  115. emit("success", "缴费成功!");
  116. visible.value = false;
  117. } catch (error) {
  118. console.error("缴费失败:", error);
  119. emit("confirm", { error: error.message });
  120. } finally {
  121. loading.value = false;
  122. }
  123. }
  124. // 根据 cardNo 查询 cardId
  125. async function getCardIdByCardNo(cardNo) {
  126. try {
  127. const response = await listCards({ cardNo: cardNo });
  128. if (response.code === 200 && response.rows && response.rows.length > 0) {
  129. return response.rows[0]; // 返回第一个匹配的卡片信息
  130. }
  131. return null;
  132. } catch (error) {
  133. console.error(`根据卡号 ${cardNo} 查询卡片信息失败:`, error);
  134. return null;
  135. }
  136. }
  137. </script>
  138. <style scoped>
  139. .payment-confirm-content {
  140. padding: 20px 0;
  141. }
  142. .confirm-item {
  143. display: flex;
  144. align-items: flex-start;
  145. gap: 12px;
  146. }
  147. .warning-icon {
  148. color: #e6a23c;
  149. font-size: 20px;
  150. margin-top: 2px;
  151. flex-shrink: 0;
  152. }
  153. .confirm-text {
  154. font-size: 14px;
  155. line-height: 1.5;
  156. color: #ffffff;
  157. }
  158. .dialog-footer {
  159. text-align: right;
  160. }
  161. </style>