Ver Fonte

feat(product): 新增商品审核流程和商品池功能优化

- 在 base API 中新增 reviewBase、shelfReview、getProductStatusCount 和 changeProductType 方法
- 在 category API 中新增 setCategoryReviewer 方法并修改 listCategory 类型定义
- 在 poolLink API 中新增 batchReview、reSubmit、editPrice 和 editStock 方法
- 更新路由配置,添加商品池管理缓存和入池清单审核页面
- 优化 base 页面的商品上下架状态选项和统计信息展示
- 实现商品审核、上下架审核和商品类型变更功能
- 重构 category 页面实现懒加载树形结构和设置审核员功能
- 优化 pool 页面的产品池类型管理和统计信息展示
- 在 poolLink 页面添加价格维护和库存修改对话框功能
肖路 há 2 meses atrás
pai
commit
b972befe9b
2 ficheiros alterados com 783 adições e 0 exclusões
  1. 529 0
      src/views/product/base/shelfReview.vue
  2. 254 0
      src/views/product/pool/review1.vue

+ 529 - 0
src/views/product/base/shelfReview.vue

@@ -0,0 +1,529 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索区域 -->
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" label-width="100px">
+            <el-row :gutter="20">
+              <el-col :span="6">
+                <el-form-item label="商品编号" prop="productNo">
+                  <el-input v-model="queryParams.productNo" placeholder="请输入商品编号" clearable @keyup.enter="handleQuery" />
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="商品名称" prop="itemName">
+                  <el-input v-model="queryParams.itemName" placeholder="请输入商品名称" clearable @keyup.enter="handleQuery" />
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="商品类别" prop="bottomCategoryId">
+                  <el-tree-select
+                    v-model="queryParams.bottomCategoryId"
+                    :data="categoryOptions"
+                    :props="{ value: 'id', label: 'label', children: 'children' } as any"
+                    value-key="id"
+                    placeholder="请选择商品类别"
+                    clearable
+                    check-strictly
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="6">
+                <el-form-item label="商品品牌" prop="brandName">
+                  <el-select-v2
+                    v-model="queryParams.brandName"
+                    :options="brandOptionsFormatted"
+                    placeholder="请选择商品品牌"
+                    clearable
+                    filterable
+                    :loading="brandLoading"
+                    @visible-change="handleBrandVisibleChange"
+                  />
+                </el-form-item>
+              </el-col>
+
+              <el-col :span="6">
+                <el-form-item>
+                  <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+                  <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+
+    <!-- 上下架审核商品信息列表 -->
+    <el-card shadow="never" class="table-card">
+      <template #header>
+        <div class="flex items-center justify-between">
+          <span class="font-semibold">上下架审核商品信息列表</span>
+          <div class="flex gap-2">
+            <el-button type="primary" icon="Download" @click="handleExport">导出商品</el-button>
+            <el-button type="success" icon="Upload">导入商品</el-button>
+            <el-button circle icon="Refresh" @click="getList"></el-button>
+          </div>
+        </div>
+      </template>
+
+      <el-table v-loading="loading" border :data="baseList" :height="tableHeight" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="商品图片" align="center" prop="productImage" width="100" >
+          <template #default="scope">
+            <image-preview :src="scope.row.productImage" :width="60" :height="60"/>
+          </template>
+        </el-table-column>
+        <el-table-column label="商品编号" align="center" prop="productNo" width="120" >
+          <template #default="scope">
+            <el-link type="primary" @click="handleView(scope.row)">{{ scope.row.productNo }}</el-link>
+          </template>
+        </el-table-column>
+        <el-table-column label="商品信息" align="center" min-width="250" show-overflow-tooltip>
+          <template #default="scope">
+            <div class="text-left">
+              <div>{{ scope.row.itemName }}</div>
+              <div class="text-gray-500" style="font-size: 12px;">品牌: {{ scope.row.brandName || '-' }}</div>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="基本情况" align="center" width="180">
+          <template #default="scope">
+            <div class="text-left" style="font-size: 12px;">
+              <div>
+                <span class="text-gray-500">商品分类:</span>
+                <span>{{ scope.row.categoryName || '-' }}</span>
+              </div>
+              <div>
+                <span class="text-gray-500">单位:</span>
+                <span>{{ scope.row.unitName || '-' }}</span>
+              </div>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="SKU价格" align="center" width="180">
+          <template #default="scope">
+            <div class="text-left" style="font-size: 12px;">
+              <div>
+                <span class="text-gray-500">市场价:</span>
+                <span class="text-red-500">¥{{ scope.row.marketPrice || '0.00' }}</span>
+              </div>
+              <div>
+                <span class="text-gray-500">会员价:</span>
+                <span class="text-red-500">¥{{ scope.row.memberPrice || '0.00' }}</span>
+              </div>
+              <div>
+                <span class="text-gray-500">最低价:</span>
+                <span class="text-red-500">¥{{ scope.row.minSellingPrice || '0.00' }}</span>
+              </div>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="成本预算" align="center" width="150">
+          <template #default="scope">
+            <div class="text-left" style="font-size: 12px;">
+              <div>
+                <span class="text-gray-500">采购价:</span>
+                <span>¥{{ scope.row.purchasingPrice || '0.00' }}</span>
+              </div>
+              <div>
+                <span class="text-gray-500">暂估毛利率:</span>
+                <span>{{ scope.row.tempGrossMargin || '0.0000' }}%</span>
+              </div>
+            </div>
+          </template>
+        </el-table-column>
+        <el-table-column label="商品来源" align="center" width="100">
+          <template #default="scope">
+            <span>{{ scope.row.dataSource || '-' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="商品状态" align="center" width="100">
+          <template #default="scope">
+            <el-tag v-if="scope.row.productStatus === '2' || scope.row.productStatus === 2" type="warning">上架中</el-tag>
+            <el-tag v-else-if="scope.row.productStatus === '1' || scope.row.productStatus === 1" type="success">已上架</el-tag>
+            <el-tag v-else-if="scope.row.productStatus === '0' || scope.row.productStatus === 0" type="info">已下架</el-tag>
+            <span v-else>-</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="审核意见" align="center" width="180" show-overflow-tooltip>
+          <template #default="scope">
+            <span>{{ scope.row.shelfComments || '-' }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" align="center" width="200" fixed="right" class-name="border-left">
+          <template #default="scope">
+            <div class="flex flex-col gap-1">
+              <!-- 根据商品状态显示不同按钮 -->
+              <template v-if="scope.row.productStatus === '2' || scope.row.productStatus === 2">
+                <!-- 上架中:显示上架审核按钮 -->
+                <div class="flex gap-1 justify-center">
+                  <el-link type="primary" :underline="false" @click="handleEdit(scope.row)">编辑</el-link>
+                  <el-link type="success" :underline="false" @click="handleShelfReview(scope.row)">上架审核</el-link>
+                </div>
+              </template>
+              <template v-else-if="scope.row.productStatus === '1' || scope.row.productStatus === 1">
+                <!-- 已上架:显示下架按钮 -->
+                <div class="flex gap-1 justify-center">
+                  <el-link type="primary" :underline="false" @click="handleEdit(scope.row)">编辑</el-link>
+                  <el-link type="danger" :underline="false" @click="handleOffShelf(scope.row)">下架</el-link>
+                </div>
+              </template>
+            </div>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 游标分页控制 -->
+      <pagination
+        v-show="baseList.length > 0"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        v-model:way="queryParams.way"
+        :cursor-mode="true"
+        :has-more="hasMore"
+        @pagination="getList"
+      />
+    </el-card>
+
+    <!-- 上架审核对话框 -->
+    <el-dialog v-model="reviewDialog.visible" :title="reviewDialog.title" width="600px" append-to-body>
+      <el-form ref="reviewFormRef" :model="reviewForm" :rules="reviewRules" label-width="100px">
+        <el-form-item label="商品编号">
+          <el-input v-model="reviewForm.productNo" disabled />
+        </el-form-item>
+        <el-form-item label="商品名称">
+          <el-input v-model="reviewForm.itemName" disabled />
+        </el-form-item>
+        <el-form-item label="审核结果" prop="productStatus">
+          <el-radio-group v-model="reviewForm.productStatus">
+            <el-radio :label="1">通过上架</el-radio>
+            <el-radio :label="0">驳回下架</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="审核意见" prop="shelfComments">
+          <el-input v-model="reviewForm.shelfComments" type="textarea" :rows="4" placeholder="请输入审核意见" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button @click="reviewDialog.visible = false">取消</el-button>
+          <el-button type="primary" @click="submitReview">确定</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="ShelfReview" lang="ts">
+import { listBase, getBase, shelfReview, brandList, categoryTree } from '@/api/product/base';
+import { BaseVO, BaseQuery, BaseForm } from '@/api/product/base/types';
+import { BrandVO } from '@/api/product/brand/types';
+import { categoryTreeVO } from '@/api/product/category/types';
+import { useRouter, useRoute } from 'vue-router';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const router = useRouter();
+const route = useRoute();
+
+const baseList = ref<BaseVO[]>([]);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const brandOptions = ref<BrandVO[]>([]);
+const brandLoading = ref(false);
+const brandOptionsFormatted = computed(() => {
+  return brandOptions.value.slice(0, 500).map((item) => ({
+    label: item.brandName,
+    value: item.brandName // review.vue使用brandName作为value
+  }));
+});
+const categoryOptions = ref<categoryTreeVO[]>([]);
+const hasMore = ref(true); // 是否还有更多数据
+const pageHistory = ref([]);
+
+// 动态计算表格高度
+const tableHeight = computed(() => {
+  // 基础高度 = 视口高度 - 顶部导航(84) - 容器padding(16) - 搜索区域 - 卡片header(60) - 分页器(60)
+  const baseHeight = window.innerHeight - 84 - 16;
+  const searchHeight = showSearch.value ? 150 : 10; // 搜索区域高度
+  const cardHeaderHeight = 60; // 卡片header高度
+  const paginationHeight = 60; // 分页器高度
+  return baseHeight - searchHeight - cardHeaderHeight - paginationHeight;
+});
+
+const queryFormRef = ref<ElFormInstance>();
+const reviewFormRef = ref<ElFormInstance>();
+
+// 审核对话框
+const reviewDialog = reactive({
+  visible: false,
+  title: '上架审核'
+});
+
+// 审核表单
+const reviewForm = ref<any>({
+  id: undefined,
+  productNo: '',
+  itemName: '',
+  productStatus: 1,
+  shelfComments: ''
+});
+
+// 审核表单验证规则
+const reviewRules = ref({
+  productStatus: [{ required: true, message: '请选择审核结果', trigger: 'change' }],
+  shelfComments: [{ required: true, message: '请输入审核意见', trigger: 'blur' }]
+});
+
+const queryParams = ref<BaseQuery>({
+  pageNum: 1,
+  pageSize: 10,
+  way: undefined,
+  productNo: undefined,
+  itemName: undefined,
+  brandName: undefined,
+  purchaseNature: undefined,
+  bottomCategoryId: undefined,
+  isSelf: undefined,
+  productReviewStatus: 1, // 只查询审核通过的数据
+  productStatus: 2, // 用于筛选商品状态
+  lastSeenId: undefined // 游标分页的lastSeenId
+});
+
+
+/** 查询商品列表 */
+const getList = async () => {
+  loading.value = true;
+  try {
+    const params = { ...queryParams.value };
+    const currentPageNum = queryParams.value.pageNum;
+
+    // 强制只查询审核通过的数据
+    params.productReviewStatus = 1;
+
+    // 如果没有选择商品状态,默认查询上架中和已上架的数据
+    // 后端需要支持多状态查询,这里通过不传productStatus让后端返回所有状态,前端再过滤
+    // 或者后端支持传入多个状态值
+
+    // 第一页不需要游标参数
+    if (currentPageNum === 1) {
+      delete params.lastSeenId;
+      delete params.way;
+    } else {
+      // way参数:0=上一页,1=下一页
+      if (queryParams.value.way === 0) {
+        // 上一页:使用目标页(即当前显示页)的firstId
+        const nextPageHistory = pageHistory.value[currentPageNum];
+        if (nextPageHistory) {
+          params.firstSeenId = nextPageHistory.firstId;
+          params.way = 0;
+        }
+      } else {
+        // 下一页:使用前一页的lastId作为lastSeenId
+        const prevPageHistory = pageHistory.value[currentPageNum - 1];
+        if (prevPageHistory) {
+          params.lastSeenId = prevPageHistory.lastId;
+          params.way = 1;
+        }
+      }
+    }
+
+    const res = await listBase(params);
+    baseList.value = res.rows || [];
+
+    // 判断是否还有更多数据
+    hasMore.value = baseList.value.length === queryParams.value.pageSize;
+
+    // 记录当前页的第一个id和最后一个id
+    if (baseList.value.length > 0) {
+      const firstItem = baseList.value[0];
+      const lastItem = baseList.value[baseList.value.length - 1];
+      //如果长度小于currentPageNum则创建
+
+      if (pageHistory.value.length <= currentPageNum) {
+        pageHistory.value[currentPageNum] = {
+          firstId: firstItem.id,
+          lastId: lastItem.id
+        };
+      }
+    }
+    total.value = res.total || 0;
+  } catch (error) {
+    console.error('获取列表失败:', error);
+  } finally {
+    loading.value = false;
+  }
+};
+
+/** 初始化路由参数 */
+const initRouteParams = () => {
+  // 从路由参数中获取筛选条件
+  if (route.query.productStatus) {
+    queryParams.value.productStatus = Number(route.query.productStatus);
+  }
+  if (route.query.brandName) {
+    queryParams.value.brandName = route.query.brandName as string;
+  }
+  if (route.query.bottomCategoryId) {
+    queryParams.value.bottomCategoryId = route.query.bottomCategoryId as string;
+  }
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  queryParams.value.lastSeenId = undefined;
+  pageHistory.value = [0]; // 重置页面历史
+  getList();
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  queryParams.value.lastSeenId = undefined;
+  pageHistory.value = [0]; // 重置页面历史
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: BaseVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'product/base/export',
+    {
+      ...queryParams.value
+    },
+    `base_shelf_review_${new Date().getTime()}.xlsx`
+  );
+};
+
+/** 查看商品详情 */
+const handleView = (row: BaseVO) => {
+  router.push(`/product/base/detail/${row.id}`);
+};
+
+/** 编辑商品 */
+const handleEdit = (row: BaseVO) => {
+  router.push(`/product/base/edit/${row.id}`);
+};
+
+/** 上架审核 */
+const handleShelfReview = (row: BaseVO) => {
+  reviewDialog.visible = true;
+  reviewDialog.title = '上架审核';
+  reviewForm.value = {
+    id: row.id,
+    productNo: row.productNo,
+    itemName: row.itemName,
+    productStatus: 1,
+    shelfComments: ''
+  };
+}
+
+/** 下架操作 */
+const handleOffShelf = async (row: BaseVO) => {
+  await proxy?.$modal.confirm('确认下架该商品吗?');
+  const data: BaseForm = {
+    id: row.id,
+    productStatus: '0' // 设置为下架状态
+  };
+  await shelfReview(data);
+  proxy?.$modal.msgSuccess('下架成功');
+  await getList();
+};
+
+/** 提交审核 */
+const submitReview = async () => {
+  await reviewFormRef.value?.validate();
+  const data: BaseForm = {
+    id: reviewForm.value.id,
+    productStatus: String(reviewForm.value.productStatus),
+    shelfComments: reviewForm.value.shelfComments
+  };
+  await shelfReview(data);
+  proxy?.$modal.msgSuccess(reviewForm.value.productStatus === 1 ? '上架成功' : '驳回成功');
+  reviewDialog.visible = false;
+  await getList();
+};
+
+/** 查询品牌列表(实时请求,每次只加载500条) */
+const getBrandList = async () => {
+  try {
+    brandLoading.value = true;
+    const res = await brandList({ pageNum: 1, pageSize: 500 });
+    brandOptions.value = res.data || [];
+  } catch (error) {
+    console.error('获取品牌列表失败:', error);
+  } finally {
+    brandLoading.value = false;
+  }
+};
+
+/** 处理品牌下拉框显示/隐藏 */
+const handleBrandVisibleChange = (visible: boolean) => {
+  if (visible && brandOptions.value.length === 0) {
+    getBrandList();
+  }
+};
+
+/** 查询分类树 */
+const getCategoryTree = async () => {
+  const res = await categoryTree();
+  categoryOptions.value = res.data || [];
+};
+
+onMounted(() => {
+  getCategoryTree();
+  initRouteParams();
+  getList();
+});
+</script>
+
+<style scoped lang="scss">
+.app-container {
+  padding: 8px;
+  height: calc(100vh - 84px);
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+}
+
+.table-card {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  overflow: hidden;
+
+  :deep(.el-card__body) {
+    flex: 1;
+    display: flex;
+    flex-direction: column;
+    overflow: hidden;
+  }
+
+  :deep(.el-table) {
+    flex: 1;
+  }
+
+  // 确保固定列左侧有边框
+  :deep(.el-table__fixed-right) {
+    box-shadow: -1px 0 0 var(--el-table-border-color) !important;
+  }
+
+  // 固定列的单元格左边框
+  :deep(.el-table__fixed-right .el-table__cell) {
+    border-left: 1px solid var(--el-table-border-color) !important;
+  }
+}
+</style>

+ 254 - 0
src/views/product/pool/review1.vue

@@ -0,0 +1,254 @@
+<template>
+  <div class="p-2">
+    <!-- 标签页 -->
+    <el-card shadow="never">
+      <el-tabs v-model="activeTab" @tab-click="handleTabClick">
+        <el-tab-pane label="待入池产品" name="pending">
+          <!-- 待入池产品表格 -->
+          <el-table v-loading="pendingLoading" border :data="pendingProductList">
+            <el-table-column type="index" label="序号" width="60" align="center" />
+            <el-table-column label="产品池名称" align="center" prop="poolName" min-width="150" />
+            <el-table-column label="产品池类型" align="center" width="120">
+              <template #default="scope">
+                {{ getPoolTypeLabel(scope.row.type) }}
+              </template>
+            </el-table-column>
+            <el-table-column label="商品编号" align="center" prop="productNo" width="120" />
+            <el-table-column label="商品图片" align="center" prop="productImageUrl" width="100">
+              <template #default="scope">
+                <image-preview :src="scope.row.productImageUrl" :width="60" :height="60"/>
+              </template>
+            </el-table-column>
+            <el-table-column label="商品信息" align="center" min-width="200">
+              <template #default="scope">
+                <div class="text-left" style="font-size: 12px;">
+                  <div>{{ scope.row.itemName }}</div>
+                  <div class="text-gray-500">品牌:{{ scope.row.brandName || '-' }}</div>
+                  <div class="text-gray-500">库存:{{ scope.row.stock || '-' }}</div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="单位" align="center" prop="unitName" width="80" />
+            <el-table-column label="SKU价格" align="center" width="150">
+              <template #default="scope">
+                <div class="text-left" style="font-size: 12px;">
+                  <div>
+                    <span class="text-gray-500">市场价:</span>
+                    <span class="text-red-500">¥{{ scope.row.marketPrice || '0.00' }}</span>
+                  </div>
+                  <div>
+                    <span class="text-gray-500">平台售价:</span>
+                    <span class="text-red-500">¥{{ scope.row.platformPrice || '0.00' }}</span>
+                  </div>
+                  <div>
+                    <span class="text-gray-500">最低售价:</span>
+                    <span class="text-red-500">¥{{ scope.row.minPrice || '0.00' }}</span>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="成本数据" align="center" width="150">
+              <template #default="scope">
+                <div class="text-left" style="font-size: 12px;">
+                  <div>
+                    <span class="text-gray-500">采购价:</span>
+                    <span>¥{{ scope.row.purchasePrice || '0.00' }}</span>
+                  </div>
+                  <div>
+                    <span class="text-gray-500">暂估毛利率:</span>
+                    <span>{{ scope.row.grossMargin || '0.00' }}%</span>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="项目/平台价" align="center" prop="productPrice" width="120">
+              <template #default="scope">
+                ¥{{ scope.row.productPrice || '0.00' }}
+              </template>
+            </el-table-column>
+            <el-table-column label="商品状态" align="center" width="100">
+              <template #default="scope">
+                <dict-tag :options="product_review_status" :value="scope.row.productReviewStatus" />
+              </template>
+            </el-table-column>
+            <el-table-column label="创建供应商" align="center" prop="supplier" width="120" />
+          </el-table>
+
+          <pagination v-show="pendingTotal > 0" :total="pendingTotal" v-model:page="pendingQuery.pageNum" v-model:limit="pendingQuery.pageSize" @pagination="getPendingList" />
+        </el-tab-pane>
+
+        <el-tab-pane label="入池清单" name="approved">
+          <!-- 入池清单表格 -->
+          <el-table v-loading="approvedLoading" border :data="approvedProductList">
+            <el-table-column type="index" label="序号" width="60" align="center" />
+            <el-table-column label="产品池名称" align="center" prop="poolName" min-width="150" />
+            <el-table-column label="产品池类型" align="center" width="120">
+              <template #default="scope">
+                {{ getPoolTypeLabel(scope.row.type) }}
+              </template>
+            </el-table-column>
+            <el-table-column label="商品编号" align="center" prop="productNo" width="120" />
+            <el-table-column label="商品图片" align="center" prop="productImageUrl" width="100">
+              <template #default="scope">
+                <image-preview :src="scope.row.productImageUrl" :width="60" :height="60"/>
+              </template>
+            </el-table-column>
+            <el-table-column label="商品信息" align="center" min-width="200">
+              <template #default="scope">
+                <div class="text-left" style="font-size: 12px;">
+                  <div>{{ scope.row.itemName }}</div>
+                  <div class="text-gray-500">品牌:{{ scope.row.brandName || '-' }}</div>
+                  <div class="text-gray-500">库存:{{ scope.row.stock || '-' }}</div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="单位" align="center" prop="unitName" width="80" />
+            <el-table-column label="SKU价格" align="center" width="150">
+              <template #default="scope">
+                <div class="text-left" style="font-size: 12px;">
+                  <div>
+                    <span class="text-gray-500">市场价:</span>
+                    <span class="text-red-500">¥{{ scope.row.marketPrice || '0.00' }}</span>
+                  </div>
+                  <div>
+                    <span class="text-gray-500">平台售价:</span>
+                    <span class="text-red-500">¥{{ scope.row.platformPrice || '0.00' }}</span>
+                  </div>
+                  <div>
+                    <span class="text-gray-500">最低售价:</span>
+                    <span class="text-red-500">¥{{ scope.row.minPrice || '0.00' }}</span>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="成本数据" align="center" width="150">
+              <template #default="scope">
+                <div class="text-left" style="font-size: 12px;">
+                  <div>
+                    <span class="text-gray-500">采购价:</span>
+                    <span>¥{{ scope.row.purchasePrice || '0.00' }}</span>
+                  </div>
+                  <div>
+                    <span class="text-gray-500">暂估毛利率:</span>
+                    <span>{{ scope.row.grossMargin || '0.00' }}%</span>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column label="项目/平台价" align="center" prop="productPrice" width="120">
+              <template #default="scope">
+                ¥{{ scope.row.productPrice || '0.00' }}
+              </template>
+            </el-table-column>
+            <el-table-column label="商品状态" align="center" width="100">
+              <template #default="scope">
+                <dict-tag :options="product_review_status" :value="scope.row.productReviewStatus" />
+              </template>
+            </el-table-column>
+            <el-table-column label="创建供应商" align="center" prop="supplier" width="120" />
+          </el-table>
+
+          <pagination v-show="approvedTotal > 0" :total="approvedTotal" v-model:page="approvedQuery.pageNum" v-model:limit="approvedQuery.pageSize" @pagination="getApprovedList" />
+        </el-tab-pane>
+      </el-tabs>
+    </el-card>
+
+  </div>
+</template>
+
+<script setup name="PoolReviewDetail" lang="ts">
+import { listPoolLink } from '@/api/product/poolLink';
+import { PoolLinkVO, PoolLinkQuery } from '@/api/product/poolLink/types';
+
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+
+/** 产品池类型选项 */
+const poolTypeOptions = [
+  { label: '普通产品池', value: 0 },
+  { label: '精选产品池', value: 1 },
+  { label: '协议产品池', value: 2 },
+  { label: '项目产品池', value: 3 },
+  { label: '分类产品池', value: 4 }
+];
+
+/** 获取产品池类型标签 */
+const getPoolTypeLabel = (type: number | undefined) => {
+  const option = poolTypeOptions.find(item => item.value === type);
+  return option ? option.label : '未知类型';
+};
+
+// 当前标签页
+const activeTab = ref('pending');
+
+// 待入池产品列表
+const pendingProductList = ref<PoolLinkVO[]>([]);
+const pendingLoading = ref(false);
+const pendingTotal = ref(0);
+const pendingQuery = ref<PoolLinkQuery>({
+  pageNum: 1,
+  pageSize: 10,
+  productReviewStatus: '1' // 待审核
+});
+
+// 入池清单列表
+const approvedProductList = ref<PoolLinkVO[]>([]);
+const approvedLoading = ref(false);
+const approvedTotal = ref(0);
+const approvedQuery = ref<PoolLinkQuery>({
+  pageNum: 1,
+  pageSize: 10,
+  productReviewStatus: '2' // 审核通过
+});
+
+// 字典数据
+const { product_review_status } = toRefs<any>(proxy?.useDict('product_review_status'));
+
+/** 获取待入池产品列表 */
+const getPendingList = async () => {
+  pendingLoading.value = true;
+  try {
+    const res = await listPoolLink(pendingQuery.value);
+    pendingProductList.value = res.rows || [];
+    pendingTotal.value = res.total || 0;
+  } catch (error) {
+    console.error('获取待入池产品列表失败:', error);
+    pendingProductList.value = [];
+    pendingTotal.value = 0;
+  } finally {
+    pendingLoading.value = false;
+  }
+};
+
+/** 获取入池清单列表 */
+const getApprovedList = async () => {
+  approvedLoading.value = true;
+  try {
+    const res = await listPoolLink(approvedQuery.value);
+    approvedProductList.value = res.rows || [];
+    approvedTotal.value = res.total || 0;
+  } catch (error) {
+    console.error('获取入池清单列表失败:', error);
+    approvedProductList.value = [];
+    approvedTotal.value = 0;
+  } finally {
+    approvedLoading.value = false;
+  }
+};
+
+/** 标签页切换 */
+const handleTabClick = () => {
+  if (activeTab.value === 'pending') {
+    getPendingList();
+  } else {
+    getApprovedList();
+  }
+};
+
+onMounted(async () => {
+  // 默认加载待入池产品
+  await getPendingList();
+});
+</script>
+
+<style scoped lang="scss">
+</style>