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

```
feat(delivery): 新增普通订单管理页面及相关接口类型定义

新增了普通订单管理页面,包括订单列表展示、状态筛选、搜索功能,
并添加了相关 API 接口和服务端数据类型的 TypeScript 定义。

同时调整了部分环境变量配置及路由结构,以支持新模块的接入。
```

zhangtao 1 долоо хоног өмнө
parent
commit
5fd09cf1ac

+ 1 - 1
.env.prod

@@ -1,6 +1,6 @@
 # backend service base url, prod environment
 # VITE_SERVICE_BASE_URL=https://mock.apifox.cn/m1/3109515-0-default
-VITE_SERVICE_BASE_URL=https://shop.platform.zswlgz.com/plt #服务器
+VITE_SERVICE_BASE_URL=/plt #服务器
 # other backend service base url, prod environment
 VITE_OTHER_SERVICE_BASE_URL= `{
   "demo": "http://localhost:9529"

+ 2 - 2
.env.test

@@ -1,7 +1,7 @@
 # backend service base url, test environment
 # VITE_SERVICE_BASE_URL=http://74949mkfh190.vicp.fun
-VITE_SERVICE_BASE_URL=http://192.168.1.206:8114 #付
-# VITE_SERVICE_BASE_URL=http://192.168.0.157:8114 #王
+# VITE_SERVICE_BASE_URL=http://192.168.1.206:8114 #付
+VITE_SERVICE_BASE_URL=http://192.168.0.157:8114 #王
 # VITE_SERVICE_BASE_URL=https://mock.apifox.cn/m1/3109515-0-default
 # VITE_SERVICE_BASE_URL=https://shop.platform.zswlgz.com #服务器
 

+ 3 - 1
src/locales/langs/en-us.ts

@@ -299,7 +299,9 @@ const local: App.I18n.Schema = {
     operation_search: '',
     config: '',
     'config_fright-config': '',
-    'config_order-splitting': ''
+    'config_order-splitting': '',
+    delivery: '',
+    'delivery_normal-order': ''
   },
   page: {
     login: {

+ 3 - 1
src/locales/langs/zh-cn.ts

@@ -296,7 +296,9 @@ const local: App.I18n.Schema = {
     operation_search: '',
     config: '',
     'config_fright-config': '',
-    'config_order-splitting': ''
+    'config_order-splitting': '',
+    delivery: '',
+    'delivery_normal-order': ''
   },
   page: {
     login: {

+ 1 - 0
src/router/elegant/imports.ts

@@ -23,6 +23,7 @@ export const views: Record<LastLevelRouteKey, RouteComponent | (() => Promise<Ro
   about: () => import("@/views/about/index.vue"),
   "config_fright-config": () => import("@/views/config/fright-config/index.vue"),
   "config_order-splitting": () => import("@/views/config/order-splitting/index.vue"),
+  "delivery_normal-order": () => import("@/views/delivery/normal-order/index.vue"),
   "goods_desk-category": () => import("@/views/goods/desk-category/index.vue"),
   "goods_store-goods": () => import("@/views/goods/store-goods/index.vue"),
   goods_tag: () => import("@/views/goods/tag/index.vue"),

+ 20 - 0
src/router/elegant/routes.ts

@@ -79,6 +79,26 @@ export const generatedRoutes: GeneratedRoute[] = [
       }
     ]
   },
+  {
+    name: 'delivery',
+    path: '/delivery',
+    component: 'layout.base',
+    meta: {
+      title: 'delivery',
+      i18nKey: 'route.delivery'
+    },
+    children: [
+      {
+        name: 'delivery_normal-order',
+        path: '/delivery/normal-order',
+        component: 'view.delivery_normal-order',
+        meta: {
+          title: 'delivery_normal-order',
+          i18nKey: 'route.delivery_normal-order'
+        }
+      }
+    ]
+  },
   {
     name: 'goods',
     path: '/goods',

+ 2 - 0
src/router/elegant/transform.ts

@@ -185,6 +185,8 @@ const routeMap: RouteMap = {
   "config": "/config",
   "config_fright-config": "/config/fright-config",
   "config_order-splitting": "/config/order-splitting",
+  "delivery": "/delivery",
+  "delivery_normal-order": "/delivery/normal-order",
   "goods": "/goods",
   "goods_desk-category": "/goods/desk-category",
   "goods_store-goods": "/goods/store-goods",

+ 25 - 0
src/service/api/delivery/normal-orde/index.ts

@@ -0,0 +1,25 @@
+import { request } from '@/service/request';
+
+/**
+ * 正常快递订单
+ * @param data
+ * @returns
+ */
+export function fetchGetDeliveryOrderList(data: any) {
+  return request<Api.Common.PaginatingQueryRecord<Api.delivery.deliveryOrder>>({
+    url: '/platform/order/deliverList',
+    method: 'get',
+    params: data
+  });
+}
+
+/**
+ *  获取快递订单状态数量
+ * @returns
+ */
+export function fetchGetDeliveryStatusNum() {
+  return request<Api.delivery.DeliveryStatusNum>({
+    url: '/platform/order/deliverListStatusNum',
+    method: 'get'
+  });
+}

+ 403 - 1
src/typings/api.d.ts

@@ -133,7 +133,7 @@ declare namespace Api {
       /**
        * 序号
        */
-      num?: number;
+      num: number;
       /**
        * 操作人
        */
@@ -880,4 +880,406 @@ declare namespace Api {
       channelId: number;
     }
   }
+  namespace delivery {
+    interface deliveryOrder {
+      /**
+       * 实际总值
+       */
+      actualTotal?: number;
+      /**
+       * 用户订单地址Id
+       */
+      addrOrderId?: number;
+      /**
+       * 取消时间
+       */
+      cancelTime?: string;
+      /**
+       * 渠道ID
+       */
+      channelId?: number;
+      /**
+       * 订单关闭原因 (1:超时未支付 2:退款关闭 4:买家取消 15:已通过货到付款交易)
+       */
+      closeType?: number;
+      /**
+       * 订购时间
+       */
+      createTime?: string;
+      /**
+       * 用户订单删除状态,0:没有删除, 1:回收站, 2:永久删除
+       */
+      deleteStatus?: number;
+      /**
+       * 物流单号
+       */
+      dvyFlowId?: string;
+      /**
+       * 配送方式ID
+       */
+      dvyId?: number;
+      /**
+       * 麦芽条状态 0 失败 1 成功 null为暂未创建
+       */
+      dvyStatus?: number;
+      /**
+       * 发货时间
+       */
+      dvyTime?: string;
+      /**
+       * 配送类型(1:快递 2:自提 3:及时配送)
+       */
+      dvyType?: number;
+      /**
+       * 完成时间
+       */
+      finallyTime?: string;
+      /**
+       * 订单运费
+       */
+      freightAmount?: number;
+      /**
+       * 海博物流状态
+       * 20:已抢单,30:配送员到店,40:取货完成,50:配送单取消,100:已送达
+       */
+      hbLogisticStatus: number;
+      /**
+       * 海博订单状态
+       * 0-待支付 1-待发货,20-订单已接单(待拣货),30-订单待配送(拣货完成/自提类订单为待自提),40-订单配送中
+       * ,50-订单取消待审核,60-订单已取消,70-订单已送达,80-订单已完成
+       */
+      hbOrderStatus?: number;
+      /**
+       * 是否已经支付,1:已经支付过,0:,没有支付过
+       */
+      isPayed?: number;
+      /**
+       * 亏损金额
+       */
+      lossAmount?: number;
+      nextPay?: boolean;
+      /**
+       * 买家昵称
+       * 买家名称
+       */
+      nickName?: string;
+      offsetPoints?: number;
+      /**
+       * 订单ID
+       */
+      orderId?: number;
+      orderItems?: OrderItemElement[];
+      /**
+       * 订购流水号
+       */
+      orderNumber?: string;
+      /**
+       * 订单类型参考orderType ,1团购订单 2秒杀订单,3积分订单
+       */
+      orderType?: number;
+      payScore?: number;
+      /**
+       * 付款时间
+       */
+      payTime?: string;
+      /**
+       * 支付方式 1 微信支付 2 支付宝
+       */
+      payType?: number;
+      /**
+       * 平台优惠总额
+       */
+      platformAmount?: number;
+      /**
+       * 产品名称,多个产品将会以逗号隔开
+       */
+      prodName?: string;
+      /**
+       * 订单商品总数
+       */
+      productNums?: number;
+      /**
+       * 牵牛花订单id
+       */
+      qnhOrderId?: string;
+      /**
+       * 牵牛花订单状态 0 失败 1 成功 null为暂未创建
+       */
+      qnhOrderStatus?: string;
+      /**
+       * 收货人
+       */
+      receiver?: string;
+      /**
+       * 优惠总额
+       */
+      reduceAmount?: number;
+      /**
+       * 退款订单编号
+       */
+      refundSn?: string;
+      /**
+       * 订单退款状态(1:申请退款 2:退款成功 3:部分退款成功 4:退款失败)
+       */
+      refundStatus?: number;
+      /**
+       * 退款类型
+       */
+      refundType?: number;
+      /**
+       * 用户备注
+       */
+      remarks?: string;
+      /**
+       * 退款状态
+       */
+      returnMoneySts?: number;
+      /**
+       * 订单所用积分
+       */
+      score?: number;
+      /**
+       * 店铺id
+       */
+      shopId?: number;
+      /**
+       * 店铺名称
+       */
+      shopName?: string;
+      /**
+       * 卖家备注
+       */
+      shopRemarks?: string;
+      /**
+       * 总值
+       */
+      total?: number;
+      /**
+       * 订单更新时间
+       */
+      updateTime?: string;
+      /**
+       * 用户订单地址
+       */
+      userAddrOrder?: UserAddrOrder;
+      /**
+       * 订购用户ID
+       */
+      userId?: string;
+      /**
+       * 买家手机号
+       */
+      userMobile?: string;
+      [property: string]: any;
+    }
+    interface OrderItemElement {
+      /**
+       * 商品实际金额 = 商品总金额 - 分摊的优惠金额
+       */
+      actualTotal?: number;
+      /**
+       * 加入购物车的时间
+       */
+      basketDate?: string;
+      /**
+       * 订单减少金额
+       */
+      chageAmount?: number;
+      /**
+       * 发货改变的数量
+       */
+      changeNum?: number;
+      /**
+       * 评论状态: 0 未评价  1 已评价
+       */
+      commSts?: number;
+      /**
+       * 分销佣金
+       */
+      distributionAmount?: number;
+      /**
+       * 推广员使用的推销卡号
+       */
+      distributionCardNo?: string;
+      /**
+       * 上级分销佣金
+       */
+      distributionParentAmount?: number;
+      /**
+       * 单个orderItem的配送类型 1:快递 2:自提 3:无需快递
+       */
+      dvyType?: number;
+      /**
+       * 订单确认收货获取的积分
+       */
+      gainScore?: number;
+      goodsTotal?: number;
+      /**
+       * 订单项ID
+       */
+      orderItemId?: number;
+      /**
+       * 订单orderNumber
+       */
+      orderNumber?: string;
+      /**
+       * 产品主图片路径
+       */
+      pic?: string;
+      /**
+       * 平台补贴的优惠金额
+       */
+      platformShareReduce?: number;
+      /**
+       * 产品价格
+       */
+      price?: number;
+      /**
+       * 购物车产品个数
+       */
+      prodCount?: number;
+      /**
+       * 产品ID
+       */
+      prodId?: number;
+      /**
+       * 产品名称
+       */
+      prodName?: string;
+      productCount?: number;
+      /**
+       * 商品总金额
+       */
+      productTotalAmount?: number;
+      /**
+       * 购物时间
+       */
+      recTime?: string;
+      /**
+       * 退款编号(退款编号为null时,说明订单为正常状态)
+       */
+      refundSn?: string;
+      /**
+       * 退款状态
+       */
+      returnMoneySts?: number;
+      /**
+       * 分摊的优惠金额
+       */
+      shareReduce?: number;
+      shopId?: number;
+      /**
+       * 产品SkuID
+       */
+      skuId?: number;
+      /**
+       * sku名称
+       */
+      skuName?: string;
+      /**
+       * 状态 -1待发货 0全部发货 其他数量为剩余待发货数量
+       */
+      status?: number;
+      /**
+       * 用户Id
+       */
+      userId?: string;
+      /**
+       * 使用积分
+       */
+      useScore?: number;
+      [property: string]: any;
+    }
+    interface UserAddrOrder {
+      /**
+       * 地址
+       */
+      addr?: string;
+      /**
+       * 地址详情
+       */
+      addrDetail?: string;
+      /**
+       * 地址名称
+       */
+      address?: string;
+      /**
+       * 地址名称
+       */
+      addressName?: string;
+      /**
+       * 地址ID
+       */
+      addrId?: number;
+      /**
+       * ID
+       */
+      addrOrderId?: number;
+      /**
+       * 区
+       */
+      area?: string;
+      /**
+       * 区域ID
+       */
+      areaId?: number;
+      /**
+       * 城市
+       */
+      city?: string;
+      /**
+       * 城市ID
+       */
+      cityId?: number;
+      /**
+       * 建立时间
+       */
+      createTime?: string;
+      /**
+       * 纬度
+       */
+      latitude?: number;
+      /**
+       * 经度
+       */
+      longitude?: number;
+      /**
+       * 手机
+       */
+      mobile?: string;
+      /**
+       * 邮编
+       */
+      postCode?: string;
+      /**
+       * 省
+       */
+      province?: string;
+      /**
+       * 省ID
+       */
+      provinceId?: number;
+      /**
+       * 收货人
+       */
+      receiver?: string;
+      /**
+       * 用户ID
+       */
+      userId?: string;
+      /**
+       * 版本号
+       */
+      version?: number;
+      [property: string]: any;
+    }
+    interface DeliveryStatusNum {
+      all: number;
+      paddingPay: number;
+      paddingShipped: number;
+      paddingReceived: number;
+      completed: number;
+      cancel: number;
+    }
+  }
 }

+ 3 - 0
src/typings/components.d.ts

@@ -75,6 +75,7 @@ declare module 'vue' {
     NDrawer: typeof import('naive-ui')['NDrawer']
     NDrawerContent: typeof import('naive-ui')['NDrawerContent']
     NDropdown: typeof import('naive-ui')['NDropdown']
+    NEllipsis: typeof import('naive-ui')['NEllipsis']
     NEmpty: typeof import('naive-ui')['NEmpty']
     NFlex: typeof import('naive-ui')['NFlex']
     NForm: typeof import('naive-ui')['NForm']
@@ -82,6 +83,7 @@ declare module 'vue' {
     NGi: typeof import('naive-ui')['NGi']
     NGrid: typeof import('naive-ui')['NGrid']
     NIcon: typeof import('naive-ui')['NIcon']
+    NImage: typeof import('naive-ui')['NImage']
     NInput: typeof import('naive-ui')['NInput']
     NInputGroup: typeof import('naive-ui')['NInputGroup']
     NInputNumber: typeof import('naive-ui')['NInputNumber']
@@ -106,6 +108,7 @@ declare module 'vue' {
     NSteps: typeof import('naive-ui')['NSteps']
     NSwitch: typeof import('naive-ui')['NSwitch']
     NTab: typeof import('naive-ui')['NTab']
+    NTabpane: typeof import('naive-ui')['NTabpane']
     NTabPane: typeof import('naive-ui')['NTabPane']
     NTabs: typeof import('naive-ui')['NTabs']
     NTag: typeof import('naive-ui')['NTag']

+ 4 - 0
src/typings/elegant-router.d.ts

@@ -39,6 +39,8 @@ declare module "@elegant-router/types" {
     "config": "/config";
     "config_fright-config": "/config/fright-config";
     "config_order-splitting": "/config/order-splitting";
+    "delivery": "/delivery";
+    "delivery_normal-order": "/delivery/normal-order";
     "goods": "/goods";
     "goods_desk-category": "/goods/desk-category";
     "goods_store-goods": "/goods/store-goods";
@@ -149,6 +151,7 @@ declare module "@elegant-router/types" {
     | "500"
     | "about"
     | "config"
+    | "delivery"
     | "goods"
     | "government"
     | "home"
@@ -187,6 +190,7 @@ declare module "@elegant-router/types" {
     | "about"
     | "config_fright-config"
     | "config_order-splitting"
+    | "delivery_normal-order"
     | "goods_desk-category"
     | "goods_store-goods"
     | "goods_tag"

+ 1 - 1
src/views/_builtin/login/modules/pwd-login.vue

@@ -44,7 +44,7 @@ async function getDataCode() {
   // imgPath.value = `${import.meta.env.VITE_SERVICE_BASE_URL}/captcha.jpg?uuid=${uuid}`;
   imgPath.value = import.meta.env.DEV
     ? `${import.meta.env.VITE_SERVICE_BASE_URL}/captcha.jpg?uuid=${uuid}`
-    : `https://shop.backend.zswlgz.com/captcha.jpg?uuid=${uuid}`;
+    : `https://shop.backend.zswlgz.com/plt/captcha.jpg?uuid=${uuid}`;
   sessionUUID.value = uuid;
 }
 getDataCode();

+ 256 - 0
src/views/delivery/normal-order/index.vue

@@ -0,0 +1,256 @@
+<script setup lang="tsx">
+import { nextTick, onMounted, reactive, ref, watch } from 'vue';
+import type { TabsInst } from 'naive-ui';
+import { NImage, NTag } from 'naive-ui';
+import { fetchGetDeliveryOrderList, fetchGetDeliveryStatusNum } from '@/service/api/delivery/normal-orde';
+import { useAppStore } from '@/store/modules/app';
+import { defaultTransform, useNaivePaginatedTable } from '@/hooks/common/table';
+import { $t } from '@/locales';
+import { useForm } from '@/components/zt/Form/hooks/useForm';
+import { SearchForm, orderStatus, refundStatus } from './normal-order';
+const appStore = useAppStore();
+const checkedRowKeys = ref([]);
+const activeTab = ref('all');
+const statusList = ref<{ label: string; value: string; num?: number }[]>([]);
+const wrapperRef = ref<HTMLElement | null>(null);
+const tabsInstRef = ref<TabsInst | null>(null);
+onMounted(() => {
+  nextTick(() => {
+    tabsInstRef.value?.syncBarPosition();
+    console.log(tabsInstRef.value, 'tabsInstRef.value');
+  });
+});
+const [registerSearchForm, { getFieldsValue }] = useForm({
+  schemas: SearchForm,
+  showAdvancedButton: false,
+  labelWidth: 120,
+  layout: 'horizontal',
+  gridProps: {
+    cols: '1 xl:4 s:1 l:3',
+    itemResponsive: true
+  },
+  collapsedRows: 1
+});
+const searchParams = reactive({
+  current: 1,
+  size: 10
+});
+const { columns, data, loading, getData, mobilePagination } = useNaivePaginatedTable({
+  api: () => fetchGetDeliveryOrderList({ ...searchParams, orderStatus: activeTab.value, ...getFieldsValue() }),
+  transform: response => defaultTransform(response),
+  onPaginationParamsChange: params => {
+    searchParams.current = Number(params.page);
+    searchParams.size = Number(params.pageSize);
+  },
+  columns: () => [
+    {
+      key: 'orderItems',
+      title: '商品',
+      align: 'left',
+      width: 200,
+      colSpan: (_rowData, _rowIndex) => 2,
+      render: row => {
+        return (
+          <div>
+            <div class={'mb3 flex items-center'}>
+              <n-tag>
+                订单编号:{row.orderNumber} 下单时间:{row.createTime} 门店名称 {row.shopName}
+              </n-tag>
+            </div>
+            {row.orderItems?.map(item => {
+              return (
+                <div class={'mb-3 h-80px flex items-center'}>
+                  <NImage src={item.pic} class="h-[80px] min-w-80px w-[80px]" lazy />
+                  <div class={'ml12px flex-1'}>
+                    <div class={'w-full flex items-center justify-between'}>
+                      <div class={'w250px'}>
+                        <n-ellipsis class={'w250px'}>
+                          <span class={'w-full text-left text-15px font-semibold'}>{item.skuName}</span>
+                        </n-ellipsis>
+                      </div>
+                      <div class={'w100px text-left'}>
+                        <div class={'text-16px font-semibold'}>¥{item.price} </div>
+                      </div>
+                    </div>
+                    <div class={'w-full flex items-center justify-between'}>
+                      <div class={'w250px text-gray'}>规格: </div>
+                      <div class={'w100px text-left text-gray'}>x{item.prodCount} </div>
+                    </div>
+                  </div>
+                </div>
+              );
+            })}
+          </div>
+        );
+      }
+    },
+    {
+      key: 'deptName',
+      title: '单价(元)/数量',
+      align: 'center',
+      width: 100
+    },
+    {
+      key: 'actualTotal',
+      title: '实付金额(元)',
+      align: 'center',
+      width: 120,
+      render: row => {
+        return (
+          <div class={'mt7'}>
+            <div class={'text-16px text-#ff0000 font-semibold'}>{row.actualTotal} 元</div>
+            <div>共 {row.goodsTotalCount} 件</div>
+          </div>
+        );
+      }
+    },
+    {
+      key: 'payType',
+      title: '支付方式',
+      align: 'center',
+      width: 120
+    },
+    {
+      key: 'seq',
+      title: '买家/收货人',
+      align: 'center',
+      width: 120,
+      render: row => {
+        return (
+          <div class={'mt7'}>
+            <div>{row.receiver}</div>
+            <div>{row.userMobile}</div>
+          </div>
+        );
+      }
+    },
+    {
+      key: 'status',
+      title: '订单状态',
+      align: 'center',
+      width: 320,
+      render: row => {
+        const statusKey = row.hbOrderStatus as keyof typeof orderStatus;
+        const statusText = orderStatus[statusKey] || '未知状态';
+        return <NTag class={'mt7'}>{statusText}</NTag>;
+      }
+    },
+    {
+      key: 'createTime',
+      title: '售后状态',
+      align: 'center',
+      width: 160,
+      render: row => {
+        const statusKey = row.refundStatus as keyof typeof refundStatus;
+        const statusText = refundStatus[statusKey] || '暂无售后';
+        return <NTag class={'mt7'}>{statusText}</NTag>;
+      }
+    },
+    {
+      key: 'operate',
+      title: $t('common.operate'),
+      align: 'center',
+      width: 130,
+      fixed: 'right'
+    }
+  ]
+});
+
+async function getNums() {
+  const { data: keyData } = await fetchGetDeliveryStatusNum();
+  if (!keyData) return;
+  const orderStatusList = [
+    {
+      label: '全部',
+      value: 'all'
+    },
+    {
+      label: '待支付',
+      value: 'paddingPay'
+    },
+    {
+      label: '待发货',
+      value: 'paddingShipped'
+    },
+    {
+      label: '待收货',
+      value: 'paddingReceived'
+    },
+    {
+      label: '已完成',
+      value: 'completed'
+    },
+    {
+      label: '已取消',
+      value: 'cancel'
+    }
+  ];
+  const updatedOrderStatusList = orderStatusList.map(item => {
+    const key = item.value as keyof typeof keyData;
+    if (Object.hasOwn(keyData, key)) {
+      return {
+        ...item,
+        num: keyData[key]
+      };
+    }
+    return item;
+  });
+  console.log(updatedOrderStatusList, 'updatedOrderStatusList');
+  statusList.value = updatedOrderStatusList;
+}
+getNums();
+watch(
+  () => [activeTab.value],
+  () => {
+    getData();
+  }
+);
+</script>
+
+<template>
+  <div ref="wrapperRef" class="flex-col-stretch gap-16px overflow-hidden lt-sm:overflow-auto">
+    <NCard :bordered="false" size="small">
+      <NCollapse display-directive="show" :default-expanded-names="['dept-search']">
+        <NCollapseItem title="搜索" name="dept-search">
+          <BasicForm @register-form="registerSearchForm" />
+        </NCollapseItem>
+      </NCollapse>
+    </NCard>
+    <NCard title="订单列表" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
+      <NTabs ref="tabsInstRef" v-model:value="activeTab" type="line" animated class="mb-16px h-full">
+        <NTabPane
+          v-for="item in statusList"
+          :key="item.value"
+          display-directive="show"
+          :name="item.value"
+          :tab="`${item.label}(${item.num})`"
+        >
+          <NDataTable
+            v-model:checked-row-keys="checkedRowKeys"
+            :columns="columns"
+            :data="data"
+            size="small"
+            :flex-height="!appStore.isMobile"
+            :scroll-x="1800"
+            :loading="loading"
+            :row-key="row => row.orderId"
+            remote
+            class="sm:h-full"
+            :pagination="mobilePagination"
+          />
+        </NTabPane>
+      </NTabs>
+
+      <!-- <BasicModal @register="registerModal" @ok="handleSubmit"></BasicModal> -->
+    </NCard>
+  </div>
+</template>
+
+<style scoped>
+:deep(.n-tabs-pane-wrapper) {
+  height: 100%;
+}
+:deep(.n-tab-pane) {
+  height: 100%;
+}
+</style>

+ 43 - 0
src/views/delivery/normal-order/normal-order.ts

@@ -0,0 +1,43 @@
+import { fetchGetAllStoreList } from '@/service/api/goods/desk-category';
+import type { FormSchema } from '@/components/zt/Form/types/form';
+
+export const SearchForm: FormSchema[] = [
+  {
+    label: '门店名称',
+    component: 'ApiSelect',
+    field: 'shopId',
+    componentProps: {
+      api: fetchGetAllStoreList,
+      labelFeild: 'shopName',
+      valueFeild: 'shopId'
+    }
+  }
+];
+
+/**
+ *  // 0-待支付 1-待发货,20-订单已接单(待拣货),30-订单待配送(拣货完成/自提类订单为待自提),40-订单配送中
+        // ,50-订单取消待审核,60-订单已取消,70-订单已送达,80-订单已完成
+ */
+export const orderStatus = {
+  0: '待支付',
+  1: '待发货',
+  20: '订单已接单(待拣货)',
+  30: '订单待配送(拣货完成/自提类订单为待自提)',
+  40: '订单配送中',
+  50: '订单取消待审核',
+  60: '订单已取消',
+  70: '订单已送达',
+  80: '订单已完成'
+};
+
+/**
+ // 1:申请退款 2:退款成功 3:部分退款成功 4:退款失败
+ *
+ */
+
+export const refundStatus = {
+  1: '申请退款',
+  2: '退款成功',
+  3: '部分退款成功',
+  4: '退款失败'
+};

+ 0 - 0
src/views/delivery/normal-order/order-modal.vue


+ 31 - 24
src/views/goods/desk-category/index.vue

@@ -1,13 +1,8 @@
 <script setup lang="tsx">
-import { nextTick, ref, useTemplateRef } from 'vue';
+import { nextTick, ref } from 'vue';
 import { NButton, NImage } from 'naive-ui';
 import type { InternalRowData } from 'naive-ui/es/data-table/src/interface';
-import {
-  fetchGategoryImport,
-  fetchGetAllStoreList,
-  fetchGetDeskCategoryList,
-  fetchUpdateCategory
-} from '@/service/api/goods/desk-category';
+import { fetchGetAllStoreList, fetchGetDeskCategoryList, fetchUpdateCategory } from '@/service/api/goods/desk-category';
 import { fetchGetAllTagList } from '@/service/api/goods/tag';
 import { useAppStore } from '@/store/modules/app';
 import { useModalFrom } from '@/components/zt/ModalForm/hooks/useModalForm';
@@ -46,7 +41,7 @@ const [registerSearchForm, { getFieldsValue: getSearchForm }] = useForm({
   },
   collapsedRows: 1
 });
-const importTemplateRef = useTemplateRef('importTemplateRef');
+// const importTemplateRef = useTemplateRef('importTemplateRef');
 const tableColumns: NaiveUI.TableColumn<InternalRowData>[] = [
   {
     title: '分类名称',
@@ -79,7 +74,7 @@ const tableColumns: NaiveUI.TableColumn<InternalRowData>[] = [
     align: 'center',
     render: row => (
       <div class="flex-center gap-8px">
-        {row.level == 0 && (
+        {row.level == 1 && (
           <NButton type="primary" ghost size="small" onClick={() => edit(row)}>
             编辑
           </NButton>
@@ -104,7 +99,15 @@ const [
   formConfig: {
     schemas: [
       { label: '', field: 'id', show: false, component: 'NInput' },
-      { label: '分类名称', field: 'name', component: 'NInput', required: true },
+      {
+        label: '分类名称',
+        field: 'name',
+        component: 'NInput',
+        required: true,
+        componentProps: {
+          disabled: true
+        }
+      },
       {
         label: '分类图标',
         field: 'icon',
@@ -148,22 +151,22 @@ const [
     }
   }
 });
-async function handleSubmit(file: File) {
-  const { error } = await fetchGategoryImport(file);
-  if (!error) {
-    importTemplateRef.value?.closeModal();
-  }
-  importTemplateRef.value?.setSubLoading(false);
-}
+// async function handleSubmit(file: File) {
+//   const { error } = await fetchGategoryImport(file);
+//   if (!error) {
+//     importTemplateRef.value?.closeModal();
+//   }
+//   importTemplateRef.value?.setSubLoading(false);
+// }
 function edit(row: Recordable) {
   openModalForm(row);
-  setModalFormValue({ ...row, label: Number(row.label) });
+  setModalFormValue({ ...row, label: row.label });
 }
 
 async function getData() {
   const { data, error } = await fetchGetDeskCategoryList(getSearchForm());
   if (!error) {
-    deskData.value = buildTree(data);
+    deskData.value = buildTree(data).sort((a, b) => b.num - a.num);
   }
 }
 async function handleSubmitForm() {
@@ -174,9 +177,9 @@ async function handleSubmitForm() {
     getData();
   }
 }
-function handleOpen() {
-  importTemplateRef.value?.openModal();
-}
+// function handleOpen() {
+//   importTemplateRef.value?.openModal();
+// }
 interface BuildTreeOptions {
   idKey?: string;
   pidKey?: string;
@@ -234,7 +237,8 @@ function buildTree<T>(items: T[], options: BuildTreeOptions = {}): T[] {
     <NCard title="前台类目" :bordered="false" size="small" class="card-wrapper sm:flex-1-hidden">
       <template #header-extra>
         <TableHeaderOperation :loading="loading" @refresh="getData">
-          <template #prefix>
+          <!--
+ <template #prefix>
             <NButton size="small" @click="handleOpen">
               <template #icon>
                 <icon-file-icons:microsoft-excel class="text-icon"></icon-file-icons:microsoft-excel>
@@ -242,6 +246,7 @@ function buildTree<T>(items: T[], options: BuildTreeOptions = {}): T[] {
               Excel导入分类
             </NButton>
           </template>
+-->
         </TableHeaderOperation>
       </template>
       <NDataTable
@@ -256,13 +261,15 @@ function buildTree<T>(items: T[], options: BuildTreeOptions = {}): T[] {
         class="sm:h-full"
       />
     </NCard>
-    <ZImportTemplate
+    <!--
+ <ZImportTemplate
       ref="importTemplateRef"
       url="/platform/shopCategory/exportTemplate"
       template-text="店内分类导入模版.xlsx"
       modal-text="Excel导入分类"
       @submit="handleSubmit"
     ></ZImportTemplate>
+-->
     <BasicModelForm @register-modal-form="registerModalForm" @submit-form="handleSubmitForm"></BasicModelForm>
   </LayoutTable>
 </template>