Ver código fonte

feat: 订单部分国际化,优化入参

叶静 1 mês atrás
pai
commit
f400836069

+ 47 - 10
src/app/shop/admin/order/order.service.js

@@ -1,10 +1,55 @@
 import Content from '@/sheep/layouts/content.vue';
 import { request } from '@/sheep/request';
 import { REPORT } from '@/sheep/request/crud';
+import { useI18n } from 'vue-i18n';
 
-// 订单状态配置 - 根据最新状态机调整
-export const ORDER_STATUS = {
+// 订单状态配置 - 根据最新状态机调整,使用函数形式支持国际化
+export const getOrderStatusConfig = (t) => ({
   // 订单状态 - 新的状态机
+  ORDER_STATUS: {
+    1: { text: t('modules.order.status.pendingPayment'), type: 'warning' },
+    2: { text: t('modules.order.status.cancelled'), type: 'danger' },
+    3: { text: t('modules.order.status.paid'), type: 'success' },
+    4: { text: t('modules.order.status.refunded'), type: 'info' },
+    5: { text: t('modules.order.status.pendingShipment'), type: 'warning' },
+    6: { text: t('modules.order.status.closed'), type: 'info' },
+    7: { text: t('modules.order.status.shipped'), type: 'primary' },
+    8: { text: t('modules.order.status.completed'), type: 'success' },
+  },
+
+  // 退款状态
+  REFUND_STATUS: {
+    0: { text: t('modules.order.refundStatus.noRefund'), type: 'info' },
+    1: { text: t('modules.order.refundStatus.applying'), type: 'warning' },
+    2: { text: t('modules.order.refundStatus.refunded'), type: 'success' },
+    3: { text: t('modules.order.refundStatus.refunding'), type: 'primary' },
+  },
+
+  // 拼团状态
+  PINK_STATUS: {
+    1: { text: t('modules.order.groupStatus.pending'), type: 'warning' },
+    2: { text: t('modules.order.groupStatus.success'), type: 'success' },
+    3: { text: t('modules.order.groupStatus.failed'), type: 'danger' },
+  },
+
+  // 中奖状态
+  WIN_STATUS: {
+    0: { text: t('modules.order.winStatus.notWon'), type: 'info' },
+    1: { text: t('modules.order.winStatus.won'), type: 'success' },
+  },
+
+  // 支付方式
+  PAY_TYPE: {
+    yue: t('modules.order.payType.balance'),
+    alipay: t('modules.order.payType.alipay'),
+    balance: t('modules.order.payType.balance'),
+    offline: t('modules.order.payType.offline'),
+    wechat: t('modules.order.payType.wechat'),
+  },
+});
+
+// 保持向后兼容的静态配置(用于不需要国际化的场景)
+export const ORDER_STATUS = {
   ORDER_STATUS: {
     1: { text: '待支付', type: 'warning' },
     2: { text: '订单取消', type: 'danger' },
@@ -15,29 +60,21 @@ export const ORDER_STATUS = {
     7: { text: '待收货', type: 'primary' },
     8: { text: '订单完成', type: 'success' },
   },
-
-  // 退款状态
   REFUND_STATUS: {
     0: { text: '未退款', type: 'info' },
     1: { text: '申请中', type: 'warning' },
     2: { text: '已退款', type: 'success' },
     3: { text: '退款中', type: 'primary' },
   },
-
-  // 拼团状态
   PINK_STATUS: {
     1: { text: '未成团', type: 'warning' },
     2: { text: '已成团', type: 'success' },
     3: { text: '成团失败', type: 'danger' },
   },
-
-  // 中奖状态
   WIN_STATUS: {
     0: { text: '未中奖', type: 'info' },
     1: { text: '已中奖', type: 'success' },
   },
-
-  // 支付方式
   PAY_TYPE: {
     yue: '账户余额',
     alipay: '支付宝',

+ 98 - 81
src/app/shop/admin/order/order/detail.vue

@@ -1,9 +1,9 @@
 <template>
   <el-container class="order-detail">
-    <el-main v-loading="loading" element-loading-text="加载中...">
+    <el-main v-loading="loading" :element-loading-text="t('common.loading')">
       <!-- 订单轨迹 -->
       <div class="order-track sa-m-b-46">
-        <h3 class="sa-m-b-20">订单轨迹</h3>
+        <h3 class="sa-m-b-20">{{ t('modules.order.orderTrack') }}</h3>
         <el-steps :active="getActiveStep()" align-center>
           <el-step v-for="(step, index) in orderSteps" :key="index" :title="step.title" :description="step.description"
             :status="step.status" />
@@ -12,18 +12,18 @@
 
       <!-- 基本信息 -->
       <div class="basic-info sa-m-b-26">
-        <h3 class="sa-m-b-20">基本信息</h3>
+        <h3 class="sa-m-b-20">{{ t('modules.order.basicInfo') }}</h3>
         <!-- 第一行:订单编号、订单状态、拼团状态、全部金额 -->
         <el-row :gutter="20">
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">订单编号:</span>
+              <span class="label">{{ t('modules.order.orderNumber') }}:</span>
               <span class="value">{{ state.orderDetail.orderId || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">订单状态:</span>
+              <span class="label">{{ t('modules.order.orderStatus') }}:</span>
               <el-tag :type="getStatusType('order', state.orderDetail.status)">
                 {{ getStatusText('order', state.orderDetail.status) }}
               </el-tag>
@@ -31,7 +31,7 @@
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">拼团状态:</span>
+              <span class="label">{{ t('modules.order.groupStatus') }}:</span>
               <el-tag :type="getStatusType('pink', state.orderDetail.pinkStatus)">
                 {{ getStatusText('pink', state.orderDetail.pinkStatus) }}
               </el-tag>
@@ -39,7 +39,7 @@
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">全部金额:</span>
+              <span class="label">{{ t('modules.order.totalAmount') }}:</span>
               <span class="value">৳{{ state.orderDetail.totalPrice || 0 }}</span>
             </div>
           </el-col>
@@ -48,7 +48,7 @@
         <el-row :gutter="20" class="sa-m-t-12">
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">中奖状态:</span>
+              <span class="label">{{ t('modules.order.winStatusLabel') }}:</span>
               <el-tag :type="getStatusType('win', state.orderDetail.winStatus)">
                 {{ getStatusText('win', state.orderDetail.winStatus) }}
               </el-tag>
@@ -56,19 +56,19 @@
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">用户名:</span>
+              <span class="label">{{ t('modules.order.username') }}:</span>
               <span class="value">{{ state.realName || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">支付方式:</span>
-              <span class="value">{{ getPayTypeText(state.orderDetail.payType) }}</span>
+              <span class="label">{{ t('modules.order.paymentMethod') }}:</span>
+              <span class="value">{{ getPayTypeTextI18n(state.orderDetail.payType) }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">优惠金额:</span>
+              <span class="label">{{ t('modules.order.discountAmount') }}:</span>
               <span class="value">৳{{ state.orderDetail.deductionPrice || 0 }}</span>
             </div>
           </el-col>
@@ -77,25 +77,25 @@
         <el-row :gutter="20" class="sa-m-t-12">
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">奖励佣金:</span>
+              <span class="label">{{ t('modules.order.rewardCommission') }}:</span>
               <span class="value">৳{{ state.orderDetail.brokerage || 0 }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">手机号码:</span>
+              <span class="label">{{ t('modules.order.phoneNumber') }}:</span>
               <span class="value">{{ state.orderDetail.userPhone || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">支付金额:</span>
+              <span class="label">{{ t('modules.order.paymentAmount') }}:</span>
               <span class="value">৳{{ state.orderDetail.totalPrice || 0 }}</span>
             </div>
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">实付金额:</span>
+              <span class="label">{{ t('modules.order.actualPayment') }}:</span>
               <span class="value">৳{{ state.orderDetail.payPrice || 0 }}</span>
             </div>
           </el-col>
@@ -136,29 +136,32 @@
       <!-- 操作按钮 -->
       <div class="action-buttons sa-m-b-26">
         <!-- 取消订单按钮 - 只在待支付状态显示 -->
-        <el-button v-if="state.orderDetail.status === 1" type="warning" plain @click="onCancelOrder">取消订单</el-button>
+        <el-button v-if="state.orderDetail.status === 1" type="warning" plain @click="onCancelOrder">{{
+          t('modules.order.cancelOrder') }}</el-button>
         <!-- 立即发货按钮 - 待发货状态显示 -->
-        <el-button type="primary" @click="onDispatch">立即发货测试</el-button>
-        <el-button type="primary" @click="onDispatch" v-if="state.orderDetail.status === 5">立即发货</el-button>
+        <el-button type="primary" @click="onDispatch">{{ t('modules.order.shipTest') }}</el-button>
+        <el-button type="primary" @click="onDispatch" v-if="state.orderDetail.status === 5">{{
+          t('modules.order.shipOrder')
+        }}</el-button>
         <!-- 全部退款按钮 - 订单状态已支付且拼团状态未成团时显示 -->
         <el-button v-if="state.orderDetail.status === 3 && state.orderDetail.pinkStatus === 1" type="danger" plain
           @click="onRefund">
-          退款
+          {{ t('modules.order.refund') }}
         </el-button>
       </div>
       <!-- 商品信息 -->
       <div class="goods-content sa-m-b-16">
-        <div class="sa-title sa-m-b-10">商品信息</div>
+        <div class="sa-title sa-m-b-10">{{ t('modules.order.goodsInfo') }}</div>
         <el-table class="sa-table" :data="state.orderDetail.orderInfoVO" stripe border>
-          <el-table-column label="商品图片" width="100" align="center">
+          <el-table-column :label="t('modules.order.goodsImage')" width="100" align="center">
             <template #default="{ row }">
               <el-image :src="row.image" style="width: 60px; height: 60px; border-radius: 4px" fit="cover" />
             </template>
           </el-table-column>
-          <el-table-column label="商品名称" prop="productName" />
-          <el-table-column label="规格" prop="sku" align="center" />
-          <el-table-column label="数量" prop="payNum" align="center" />
-          <el-table-column label="单价" align="center">
+          <el-table-column :label="t('modules.order.goodsName')" prop="productName" />
+          <el-table-column :label="t('modules.order.specification')" prop="sku" align="center" />
+          <el-table-column :label="t('modules.order.quantity')" prop="payNum" align="center" />
+          <el-table-column :label="t('modules.order.unitPrice')" align="center">
             <template #default="{ row }"> ৳{{ row.price || '0' }} </template>
           </el-table-column>
         </el-table>
@@ -166,21 +169,21 @@
 
       <!-- 收货信息 - 在待收货和订单完成状态显示 -->
       <div class="address-content sa-m-b-16" v-if="[7, 8].includes(state.orderDetail.status)">
-        <div class="sa-title sa-m-b-10">收货信息</div>
+        <div class="sa-title sa-m-b-10">{{ t('modules.order.deliveryInfo') }}</div>
         <el-table class="sa-table" :data="[state.orderDetail.orderAddressVO]" stripe border>
-          <el-table-column label="收件人" prop="realName" align="center" />
-          <el-table-column label="手机号" prop="phone" align="center" />
-          <el-table-column label="详细地址" min-width="200">
+          <el-table-column :label="t('modules.order.recipient')" prop="realName" align="center" />
+          <el-table-column :label="t('modules.order.phoneNumber')" prop="phone" align="center" />
+          <el-table-column :label="t('modules.order.detailAddress')" min-width="200">
             <template #default="{ row }">
               {{ getFullAddress(row) }}
             </template>
           </el-table-column>
-          <el-table-column label="物流公司" align="center">
+          <el-table-column :label="t('modules.order.expressCompany')" align="center">
             <template #default>
               {{ state.orderDetail.deliveryName || '--' }}
             </template>
           </el-table-column>
-          <el-table-column label="物流单号" align="center">
+          <el-table-column :label="t('modules.order.trackingNumber')" align="center">
             <template #default>
               {{ state.orderDetail.deliveryId || '--' }}
             </template>
@@ -190,38 +193,41 @@
 
       <!-- 拼团信息 -->
       <div class="group-content" v-if="state.pinkList && state.pinkList.length > 0">
-        <div class="sa-title sa-m-b-10">拼团信息({{ state.pinkList[0]?.people || '未知' }}人团)</div>
+        <div class="sa-title sa-m-b-10">{{ t('modules.order.groupInfo', {
+          people: state.pinkList[0]?.people ||
+            t('common.unknown')
+        }) }}</div>
         <el-table class="sa-table" :data="state.pinkList" stripe border>
-          <el-table-column label="用户名" min-width="120" align="center">
+          <el-table-column :label="t('modules.order.username')" min-width="120" align="center">
             <template #default="{ row }">
               <el-link type="primary" @click="openUserDetail(row.uid)">
                 {{ row.name || '--' }}
               </el-link>
             </template>
           </el-table-column>
-          <el-table-column label="手机号" min-width="150" align="center">
+          <el-table-column :label="t('modules.order.phoneNumber')" min-width="150" align="center">
             <template #default="{ row }">
               {{ row.userPhone || '--' }}
             </template>
           </el-table-column>
-          <el-table-column label="参团订单号" min-width="180" align="center">
+          <el-table-column :label="t('modules.order.groupOrderNumber')" min-width="180" align="center">
             <template #default="{ row }">
               <el-link type="primary" @click="openOrderDetail(row.orderIdKey)">
                 {{ row.orderId || '--' }}
               </el-link>
             </template>
           </el-table-column>
-          <el-table-column label="参团时间" min-width="160" align="center">
+          <el-table-column :label="t('modules.order.joinTime')" min-width="160" align="center">
             <template #default="{ row }">
               {{ row.createTime || '--' }}
             </template>
           </el-table-column>
-          <el-table-column label="支付时间" min-width="160" align="center">
+          <el-table-column :label="t('modules.order.payTime')" min-width="160" align="center">
             <template #default="{ row }">
               {{ row.payTime || '--' }}
             </template>
           </el-table-column>
-          <el-table-column label="奖励佣金" min-width="120" align="center">
+          <el-table-column :label="t('modules.order.rewardCommission')" min-width="120" align="center">
             <template #default="{ row }"> ৳{{ row.commission || 0 }} </template>
           </el-table-column>
         </el-table>
@@ -231,13 +237,14 @@
 </template>
 <script setup>
 import { onMounted, reactive, ref, computed } from 'vue';
+import { useI18n } from 'vue-i18n';
 import { ElMessage, ElMessageBox } from 'element-plus';
 import {
   api,
   getOrderStatusInfo,
   getPinkStatusInfo,
   getWinStatusInfo,
-  getPayTypeText,
+  getOrderStatusConfig,
 } from '../order.service';
 import { useModal } from '@/sheep/hooks';
 import OrderDispatch from './dispatch.vue';
@@ -245,6 +252,8 @@ import OrderRefund from './refund.vue';
 import UserDetail from '../../user/list/detail.vue';
 import OrderDetailC from './detail.vue';
 
+const { t } = useI18n();
+
 const emit = defineEmits(['modalCallBack']);
 const props = defineProps(['modal']);
 
@@ -257,20 +266,20 @@ const state = reactive({
 const loading = ref(false);
 
 // 订单步骤配置
-const stepConfig = [
-  { key: 'create_order', title: '提交订单', waitText: '未提交' },
-  { key: 'payment', title: '付款', waitText: '未支付' },
-  { key: 'group_start', title: '开团', waitText: '未开团' },
-  { key: 'platform_ship', title: '平台发货', waitText: '未发货' },
-  { key: 'user_receive', title: '用户收货', waitText: '未收货' },
-];
+const stepConfig = computed(() => [
+  { key: 'create_order', title: t('modules.order.steps.createOrder'), waitText: t('modules.order.steps.notSubmitted') },
+  { key: 'payment', title: t('modules.order.steps.payment'), waitText: t('modules.order.steps.notPaid') },
+  { key: 'group_start', title: t('modules.order.steps.groupStart'), waitText: t('modules.order.steps.notGrouped') },
+  { key: 'platform_ship', title: t('modules.order.steps.platformShip'), waitText: t('modules.order.steps.notShipped') },
+  { key: 'user_receive', title: t('modules.order.steps.userReceive'), waitText: t('modules.order.steps.notReceived') },
+]);
 
 // 计算订单步骤
 const orderSteps = computed(() => {
   const trackData = state.orderDetail.orderStatusVO || [];
   const steps = [];
 
-  stepConfig.forEach((config, index) => {
+  stepConfig.value.forEach((config, index) => {
     const trackItem = trackData[index];
 
     if (trackItem) {
@@ -311,7 +320,7 @@ async function getOrderDetail() {
     }
   } catch (error) {
     console.error('获取订单详情失败:', error);
-    ElMessage.error('获取订单详情失败');
+    ElMessage.error(t('modules.order.getOrderDetailFailed'));
   } finally {
     loading.value = false;
   }
@@ -338,23 +347,31 @@ function getActiveStep() {
   return Math.max(0, trackData.length - 1);
 }
 
-// 通用状态处理函数
+// 通用状态处理函数 - 使用国际化配置
 const getStatusText = (type, value) => {
+  const config = getOrderStatusConfig(t);
   const statusMap = {
-    order: getOrderStatusInfo,
-    pink: getPinkStatusInfo,
-    win: getWinStatusInfo,
+    order: config.ORDER_STATUS,
+    pink: config.PINK_STATUS,
+    win: config.WIN_STATUS,
   };
-  return statusMap[type]?.(value)?.text || '未知';
+  return statusMap[type]?.[value]?.text || t('common.unknown');
 };
 
 const getStatusType = (type, value) => {
+  const config = getOrderStatusConfig(t);
   const statusMap = {
-    order: getOrderStatusInfo,
-    pink: getPinkStatusInfo,
-    win: getWinStatusInfo,
+    order: config.ORDER_STATUS,
+    pink: config.PINK_STATUS,
+    win: config.WIN_STATUS,
   };
-  return statusMap[type]?.(value)?.type || 'info';
+  return statusMap[type]?.[value]?.type || 'info';
+};
+
+// 获取支付方式文本 - 使用国际化配置
+const getPayTypeTextI18n = (payType) => {
+  const config = getOrderStatusConfig(t);
+  return config.PAY_TYPE[payType] || payType || t('common.unknown');
 };
 
 // 拼接完整地址
@@ -381,7 +398,7 @@ function openUserDetail(uid) {
   useModal(
     UserDetail,
     {
-      title: '用户详情',
+      title: t('modules.user.userDetail'),
       id: uid,
     },
     {
@@ -395,18 +412,18 @@ function openUserDetail(uid) {
 // 取消订单
 async function onCancelOrder() {
   try {
-    await ElMessageBox.confirm('确定要取消这个订单吗?', '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
+    await ElMessageBox.confirm(t('modules.order.confirmCancelOrder'), t('common.tip'), {
+      confirmButtonText: t('common.confirm'),
+      cancelButtonText: t('common.cancel'),
       type: 'warning',
     });
 
     const { code, message } = await api.order.cancel(String(state.orderDetail.id));
     if (code == 200) {
-      ElMessage.success('订单取消成功');
+      ElMessage.success(t('modules.order.cancelOrderSuccess'));
       getOrderDetail(); // 刷新订单详情
     } else {
-      ElMessage.error(message || '取消订单失败');
+      ElMessage.error(message || t('modules.order.cancelOrderFailed'));
     }
   } catch (error) { }
 }
@@ -416,7 +433,7 @@ function onDispatch() {
   useModal(
     OrderDispatch,
     {
-      title: '订单发货',
+      title: t('modules.order.orderDispatch'),
       data: state.orderDetail,
     },
     {
@@ -430,9 +447,9 @@ function onDispatch() {
 // 全部退款
 async function onRefund() {
   try {
-    await ElMessageBox.confirm('确定要对这个订单进行全部退款吗?', '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
+    await ElMessageBox.confirm(t('modules.order.confirmFullRefund'), t('common.tip'), {
+      confirmButtonText: t('common.confirm'),
+      cancelButtonText: t('common.cancel'),
       type: 'warning',
     });
 
@@ -472,7 +489,7 @@ async function openOrderDetailByOrderId(orderId) {
     useModal(
       OrderDetailC,
       {
-        title: '订单详情',
+        title: t('modules.order.orderDetail'),
         type: 'detail',
         id: orderId, // 这里可能需要转换为数据库ID
       },
@@ -484,7 +501,7 @@ async function openOrderDetailByOrderId(orderId) {
     );
   } catch (error) {
     console.error('打开订单详情失败:', error);
-    ElMessage.error('打开订单详情失败');
+    ElMessage.error(t('modules.order.openOrderDetailFailed'));
   }
 }
 
@@ -492,14 +509,14 @@ async function openOrderDetailByOrderId(orderId) {
 function onOpenDispatch() {
   // 检查订单数据是否完整
   if (!state.orderDetail || !state.orderDetail.orderInfoVO) {
-    ElMessage.error('订单数据加载中,请稍后再试');
+    ElMessage.error(t('modules.order.orderDataLoading'));
     return;
   }
 
   useModal(
     OrderDispatch,
     {
-      title: '订单发货',
+      title: t('modules.order.orderDispatch'),
       data: state.orderDetail,
     },
     {
@@ -515,7 +532,7 @@ function onOpenRefund() {
   useModal(
     OrderRefund,
     {
-      title: '订单退款',
+      title: t('modules.order.orderRefund'),
       width: '600px',
       params: {
         id: state.orderDetail.id,
@@ -534,10 +551,10 @@ async function onContactUser() {
   try {
     const { code } = await api.order.contact(state.orderDetail.id);
     if (code == 200) {
-      ElMessage.success('已发送联系信息');
+      ElMessage.success(t('modules.order.contactSent'));
     }
   } catch (err) {
-    ElMessage.error('联系用户失败');
+    ElMessage.error(t('modules.order.contactUserFailed'));
   }
 }
 
@@ -546,13 +563,13 @@ async function onExportOrder() {
   try {
     const { code, data } = await api.order.export(state.orderDetail.id);
     if (code == 200) {
-      ElMessage.success('导出成功');
+      ElMessage.success(t('modules.order.exportSuccess'));
       if (data.download_url) {
         window.open(data.download_url);
       }
     }
   } catch (err) {
-    ElMessage.error('导出订单失败');
+    ElMessage.error(t('modules.order.exportOrderFailed'));
   }
 }
 
@@ -561,11 +578,11 @@ async function onCloseOrder() {
   try {
     const { code } = await api.order.close(state.orderDetail.id);
     if (code == 200) {
-      ElMessage.success('订单已关闭');
+      ElMessage.success(t('modules.order.orderClosed'));
       getOrderDetail();
     }
   } catch (err) {
-    ElMessage.error('关闭订单失败');
+    ElMessage.error(t('modules.order.closeOrderFailed'));
   }
 }
 
@@ -580,12 +597,12 @@ async function onConfirmMemo() {
   try {
     const { code } = await api.order.editMemo(state.orderDetail.id, { memo: memoForm.data });
     if (code == 200) {
-      ElMessage.success('备注更新成功');
+      ElMessage.success(t('modules.order.memoUpdateSuccess'));
       memoForm.flag = false;
       getOrderDetail();
     }
   } catch (err) {
-    ElMessage.error('备注更新失败');
+    ElMessage.error(t('modules.order.memoUpdateFailed'));
   }
 }
 

+ 8 - 3
src/app/shop/admin/order/order/dispatch.vue

@@ -2,11 +2,13 @@
   <el-container class="send">
     <el-main>
       <el-tabs class="sa-m-b-20" v-model="state.dispatch_type">
-        <el-tab-pane v-if="state.nosendItem.length" label="快递发货" name="express"></el-tab-pane>
-        <el-tab-pane v-if="state.customItem.length" label="手动发货" name="custom"></el-tab-pane>
+        <el-tab-pane v-if="state.nosendItem.length" :label="t('modules.order.expressDelivery')"
+          name="express"></el-tab-pane>
+        <el-tab-pane v-if="state.customItem.length" :label="t('modules.order.manualDelivery')"
+          name="custom"></el-tab-pane>
       </el-tabs>
       <el-alert class="sa-alert sa-m-b-16">
-        <template #title>温馨提示:如果该商品处在售后状态,请先处理完售后再进行发货。</template>
+        <template #title>{{ t('modules.order.deliveryTip') }}</template>
       </el-alert>
       <div v-if="state.dispatch_type == 'express'">
         <el-table ref="expressTableRef" class="sa-table" :data="state.nosendItem"
@@ -175,10 +177,13 @@
 </template>
 <script setup>
 import { computed, getCurrentInstance, onMounted, reactive, ref, watch, nextTick } from 'vue';
+import { useI18n } from 'vue-i18n';
 import { api } from '../order.service';
 import useExpress from '@/app/shop/admin/data/express/express.js';
 import draggable from 'vuedraggable';
 
+const { t } = useI18n();
+
 const emit = defineEmits(['modalCallBack']);
 const props = defineProps(['modal']);
 

+ 83 - 69
src/app/shop/admin/order/order/index.vue

@@ -8,34 +8,37 @@
             <sa-search-simple :searchFields="searchFields" :defaultValues="defaultSearchValues"
               v-model="currentSearchParams" @search="handleSearch" @reset="handleReset">
               <template #custom="{ data }">
-                <el-form-item label="下单时间">
+                <el-form-item :label="t('modules.order.orderTime')">
                   <el-date-picker v-model="data.createTime" type="datetimerange" value-format="YYYY-MM-DD HH:mm:ss"
-                    format="YYYY-MM-DD HH:mm:ss" range-separator="至" start-placeholder="开始时间" end-placeholder="结束时间"
-                    :editable="false" style="width: 350px" />
+                    format="YYYY-MM-DD HH:mm:ss" :range-separator="t('common.to')"
+                    :start-placeholder="t('common.startDate')" :end-placeholder="t('common.endDate')" :editable="false"
+                    style="width: 350px" />
                 </el-form-item>
               </template>
             </sa-search-simple>
           </div>
           <el-tabs class="sa-tabs" v-model="currentStatus" @tab-change="handleTabChange">
-            <el-tab-pane label="全部" name="all"></el-tab-pane>
-            <el-tab-pane label="待付款" name="to_pay"></el-tab-pane>
-            <el-tab-pane label="已支付" name="paid"></el-tab-pane>
-            <el-tab-pane label="已退款" name="refund"></el-tab-pane>
-            <el-tab-pane label="待发货" name="to_ship"></el-tab-pane>
-            <el-tab-pane label="待收货" name="to_receive"></el-tab-pane>
-            <el-tab-pane label="已完成" name="completed"></el-tab-pane>
-            <el-tab-pane label="已关闭" name="to_closed"></el-tab-pane>
-            <el-tab-pane label="已取消" name="cancellation"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.all')" name="all"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.pendingPayment')" name="to_pay"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.paid')" name="paid"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.refunded')" name="refund"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.pendingShipment')" name="to_ship"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.shipped')" name="to_receive"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.completed')" name="completed"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.closed')" name="to_closed"></el-tab-pane>
+            <el-tab-pane :label="t('modules.order.cancelled')" name="cancellation"></el-tab-pane>
           </el-tabs>
           <div class="sa-title sa-flex sa-row-between">
             <div class="label sa-flex">
-              <span class="left">订单列表</span>
+              <span class="left">{{ t('modules.order.orderList') }}</span>
             </div>
             <div>
               <el-button class="sa-button-refresh" icon="RefreshRight" @click="getData()"></el-button>
-              <el-button :loading="exportLoading" :disabled="exportLoading" @click="onExport()">导出订单</el-button>
+              <el-button :loading="exportLoading" :disabled="exportLoading" @click="onExport()">{{
+                t('modules.order.exportOrders')
+              }}</el-button>
               <el-button v-if="currentStatus == 'to_ship'" :loading="exportLoading" :disabled="exportLoading"
-                @click="onExportDelivery()">导出发货单</el-button>
+                @click="onExportDelivery()">{{ t('modules.order.exportDeliveryList') }}</el-button>
             </div>
           </div>
         </el-header>
@@ -47,14 +50,14 @@
                 <sa-empty></sa-empty>
               </template>
               <el-table-column type="selection" width="48" align="center"></el-table-column>
-              <el-table-column sortable="custom" prop="orderId" label="订单编号" min-width="150">
+              <el-table-column sortable="custom" prop="orderId" :label="t('modules.order.orderNumber')" min-width="150">
                 <template #default="scope">
                   <div class="order-info">
                     <div class="order-sn">{{ scope.row.orderId }}</div>
                   </div>
                 </template>
               </el-table-column>
-              <el-table-column label="商品信息" min-width="300">
+              <el-table-column :label="t('modules.order.goodsInfo')" min-width="300">
                 <template #default="scope">
                   <div class="sa-flex" v-if="scope.row.orderInfoVO && scope.row.orderInfoVO.length > 0">
                     <el-image :src="scope.row.orderInfoVO[0].image"
@@ -66,7 +69,7 @@
                   <div v-else>-</div>
                 </template>
               </el-table-column>
-              <el-table-column label="规格" min-width="120" align="center">
+              <el-table-column :label="t('modules.order.specification')" min-width="120" align="center">
                 <template #default="scope">
                   <div v-if="scope.row.orderInfoVO && scope.row.orderInfoVO.length > 0">
                     {{ scope.row.orderInfoVO[0].sku || '-' }}
@@ -74,7 +77,7 @@
                   <div v-else>-</div>
                 </template>
               </el-table-column>
-              <el-table-column label="数量" min-width="80" align="center">
+              <el-table-column :label="t('modules.order.quantity')" min-width="80" align="center">
                 <template #default="scope">
                   <div v-if="scope.row.orderInfoVO && scope.row.orderInfoVO.length > 0">
                     {{ scope.row.orderInfoVO[0].payNum || 0 }}
@@ -82,60 +85,63 @@
                   <div v-else>0</div>
                 </template>
               </el-table-column>
-              <el-table-column prop="realName" label="用户名" min-width="120" align="center">
+              <el-table-column prop="realName" :label="t('modules.order.customerName')" min-width="120" align="center">
                 <template #default="scope">
                   <el-link type="primary" @click="openUserDetail(scope.row.uid)">
-                    {{ scope.row.realName || '无昵称' }}
+                    {{ scope.row.realName || t('modules.order.noNickname') }}
                   </el-link>
                 </template>
               </el-table-column>
-              <el-table-column prop="payPrice" label="付款金额" min-width="120" align="center">
+              <el-table-column prop="payPrice" :label="t('modules.order.payAmount')" min-width="120" align="center">
                 <template #default="scope">
                   <div>৳{{ scope.row.payPrice || 0 }}</div>
                 </template>
               </el-table-column>
-              <el-table-column label="订单状态" min-width="100" align="center">
+              <el-table-column :label="t('modules.order.orderStatus')" min-width="100" align="center">
                 <template #default="scope">
                   <el-tag :type="getStatusType('order', scope.row.status)">
                     {{ getStatusText('order', scope.row.status) }}
                   </el-tag>
                 </template>
               </el-table-column>
-              <el-table-column label="拼团状态" min-width="100" align="center">
+              <el-table-column :label="t('modules.order.groupStatusLabel')" min-width="100" align="center">
                 <template #default="scope">
                   <el-tag :type="getStatusType('pink', scope.row.pinkStatus)">
                     {{ getStatusText('pink', scope.row.pinkStatus) }}
                   </el-tag>
                 </template>
               </el-table-column>
-              <el-table-column label="物流信息" min-width="150" align="center">
+              <el-table-column :label="t('modules.order.deliveryInfo')" min-width="150" align="center">
                 <template #default="scope">
                   <div v-if="scope.row.deliveryId">
-                    <div class="delivery-name">{{ scope.row.deliveryName || '快递公司' }}:{{ scope.row.deliveryId }}</div>
+                    <div class="delivery-name">{{ scope.row.deliveryName || t('modules.order.expressCompany') }}:{{
+                      scope.row.deliveryId }}</div>
                   </div>
-                  <div v-else>未发货</div>
+                  <div v-else>{{ t('modules.order.notShipped') }}</div>
                 </template>
               </el-table-column>
-              <el-table-column label="下单时间" min-width="150" align="center">
+              <el-table-column :label="t('modules.order.orderTime')" min-width="150" align="center">
                 <template #default="scope">
                   <div>{{ scope.row.createTime }}</div>
                 </template>
               </el-table-column>
-              <el-table-column label="付款时间" min-width="150" align="center">
+              <el-table-column :label="t('modules.order.payTime')" min-width="150" align="center">
                 <template #default="scope">
                   <div>{{ scope.row.payTime || '-' }}</div>
                 </template>
               </el-table-column>
-              <el-table-column label="操作" min-width="150" fixed="right">
+              <el-table-column :label="t('common.actions')" min-width="150" fixed="right">
                 <template #default="scope">
                   <div class="sa-flex">
-                    <el-button class="is-link" type="primary" @click="onSend(scope.row)">发货测试</el-button>
+                    <el-button class="is-link" type="primary" @click="onSend(scope.row)">{{ t('modules.order.shipTest')
+                    }}</el-button>
                     <el-button v-if="scope.row.status === 5" class="is-link" type="primary"
-                      @click="onSend(scope.row)">发货</el-button>
-                    <el-button class="is-link" type="primary" @click="detailRow(scope.row.id)">详情</el-button>
+                      @click="onSend(scope.row)">{{ t('modules.order.shipOrder') }}</el-button>
+                    <el-button class="is-link" type="primary" @click="detailRow(scope.row.id)">{{
+                      t('modules.order.viewDetail') }}</el-button>
                     <el-button v-if="scope.row.status === 1" class="is-link sa-m-l-12" type="danger"
                       @click="cancelOrder(scope.row.id)">
-                      取消
+                      {{ t('modules.order.cancelOrder') }}
                     </el-button>
                   </div>
                 </template>
@@ -164,42 +170,45 @@ export default {
 };
 </script>
 <script setup>
-import { onMounted, reactive, ref } from 'vue';
+import { onMounted, reactive, ref, computed } from 'vue';
+import { useI18n } from 'vue-i18n';
 import { ElMessage, ElMessageBox } from 'element-plus';
-import { api, getOrderStatusInfo, getPinkStatusInfo } from '../order.service';
+import { api, getOrderStatusInfo, getPinkStatusInfo, getOrderStatusConfig } from '../order.service';
 import { useModal, usePagination } from '@/sheep/hooks';
 import OrderDispatch from './dispatch.vue';
 import OrderBatchDispatch from './batchDispatch.vue';
 import OrderDetail from './detail.vue';
 import UserEdit from '../../user/list/edit.vue';
 
-// 搜索字段配置
-const searchFields = reactive({
+const { t } = useI18n();
+
+// 搜索字段配置 - 使用计算属性以支持语言切换
+const searchFields = computed(() => ({
   orderId: {
     type: 'input',
-    label: '订单号',
-    placeholder: '请输入订单号',
+    label: t('modules.order.orderNo'),
+    placeholder: t('placeholders.inputOrderNo'),
     width: 200,
   },
   realName: {
     type: 'input',
-    label: '用户姓名',
-    placeholder: '请输入用户姓名',
+    label: t('modules.order.customerName'),
+    placeholder: t('placeholders.inputUserName'),
     width: 200,
   },
   userPhone: {
     type: 'input',
-    label: '用户手机',
-    placeholder: '请输入手机号',
+    label: t('modules.order.customerPhone'),
+    placeholder: t('placeholders.inputPhone'),
     width: 200,
   },
   deliveryId: {
     type: 'input',
-    label: '快递单号',
-    placeholder: '请输入快递单号',
+    label: t('modules.order.trackingNumber'),
+    placeholder: t('placeholders.inputTrackingNumber'),
     width: 200,
   },
-});
+}));
 
 // 默认搜索值
 const defaultSearchValues = reactive({
@@ -249,21 +258,25 @@ const handleTabChange = (status) => {
   getData(1);
 };
 
-// 通用状态处理函数
+// 通用状态处理函数 - 使用国际化配置
 const getStatusText = (type, value) => {
+  const config = getOrderStatusConfig(t);
   const statusMap = {
-    order: getOrderStatusInfo,
-    pink: getPinkStatusInfo,
+    order: config.ORDER_STATUS,
+    pink: config.PINK_STATUS,
+    win: config.WIN_STATUS,
   };
-  return statusMap[type]?.(value)?.text || '未知';
+  return statusMap[type]?.[value]?.text || t('common.unknown');
 };
 
 const getStatusType = (type, value) => {
+  const config = getOrderStatusConfig(t);
   const statusMap = {
-    order: getOrderStatusInfo,
-    pink: getPinkStatusInfo,
+    order: config.ORDER_STATUS,
+    pink: config.PINK_STATUS,
+    win: config.WIN_STATUS,
   };
-  return statusMap[type]?.(value)?.type || 'info';
+  return statusMap[type]?.[value]?.type || 'info';
 };
 
 const loading = ref(true);
@@ -368,7 +381,7 @@ async function onExport() {
       delete exportParams.createTime;
     }
 
-    await api.order.export(exportParams, '订单记录');
+    await api.order.export(exportParams, t('modules.order.orderRecords'));
   } catch (error) {
     console.error('导出订单失败:', error);
   } finally {
@@ -394,20 +407,20 @@ async function onExportDelivery() {
       delete exportParams.createTime;
     }
 
-    await api.order.exportDelivery(exportParams, '发货订单', 'exportDelivery');
+    await api.order.exportDelivery(exportParams, t('modules.order.deliveryOrders'), 'exportDelivery');
   } finally {
     exportLoading.value = false;
   }
 }
 
-const batchHandleTools = [
+const batchHandleTools = computed(() => [
   {
     operType: 'all',
     type: 'all',
-    label: '批量发货',
+    label: t('modules.order.batchDispatch'),
     buttonType: 'default',
   },
-];
+]);
 
 function batchHandle() {
   let order_ids = [];
@@ -417,7 +430,7 @@ function batchHandle() {
   useModal(
     OrderBatchDispatch,
     {
-      title: '批量发货',
+      title: t('modules.order.batchDispatch'),
       order_ids,
     },
     {
@@ -433,7 +446,7 @@ function detailRow(id) {
   useModal(
     OrderDetail,
     {
-      title: '订单详情',
+      title: t('modules.order.orderDetail'),
       type: 'detail',
       id,
     },
@@ -450,18 +463,18 @@ function detailRow(id) {
 
 async function cancelOrder(id) {
   try {
-    await ElMessageBox.confirm('确定要取消这个订单吗?', '提示', {
-      confirmButtonText: '确定',
-      cancelButtonText: '取消',
+    await ElMessageBox.confirm(t('modules.order.confirmCancelOrder'), t('common.tip'), {
+      confirmButtonText: t('common.confirm'),
+      cancelButtonText: t('common.cancel'),
       type: 'warning',
     });
 
     const { code, message } = await api.order.cancel(id);
     if (code == 200) {
-      ElMessage.success('订单取消成功');
+      ElMessage.success(t('modules.order.cancelOrderSuccess'));
       getData(); // 刷新列表
     } else {
-      ElMessage.error(message || '取消订单失败');
+      ElMessage.error(message || t('modules.order.cancelOrderFailed'));
     }
   } catch (error) { }
 }
@@ -472,7 +485,7 @@ function openUserDetail(uid) {
     useModal(
       UserEdit,
       {
-        title: '编辑用户',
+        title: t('modules.user.editUser'),
         type: 'edit',
         id: uid,
       },
@@ -490,11 +503,12 @@ function onSend(row) {
   useModal(
     OrderDispatch,
     {
-      title: '订单发货',
+      title: t('modules.order.orderDispatch'),
       data: row,
     },
     {
-      success: () => {
+      close: (result) => {
+        // 如果批量发货成功,刷新当前页面数据
         getData();
       },
     },

+ 0 - 123
src/app/shop/admin/order/order/manualOrder.vue

@@ -1,123 +0,0 @@
-<template>
-  <el-container>
-    <el-main>
-      <el-form :model="form" label-width="110px" :rules="rules" ref="formRef">
-        <el-form-item label="订单ID" prop="id">
-          <el-input v-model="form.id" disabled></el-input>
-        </el-form-item>
-        <el-form-item label="外部订单号" prop="out_order_id">
-          <el-input v-model="form.out_order_id" placeholder="请输入外部订单号"></el-input>
-        </el-form-item>
-        <el-form-item label="外部子订单号" prop="out_order_item_id">
-          <el-input v-model="form.out_order_item_id" placeholder="请输入外部子订单号"></el-input>
-        </el-form-item>
-        <el-form-item label="下单渠道" prop="order_source">
-          <el-input v-model="form.order_source" placeholder="请输入下单渠道"></el-input>
-        </el-form-item>
-      </el-form>
-    </el-main>
-    <el-footer class="sa-footer--submit">
-      <el-button @click="onCancel">取消</el-button>
-      <el-button
-        v-auth="'shop.admin.order.order.dispatch'"
-        type="primary"
-        @click="submit"
-        :loading="loading"
-        >确定</el-button
-      >
-    </el-footer>
-  </el-container>
-</template>
-
-<script setup>
-  import { reactive, ref, onMounted } from 'vue';
-  import { api } from '../order.service';
-  import { ElMessage } from 'element-plus';
-
-  const props = defineProps({
-    modal: {
-      type: Object,
-      default: () => {},
-    },
-  });
-
-  const emit = defineEmits(['modalCallBack']);
-
-  const formRef = ref(null);
-  const loading = ref(false);
-
-  const form = reactive({
-    id: '',
-    out_order_id: '',
-    out_order_item_id: '',
-    order_source: '',
-  });
-
-  const rules = {
-    out_order_id: [{ required: true, message: '请输入外部订单号', trigger: 'blur' }],
-    out_order_item_id: [{ required: true, message: '请输入外部子订单号', trigger: 'blur' }],
-    order_source: [{ required: true, message: '请输入下单渠道', trigger: 'blur' }],
-  };
-
-  onMounted(() => {
-    console.log(props.modal);
-    // 从传入的参数中获取订单ID
-    if (props.modal?.params?.id) {
-      form.id = props.modal.params.id;
-    } else if (props.modal?.data?.id) {
-      // 兼容另一种传参方式
-      form.id = props.modal.data.id;
-    }
-
-    // 如果有旧的表单数据,则回显
-    if (props.modal?.data?.out_order_id) {
-      form.out_order_id = props.modal.data.out_order_id;
-    }
-
-    if (props.modal?.data?.out_order_item_id) {
-      form.out_order_item_id = props.modal.data.out_order_item_id;
-    }
-
-    if (props.modal?.data?.order_source) {
-      form.order_source = props.modal.data.order_source;
-    }
-  });
-
-  // 取消操作
-  function onCancel() {
-    emit('modalCallBack', { event: 'close' });
-  }
-
-  // 提交表单
-  async function submit() {
-    if (!formRef.value) return;
-
-    await formRef.value.validate(async (valid) => {
-      if (valid) {
-        loading.value = true;
-        try {
-          const { code } = await api.order.manualOrderSubmit(form.id, {
-            out_order_id: form.out_order_id,
-            out_order_item_id: form.out_order_item_id,
-            order_source: form.order_source,
-          });
-
-          if (code == 200) {
-            ElMessage({
-              message: '手动下单成功',
-              type: 'success',
-            });
-            emit('modalCallBack', { event: 'confirm' });
-          }
-        } finally {
-          loading.value = false;
-        }
-      }
-    });
-  }
-
-  // 暴露方法给父组件调用
-  defineExpose({
-    submit,
-  });
-</script>

+ 123 - 1
src/locales/en-US/index.json

@@ -120,6 +120,8 @@
     "delete": "Delete",
     "confirm": "Confirm",
     "cancel": "Cancel",
+    "tip": "Tip",
+    "unknown": "Unknown",
     "createTime": "Create Time",
     "to": "to",
     "startDate": "Start Date",
@@ -378,6 +380,13 @@
     "editFeatureNotDeveloped": "Edit feature is under development",
     "goodsAttributeSaveSuccess": "Product attributes saved successfully"
   },
+  "placeholders": {
+    "inputOrderNo": "Please enter order number",
+    "inputUserName": "Please enter user name",
+    "inputUserAccount": "Please enter username or nickname",
+    "inputPhone": "Please enter phone number",
+    "inputTrackingNumber": "Please enter tracking number"
+  },
   "error": {
     "pageNotFound": "Page Not Found",
     "accessDenied": "Access Denied",
@@ -1090,10 +1099,119 @@
       "importDeliveryFile": "Import Delivery File",
       "reSelectFile": "Re-select File",
       "batchDispatch": "Batch Dispatch",
+      "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",
+      "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",
-      "partialDispatchFailed": "Partial dispatch failed, error records downloaded"
+      "partialDispatchFailed": "Partial dispatch failed, error records downloaded",
+      "orderDispatch": "Order Dispatch",
+      "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",
+        "cancelled": "Cancelled",
+        "paid": "Paid",
+        "refunded": "Refunded",
+        "pendingShipment": "Pending Shipment",
+        "closed": "Closed",
+        "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",
+        "offline": "Offline Payment",
+        "wechat": "WeChat Pay"
+      },
+      "recipient": "Recipient",
+      "detailAddress": "Detail Address",
+      "groupInfo": "Group Info ({people} people)",
+      "groupOrderNumber": "Group Order Number",
+      "joinTime": "Join Time",
+      "payTime": "Pay Time",
+      "steps": {
+        "createOrder": "Submit Order",
+        "payment": "Payment",
+        "groupStart": "Start Group",
+        "platformShip": "Platform Ship",
+        "userReceive": "User Receive",
+        "notSubmitted": "Not Submitted",
+        "notPaid": "Not Paid",
+        "notGrouped": "Not Grouped",
+        "notShipped": "Not Shipped",
+        "notReceived": "Not Received"
+      },
+      "confirmFullRefund": "Are you sure you want to fully refund this order?",
+      "orderRefund": "Order Refund",
+      "getOrderDetailFailed": "Failed to get order details",
+      "orderDataLoading": "Order data is loading, please try again later",
+      "contactSent": "Contact information sent",
+      "contactUserFailed": "Failed to contact user",
+      "exportSuccess": "Export successful",
+      "exportOrderFailed": "Failed to export order",
+      "orderClosed": "Order closed",
+      "closeOrderFailed": "Failed to close order",
+      "memoUpdateSuccess": "Memo updated successfully",
+      "memoUpdateFailed": "Failed to update memo",
+      "openOrderDetailFailed": "Failed to open order details"
     },
     "system": {
       "systemManagement": "System Management",
@@ -1192,6 +1310,10 @@
       "noPhone": "No phone bound",
       "getUserListFailed": "Failed to get user list"
     },
+    "user": {
+      "editUser": "Edit User",
+      "userDetail": "User Detail"
+    },
     "report": {
       "dataReport": "Data Report",
       "salesReport": "Sales Report",

+ 126 - 8
src/locales/zh-CN/index.json

@@ -116,8 +116,10 @@
     "add": "新建",
     "save": "保存",
     "update": "更新",
-    "to": "至",
-    "startDate": "开始日期",
+    "tip": "提示",
+    "confirm": "确定",
+    "cancel": "取消",
+    "unknown": "未知",
     "endDate": "结束日期",
     "status": "状态",
     "all": "全部",
@@ -252,11 +254,7 @@
     "selectCategory": "请选择分类",
     "selectStatus": "请选择状态",
     "uploadImage": "请上传图片",
-    "inputOrderNo": "请输入订单编号",
-    "inputUserName": "请输入用户姓名",
-    "inputUserAccount": "请输入用户名或昵称",
-    "inputPhone": "请输入手机号",
-    "inputTrackingNumber": "请输入物流单号",
+
     "selectLoginPermission": "请选择登录权限",
     "selectOrderPermission": "请选择下单权限",
     "selectWithdrawPermission": "请选择提现权限",
@@ -374,6 +372,13 @@
     "editFeatureNotDeveloped": "编辑功能待开发",
     "goodsAttributeSaveSuccess": "商品属性保存成功"
   },
+  "placeholders": {
+    "inputOrderNo": "请输入订单号",
+    "inputUserName": "请输入用户姓名",
+    "inputUserAccount": "请输入用户名或昵称",
+    "inputPhone": "请输入手机号",
+    "inputTrackingNumber": "请输入物流单号"
+  },
   "error": {
     "pageNotFound": "未找到页面",
     "accessDenied": "访问被拒绝",
@@ -1091,10 +1096,119 @@
       "importDeliveryFile": "导入发货单",
       "reSelectFile": "重新选择文件",
       "batchDispatch": "批量发货",
+      "all": "全部",
+      "customerName": "客户姓名",
+      "customerPhone": "客户手机",
+      "goodsInfo": "商品信息",
+      "specification": "规格",
+      "quantity": "数量",
+      "payAmount": "付款金额",
+      "deliveryInfo": "物流信息",
+      "expressCompany": "快递公司",
+      "notShipped": "未发货",
+      "shipTest": "发货测试",
+      "noNickname": "无昵称",
+      "orderTrack": "订单轨迹",
+      "basicInfo": "基本信息",
+      "totalAmount": "全部金额",
+      "expressDelivery": "快递发货",
+      "manualDelivery": "手动发货",
+      "deliveryTip": "温馨提示:如果该商品处在售后状态,请先处理完售后再进行发货。",
+      "pendingShipment": "待发货",
+      "shipped": "待收货",
+      "refunded": "已退款",
+      "closed": "已关闭",
+      "cancelled": "已取消",
+      "trackingNumber": "物流单号",
+      "winStatus": "中奖状态",
+      "username": "用户名",
+      "paymentMethod": "支付方式",
+      "discountAmount": "优惠金额",
+      "rewardCommission": "奖励佣金",
+      "phoneNumber": "手机号码",
+      "paymentAmount": "支付金额",
+      "actualPayment": "实付金额",
+      "orderTrack": "订单轨迹",
+      "basicInfo": "基本信息",
       "pleaseSelectFile": "请先选择发货单文件",
       "batchDispatchSuccess": "批量发货成功",
       "batchDispatchFailed": "批量发货失败",
-      "partialDispatchFailed": "部分发货失败,已下载失败记录"
+      "partialDispatchFailed": "部分发货失败,已下载失败记录",
+      "orderDispatch": "订单发货",
+      "confirmCancelOrder": "确定要取消这个订单吗?",
+      "cancelOrderSuccess": "订单取消成功",
+      "cancelOrderFailed": "取消订单失败",
+      "orderDetail": "订单详情",
+      "orderRecords": "订单记录",
+      "deliveryOrders": "发货订单",
+      "refund": "退款",
+      "goodsImage": "商品图片",
+      "goodsName": "商品名称",
+      "unitPrice": "单价",
+      "status": {
+        "pendingPayment": "待支付",
+        "cancelled": "订单取消",
+        "paid": "已支付",
+        "refunded": "失败已退款",
+        "pendingShipment": "待发货",
+        "closed": "已关闭",
+        "shipped": "待收货",
+        "completed": "订单完成"
+      },
+      "refundStatus": {
+        "noRefund": "未退款",
+        "applying": "申请中",
+        "refunded": "已退款",
+        "refunding": "退款中"
+      },
+      "groupStatusLabel": "拼团状态",
+      "groupStatus": {
+        "pending": "未成团",
+        "success": "已成团",
+        "failed": "成团失败"
+      },
+      "winStatusLabel": "中奖状态",
+      "winStatus": {
+        "notWon": "未中奖",
+        "won": "已中奖"
+      },
+      "payType": {
+        "balance": "账户余额",
+        "alipay": "支付宝",
+        "offline": "线下支付",
+        "wechat": "微信支付"
+      },
+      "recipient": "收件人",
+      "detailAddress": "详细地址",
+      "groupInfo": "拼团信息({people}人团)",
+      "groupOrderNumber": "参团订单号",
+      "joinTime": "参团时间",
+      "payTime": "支付时间",
+      "steps": {
+        "createOrder": "提交订单",
+        "payment": "付款",
+        "groupStart": "开团",
+        "platformShip": "平台发货",
+        "userReceive": "用户收货",
+        "notSubmitted": "未提交",
+        "notPaid": "未支付",
+        "notGrouped": "未开团",
+        "notShipped": "未发货",
+        "notReceived": "未收货"
+      },
+      "confirmFullRefund": "确定要对这个订单进行全部退款吗?",
+      "orderRefund": "订单退款",
+      "getOrderDetailFailed": "获取订单详情失败",
+      "orderDataLoading": "订单数据加载中,请稍后再试",
+      "contactSent": "已发送联系信息",
+      "contactUserFailed": "联系用户失败",
+      "exportSuccess": "导出成功",
+      "exportOrderFailed": "导出订单失败",
+      "orderClosed": "订单已关闭",
+      "closeOrderFailed": "关闭订单失败",
+      "memoUpdateSuccess": "备注更新成功",
+      "memoUpdateFailed": "备注更新失败",
+      "openOrderDetailFailed": "打开订单详情失败"
     },
     "system": {
       "systemManagement": "系统管理",
@@ -1193,6 +1307,10 @@
       "noPhone": "未绑定手机",
       "getUserListFailed": "获取用户列表失败"
     },
+    "user": {
+      "editUser": "编辑用户",
+      "userDetail": "用户详情"
+    },
     "report": {
       "dataReport": "数据报表",
       "salesReport": "销售报表",