Przeglądaj źródła

feat: 新增限额配置,支付通道修改

叶静 1 miesiąc temu
rodzic
commit
bd821989ec

+ 51 - 0
src/app/admin/api/index.js

@@ -408,5 +408,56 @@ export default {
           data: { id, isValid: 0 },
         }),
     },
+
+    // 支付限额管理
+    editPaymentLimit: (paymentId, data) =>
+      request({
+        url: `/cif/goods/editInterval/${paymentId}`,
+        method: 'PATCH',
+        data,
+      }),
+
+    // 金额商品管理
+    goods: {
+      // 获取商品列表
+      list: (data) =>
+        request({
+          url: '/cif/goods/list',
+          method: 'POST',
+          data,
+        }),
+
+      // 新增商品
+      add: (data) =>
+        request({
+          url: '/cif/goods/add',
+          method: 'POST',
+          data,
+        }),
+
+      // 更新商品
+      update: (data) =>
+        request({
+          url: '/cif/goods/update',
+          method: 'POST',
+          data,
+        }),
+
+      // 删除商品
+      delete: (id) =>
+        request({
+          url: '/cif/goods/delete',
+          method: 'GET',
+          params: { id },
+        }),
+
+      // 获取商品详情
+      detail: (id) =>
+        request({
+          url: '/cif/goods/detail',
+          method: 'GET',
+          params: { id },
+        }),
+    },
   },
 };

+ 7 - 9
src/app/admin/views/payment/components/ChannelManage.vue

@@ -5,8 +5,6 @@
         <sa-empty />
       </template>
 
-      <el-table-column prop="channelCode" :label="t('modules.payment.channelCode')" min-width="120"> </el-table-column>
-
       <el-table-column prop="channelName" :label="t('modules.payment.channelName')" min-width="150"> </el-table-column>
 
       <el-table-column prop="merchantNum" :label="t('modules.payment.merchantId')" min-width="150"> </el-table-column>
@@ -15,10 +13,11 @@
 
       <el-table-column prop="secretKey" :label="t('modules.payment.secretKey')" min-width="300">
         <template #default="scope">
-          {{ scope.row.secretKey }}
+          <span class="secret-key">{{ scope.row.secretKey }}</span>
         </template>
       </el-table-column>
 
+
       <el-table-column :label="t('common.actions')" min-width="150" fixed="right">
         <template #default="scope">
           <el-button class="is-link" type="primary" @click="editChannel(scope.row)">
@@ -33,6 +32,11 @@
           </el-popconfirm>
         </template>
       </el-table-column>
+      <el-table-column prop="notifyUrl" label="异步通知地址" min-width="200">
+        <template #default="{ row }">
+          <span class="notify-url">{{ row.notifyUrl || '--' }}</span>
+        </template>
+      </el-table-column>
     </el-table>
   </div>
 </template>
@@ -120,11 +124,5 @@ onMounted(() => {
     margin-top: 16px;
   }
 
-  .secret-key {
-    font-family: 'Courier New', monospace;
-    font-size: 12px;
-    word-break: break-all;
-    line-height: 1.4;
-  }
 }
 </style>

+ 25 - 0
src/app/admin/views/payment/components/CollectionConfig.vue

@@ -11,6 +11,11 @@
             <div class="method-name">{{ scope.row.methodName }}</div>
             <el-switch v-model="scope.row.status" :active-value="1" :inactive-value="0"
               @change="handleMethodStatusChange(scope.row)" />
+            <div>
+              <el-button type="text" size="small" @click="openPaymentLimitModal(scope.row)">
+                {{ t('modules.payment.paymentLimit') }}
+              </el-button>
+            </div>
           </div>
         </template>
       </el-table-column>
@@ -60,7 +65,9 @@
 import { onMounted, ref } from 'vue';
 import { ElMessage } from 'element-plus';
 import { useI18n } from 'vue-i18n';
+import { useModal } from '@/sheep/hooks';
 import api from '../../../api';
+import PaymentLimitModal from './PaymentLimitModal.vue';
 
 const { t } = useI18n();
 
@@ -160,6 +167,24 @@ defineExpose({
   getData,
 });
 
+// 打开支付限额配置弹窗
+function openPaymentLimitModal(paymentMethod) {
+  useModal(
+    PaymentLimitModal,
+    {
+      title: t('modules.payment.paymentLimitConfig'),
+      paymentId: paymentMethod.id,
+      paymentName: paymentMethod.methodName,
+    },
+    {
+      confirm: () => {
+        // 配置成功后可以选择是否刷新数据
+        // getData();
+      },
+    },
+  );
+}
+
 onMounted(() => {
   getData();
 });

+ 135 - 0
src/app/admin/views/payment/components/GoodsEdit.vue

@@ -0,0 +1,135 @@
+<template>
+    <el-container>
+        <el-main>
+            <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
+                <el-form-item :label="t('modules.payment.amount')" prop="amount">
+                    <el-input-number v-model="form.amount" :min="1" :max="999999999" :precision="0" style="width: 100%"
+                        :placeholder="t('modules.payment.enterAmount')" />
+                </el-form-item>
+                <el-form-item :label="t('common.status')" prop="status">
+                    <el-select v-model="form.status" style="width: 100%" :placeholder="t('common.select')">
+                        <el-option :label="t('common.enabled')" :value="1" />
+                        <el-option :label="t('common.disabled')" :value="0" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item :label="t('modules.payment.sortNum')" prop="sortNum">
+                    <el-input-number v-model="form.sortNum" :min="0" :max="999" :precision="0" style="width: 100%"
+                        :placeholder="t('modules.payment.enterSortNum')" />
+                </el-form-item>
+            </el-form>
+        </el-main>
+        <el-footer class="sa-footer--submit">
+            <el-button v-if="modal.params.type == 'add'" type="primary" @click="confirm">
+                {{ t('common.save') }}
+            </el-button>
+            <el-button v-if="modal.params.type == 'edit'" type="primary" @click="confirm">
+                {{ t('common.update') }}
+            </el-button>
+        </el-footer>
+    </el-container>
+</template>
+
+<script setup>
+import { ref, reactive, onMounted, unref } from 'vue';
+import { ElMessage } from 'element-plus';
+import { useI18n } from 'vue-i18n';
+import { cloneDeep } from 'lodash';
+import api from '../../../api';
+
+const { t } = useI18n();
+
+const emit = defineEmits(['modalCallBack']);
+const props = defineProps({
+    modal: {
+        type: Object,
+        required: true,
+    },
+});
+
+const formRef = ref();
+const form = reactive({
+    id: null,
+    amount: null,
+    status: 1,
+    sortNum: 0,
+    methodId: null,
+});
+
+const rules = reactive({
+    amount: [
+        { required: true, message: t('modules.payment.amountRequired'), trigger: 'blur' },
+        { type: 'number', min: 1, message: t('modules.payment.amountValidation'), trigger: 'blur' },
+    ],
+    status: [
+        { required: true, message: t('modules.payment.statusRequired'), trigger: 'change' },
+    ],
+    sortNum: [
+        { type: 'number', min: 0, max: 999, message: t('modules.payment.sortNumValidation'), trigger: 'blur' },
+    ],
+});
+
+// 获取详情
+async function getDetail(id) {
+    try {
+        const { code, data } = await api.payment.goods.detail(id);
+        if (code == '200' && data) {
+            form.id = data.id;
+            form.amount = data.amount;
+            form.status = data.status;
+            form.sortNum = data.sortNum;
+            form.methodId = data.methodId;
+        }
+    } catch (error) {
+        console.error('获取商品详情失败:', error);
+        ElMessage.error(t('modules.payment.getGoodsDetailFailed'));
+    }
+}
+
+// 表单提交确认
+async function confirm() {
+    unref(formRef).validate(async (valid) => {
+        if (!valid) return;
+        let submitForm = cloneDeep(form);
+        const { code } = props.modal.params.type == 'add'
+            ? await api.payment.goods.add(submitForm)
+            : await api.payment.goods.update(submitForm);
+        if (code == '200') {
+            ElMessage.success(t('message.saveSuccess'));
+            emit('modalCallBack', { event: 'confirm' });
+        }
+    });
+}
+
+// 初始化
+async function init() {
+    // 设置methodId
+    form.methodId = props.modal.params.methodId;
+
+    // 如果是编辑模式且有id,获取详情
+    if (props.modal.params.id) {
+        await getDetail(props.modal.params.id);
+    }
+}
+
+onMounted(() => {
+    init();
+});
+</script>
+
+<style lang="scss" scoped>
+// 表单样式优化
+:deep(.el-form-item) {
+    .el-form-item__label {
+        font-weight: 500;
+        color: var(--el-text-color-regular);
+    }
+
+    .el-form-item__content {
+        .el-input-number {
+            .el-input__inner {
+                text-align: left;
+            }
+        }
+    }
+}
+</style>

+ 441 - 0
src/app/admin/views/payment/components/PaymentLimitModal.vue

@@ -0,0 +1,441 @@
+<template>
+    <el-container>
+        <el-main>
+            <div class="amount-management">
+                <!-- 统一金额区间配置 -->
+                <div class="config-section">
+                    <div class="section-header">
+                        <h4>{{ t('modules.payment.amountRangeConfig') }}</h4>
+                        <p class="section-desc my-10px text-gray">{{ t('modules.payment.amountRangeDesc', {
+                            methodName:
+                                paymentName
+                        }) }}
+                        </p>
+                    </div>
+
+                    <el-form ref="rangeFormRef" :model="rangeForm" :rules="rangeRules" label-width="140px"
+                        class="range-form" inline>
+                        <el-form-item :label="t('modules.payment.minAmount')" prop="miniPrice">
+                            <el-input-number v-model="rangeForm.miniPrice" :min="0" :max="999999999" :precision="0"
+                                style="width: 160px" :placeholder="t('modules.payment.enterMinAmount')" />
+                        </el-form-item>
+                        <el-form-item :label="t('modules.payment.maxAmount')" prop="maxPrice">
+                            <el-input-number v-model="rangeForm.maxPrice" :min="0" :max="999999999" :precision="0"
+                                style="width: 160px" :placeholder="t('modules.payment.enterMaxAmount')" />
+                        </el-form-item>
+                        <el-form-item>
+                            <el-button type="primary" :loading="rangeSubmitLoading" @click="handleRangeSubmit">
+                                {{ t('common.save') }}
+                            </el-button>
+                        </el-form-item>
+                    </el-form>
+                </div>
+
+                <el-divider />
+
+                <!-- 金额配置 -->
+                <div class="goods-section">
+                    <div class="section-header">
+                        <h4>{{ t('modules.payment.amountConfig') }}</h4>
+                        <div class="header-actions">
+                            <el-button type="primary" @click="handleAddGoods">
+                                <el-icon>
+                                    <Plus />
+                                </el-icon>
+                                {{ t('common.add') }}
+                            </el-button>
+                        </div>
+                    </div>
+
+                    <!-- 商品列表 -->
+                    <div class="sa-table-wrap" v-loading="tableLoading">
+                        <el-table height="100%" class="sa-table" :data="tableData" stripe row-key="id">
+                            <template #empty>
+                                <sa-empty />
+                            </template>
+                            <el-table-column type="selection" width="48" align="center" />
+                            <el-table-column prop="id" label="ID" min-width="100" />
+                            <el-table-column prop="amount" :label="t('modules.payment.amount')" min-width="120"
+                                align="center">
+                                <template #default="{ row }">
+                                    <span>৳{{ row.amount || 0 }}</span>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="status" :label="t('common.status')" min-width="100" align="center">
+                                <template #default="{ row }">
+                                    <el-tag :type="row.status === 1 ? 'success' : 'danger'">
+                                        {{ row.status === 1 ? t('common.enabled') : t('common.disabled') }}
+                                    </el-tag>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="sortNum" :label="t('form.sort')" min-width="80" align="center">
+                                <template #default="{ row }">
+                                    <span>{{ row.sortNum || 0 }}</span>
+                                </template>
+                            </el-table-column>
+                            <el-table-column prop="createTime" :label="t('form.createTime')" min-width="160">
+                                <template #default="{ row }">
+                                    <span>{{ row.createTime || '--' }}</span>
+                                </template>
+                            </el-table-column>
+                            <el-table-column fixed="right" :label="t('common.actions')" min-width="140">
+                                <template #default="{ row }">
+                                    <el-button class="is-link" type="primary" @click="handleEditGoods(row)">
+                                        {{ t('common.edit') }}
+                                    </el-button>
+                                    <el-popconfirm width="fit-content" :confirm-button-text="t('common.confirm')"
+                                        :cancel-button-text="t('common.cancel')" :title="t('message.confirmDelete')"
+                                        @confirm="handleDeleteGoods(row)">
+                                        <template #reference>
+                                            <el-button class="is-link" type="danger">{{ t('common.delete')
+                                            }}</el-button>
+                                        </template>
+                                    </el-popconfirm>
+                                </template>
+                            </el-table-column>
+                        </el-table>
+                    </div>
+                </div>
+            </div>
+        </el-main>
+
+        <sa-view-bar>
+            <template #right>
+                <sa-pagination :pageData="pageData" @updateFn="getGoodsList" />
+            </template>
+        </sa-view-bar>
+
+        <el-footer class="sa-footer--submit">
+            <el-button @click="handleCancel">{{ t('common.close') }}</el-button>
+        </el-footer>
+    </el-container>
+
+    <!-- 移除商品编辑弹窗,使用独立组件 -->
+</template>
+
+<script setup>
+import { ref, reactive, computed, onMounted } from 'vue';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { useI18n } from 'vue-i18n';
+import { Plus } from '@element-plus/icons-vue';
+import { usePagination, useModal } from '@/sheep/hooks';
+import api from '../../../api';
+import GoodsEdit from './GoodsEdit.vue';
+
+const { t } = useI18n();
+
+const emit = defineEmits(['modalCallBack']);
+const props = defineProps({
+    modal: {
+        type: Object,
+        required: true,
+    },
+});
+
+// 获取传入的参数
+const paymentId = computed(() => props.modal.params.paymentId);
+const paymentName = computed(() => props.modal.params.paymentName);
+
+// 金额区间配置
+const rangeFormRef = ref();
+const rangeSubmitLoading = ref(false);
+const rangeForm = reactive({
+    miniPrice: 0,
+    maxPrice: 0,
+});
+
+// 移除联动判断,允许用户随意输入
+
+const rangeRules = reactive({
+    miniPrice: [
+        { required: true, message: t('modules.payment.minAmountRequired'), trigger: 'blur' },
+        { type: 'number', min: 0, message: t('modules.payment.minAmountValidation'), trigger: 'blur' }
+    ],
+    maxPrice: [
+        { required: true, message: t('modules.payment.maxAmountRequired'), trigger: 'blur' },
+        { type: 'number', min: 0, message: t('modules.payment.maxAmountValidation'), trigger: 'blur' }
+    ],
+});
+
+// 商品管理
+const tableLoading = ref(false);
+const tableData = ref([]);
+const { pageData } = usePagination();
+
+// 商品编辑弹窗
+const goodsFormRef = ref();
+
+// 获取当前支付限额配置
+async function getCurrentLimit() {
+    try {
+        // 这里可以调用获取当前配置的接口
+        // const { code, data } = await api.payment.getPaymentLimit(paymentId.value);
+        // if (code == 200 && data) {
+        //   rangeForm.miniPrice = data.miniPrice || 1;
+        //   rangeForm.maxPrice = data.maxPrice || 100000;
+        // }
+    } catch (error) {
+        console.error('获取支付限额配置失败:', error);
+    }
+}
+
+// 获取商品列表
+async function getGoodsList() {
+    try {
+        tableLoading.value = true;
+        const { code, data } = await api.payment.goods.list({
+            methodId: paymentId.value,
+            page: pageData.page,
+            size: pageData.size,
+        });
+
+        if (code == 200 && data) {
+            // 根据真实数据结构处理
+            if (Array.isArray(data.list)) {
+                tableData.value = data.list;
+                pageData.total = data.list.length;
+
+                // 同时更新金额区间配置
+                if (data.miniPrice !== undefined) {
+                    rangeForm.miniPrice = data.miniPrice;
+                }
+                if (data.maxPrice !== undefined) {
+                    rangeForm.maxPrice = data.maxPrice;
+                }
+            } else {
+                tableData.value = [];
+                pageData.total = 0;
+            }
+        } else {
+            tableData.value = [];
+            pageData.total = 0;
+        }
+    } catch (error) {
+        console.error('获取商品列表失败:', error);
+        ElMessage.error(t('modules.payment.getGoodsListFailed'));
+        tableData.value = [];
+        pageData.total = 0;
+    } finally {
+        tableLoading.value = false;
+    }
+}
+
+// 保存金额区间配置
+async function handleRangeSubmit() {
+    try {
+        await rangeFormRef.value.validate();
+
+        // 保存时验证最大金额大于等于最小金额
+        if (rangeForm.maxPrice < rangeForm.miniPrice) {
+            ElMessage.error(t('modules.payment.maxGreaterThanMin'));
+            return;
+        }
+
+        rangeSubmitLoading.value = true;
+
+        const { code } = await api.payment.editPaymentLimit(paymentId.value, {
+            miniPrice: rangeForm.miniPrice,
+            maxPrice: rangeForm.maxPrice,
+        });
+
+        if (code == 200) {
+            ElMessage.success(t('modules.payment.rangeConfigSuccess'));
+        }
+    } catch (error) {
+        console.error('保存金额区间配置失败:', error);
+        if (error.response?.data?.message) {
+            ElMessage.error(error.response.data.message);
+        } else {
+            ElMessage.error(t('modules.payment.rangeConfigFailed'));
+        }
+    } finally {
+        rangeSubmitLoading.value = false;
+    }
+}
+
+// 新增
+function handleAddGoods() {
+    useModal(
+        GoodsEdit,
+        {
+            title: t('common.add'),
+            type: 'add',
+            methodId: paymentId.value,
+        },
+        {
+            confirm: () => {
+                getGoodsList();
+            },
+        },
+    );
+}
+
+// 编辑
+function handleEditGoods(row) {
+    useModal(
+        GoodsEdit,
+        {
+            title: t('common.edit'),
+            type: 'edit',
+            id: row.id,
+            methodId: paymentId.value,
+        },
+        {
+            confirm: () => {
+                getGoodsList();
+            },
+        },
+    );
+}
+
+// 删除商品
+async function handleDeleteGoods(row) {
+    try {
+        const { code } = await api.payment.goods.delete(row.id);
+
+        if (code == 200) {
+            ElMessage.success(t('modules.payment.deleteGoodsSuccess'));
+            // 刷新列表
+            getGoodsList();
+        }
+    } catch (error) {
+        console.error('删除商品失败:', error);
+        ElMessage.error(t('modules.payment.deleteGoodsFailed'));
+    }
+}
+
+
+
+// 取消操作
+function handleCancel() {
+    emit('modalCallBack', { event: 'cancel' });
+}
+
+onMounted(() => {
+    getCurrentLimit();
+    getGoodsList();
+});
+</script>
+
+<style lang="scss" scoped>
+.amount-management {
+    .config-section {
+        margin-bottom: 20px;
+
+        .section-header {
+            margin-bottom: 16px;
+
+            h4 {
+                margin: 0 0 4px 0;
+                font-size: 16px;
+                font-weight: 600;
+                color: var(--el-text-color-primary);
+            }
+
+            .section-desc {
+                margin: 0;
+                font-size: 13px;
+                color: var(--el-text-color-regular);
+            }
+        }
+
+        .range-form {
+            background: var(--el-bg-color-page);
+            padding: 16px 20px;
+            border-radius: 6px;
+            border: 1px solid var(--el-border-color-light);
+
+            .unit-text {
+                margin-left: 8px;
+                color: var(--el-text-color-regular);
+                font-size: 14px;
+            }
+
+            :deep(.el-form-item) {
+                margin-right: 32px;
+                margin-bottom: 0;
+            }
+        }
+    }
+
+    .goods-section {
+        .section-header {
+            margin-bottom: 16px;
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+
+            h4 {
+                margin: 0;
+                font-size: 16px;
+                font-weight: 600;
+                color: var(--el-text-color-primary);
+            }
+        }
+
+        .sa-table-wrap {
+            height: 400px;
+
+            .sa-table {
+                height: 100%;
+            }
+        }
+    }
+
+    .el-divider {
+        margin: 24px 0;
+    }
+}
+
+.sa-footer--submit {
+    display: flex;
+    justify-content: flex-end;
+    gap: 12px;
+    padding: 16px 24px;
+    border-top: 1px solid var(--el-border-color-light);
+    background: var(--el-bg-color-page);
+}
+
+.dialog-footer {
+    display: flex;
+    gap: 12px;
+}
+
+// 弹窗样式优化
+:deep(.el-dialog) {
+    .el-dialog__header {
+        padding: 20px 24px 16px;
+        border-bottom: 1px solid var(--el-border-color-light);
+
+        .el-dialog__title {
+            font-weight: 600;
+            color: var(--el-text-color-primary);
+        }
+    }
+
+    .el-dialog__body {
+        padding: 20px 24px;
+    }
+
+    .el-dialog__footer {
+        padding: 16px 24px 20px;
+        border-top: 1px solid var(--el-border-color-light);
+    }
+}
+
+// 表单样式优化
+:deep(.el-form-item) {
+    .el-form-item__label {
+        font-weight: 500;
+        color: var(--el-text-color-regular);
+    }
+
+    .el-form-item__content {
+        .el-input-number {
+            .el-input__inner {
+                text-align: left;
+            }
+        }
+    }
+}
+</style>

+ 51 - 8
src/app/admin/views/payment/edit.vue

@@ -2,11 +2,6 @@
   <el-container>
     <el-main v-loading="loading" :element-loading-text="t('common.loading')">
       <el-form :model="form.model" :rules="form.rules" ref="formRef" :label-width="formLabelWidth">
-        <el-form-item :label="t('modules.payment.channelCode')" prop="channelCode">
-          <el-input v-model="form.model.channelCode" :placeholder="t('modules.payment.enterChannelCode')" maxlength="50"
-            show-word-limit />
-        </el-form-item>
-
         <el-form-item :label="t('modules.payment.channelName')" prop="channelName">
           <el-input v-model="form.model.channelName" :placeholder="t('modules.payment.enterChannelName')"
             maxlength="100" show-word-limit />
@@ -26,6 +21,42 @@
           <el-input v-model="form.model.secretKey" type="textarea" :rows="4"
             :placeholder="t('modules.payment.enterSecretKey')" maxlength="1000" show-word-limit />
         </el-form-item>
+        <el-form-item label="异步通知地址" prop="notifyUrl">
+          <el-input v-model="form.model.notifyUrl" type="textarea" :rows="2" placeholder="请输入异步通知地址" maxlength="500"
+            show-word-limit />
+        </el-form-item>
+
+        <el-divider content-position="left">Bkash通道代码</el-divider>
+
+        <el-form-item label="Bkash支付编码" prop="bkashPayCode">
+          <el-input v-model="form.model.bkashPayCode" placeholder="请输入Bkash支付编码" maxlength="100" show-word-limit />
+        </el-form-item>
+
+        <el-form-item label="Bkash提现编码" prop="bkashWithdrawCode">
+          <el-input v-model="form.model.bkashWithdrawCode" placeholder="请输入Bkash提现编码" maxlength="100" show-word-limit />
+        </el-form-item>
+
+        <el-divider content-position="left">Nagad通道代码</el-divider>
+
+        <el-form-item label="Nagad支付编码" prop="nagadPayCode">
+          <el-input v-model="form.model.nagadPayCode" placeholder="请输入Nagad支付编码" maxlength="100" show-word-limit />
+        </el-form-item>
+
+        <el-form-item label="Nagad提现编码" prop="nagadWithdrawCode">
+          <el-input v-model="form.model.nagadWithdrawCode" placeholder="请输入Nagad提现编码" maxlength="100" show-word-limit />
+        </el-form-item>
+
+        <el-divider content-position="left">Rocket通道代码</el-divider>
+
+        <el-form-item label="Rocket支付编码" prop="rocketPayCode">
+          <el-input v-model="form.model.rocketPayCode" placeholder="请输入Rocket支付编码" maxlength="100" show-word-limit />
+        </el-form-item>
+
+        <el-form-item label="Rocket提现编码" prop="rocketWithdrawCode">
+          <el-input v-model="form.model.rocketWithdrawCode" placeholder="请输入Rocket提现编码" maxlength="100"
+            show-word-limit />
+        </el-form-item>
+
       </el-form>
     </el-main>
     <el-footer class="sa-footer--submit">
@@ -60,18 +91,24 @@ const loading = ref(false);
 
 const form = reactive({
   model: {
-    channelCode: '',
     channelName: '',
     merchantNum: '',
     appid: '',
     secretKey: '',
+    bkashPayCode: '',
+    nagadPayCode: '',
+    rocketPayCode: '',
+    bkashWithdrawCode: '',
+    nagadWithdrawCode: '',
+    rocketWithdrawCode: '',
+    notifyUrl: '',
   },
   rules: {
-    channelCode: [{ required: true, message: '请输入支付通道编号', trigger: 'blur' }],
     channelName: [{ required: true, message: '请输入通道名称', trigger: 'blur' }],
     merchantNum: [{ required: true, message: '请输入商户号', trigger: 'blur' }],
     appid: [{ required: true, message: '请输入应用ID', trigger: 'blur' }],
     secretKey: [{ required: true, message: '请输入密钥', trigger: 'blur' }],
+    // 新增字段都是可选的,不需要验证规则
   },
 });
 
@@ -79,11 +116,17 @@ const form = reactive({
 async function getDetail(data) {
   loading.value = true;
   try {
-    form.model.channelCode = data.channelCode || '';
     form.model.channelName = data.channelName || '';
     form.model.merchantNum = data.merchantNum || '';
     form.model.appid = data.appid || '';
     form.model.secretKey = data.secretKey || '';
+    form.model.bkashPayCode = data.bkashPayCode || '';
+    form.model.nagadPayCode = data.nagadPayCode || '';
+    form.model.rocketPayCode = data.rocketPayCode || '';
+    form.model.bkashWithdrawCode = data.bkashWithdrawCode || '';
+    form.model.nagadWithdrawCode = data.nagadWithdrawCode || '';
+    form.model.rocketWithdrawCode = data.rocketWithdrawCode || '';
+    form.model.notifyUrl = data.notifyUrl || '';
   } finally {
     loading.value = false;
   }

+ 75 - 166
src/locales/en-US/index.json

@@ -98,7 +98,6 @@
     "weight": "Weight",
     "enterWeight": "Please enter weight",
     "normal": "Normal",
-    "disabled": "Disabled",
     "includePermissions": "Include Permissions",
     "name": "Name",
     "operation": "Operation",
@@ -109,35 +108,8 @@
     "uploadCert": "Upload Certificate",
     "noInfo": "No Info",
     "cancelled": "Cancelled",
-    "loading": "Loading...",
     "sort": "Sort",
-    "enterSort": "Please enter sort",
-    "actions": "Actions",
-    "add": "Add",
-    "save": "Save",
-    "update": "Update",
-    "edit": "Edit",
-    "delete": "Delete",
-    "confirm": "Confirm",
-    "cancel": "Cancel",
-    "tip": "Tip",
-    "unknown": "Unknown",
-    "createTime": "Create Time",
-    "to": "to",
-    "startDate": "Start Date",
-    "endDate": "End Date",
-    "status": "Status",
-    "all": "All",
-    "confirm": "Confirm",
-    "cancel": "Cancel",
-    "cancelled": "Cancelled",
-    "tip": "Tip",
-    "unknown": "Unknown",
-    "actions": "Actions",
-    "detail": "Detail",
-    "loading": "Loading...",
-    "fetchDataFailed": "Failed to fetch data",
-    "submit": "Submit"
+    "enterSort": "Please enter sort"
   },
   "menu": {
     "dashboard": "Dashboard",
@@ -267,10 +239,10 @@
     "selectLoginPermission": "Please select login permission",
     "selectOrderPermission": "Please select order permission",
     "selectWithdrawPermission": "Please select withdraw permission",
-    "inputUserPhone": "Please input user phone",
-    "inputUserNickname": "Please input user nickname",
-    "inputNewPassword": "Please input new password",
-    "inputConfirmPassword": "Please confirm password",
+    "inputUserPhone": "Please enter user phone",
+    "inputUserNickname": "Please enter user nickname",
+    "inputNewPassword": "Please enter new password",
+    "inputConfirmPassword": "Please enter new password again",
     "inputCategoryName": "Please input category name",
     "inputSort": "Please input sort order",
     "inputGoodsName": "Please input goods name (max 100 characters)",
@@ -306,14 +278,10 @@
     "mainImageRequired": "Please upload main image",
     "carouselImagesRequired": "Please upload carousel images",
     "detailImagesRequired": "Please upload detail images",
-    "inputUserPhone": "Please enter user phone",
-    "inputUserNickname": "Please enter user nickname",
     "uploadUserAvatar": "Upload user avatar",
     "inputPaymentBank": "Please enter payment bank",
     "inputAccountName": "Please enter account name",
     "inputPaymentAccount": "Please enter payment account",
-    "inputNewPassword": "Please enter new password",
-    "inputConfirmPassword": "Please enter new password again",
     "passwordRequired": "Please enter new password",
     "passwordLength": "Password length should be 6-20 characters",
     "confirmPasswordRequired": "Please enter new password again",
@@ -557,7 +525,56 @@
       "statusUpdateSuccess": "Status updated successfully",
       "statusUpdateFailed": "Failed to update status",
       "channelStatusUpdateSuccess": "Channel status updated successfully",
-      "channelStatusUpdateFailed": "Failed to update channel status"
+      "channelStatusUpdateFailed": "Failed to update channel status",
+      "paymentLimit": "Payment Limit Config",
+      "paymentLimitConfig": "Payment Limit Configuration",
+      "paymentLimitDesc": "Configure payment amount range for {methodName} payment method",
+      "currencyUnit": "Yuan",
+      "limitConfigTip": "Note: The minimum amount must be less than the maximum amount, and the configuration takes effect immediately",
+      "enterMinAmount": "Please enter minimum amount",
+      "enterMaxAmount": "Please enter maximum amount",
+      "minAmountRequired": "Please enter minimum amount",
+      "maxAmountRequired": "Please enter maximum amount",
+      "minAmountValidation": "Minimum amount must be greater than or equal to 0",
+      "maxAmountValidation": "Maximum amount must be greater than or equal to 1",
+      "minLessThanMax": "Minimum amount must be less than maximum amount",
+      "maxGreaterThanMin": "Maximum amount must be greater than minimum amount",
+      "limitConfigSuccess": "Payment limit configuration successful",
+      "limitConfigFailed": "Payment limit configuration failed",
+      "amountRangeConfig": "Amount Range Configuration",
+      "amountRangeDesc": "Configure unified minimum and maximum amount range for {methodName}",
+      "rangeConfigSuccess": "Amount range configuration saved successfully",
+      "rangeConfigFailed": "Amount range configuration save failed",
+      "saveRangeConfig": "Save Range Configuration",
+      "goodsManagement": "Amount Configuration",
+      "amountConfig": "Amount Configuration",
+      "addGoods": "Add Goods",
+      "editGoods": "Edit Goods",
+      "goodsName": "Goods Name",
+      "goodsNameRequired": "Please enter goods name",
+      "goodsNameLength": "Goods name length should be 1-50 characters",
+      "enterGoodsName": "Please enter goods name",
+      "amount": "Amount",
+      "amountRequired": "Please enter amount",
+      "amountValidation": "Amount must be greater than 0",
+      "enterAmount": "Please enter amount",
+      "sortNum": "Sort",
+      "sortNumValidation": "Sort value must be between 0-999",
+      "enterSortNum": "Please enter sort value",
+      "statusRequired": "Please select status",
+      "confirmDeleteGoods": "Are you sure you want to delete goods \"{name}\"?",
+      "deleteGoodsSuccess": "Delete goods successful",
+      "deleteGoodsFailed": "Delete goods failed",
+      "addGoodsSuccess": "Add goods successful",
+      "updateGoodsSuccess": "Update goods successful",
+      "saveGoodsFailed": "Save goods failed",
+      "getGoodsListFailed": "Get goods list failed",
+      "name": "Name",
+      "nameRequired": "Please enter name",
+      "nameLength": "Name length should be 1-50 characters",
+      "enterName": "Please enter name",
+      "updateSuccess": "Update successful",
+      "addSuccess": "Add successful"
     },
     "finance": {
       "financeReport": "Finance Report",
@@ -669,7 +686,6 @@
       "sourceOrder": "Source Order",
       "enterSourceOrderNo": "Please enter source order number",
       "commissionRate": "Commission Rate",
-      "selectStatus": "Please select status",
       "frozen": "Frozen",
       "enterRemark": "Please enter remark",
       "userDetail": "User Detail",
@@ -802,8 +818,7 @@
       "rejectReasonLength": "Reject reason length should be 1 to 200 characters",
       "approveSuccess": "Approve Success",
       "rejectSuccess": "Reject Success",
-      "auditFailed": "Audit Failed",
-      "accountType": "Account Type"
+      "auditFailed": "Audit Failed"
     },
     "dashboard": {
       "dashboard": "Dashboard",
@@ -916,12 +931,7 @@
       "detailedAddress": "Detailed Address",
       "isDefault": "Is Default",
       "defaultAddress": "Default Address",
-      "normalAddress": "Normal Address",
-      "userPhone": "User Phone",
-      "userNickname": "User Nickname",
-      "userAvatar": "User Avatar",
-      "newPassword": "New Password",
-      "confirmPassword": "Confirm Password"
+      "normalAddress": "Normal Address"
     },
     "goods": {
       "goodsList": "Goods List",
@@ -1031,7 +1041,7 @@
       "orderDetail": "Order Detail",
       "orderNo": "Order No.",
       "orderNumber": "Order Number",
-      "orderStatus": "Order Status",
+      "orderStatus": "Status",
       "orderAmount": "Order Amount",
       "orderTime": "Order Time",
       "payTime": "Pay Time",
@@ -1049,30 +1059,34 @@
       "buyerName": "Buyer Name",
       "buyerPhone": "Buyer Phone",
       "buyerAddress": "Delivery Address",
-      "goodsInfo": "Goods Information",
-      "goodsName": "Goods Name",
+      "goodsInfo": "Product Info",
+      "goodsName": "Product Name",
       "goodsPrice": "Goods Price",
       "goodsQuantity": "Quantity",
       "quantity": "Quantity",
       "paymentAmount": "Payment Amount",
       "paymentStatus": "Payment Status",
-      "paid": "Paid",
-      "pendingPayment": "Pending Payment",
-      "groupStatus": "Group Status",
-      "refundStatus": "Refund Status",
+      "groupStatus": {
+        "pending": "Pending Group",
+        "success": "Group Success",
+        "failed": "Group Failed"
+      },
+      "refundStatus": {
+        "noRefund": "No Refund",
+        "applying": "Applying",
+        "refunded": "Refunded",
+        "refunding": "Refunding"
+      },
       "logistics": "Logistics",
       "courier": "Courier",
       "notShipped": "Not Shipped",
-      "payTime": "Pay Time",
       "goodsTotal": "Subtotal",
       "subtotal": "Subtotal",
       "shippingFee": "Shipping Fee",
       "discount": "Discount",
       "totalAmount": "Total Amount",
       "actualPayment": "Actual Payment",
-      "logistics": "Logistics",
       "trackingNumber": "Tracking Number",
-      "courier": "Courier",
       "shippingAddress": "Shipping Address",
       "receivingAddress": "Receiving Address",
       "aftersale": "Aftersale",
@@ -1081,7 +1095,6 @@
       "exchange": "Exchange",
       "refundAmount": "Refund Amount",
       "refundReason": "Refund Reason",
-      "refundStatus": "Refund Status",
       "invoice": "Invoice",
       "invoiceType": "Invoice Type",
       "invoiceTitle": "Invoice Title",
@@ -1102,37 +1115,28 @@
       "all": "All",
       "customerName": "Customer Name",
       "customerPhone": "Customer Phone",
-      "goodsInfo": "Product Info",
       "specification": "Specification",
-      "quantity": "Quantity",
       "payAmount": "Payment Amount",
       "deliveryInfo": "Delivery Info",
       "expressCompany": "Express Company",
-      "notShipped": "Not Shipped",
       "shipTest": "Ship Test",
       "noNickname": "No Nickname",
       "orderTrack": "Order Track",
       "basicInfo": "Basic Info",
-      "totalAmount": "Total Amount",
       "expressDelivery": "Express Delivery",
       "manualDelivery": "Manual Delivery",
       "deliveryTip": "Tip: If the product is in after-sales status, please handle the after-sales first before shipping.",
       "pendingShipment": "Pending Shipment",
       "shipped": "Shipped",
-      "refunded": "Refunded",
-      "closed": "Closed",
-      "cancelled": "Cancelled",
-      "trackingNumber": "Tracking Number",
-      "winStatus": "Win Status",
+      "winStatus": {
+        "notWon": "Not Won",
+        "won": "Won"
+      },
       "username": "Username",
       "paymentMethod": "Payment Method",
       "discountAmount": "Discount Amount",
       "rewardCommission": "Reward Commission",
       "phoneNumber": "Phone Number",
-      "paymentAmount": "Payment Amount",
-      "actualPayment": "Actual Payment",
-      "orderTrack": "Order Track",
-      "basicInfo": "Basic Info",
       "pleaseSelectFile": "Please select delivery file first",
       "batchDispatchSuccess": "Batch dispatch successful",
       "batchDispatchFailed": "Batch dispatch failed",
@@ -1141,12 +1145,9 @@
       "confirmCancelOrder": "Are you sure you want to cancel this order?",
       "cancelOrderSuccess": "Order cancelled successfully",
       "cancelOrderFailed": "Failed to cancel order",
-      "orderDetail": "Order Detail",
       "orderRecords": "Order Records",
       "deliveryOrders": "Delivery Orders",
-      "refund": "Refund",
       "goodsImage": "Product Image",
-      "goodsName": "Product Name",
       "unitPrice": "Unit Price",
       "status": {
         "pendingPayment": "Pending Payment",
@@ -1158,23 +1159,8 @@
         "shipped": "Shipped",
         "completed": "Completed"
       },
-      "refundStatus": {
-        "noRefund": "No Refund",
-        "applying": "Applying",
-        "refunded": "Refunded",
-        "refunding": "Refunding"
-      },
       "groupStatusLabel": "Group Status",
-      "groupStatus": {
-        "pending": "Pending Group",
-        "success": "Group Success",
-        "failed": "Group Failed"
-      },
       "winStatusLabel": "Win Status",
-      "winStatus": {
-        "notWon": "Not Won",
-        "won": "Won"
-      },
       "payType": {
         "balance": "Account Balance",
         "alipay": "Alipay",
@@ -1186,7 +1172,6 @@
       "groupInfo": "Group Info ({people} people)",
       "groupOrderNumber": "Group Order Number",
       "joinTime": "Join Time",
-      "payTime": "Pay Time",
       "steps": {
         "createOrder": "Submit Order",
         "payment": "Payment",
@@ -1213,12 +1198,7 @@
       "memoUpdateFailed": "Failed to update memo",
       "openOrderDetailFailed": "Failed to open order details",
       "productInfo": "Product Info",
-      "specification": "Specification",
-      "quantity": "Quantity",
-      "orderStatus": "Status",
-      "pendingShipment": "Pending Shipment",
       "expressNumber": "Express Number",
-      "deliveryInfo": "Delivery Info",
       "recipientInfo": "Recipient Info",
       "recipientAddress": "Recipient Address",
       "postalCode": "Postal Code",
@@ -1226,13 +1206,11 @@
       "logisticsInfo": "Logistics Info",
       "shippingMethod": "Shipping Method",
       "expressShipping": "Express Shipping",
-      "expressCompany": "Express Company",
       "selectExpressCompany": "Please select express company",
       "enterExpressNumber": "Please enter express number",
       "shipNow": "Ship Now",
       "importDeliveryList": "Import Delivery List",
       "systemAutoProcess": "Import delivery list, the system will automatically process delivery information",
-      "reSelectFile": "Re-select File",
       "batchShip": "Batch Ship",
       "pleaseSelectDeliveryFile": "Please select delivery file first",
       "batchShipSuccess": "Batch shipping successful",
@@ -1336,75 +1314,6 @@
       "noPhone": "No phone bound",
       "getUserListFailed": "Failed to get user list"
     },
-    "user": {
-      "userId": "User ID",
-      "userName": "Username",
-      "userPhone": "Phone Number",
-      "userNickname": "Nickname",
-      "userLevel": "User Level",
-      "userAvatar": "Avatar",
-      "userAccount": "User Account",
-      "inviteFriends": "Invited Friends",
-      "teamMembers": "Team Members",
-      "successOrders": "Success Orders",
-      "accountBalance": "Account Balance",
-      "commissionBalance": "Commission Balance",
-      "loginPermission": "Login Permission",
-      "orderPermission": "Order Permission",
-      "withdrawPermission": "Withdraw Permission",
-      "registrationTime": "Registration Time",
-      "changePassword": "Change Password",
-      "userDetail": "User Detail",
-      "addUser": "Add User",
-      "editUser": "Edit User",
-      "editProfile": "Edit Profile",
-      "basicInfo": "Basic Information",
-      "avatar": "Avatar",
-      "noLevel": "No Level",
-      "paymentBank": "Payment Bank",
-      "accountName": "Account Name",
-      "paymentAccount": "Payment Account",
-      "newPassword": "New Password",
-      "confirmPassword": "Confirm Password",
-      "login": "Login",
-      "order": "Order",
-      "withdraw": "Withdraw",
-      "userList": "User List",
-      "statisticsInfo": "Statistics Information",
-      "availableGroups": "Available Groups",
-      "totalCommission": "Total Commission Amount",
-      "settledCommission": "Settled Commission Balance",
-      "totalRecharge": "Total Recharge Amount",
-      "last7DaysCommission": "Last 7 Days Commission",
-      "pendingCommission": "Pending Commission Balance",
-      "totalWithdraw": "Total Withdraw Amount",
-      "orderRecords": "Order Records",
-      "subordinateUsers": "Subordinate Users",
-      "commissionRecords": "Commission Records",
-      "commissionId": "Commission ID",
-      "commissionType": "Commission Type",
-      "commissionDescription": "Commission Description",
-      "commissionAmount": "Commission Amount",
-      "commissionStatus": "Commission Status",
-      "commissionTime": "Commission Time",
-      "rechargeRecords": "Recharge Records",
-      "rechargeOrderNo": "Recharge Order No.",
-      "rechargeChannel": "Recharge Channel",
-      "currency": "Currency",
-      "amount": "Amount",
-      "successTime": "Success Time",
-      "withdrawRecords": "Withdraw Records",
-      "withdrawOrderNo": "Withdraw Order No.",
-      "withdrawType": "Withdraw Type",
-      "withdrawChannel": "Withdraw Channel",
-      "withdrawAmount": "Withdraw Amount",
-      "shippingAddresses": "Shipping Addresses",
-      "recipient": "Recipient",
-      "detailedAddress": "Detailed Address",
-      "isDefault": "Is Default",
-      "defaultAddress": "Default Address",
-      "normalAddress": "Normal Address"
-    },
     "report": {
       "dataReport": "Data Report",
       "salesReport": "Sales Report",

+ 80 - 169
src/locales/zh-CN/index.json

@@ -7,7 +7,7 @@
     "confirm": "确定",
     "delete": "删除",
     "edit": "编辑",
-    "add": "新",
+    "add": "新",
     "create": "创建",
     "view": "查看",
     "search": "搜索",
@@ -37,7 +37,7 @@
     "enable": "启用",
     "disable": "禁用",
     "enabled": "已启用",
-    "disabled": "禁用",
+    "disabled": "禁用",
     "submitting": "提交中...",
     "memo": "备注",
     "tip": "提示",
@@ -98,7 +98,6 @@
     "weight": "权重",
     "enterWeight": "请输入权重",
     "normal": "正常",
-    "disabled": "禁用",
     "includePermissions": "包含权限",
     "name": "名称",
     "operation": "操作",
@@ -109,30 +108,8 @@
     "uploadCert": "上传证书",
     "noInfo": "暂无信息",
     "cancelled": "已取消",
-    "loading": "加载中...",
     "sort": "排序",
-    "enterSort": "请填写排序",
-    "actions": "操作",
-    "add": "新建",
-    "save": "保存",
-    "update": "更新",
-    "tip": "提示",
-    "confirm": "确定",
-    "cancel": "取消",
-    "unknown": "未知",
-    "endDate": "结束日期",
-    "status": "状态",
-    "all": "全部",
-    "confirm": "确定",
-    "cancel": "取消",
-    "cancelled": "已取消",
-    "tip": "提示",
-    "unknown": "未知",
-    "actions": "操作",
-    "detail": "详情",
-    "loading": "加载中...",
-    "fetchDataFailed": "获取数据失败",
-    "submit": "提交"
+    "enterSort": "请填写排序"
   },
   "menu": {
     "dashboard": "首页",
@@ -257,14 +234,13 @@
     "inputUserAccount": "请输入用户账号或昵称",
     "inputPhone": "请输入手机号",
     "inputMemo": "请输入备注(限100字)",
-
     "selectLoginPermission": "请选择登录权限",
     "selectOrderPermission": "请选择下单权限",
     "selectWithdrawPermission": "请选择提现权限",
-    "inputUserPhone": "请输入用户手机",
+    "inputUserPhone": "请输入用户手机",
     "inputUserNickname": "请输入用户昵称",
     "inputNewPassword": "请输入新密码",
-    "inputConfirmPassword": "请确认密码",
+    "inputConfirmPassword": "请再次输入新密码",
     "inputCategoryName": "请输入分类名称",
     "inputSort": "请填写排序",
     "inputGoodsName": "请输入商品名称(限100字符)",
@@ -300,19 +276,14 @@
     "mainImageRequired": "请上传商品主图",
     "carouselImagesRequired": "请上传轮播图",
     "detailImagesRequired": "请上传商品详情图",
-    "inputUserPhone": "请输入用户手机",
-    "inputUserNickname": "请输入用户昵称",
     "uploadUserAvatar": "上传用户头像",
     "inputPaymentBank": "请输入收款银行",
     "inputAccountName": "请输入账户名称",
     "inputPaymentAccount": "请输入收款账户",
-    "inputNewPassword": "请输入新密码",
-    "inputConfirmPassword": "请再次输入新密码",
     "passwordRequired": "请输入新密码",
     "passwordLength": "密码长度为6-20位",
     "confirmPasswordRequired": "请再次输入新密码",
-    "passwordMismatch": "两次输入的密码不一致",
-    "inputMemo": "请输入备注(限100字)"
+    "passwordMismatch": "两次输入的密码不一致"
   },
   "message": {
     "loginSuccess": "登录成功",
@@ -551,9 +522,57 @@
       "statusUpdateSuccess": "状态更新成功",
       "statusUpdateFailed": "状态更新失败",
       "channelStatusUpdateSuccess": "通道状态更新成功",
-      "channelStatusUpdateFailed": "通道状态更新失败"
+      "channelStatusUpdateFailed": "通道状态更新失败",
+      "paymentLimit": "支付限额配置",
+      "paymentLimitConfig": "支付限额配置",
+      "paymentLimitDesc": "为{methodName}支付方式配置支付金额区间",
+      "currencyUnit": "元",
+      "limitConfigTip": "注意:最小金额必须小于最大金额,配置后即时生效",
+      "enterMinAmount": "请输入最小金额",
+      "enterMaxAmount": "请输入最大金额",
+      "minAmountRequired": "请输入最小金额",
+      "maxAmountRequired": "请输入最大金额",
+      "minAmountValidation": "最小金额必须大于等于0",
+      "maxAmountValidation": "最大金额必须大于等于1",
+      "minLessThanMax": "最小金额必须小于最大金额",
+      "maxGreaterThanMin": "最大金额必须大于最小金额",
+      "limitConfigSuccess": "支付限额配置成功",
+      "limitConfigFailed": "支付限额配置失败",
+      "amountRangeConfig": "金额区间配置",
+      "amountRangeDesc": "为{methodName}配置统一的最小和最大金额范围",
+      "rangeConfigSuccess": "金额区间配置保存成功",
+      "rangeConfigFailed": "金额区间配置保存失败",
+      "saveRangeConfig": "保存区间配置",
+      "goodsManagement": "金额配置",
+      "amountConfig": "金额配置",
+      "addGoods": "新增商品",
+      "editGoods": "编辑商品",
+      "goodsName": "商品名称",
+      "goodsNameRequired": "请输入商品名称",
+      "goodsNameLength": "商品名称长度为1-50个字符",
+      "enterGoodsName": "请输入商品名称",
+      "amount": "金额",
+      "amountRequired": "请输入金额",
+      "amountValidation": "金额必须大于0",
+      "enterAmount": "请输入金额",
+      "sortNum": "排序",
+      "sortNumValidation": "排序值必须在0-999之间",
+      "enterSortNum": "请输入排序值",
+      "statusRequired": "请选择状态",
+      "confirmDeleteGoods": "确定要删除商品\"{name}\"吗?",
+      "deleteGoodsSuccess": "删除商品成功",
+      "deleteGoodsFailed": "删除商品失败",
+      "addGoodsSuccess": "新增商品成功",
+      "updateGoodsSuccess": "更新商品成功",
+      "saveGoodsFailed": "保存商品失败",
+      "getGoodsListFailed": "获取商品列表失败",
+      "name": "名称",
+      "nameRequired": "请输入名称",
+      "nameLength": "名称长度为1-50个字符",
+      "enterName": "请输入名称",
+      "updateSuccess": "更新成功",
+      "addSuccess": "新增成功"
     },
-
     "commission": {
       "title": "佣金管理",
       "commissionNo": "佣金单号",
@@ -610,7 +629,6 @@
       "sourceOrder": "来源订单",
       "enterSourceOrderNo": "请填写来源订单号",
       "commissionRate": "佣金比例",
-      "selectStatus": "请选择状态",
       "frozen": "已冻结",
       "enterRemark": "请填写备注",
       "userDetail": "用户详情",
@@ -709,7 +727,7 @@
       "status": "提款状态",
       "userName": "用户名",
       "phoneNo": "手机号",
-      "accountType": "提款类型",
+      "accountType": "账户类型",
       "amount": "提款金额",
       "receivingBank": "收款银行",
       "receivingAccountName": "收款账户名称",
@@ -743,8 +761,7 @@
       "rejectReasonLength": "拒绝原因长度在1到200个字符",
       "approveSuccess": "审核通过成功",
       "rejectSuccess": "审核拒绝成功",
-      "auditFailed": "审核失败",
-      "accountType": "账户类型"
+      "auditFailed": "审核失败"
     },
     "finance": {
       "financeReport": "财务报表",
@@ -911,12 +928,7 @@
       "detailedAddress": "详细地址",
       "isDefault": "是否默认",
       "defaultAddress": "默认地址",
-      "normalAddress": "普通地址",
-      "userPhone": "用户手机",
-      "userNickname": "用户昵称",
-      "userAvatar": "用户头像",
-      "newPassword": "新密码",
-      "confirmPassword": "确认密码"
+      "normalAddress": "普通地址"
     },
     "goods": {
       "goodsList": "商品列表",
@@ -1030,14 +1042,14 @@
       "orderDetail": "订单详情",
       "orderNo": "订单号",
       "orderNumber": "订单编号",
-      "orderStatus": "订单状态",
+      "orderStatus": "状态",
       "orderAmount": "订单金额",
       "orderTime": "下单时间",
       "payTime": "支付时间",
       "deliveryTime": "发货时间",
       "completeTime": "完成时间",
       "pendingPayment": "待付款",
-      "paid": "已付",
+      "paid": "已付",
       "pendingDelivery": "待发货",
       "pendingReceive": "待收货",
       "completed": "已完成",
@@ -1053,25 +1065,29 @@
       "goodsPrice": "商品价格",
       "goodsQuantity": "商品数量",
       "quantity": "数量",
-      "paymentAmount": "付金额",
+      "paymentAmount": "付金额",
       "paymentStatus": "付款状态",
-      "paid": "已付款",
-      "pendingPayment": "待付款",
-      "groupStatus": "拼团状态",
-      "refundStatus": "退款状态",
+      "groupStatus": {
+        "pending": "未成团",
+        "success": "已成团",
+        "failed": "成团失败"
+      },
+      "refundStatus": {
+        "noRefund": "未退款",
+        "applying": "申请中",
+        "refunded": "已退款",
+        "refunding": "退款中"
+      },
       "logistics": "物流信息",
       "courier": "快递公司",
       "notShipped": "未发货",
-      "payTime": "付款时间",
       "goodsTotal": "商品小计",
       "subtotal": "商品小计",
       "shippingFee": "运费",
       "discount": "优惠金额",
-      "totalAmount": "金额",
+      "totalAmount": "全部金额",
       "actualPayment": "实付金额",
-      "logistics": "物流信息",
-      "trackingNumber": "快递单号",
-      "courier": "快递公司",
+      "trackingNumber": "物流单号",
       "shippingAddress": "发货地址",
       "receivingAddress": "收货地址",
       "aftersale": "售后管理",
@@ -1080,7 +1096,6 @@
       "exchange": "换货",
       "refundAmount": "退款金额",
       "refundReason": "退款原因",
-      "refundStatus": "退款状态",
       "invoice": "发票管理",
       "invoiceType": "发票类型",
       "invoiceTitle": "发票抬头",
@@ -1101,37 +1116,28 @@
       "all": "全部",
       "customerName": "客户姓名",
       "customerPhone": "客户手机",
-      "goodsInfo": "商品信息",
       "specification": "规格",
-      "quantity": "数量",
       "payAmount": "付款金额",
-      "deliveryInfo": "物流信息",
+      "deliveryInfo": "配送信息",
       "expressCompany": "快递公司",
-      "notShipped": "未发货",
       "shipTest": "发货测试",
       "noNickname": "无昵称",
       "orderTrack": "订单轨迹",
       "basicInfo": "基本信息",
-      "totalAmount": "全部金额",
       "expressDelivery": "快递发货",
       "manualDelivery": "手动发货",
       "deliveryTip": "温馨提示:如果该商品处在售后状态,请先处理完售后再进行发货。",
       "pendingShipment": "待发货",
       "shipped": "待收货",
-      "refunded": "已退款",
-      "closed": "已关闭",
-      "cancelled": "已取消",
-      "trackingNumber": "物流单号",
-      "winStatus": "中奖状态",
+      "winStatus": {
+        "notWon": "未中奖",
+        "won": "已中奖"
+      },
       "username": "用户名",
       "paymentMethod": "支付方式",
       "discountAmount": "优惠金额",
       "rewardCommission": "奖励佣金",
       "phoneNumber": "手机号码",
-      "paymentAmount": "支付金额",
-      "actualPayment": "实付金额",
-      "orderTrack": "订单轨迹",
-      "basicInfo": "基本信息",
       "pleaseSelectFile": "请先选择发货单文件",
       "batchDispatchSuccess": "批量发货成功",
       "batchDispatchFailed": "批量发货失败",
@@ -1140,12 +1146,9 @@
       "confirmCancelOrder": "确定要取消这个订单吗?",
       "cancelOrderSuccess": "订单取消成功",
       "cancelOrderFailed": "取消订单失败",
-      "orderDetail": "订单详情",
       "orderRecords": "订单记录",
       "deliveryOrders": "发货订单",
-      "refund": "退款",
       "goodsImage": "商品图片",
-      "goodsName": "商品名称",
       "unitPrice": "单价",
       "status": {
         "pendingPayment": "待支付",
@@ -1157,23 +1160,8 @@
         "shipped": "待收货",
         "completed": "订单完成"
       },
-      "refundStatus": {
-        "noRefund": "未退款",
-        "applying": "申请中",
-        "refunded": "已退款",
-        "refunding": "退款中"
-      },
       "groupStatusLabel": "拼团状态",
-      "groupStatus": {
-        "pending": "未成团",
-        "success": "已成团",
-        "failed": "成团失败"
-      },
       "winStatusLabel": "中奖状态",
-      "winStatus": {
-        "notWon": "未中奖",
-        "won": "已中奖"
-      },
       "payType": {
         "balance": "账户余额",
         "alipay": "支付宝",
@@ -1185,7 +1173,6 @@
       "groupInfo": "拼团信息({people}人团)",
       "groupOrderNumber": "参团订单号",
       "joinTime": "参团时间",
-      "payTime": "支付时间",
       "steps": {
         "createOrder": "提交订单",
         "payment": "付款",
@@ -1212,12 +1199,7 @@
       "memoUpdateFailed": "备注更新失败",
       "openOrderDetailFailed": "打开订单详情失败",
       "productInfo": "商品信息",
-      "specification": "规格",
-      "quantity": "数量",
-      "orderStatus": "状态",
-      "pendingShipment": "待发货",
       "expressNumber": "快递单号",
-      "deliveryInfo": "配送信息",
       "recipientInfo": "收货信息",
       "recipientAddress": "收货地址",
       "postalCode": "邮编",
@@ -1225,13 +1207,11 @@
       "logisticsInfo": "物流信息",
       "shippingMethod": "发货方式",
       "expressShipping": "物流快递",
-      "expressCompany": "快递公司",
       "selectExpressCompany": "请选择快递公司",
       "enterExpressNumber": "请输入快递单号",
       "shipNow": "立即发货",
       "importDeliveryList": "导入发货单",
       "systemAutoProcess": "导入发货单,系统将自动处理发货信息",
-      "reSelectFile": "重新选择文件",
       "batchShip": "批量发货",
       "pleaseSelectDeliveryFile": "请先选择发货单文件",
       "batchShipSuccess": "批量发货成功",
@@ -1335,75 +1315,6 @@
       "noPhone": "未绑定手机",
       "getUserListFailed": "获取用户列表失败"
     },
-    "user": {
-      "userId": "用户ID",
-      "userName": "用户名",
-      "userPhone": "手机号码",
-      "userNickname": "用户昵称",
-      "userLevel": "用户等级",
-      "userAvatar": "用户头像",
-      "userAccount": "用户账号",
-      "inviteFriends": "邀请好友数",
-      "teamMembers": "团队人数",
-      "successOrders": "成功订单",
-      "accountBalance": "账户余额",
-      "commissionBalance": "佣金余额",
-      "loginPermission": "登录权限",
-      "orderPermission": "下单权限",
-      "withdrawPermission": "提现权限",
-      "registrationTime": "注册时间",
-      "changePassword": "修改密码",
-      "userDetail": "用户详情",
-      "addUser": "新建用户",
-      "editUser": "编辑用户",
-      "editProfile": "编辑资料",
-      "basicInfo": "基本信息",
-      "avatar": "头像",
-      "noLevel": "暂无等级",
-      "paymentBank": "收款银行",
-      "accountName": "账户名称",
-      "paymentAccount": "收款账户",
-      "newPassword": "新密码",
-      "confirmPassword": "确认密码",
-      "login": "登录",
-      "order": "下单",
-      "withdraw": "提现",
-      "userList": "用户列表",
-      "statisticsInfo": "统计信息",
-      "availableGroups": "可参团次数",
-      "totalCommission": "全部佣金总金额",
-      "settledCommission": "已结算佣金余额",
-      "totalRecharge": "充值总金额",
-      "last7DaysCommission": "近7天佣金余额",
-      "pendingCommission": "待结算佣金余额",
-      "totalWithdraw": "提现总金额",
-      "orderRecords": "订单记录",
-      "subordinateUsers": "下线用户",
-      "commissionRecords": "佣金记录",
-      "commissionId": "佣金ID",
-      "commissionType": "佣金类型",
-      "commissionDescription": "佣金说明",
-      "commissionAmount": "佣金金额",
-      "commissionStatus": "佣金状态",
-      "commissionTime": "佣金发放时间",
-      "rechargeRecords": "充值记录",
-      "rechargeOrderNo": "充值订单号",
-      "rechargeChannel": "充值渠道",
-      "currency": "币种",
-      "amount": "金额",
-      "successTime": "成功时间",
-      "withdrawRecords": "提现记录",
-      "withdrawOrderNo": "提款订单号",
-      "withdrawType": "提款类型",
-      "withdrawChannel": "提款渠道",
-      "withdrawAmount": "提款金额",
-      "shippingAddresses": "收货地址",
-      "recipient": "收件人",
-      "detailedAddress": "详细地址",
-      "isDefault": "是否默认",
-      "defaultAddress": "默认地址",
-      "normalAddress": "普通地址"
-    },
     "report": {
       "dataReport": "数据报表",
       "salesReport": "销售报表",