Quellcode durchsuchen

【新增】MALL: 会员列表增加修改余额操作

puhui999 vor 8 Monaten
Ursprung
Commit
231bdd1dd0

+ 144 - 0
src/views/member/user/components/UserBalanceUpdateForm.vue

@@ -0,0 +1,144 @@
+<template>
+  <Dialog v-model="dialogVisible" title="修改用户余额" width="600">
+    <el-form
+      ref="formRef"
+      v-loading="formLoading"
+      :model="formData"
+      :rules="formRules"
+      label-width="130px"
+    >
+      <el-form-item label="用户编号" prop="id">
+        <el-input v-model="formData.id" class="!w-240px" disabled />
+      </el-form-item>
+      <el-form-item label="用户昵称" prop="nickname">
+        <el-input v-model="formData.nickname" class="!w-240px" disabled />
+      </el-form-item>
+      <el-form-item label="变动前余额(元)" prop="balance">
+        <el-input-number v-model="formData.balance" class="!w-240px" disabled />
+      </el-form-item>
+      <el-form-item label="变动类型" prop="changeType">
+        <el-radio-group v-model="formData.changeType">
+          <el-radio :label="1">增加</el-radio>
+          <el-radio :label="-1">减少</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      <el-form-item label="变动余额(元)" prop="changeBalance">
+        <el-input-number
+          v-model="formData.changeBalance"
+          :min="0"
+          :precision="2"
+          :step="0.1"
+          class="!w-240px"
+        />
+      </el-form-item>
+      <el-form-item label="变动后余额(元)">
+        <el-input-number v-model="balanceResult" class="!w-240px" disabled />
+      </el-form-item>
+    </el-form>
+    <template #footer>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="dialogVisible = false">取 消</el-button>
+    </template>
+  </Dialog>
+</template>
+<script lang="ts" setup>
+import * as UserApi from '@/api/member/user'
+import * as WalletApi from '@/api/pay/wallet/balance'
+import { convertToInteger, formatToFraction } from '@/utils'
+
+/** 修改用户余额表单 */
+defineOptions({ name: 'UpdateBalanceForm' })
+
+const { t } = useI18n() // 国际化
+const message = useMessage() // 消息弹窗
+
+const dialogVisible = ref(false) // 弹窗的是否展示
+const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
+const formData = ref({
+  id: undefined,
+  nickname: undefined,
+  balance: '0',
+  changeBalance: 0,
+  changeType: 1
+})
+const formRules = reactive({
+  changeBalance: [{ required: true, message: '变动余额不能为空', trigger: 'blur' }]
+})
+const formRef = ref() // 表单 Ref
+
+/** 打开弹窗 */
+const open = async (id?: number) => {
+  dialogVisible.value = true
+  resetForm()
+  // 修改时,设置数据
+  if (id) {
+    formLoading.value = true
+    try {
+      const user = await UserApi.getUser(id)
+      const wallet = await WalletApi.getWallet({ userId: user.id || 0 })
+      formData.value.id = user.id
+      formData.value.nickname = user.nickname
+      formData.value.balance = formatToFraction(wallet.balance)
+      formData.value.changeType = 1 // 默认增加余额
+      formData.value.changeBalance = 0 // 变动余额默认0
+    } finally {
+      formLoading.value = false
+    }
+  }
+}
+defineExpose({ open }) // 提供 open 方法,用于打开弹窗
+
+/** 提交表单 */
+const emit = defineEmits(['success']) // 定义 success 事件,用于操作成功后的回调
+const submitForm = async () => {
+  // 校验表单
+  if (!formRef) return
+  const valid = await formRef.value.validate()
+  if (!valid) return
+
+  if (formData.value.changeBalance <= 0) {
+    message.error('变动余额不能为零')
+    return
+  }
+  if (convertToInteger(balanceResult.value) < 0) {
+    message.error('变动后的余额不能小于 0')
+    return
+  }
+
+  // 提交请求
+  formLoading.value = true
+  try {
+    await UserApi.updateUserBalance({
+      id: formData.value.id,
+      balance: convertToInteger(balanceResult.value)
+    })
+
+    message.success(t('common.updateSuccess'))
+    dialogVisible.value = false
+    // 发送操作成功的事件
+    emit('success')
+  } finally {
+    formLoading.value = false
+  }
+}
+
+/** 重置表单 */
+const resetForm = () => {
+  formData.value = {
+    id: undefined,
+    nickname: undefined,
+    balance: '0',
+    changeBalance: 0,
+    changeType: 1
+  }
+  formRef.value?.resetFields()
+}
+
+/** 变动后的余额 */
+const balanceResult = computed(() =>
+  formatToFraction(
+    convertToInteger(formData.value.balance) +
+      convertToInteger(formData.value.changeBalance) * formData.value.changeType
+  )
+)
+</script>

+ 0 - 0
src/views/member/user/UserLevelUpdateForm.vue → src/views/member/user/components/UserLevelUpdateForm.vue


+ 8 - 7
src/views/member/user/UserPointUpdateForm.vue → src/views/member/user/components/UserPointUpdateForm.vue

@@ -1,11 +1,11 @@
 <template>
-  <Dialog title="修改用户积分" v-model="dialogVisible" width="600">
+  <Dialog v-model="dialogVisible" title="修改用户积分" width="600">
     <el-form
       ref="formRef"
+      v-loading="formLoading"
       :model="formData"
       :rules="formRules"
       label-width="100px"
-      v-loading="formLoading"
     >
       <el-form-item label="用户编号" prop="id">
         <el-input v-model="formData.id" class="!w-240px" disabled />
@@ -23,19 +23,19 @@
         </el-radio-group>
       </el-form-item>
       <el-form-item label="变动积分" prop="changePoint">
-        <el-input-number v-model="formData.changePoint" class="!w-240px" :min="0" :precision="0" />
+        <el-input-number v-model="formData.changePoint" :min="0" :precision="0" class="!w-240px" />
       </el-form-item>
       <el-form-item label="变动后积分">
         <el-input-number v-model="pointResult" class="!w-240px" disabled />
       </el-form-item>
     </el-form>
     <template #footer>
-      <el-button @click="submitForm" type="primary" :disabled="formLoading">确 定</el-button>
+      <el-button :disabled="formLoading" type="primary" @click="submitForm">确 定</el-button>
       <el-button @click="dialogVisible = false">取 消</el-button>
     </template>
   </Dialog>
 </template>
-<script setup lang="ts">
+<script lang="ts" setup>
 import * as UserApi from '@/api/member/user'
 
 /** 修改用户积分表单 */
@@ -115,8 +115,9 @@ const resetForm = () => {
   formData.value = {
     id: undefined,
     nickname: undefined,
-    levelId: undefined,
-    reason: undefined
+    point: 0,
+    changePoint: 0,
+    changeType: 1
   }
   formRef.value?.resetFields()
 }

+ 0 - 14
src/views/member/user/components/balance-list.vue

@@ -1,14 +0,0 @@
-<script lang="ts">
-import { defineComponent } from 'vue'
-
-export default defineComponent({
-  name: 'BalanceList'
-})
-</script>
-
-<!-- TODO @芋艿:未来实现,等周建的 -->
-<template>
-  <div>余额列表</div>
-</template>
-
-<style scoped lang="scss"></style>

+ 8 - 4
src/views/member/user/index.vue

@@ -172,7 +172,7 @@
                     v-if="checkPermi(['member:user:update-balance'])"
                     command="handleUpdateBlance"
                   >
-                    修改余额(WIP)
+                    修改余额
                   </el-dropdown-item>
                 </el-dropdown-menu>
               </template>
@@ -196,6 +196,8 @@
   <UserLevelUpdateForm ref="updateLevelFormRef" @success="getList" />
   <!-- 修改用户积分弹窗 -->
   <UserPointUpdateForm ref="updatePointFormRef" @success="getList" />
+  <!-- 修改用户余额弹窗 -->
+  <UserBalanceUpdateForm ref="UpdateBalanceFormRef" @success="getList" />
   <!-- 发送优惠券弹窗 -->
   <CouponSendForm ref="couponSendFormRef" />
 </template>
@@ -207,8 +209,9 @@ import UserForm from './UserForm.vue'
 import MemberTagSelect from '@/views/member/tag/components/MemberTagSelect.vue'
 import MemberLevelSelect from '@/views/member/level/components/MemberLevelSelect.vue'
 import MemberGroupSelect from '@/views/member/group/components/MemberGroupSelect.vue'
-import UserLevelUpdateForm from './UserLevelUpdateForm.vue'
-import UserPointUpdateForm from './UserPointUpdateForm.vue'
+import UserLevelUpdateForm from './components/UserLevelUpdateForm.vue'
+import UserPointUpdateForm from './components/UserPointUpdateForm.vue'
+import UserBalanceUpdateForm from './components/UserBalanceUpdateForm.vue'
 import { CouponSendForm } from '@/views/mall/promotion/coupon/components'
 import { checkPermi } from '@/utils/permission'
 
@@ -233,6 +236,7 @@ const queryParams = reactive({
 const queryFormRef = ref() // 搜索的表单
 const updateLevelFormRef = ref() // 修改会员等级表单
 const updatePointFormRef = ref() // 修改会员积分表单
+const UpdateBalanceFormRef = ref() // 修改用户余额表单
 const selectedIds = ref<number[]>([]) // 表格的选中 ID 数组
 
 /** 查询列表 */
@@ -299,7 +303,7 @@ const handleCommand = (command: string, row: UserApi.UserVO) => {
       updatePointFormRef.value.open(row.id)
       break
     case 'handleUpdateBlance':
-      // todo @jason:增加一个【修改余额】
+      UpdateBalanceFormRef.value.open(row.id)
       break
     default:
       break