rate-dialog.vue 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. <script setup lang="ts">
  2. import { reactive, ref } from "vue";
  3. import { addPlatformRate, updatePlatformRate } from "@/api/platform";
  4. import { ElMessage } from "element-plus";
  5. const emit = defineEmits(["refresh"]);
  6. const formRef = ref();
  7. const dialogVisible = ref(false);
  8. const dialogType = ref<"add" | "edit" | "view">("add");
  9. const loading = ref(false);
  10. const state = reactive({
  11. ruleForm: {
  12. id: null as number | null,
  13. name: "",
  14. feeRate: null as number | null,
  15. withdrawalFeeRate: null as number | null
  16. },
  17. rules: {
  18. name: [{ required: true, message: "请输入费率名称", trigger: "blur" }]
  19. }
  20. });
  21. const resetForm = () => {
  22. state.ruleForm = {
  23. id: null,
  24. name: "",
  25. feeRate: null,
  26. withdrawalFeeRate: null
  27. };
  28. formRef.value?.resetFields();
  29. };
  30. const open = async (type: "add" | "edit" | "view", row?: any) => {
  31. dialogType.value = type;
  32. resetForm();
  33. if (row) {
  34. state.ruleForm = { ...row };
  35. }
  36. dialogVisible.value = true;
  37. };
  38. const handleClose = () => {
  39. dialogVisible.value = false;
  40. resetForm();
  41. };
  42. const handleSubmit = async () => {
  43. const valid = await formRef.value?.validate().catch(() => false);
  44. if (!valid) return;
  45. loading.value = true;
  46. try {
  47. if (dialogType.value === "add") {
  48. await addPlatformRate(state.ruleForm);
  49. ElMessage.success("新增成功");
  50. } else {
  51. await updatePlatformRate(state.ruleForm);
  52. ElMessage.success("修改成功");
  53. }
  54. handleClose();
  55. emit("refresh");
  56. } catch (e) {
  57. ElMessage.error("操作失败");
  58. } finally {
  59. loading.value = false;
  60. }
  61. };
  62. const isView = () => dialogType.value === "view";
  63. const getTitle = () => {
  64. const map = { add: "新增费率", edit: "编辑费率", view: "费率详情" };
  65. return map[dialogType.value];
  66. };
  67. defineExpose({ open });
  68. </script>
  69. <template>
  70. <el-dialog
  71. v-model="dialogVisible"
  72. :title="getTitle()"
  73. width="600px"
  74. :close-on-click-modal="false"
  75. destroy-on-close
  76. >
  77. <el-form
  78. ref="formRef"
  79. :model="state.ruleForm"
  80. :rules="state.rules"
  81. label-position="top"
  82. :disabled="isView()"
  83. >
  84. <el-form-item label="费率名称" prop="name">
  85. <el-input v-model="state.ruleForm.name" placeholder="请输入费率名称" clearable />
  86. </el-form-item>
  87. <el-form-item label="平台费率(0.1代表10%)" prop="feeRate">
  88. <el-input-number
  89. v-model="state.ruleForm.feeRate"
  90. :min="0"
  91. :max="1"
  92. :step="0.1"
  93. :precision="2"
  94. placeholder="平台费率"
  95. class="w100"
  96. />
  97. </el-form-item>
  98. <el-form-item label="提现手续费率(0.006代表6‰)" prop="withdrawalFeeRate">
  99. <el-input-number
  100. v-model="state.ruleForm.withdrawalFeeRate"
  101. :min="0"
  102. :max="1"
  103. :step="0.001"
  104. :precision="3"
  105. placeholder="提现手续费率"
  106. class="w100"
  107. />
  108. </el-form-item>
  109. </el-form>
  110. <template #footer>
  111. <span class="dialog-footer">
  112. <el-button @click="handleClose">取 消</el-button>
  113. <el-button v-if="!isView()" :loading="loading" type="primary" @click="handleSubmit">
  114. 确 定
  115. </el-button>
  116. </span>
  117. </template>
  118. </el-dialog>
  119. </template>
  120. <style scoped lang="scss">
  121. .w100 {
  122. width: 100%;
  123. }
  124. </style>