ReopenCardDialog.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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="reopen-card-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 { reopenCard } 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. },
  44. cardIds: {
  45. type: Array,
  46. default: () => [],
  47. },
  48. });
  49. const emit = defineEmits(["update:modelValue", "confirm", "success"]);
  50. const loading = ref(false);
  51. const visible = computed({
  52. get: () => props.modelValue,
  53. set: (value) => emit("update:modelValue", value),
  54. });
  55. // 获取确认消息
  56. function getConfirmMessage() {
  57. // 处理 cardNo 为数组的情况
  58. if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
  59. if (props.cardNo.length === 1) {
  60. return `是否确认重开VIP卡编号为${props.cardNo[0]}的数据项?`;
  61. } else {
  62. return `是否确认重开以下${
  63. props.cardNo.length
  64. }张VIP卡?\n${props.cardNo.join("、")}`;
  65. }
  66. }
  67. // 处理 cardNo 为单个值的情况
  68. else if (props.cardNo) {
  69. return `是否确认重开VIP卡编号为${props.cardNo}的数据项?`;
  70. }
  71. // 处理 cardIds 的情况
  72. else if (props.cardIds && props.cardIds.length > 0) {
  73. return `是否确认重开选中的${props.cardIds.length}张学习卡?`;
  74. }
  75. return "是否确认重开?";
  76. }
  77. // 取消
  78. function handleCancel() {
  79. visible.value = false;
  80. }
  81. // 确认重开
  82. async function handleConfirm() {
  83. try {
  84. loading.value = true;
  85. // 确定要重开的卡ID
  86. let cardIdsToReopen = [];
  87. // 处理 cardNo 为数组的情况
  88. if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
  89. cardIdsToReopen = props.cardNo;
  90. }
  91. // 处理 cardNo 为单个值的情况
  92. else if (props.cardNo) {
  93. cardIdsToReopen = [props.cardNo];
  94. }
  95. // 处理 cardIds 的情况
  96. else if (props.cardIds && props.cardIds.length > 0) {
  97. cardIdsToReopen = props.cardIds;
  98. }
  99. if (cardIdsToReopen.length === 0) {
  100. throw new Error("没有选择要重开的卡片");
  101. }
  102. // 调用重开API
  103. await reopenCard(cardIdsToReopen);
  104. emit("success", "重开成功!");
  105. visible.value = false;
  106. } catch (error) {
  107. console.error("重开失败:", error);
  108. emit("confirm", { error: error.message });
  109. } finally {
  110. loading.value = false;
  111. }
  112. }
  113. </script>
  114. <style scoped>
  115. .reopen-card-confirm-content {
  116. padding: 20px 0;
  117. }
  118. .confirm-item {
  119. display: flex;
  120. align-items: flex-start;
  121. gap: 12px;
  122. }
  123. .warning-icon {
  124. color: #e6a23c;
  125. font-size: 20px;
  126. margin-top: 2px;
  127. flex-shrink: 0;
  128. }
  129. .confirm-text {
  130. font-size: 14px;
  131. line-height: 1.5;
  132. color: #ffffff;
  133. }
  134. .dialog-footer {
  135. text-align: right;
  136. }
  137. </style>