Эх сурвалжийг харах

feat: 完善部分订单逻辑,nickname 改为name 用户名

叶静 1 долоо хоног өмнө
parent
commit
f2a0909d62

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

@@ -158,6 +158,26 @@ const api = {
         method: 'PUT',
         data,
       }),
+    // 取消订单
+    cancel: (ids) => {
+      // 如果是数组,转换为逗号分隔的字符串;如果已经是字符串,直接使用
+      const idsString = Array.isArray(ids) ? ids.join(',') : String(ids);
+      return request({
+        url: '/mall/order/cancel',
+        method: 'POST',
+        params: { ids: idsString },
+      });
+    },
+    // 退款订单
+    refund: (ids) => {
+      // 如果是数组,转换为逗号分隔的字符串;如果已经是字符串,直接使用
+      const idsString = Array.isArray(ids) ? ids.join(',') : String(ids);
+      return request({
+        url: '/mall/order/refund',
+        method: 'POST',
+        params: { ids: idsString },
+      });
+    },
     // 联系用户
     contact: (id) =>
       request({
@@ -187,12 +207,6 @@ const api = {
         method: 'PUT',
         data,
       }),
-    refund: (id, item_id, data) =>
-      request({
-        url: `/shop/admin/order/order/refund/${id}/${item_id}`,
-        method: 'PUT',
-        data,
-      }),
     updateExpress: (id, params) =>
       request({
         url: `/shop/admin/order/order/updateExpress/${id}`,
@@ -224,10 +238,8 @@ const api = {
     // 获取拼团信息
     getPinkList: (orderId) =>
       request({
-        url: '/mall/pink/list',
-        method: 'POST',
-        params: { size: 100 },
-        data: { orderId },
+        url: `/mall/pink/orderPink/${orderId}`,
+        method: 'GET',
       }),
   },
   aftersale: {

+ 77 - 55
src/app/shop/admin/order/order/detail.vue

@@ -1,6 +1,6 @@
 <template>
   <el-container class="order-detail">
-    <el-main>
+    <el-main v-loading="loading" element-loading-text="加载中...">
       <!-- 订单轨迹 -->
       <div class="order-track sa-m-b-46">
         <h3 class="sa-m-b-20">订单轨迹</h3>
@@ -75,7 +75,7 @@
           </el-col>
           <el-col :span="6">
             <div class="info-item">
-              <span class="label">用户昵称:</span>
+              <span class="label">用户:</span>
               <span class="value">{{ state.orderDetail.realName || '--' }}</span>
             </div>
           </el-col>
@@ -155,26 +155,12 @@
 
       <!-- 操作按钮 -->
       <div class="action-buttons sa-m-b-26">
-        <template v-if="state.orderDetail.btns">
-          <el-button
-            v-if="state.orderDetail.btns.includes('send')"
-            type="primary"
-            @click="onOpenDispatch"
-            >立即发货</el-button
-          >
-          <el-button v-if="state.orderDetail.btns.includes('refund')" @click="onOpenRefund"
-            >全部退款</el-button
-          >
-          <el-button v-if="state.orderDetail.btns.includes('contact_user')" @click="onContactUser"
-            >联系用户</el-button
-          >
-          <el-button v-if="state.orderDetail.btns.includes('export_order')" @click="onExportOrder"
-            >导出订单</el-button
-          >
-          <el-button v-if="state.orderDetail.btns.includes('close_order')" @click="onCloseOrder"
-            >关闭订单</el-button
-          >
-        </template>
+        <!-- 取消订单按钮 - 只在待付款状态显示 -->
+        <el-button v-if="state.orderDetail.paid === 0" type="warning" plain @click="onCancelOrder"
+          >取消订单</el-button
+        >
+        <!-- 全部退款按钮 - 固定显示 -->
+        <el-button type="danger" plain @click="onRefund">全部退款</el-button>
       </div>
       <!-- 商品信息 -->
       <div class="goods-content sa-m-b-16">
@@ -228,33 +214,37 @@
           >拼团信息({{ state.pinkList[0]?.people || '未知' }}人团)</div
         >
         <el-table class="sa-table" :data="state.pinkList" stripe border>
-          <el-table-column label="昵称" min-width="120" align="center">
+          <el-table-column label="用户名" min-width="120" align="center">
             <template #default="{ row }">
               <el-link type="primary" @click="openUserDetail(row.uid)">
-                {{ row.nickname || '--' }}
+                {{ row.name || '--' }}
               </el-link>
             </template>
           </el-table-column>
           <el-table-column label="手机号" min-width="150" align="center">
             <template #default="{ row }">
-              {{ getUserPhone(row.uid) }}
+              {{ row.userPhone || '--' }}
             </template>
           </el-table-column>
           <el-table-column label="参团订单号" min-width="180" align="center">
             <template #default="{ row }">
-              <el-link type="primary" @click="openOrderDetail(row.orderId)">
+              <el-link type="primary" @click="openOrderDetail(row.orderIdKey)">
                 {{ row.orderId || '--' }}
               </el-link>
             </template>
           </el-table-column>
-          <el-table-column label="参团时间" prop="addTime" min-width="160" align="center" />
+          <el-table-column label="参团时间" min-width="160" align="center">
+            <template #default="{ row }">
+              {{ row.createTime || '--' }}
+            </template>
+          </el-table-column>
           <el-table-column label="支付时间" min-width="160" align="center">
             <template #default="{ row }">
-              {{ getPayTime(row.orderId) }}
+              {{ row.payTime || '--' }}
             </template>
           </el-table-column>
           <el-table-column label="奖励佣金" min-width="120" align="center">
-            <template #default="{ row }"> ৳{{ getBrokerage(row.orderId) }} </template>
+            <template #default="{ row }"> ৳{{ row.commission || 0 }} </template>
           </el-table-column>
         </el-table>
       </div>
@@ -262,8 +252,8 @@
   </el-container>
 </template>
 <script setup>
-  import { onMounted, reactive, computed } from 'vue';
-  import { ElMessage } from 'element-plus';
+  import { onMounted, reactive, ref, computed } from 'vue';
+  import { ElMessage, ElMessageBox } from 'element-plus';
   import {
     api,
     getPayStatusInfo,
@@ -287,6 +277,9 @@
     pinkList: [], // 拼团信息列表
   });
 
+  // loading状态
+  const loading = ref(false);
+
   // 订单步骤配置
   const stepConfig = [
     { key: 'create_order', title: '提交订单', waitText: '未提交' },
@@ -332,11 +325,19 @@
 
   // 获取订单详情
   async function getOrderDetail() {
-    const { code, data } = await api.order.detail(props.modal.params.id);
-    if (code == 200) {
-      state.orderDetail = data;
-      // 获取拼团信息
-      await getPinkList(data.orderId);
+    try {
+      loading.value = true;
+      const { code, data } = await api.order.detail(props.modal.params.id);
+      if (code == 200) {
+        state.orderDetail = data;
+        // 获取拼团信息
+        await getPinkList(data.id);
+      }
+    } catch (error) {
+      console.error('获取订单详情失败:', error);
+      ElMessage.error('获取订单详情失败');
+    } finally {
+      loading.value = false;
     }
   }
 
@@ -346,7 +347,7 @@
     try {
       const { code, data } = await api.order.getPinkList(orderId);
       if (code == 200) {
-        state.pinkList = data.list || [];
+        state.pinkList = data || [];
       }
     } catch (error) {
       console.error('获取拼团信息失败:', error);
@@ -411,28 +412,11 @@
     if (addressInfo.city) parts.push(addressInfo.city);
     if (addressInfo.district) parts.push(addressInfo.district);
     if (addressInfo.detail) parts.push(addressInfo.detail);
+    if (addressInfo.postCode) parts.push(addressInfo.postCode);
 
     return parts.length > 0 ? parts.join('') : '--';
   }
 
-  // 获取用户手机号(这里需要根据实际情况调用用户接口或从其他地方获取)
-  function getUserPhone(uid) {
-    // TODO: 根据用户ID获取手机号,这里先返回占位符
-    return '--';
-  }
-
-  // 获取支付时间(这里需要根据订单ID获取支付时间)
-  function getPayTime(orderId) {
-    // TODO: 根据订单ID获取支付时间,这里先返回占位符
-    return '--';
-  }
-
-  // 获取奖励佣金(这里需要根据订单ID获取佣金信息)
-  function getBrokerage(orderId) {
-    // TODO: 根据订单ID获取佣金信息,这里先返回占位符
-    return '0';
-  }
-
   // 打开用户详情
   function openUserDetail(uid) {
     if (!uid) {
@@ -454,6 +438,44 @@
     );
   }
 
+  // 取消订单
+  async function onCancelOrder() {
+    try {
+      await ElMessageBox.confirm('确定要取消这个订单吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      });
+
+      const { code, message } = await api.order.cancel(String(state.orderDetail.id));
+      if (code == 200) {
+        ElMessage.success('订单取消成功');
+        getOrderDetail(); // 刷新订单详情
+      } else {
+        ElMessage.error(message || '取消订单失败');
+      }
+    } catch (error) {}
+  }
+
+  // 全部退款
+  async function onRefund() {
+    try {
+      await ElMessageBox.confirm('确定要对这个订单进行全部退款吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      });
+
+      const { code, message } = await api.order.refund(String(state.orderDetail.id));
+      if (code == 200) {
+        ElMessage.success('退款提交成功');
+        getOrderDetail(); // 刷新订单详情
+      } else {
+        ElMessage.error(message || '退款申请失败');
+      }
+    } catch (error) {}
+  }
+
   // 打开订单详情
   function openOrderDetail(orderId) {
     if (!orderId) {

+ 17 - 3
src/app/shop/admin/order/order/index.vue

@@ -246,6 +246,7 @@
   import OrderBatchDispatch from './batchDispatch.vue';
   import OrderDetail from './detail.vue';
   import UserEdit from '../../user/list/edit.vue';
+  import { ElMessage, ElMessageBox } from 'element-plus';
 
   // 搜索字段配置
   const searchFields = reactive({
@@ -451,9 +452,22 @@
     );
   }
 
-  function cancelOrder(id) {
-    console.log('取消订单:', id);
-    // 这里可以添加取消订单的逻辑
+  async function cancelOrder(id) {
+    try {
+      await ElMessageBox.confirm('确定要取消这个订单吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      });
+
+      const { code, message } = await api.order.cancel([id]);
+      if (code == 200) {
+        ElMessage.success('订单取消成功');
+        getData(); // 刷新列表
+      } else {
+        ElMessage.error(message || '取消订单失败');
+      }
+    } catch (error) {}
   }
 
   // 打开用户详情

+ 38 - 10
src/app/shop/admin/user/list/detail.vue

@@ -47,7 +47,7 @@
                 {{ row.field2 || '--' }}
               </template>
             </el-table-column>
-            <el-table-column label="昵称" align="center">
+            <el-table-column label="用户名" align="center">
               <template #default="{ row }">
                 {{ row.field3 || '--' }}
               </template>
@@ -253,9 +253,9 @@
           <el-tab-pane label="下线用户" name="subordinates">
             <el-skeleton v-if="state.loading.subordinates" :rows="5" animated />
             <el-table v-else class="sa-table" :data="state.subordinates" stripe border>
-              <el-table-column label="昵称" prop="nickname" align="center">
+              <el-table-column label="用户名" prop="name" align="center">
                 <template #default="{ row }">
-                  {{ row.nickname || '--' }}
+                  {{ row.name || '--' }}
                 </template>
               </el-table-column>
               <el-table-column label="手机号" prop="phoneNo" align="center" />
@@ -429,9 +429,21 @@
           <el-tab-pane label="收货地址" name="addresses">
             <el-skeleton v-if="state.loading.addresses" :rows="5" animated />
             <el-table v-else class="sa-table" :data="state.addresses" stripe border>
-              <el-table-column label="收件人" prop="name" align="center" />
-              <el-table-column label="手机号" prop="mobile" align="center" />
-              <el-table-column label="详细地址" prop="address" min-width="600" />
+              <el-table-column label="收件人" prop="realName" min-width="120" align="center" />
+              <el-table-column label="手机号" prop="phone" min-width="130" align="center" />
+              <el-table-column label="详细地址" min-width="400">
+                <template #default="{ row }">
+                  {{ row.province }}/{{ row.city }}/{{ row.district }}/{{ row.detail }}
+                  {{ row.postCode }}
+                </template>
+              </el-table-column>
+              <el-table-column label="是否默认" min-width="100" align="center">
+                <template #default="{ row }">
+                  <el-tag :type="row.isDefault === 1 ? 'success' : 'info'">
+                    {{ row.isDefault === 1 ? '默认地址' : '普通地址' }}
+                  </el-tag>
+                </template>
+              </el-table-column>
             </el-table>
           </el-tab-pane>
         </el-tabs>
@@ -506,7 +518,7 @@
       {
         field1: state.userDetail.userNo || '--', // 用户ID
         field2: getStatusText(state.userDetail.status) || '--', // 状态
-        field3: state.userDetail.nickname || '--', // 昵称
+        field3: state.userDetail.name || '--', // 昵称
         field4: state.userDetail.bank || '--', // 收款银行
         field5: state.userDetail.bankAccountName || '--', // 账户名称
       },
@@ -657,21 +669,37 @@
           stateKey = 'withdraws';
           break;
         case 'addresses':
-          // 获取用户收货地址(暂时留空,后端还在开发)
-          state.addresses = [];
-          return;
+          // 获取用户收货地址
+          response = await api.getUserAddresses(props.modal.params.id, requestData);
+          stateKey = 'addresses';
+          break;
         default:
           return;
       }
 
       if (response && response.code == '200') {
+        // 所有接口都使用统一的分页数据结构
         state[stateKey] = response.data.list || [];
         // 更新分页信息
         pageData.page = response.data.pageNum || page;
         pageData.total = response.data.total || 0;
+
+        console.log(`${tabType}数据加载成功:`, {
+          list: response.data.list,
+          total: response.data.total,
+          pageNum: response.data.pageNum,
+        });
+      } else {
+        console.error('API响应错误:', response);
+        // 确保即使出错也设置为空数组
+        state[stateKey] = [];
+        pageData.total = 0;
       }
     } catch (error) {
       console.error(`获取${tabType}数据失败:`, error);
+      // 确保出错时也设置为空数组,避免表格组件报错
+      state[tabType] = [];
+      pageData.total = 0;
     }
   };
 

+ 2 - 2
src/app/shop/admin/user/list/index.vue

@@ -64,10 +64,10 @@
               <span class="user-id">{{ scope.row.id }}</span>
             </template>
           </el-table-column>
-          <el-table-column label="用户昵称" min-width="140">
+          <el-table-column label="用户" min-width="140">
             <template #default="scope">
               <div class="user-info">
-                {{ scope.row.nickname || '-' }}
+                {{ scope.row.name || '-' }}
               </div>
             </template>
           </el-table-column>

+ 6 - 3
src/app/shop/admin/user/user.service.js

@@ -94,9 +94,12 @@ const api = {
     }),
   getUserAddresses: (id, params) =>
     request({
-      url: `shop/admin/user/list/${id}/addresses`,
-      method: 'GET',
-      params,
+      url: '/mall/user/address/list',
+      method: 'POST',
+      params: { page: params.page || 1, size: params.size || 10 },
+      data: {
+        uid: id, // 用户ID筛选
+      },
     }),
 
   // 会员等级相关 API