| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181 |
- <template>
- <el-dialog
- title="缴费"
- v-model="visible"
- width="400px"
- append-to-body
- align-center
- :center="true"
- :destroy-on-close="true"
- >
- <div class="payment-confirm-content">
- <div class="confirm-item">
- <el-icon class="warning-icon">
- <Warning />
- </el-icon>
- <span class="confirm-text">
- {{ getConfirmMessage() }}
- </span>
- </div>
- </div>
- <template #footer>
- <div class="dialog-footer">
- <el-button @click="handleCancel">取消</el-button>
- <el-button type="primary" @click="handleConfirm" :loading="loading"
- >确定</el-button
- >
- </div>
- </template>
- </el-dialog>
- </template>
- <script setup>
- import { ref, computed } from "vue";
- import { Warning } from "@element-plus/icons-vue";
- import { payCard, listCards } from "@/api/dz/cards";
- const props = defineProps({
- modelValue: {
- type: Boolean,
- default: false,
- },
- cardNo: {
- type: [String, Number, Array],
- default: "",
- // 卡号(字符串),缴费时会自动转换为 cardId
- },
- cardIds: {
- type: Array,
- default: () => [],
- // 卡ID(数字数组),直接用于缴费API
- },
- });
- const emit = defineEmits(["update:modelValue", "confirm", "success"]);
- const loading = ref(false);
- const visible = computed({
- get: () => props.modelValue,
- set: (value) => emit("update:modelValue", value),
- });
- // 获取确认消息
- function getConfirmMessage() {
- // 处理 cardNo 为数组的情况
- if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
- if (props.cardNo.length === 1) {
- return `是否确认缴费vip卡编号为${props.cardNo[0]}的数据项?`;
- } else {
- return `是否确认缴费以下${
- props.cardNo.length
- }张vip卡?\n${props.cardNo.join("、")}`;
- }
- }
- // 处理 cardNo 为单个值的情况
- else if (props.cardNo) {
- return `是否确认缴费vip卡编号为${props.cardNo}的数据项?`;
- }
- // 处理 cardIds 的情况
- else if (props.cardIds && props.cardIds.length > 0) {
- return `是否确认缴费选中的${props.cardIds.length}张学习卡?`;
- }
- return "是否确认缴费?";
- }
- // 取消
- function handleCancel() {
- visible.value = false;
- }
- // 确认缴费
- async function handleConfirm() {
- try {
- loading.value = true;
- // 确定要缴费的卡ID
- let cardIdsToPay = [];
- // 处理 cardNo 为数组的情况
- if (Array.isArray(props.cardNo) && props.cardNo.length > 0) {
- // 根据 cardNo 数组查询对应的 cardId
- for (const cardNo of props.cardNo) {
- const cardInfo = await getCardIdByCardNo(cardNo);
- if (cardInfo) {
- cardIdsToPay.push(cardInfo.cardId);
- }
- }
- }
- // 处理 cardNo 为单个值的情况
- else if (props.cardNo) {
- const cardInfo = await getCardIdByCardNo(props.cardNo);
- if (cardInfo) {
- cardIdsToPay.push(cardInfo.cardId);
- }
- }
- // 处理 cardIds 的情况(直接使用 cardId)
- else if (props.cardIds && props.cardIds.length > 0) {
- cardIdsToPay = props.cardIds;
- }
- if (cardIdsToPay.length === 0) {
- throw new Error("没有选择要缴费的卡片");
- }
- // 调用缴费API
- await payCard(cardIdsToPay);
- emit("success", "缴费成功!");
- visible.value = false;
- } catch (error) {
- console.error("缴费失败:", error);
- emit("confirm", { error: error.message });
- } finally {
- loading.value = false;
- }
- }
- // 根据 cardNo 查询 cardId
- async function getCardIdByCardNo(cardNo) {
- try {
- const response = await listCards({ cardNo: cardNo });
- if (response.code === 200 && response.rows && response.rows.length > 0) {
- return response.rows[0]; // 返回第一个匹配的卡片信息
- }
- return null;
- } catch (error) {
- console.error(`根据卡号 ${cardNo} 查询卡片信息失败:`, error);
- return null;
- }
- }
- </script>
- <style scoped>
- .payment-confirm-content {
- padding: 20px 0;
- }
- .confirm-item {
- display: flex;
- align-items: flex-start;
- gap: 12px;
- }
- .warning-icon {
- color: #e6a23c;
- font-size: 20px;
- margin-top: 2px;
- flex-shrink: 0;
- }
- .confirm-text {
- font-size: 14px;
- line-height: 1.5;
- color: #ffffff;
- }
- .dialog-footer {
- text-align: right;
- }
- </style>
|