seatonwan9
2025-09-02 83d5b2be8fdf0ac0b59cacf6b344c8815ab4d040
提交源码
7个文件已修改
451 ■■■■ 已修改文件
.env.production 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/userInfo.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.ts 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/pointsManage/personal/index.vue 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tradeManage/buyer/index.vue 159 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tradeManage/detail/index.vue 104 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/tradeManage/seller/index.vue 120 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.production
@@ -1,10 +1,14 @@
# 线上环境
ENV = 'production'
# base路径
VITE_BASE_PATH = '/admin'
#VITE_BASE_PATH = '/admin'
VITE_BASE_PATH = '/trade-api'
# 开发环境下跨域代理,请输入要跨域的api地址 - 尾部无需带'/'
VITE_BI_URL = 'https://zynlpt.ccccltd.cn'
VITE_AXIOS_BASE_URL = 'http://36.133.126.111:7099'
#VITE_BI_URL = 'https://zynlpt.ccccltd.cn'
VITE_BI_URL = 'http://36.133.126.111:7099'
#跳转iframe地址
VITE_IFREAM_URL='https://zynlpt.ccccltd.cn'
#VITE_IFREAM_URL='https://zynlpt.ccccltd.cn'
VITE_IFREAM_URL='http://36.133.126.111:7099'
# 扫码登录页地址 登录完会自动跳转到大屏
VITE_BASE_LOGIN_URL='https://portal.ccccltd.cn/sso_sys?cb=http://zynlpt.ccccltd.cn'
VITE_BASE_LOGIN_URL='https://portal.ccccltd.cn/sso_sys?cb=http://zynlpt.ccccltd.cn'
src/api/userInfo.ts
@@ -1,5 +1,4 @@
import createAxios from '@/utils/axios'
let url = '/test'
// 修改密码
export function updatePassw(data: object = {}): ApiPromise {
@@ -15,7 +14,8 @@
// 查看个人信息
export function queryUserDetail(data: object = {}): ApiPromise {
    return createAxios({
        url: `${url}/admin/common/userDetail`,
        baseURL: '/api',
        url: `/admin/common/userDetail`,
        headers: {
            'Content-Type': 'application/json;charset=UTF-8'
        },
src/router/index.ts
@@ -32,7 +32,7 @@
  const commonStore = useCommonInfo()
  commonStore.updateActiveMenu(to.path)
  const navStore = useNavTabs()
  // 开发模式下跳过登录验证
  if (import.meta.env.DEV) {
    // 如果访问登录页面,直接跳转到首页
@@ -51,13 +51,23 @@
            screenToken: '',
          }
          userStore.updateUserInfo(obj)
        }
        }else {
            if (to.query.token) {
              const token = to.query.token as string
              localStorage.setItem('lastRecordTime', new Date().getTime().toString())
              const obj: any = {
                adminToken: token,
                screenToken: '',
              }
              userStore.updateUserInfo(obj)
            }
          }
      }
    }
    next()
    return
  }
  // 生产环境保持原有逻辑
  if (to.path == '/login' || to.path == '/loginT') {
    // 如果路径是 /login 则正常执行
src/views/pointsManage/personal/index.vue
@@ -58,11 +58,11 @@
              <span class="filter-label">数据类目:</span>
              <el-select v-model="queryParams.dataCategory" placeholder="全部" clearable>
                <el-option label="全部" value="" />
                <el-option
                  v-for="category in categoryList"
                  :key="category"
                  :label="getCategoryLabel(category)"
                  :value="category"
                <el-option
                  v-for="category in categoryList"
                  :key="category"
                  :label="getCategoryLabel(category)"
                  :value="category"
                />
              </el-select>
            </div>
@@ -103,7 +103,7 @@
        <!-- 流水表格 -->
        <div class="table-section">
          <el-table :data="flowList" stripe style="width: 100%">
          <el-table :data="flowList" stripe style="width: 100%" :height="440">
            <el-table-column prop="id" label="序号" width="80" align="center" />
            <el-table-column prop="dataCategory" label="数据类目" width="120">
              <template #default="{ row }">
@@ -145,15 +145,15 @@
<script setup lang="ts">
import { ref, reactive, onMounted, computed } from 'vue'
import { dayjs, ElMessage } from 'element-plus'
import {
  ArrowLeft,
  Refresh,
  Setting,
  Close,
  Money,
  Plus,
  Minus,
  Search
import {
  ArrowLeft,
  Refresh,
  Setting,
  Close,
  Money,
  Plus,
  Minus,
  Search
} from '@element-plus/icons-vue'
import pointsApi from '@/api/pointsApi'
import type { PointsStats, PointsFlow, PointsQueryParams } from '@/types/points'
@@ -369,7 +369,7 @@
        cursor: pointer;
        color: #409eff;
        font-size: 18px;
        &:hover {
          color: #66b1ff;
        }
@@ -391,7 +391,7 @@
          cursor: pointer;
          color: #909399;
          font-size: 16px;
          &:hover {
            color: #409eff;
          }
@@ -585,7 +585,7 @@
        :deep(.el-select),
        :deep(.el-date-picker) {
          width: 100%;
          @media (min-width: 768px) {
            width: auto;
            min-width: 120px;
src/views/tradeManage/buyer/index.vue
@@ -35,11 +35,11 @@
              <el-option v-for="item in productTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
            </el-select>
          </el-form-item>
          <el-form-item label="" class="col-17">
            <el-select v-model="query.productSubType" placeholder="请选择产品类型子级" clearable style="width: 100%">
              <el-option v-for="item in productSubTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
            </el-select>
          </el-form-item>
<!--          <el-form-item label="" class="col-17">-->
<!--            <el-select v-model="query.productSubType" placeholder="请选择产品类型子级" clearable style="width: 100%">-->
<!--              <el-option v-for="item in productSubTypeOptions" :key="item.value" :label="item.label" :value="item.value" />-->
<!--            </el-select>-->
<!--          </el-form-item>-->
          <el-form-item label="申请时间" class="col-30">
            <el-date-picker
              v-model="query.dateRange"
@@ -74,7 +74,7 @@
              <template #default="{ row }">
                <div v-if="row.isMainOrder" class="main-order-info">
                  <div class="order-header">
                    <div class="order-item">
                      <span class="label">申请时间:</span>
                      <span class="value">{{ row.applyTime }}</span>
@@ -103,7 +103,7 @@
              </template>
            </el-table-column>
          </el-table-column>
          <!-- 购买方式 -->
          <el-table-column label="购买方式" align="center">
            <el-table-column label="销售形式/账户数量" width="150">
@@ -137,7 +137,7 @@
              </template>
            </el-table-column>
          </el-table-column>
          <!-- 总价 -->
          <el-table-column label="总价" align="center">
            <el-table-column label="单价" prop="unitPrice" width="90">
@@ -166,7 +166,7 @@
              </template>
            </el-table-column>
          </el-table-column>
          <!-- 期限(年) -->
          <el-table-column label="期限(年)" align="center" width="80">
            <el-table-column label="" prop="period" width="80">
@@ -179,7 +179,7 @@
              </template>
            </el-table-column>
          </el-table-column>
          <!-- 操作 -->
          <el-table-column label="操作" align="center" width="120" class="operation-column">
            <el-table-column label="" width="120">
@@ -190,56 +190,56 @@
                    <div class="action-item">
                      <div class="action-buttons">
                        <template v-for="action in getAvailableActions(row.parentOrder)" :key="action.type">
                          <el-button
                          <el-button
                            v-if="action.type === ActionType.VIEW"
                            type="primary"
                            link
                            size="small"
                            type="primary"
                            link
                            size="small"
                            @click="handleAction(action, row.parentOrder)"
                          >
                            查看
                          </el-button>
                          <el-button
                          <el-button
                            v-else-if="action.type === ActionType.TRACK"
                            type="primary"
                            link
                            size="small"
                            type="primary"
                            link
                            size="small"
                            @click="handleAction(action, row.parentOrder)"
                          >
                            追踪
                          </el-button>
                          <el-button
                          <el-button
                            v-else-if="action.type === ActionType.UPLOAD_FILE"
                            type="primary"
                            link
                            size="small"
                            type="primary"
                            link
                            size="small"
                            @click="handleAction(action, row.parentOrder)"
                          >
                            提交文件
                          </el-button>
                          <el-button
                          <el-button
                            v-else-if="action.type === ActionType.CONFIRM_TRADE"
                            type="primary"
                            link
                            size="small"
                            type="primary"
                            link
                            size="small"
                            @click="handleAction(action, row.parentOrder)"
                          >
                            交易确认
                          </el-button>
                          <el-button
                          <el-button
                            v-else-if="action.type === ActionType.EVALUATE"
                            type="primary"
                            link
                            size="small"
                            type="primary"
                            link
                            size="small"
                            @click="handleAction(action, row.parentOrder)"
                          >
                            评价
                          </el-button>
                          <el-button
                          <el-button
                            v-else-if="action.type === ActionType.CANCEL_ORDER"
                            type="danger"
                            link
                            size="small"
                            type="danger"
                            link
                            size="small"
                            @click="handleAction(action, row.parentOrder)"
                          >
                            取消订单
@@ -268,11 +268,11 @@
        />
      </div>
    </el-card>
    <!-- 订单状态对话框 -->
    <!-- <ProductOrderStatusDialog
      v-model="orderStatusDialogVisible"
      :order-id="currentOrderId"
    <!-- <ProductOrderStatusDialog
      v-model="orderStatusDialogVisible"
      :order-id="currentOrderId"
    /> -->
  </div>
</template>
@@ -379,7 +379,8 @@
// 获取产品类型选项
const getProductTypeOptions = async () => {
  try {
    const res = await productApi.getCategoryByParent({ parentCode: 'product_type' })
      // product_type
    const res = await productApi.getCategoryByParent({ parentCode: 'ProductTechnologyType' })
    if (res?.code === 200 && res.data) {
      productTypeOptions.value = res.data.map((item: any) => ({
        label: item.name,
@@ -444,7 +445,7 @@
  // 清空产品子级选择
  query.productSubType = ''
  // 获取对应的产品子级选项
  await getProductSubTypeOptions(value)
 //  await getProductSubTypeOptions(value)
}
// 获取状态类型
@@ -552,7 +553,7 @@
    payload.applyTimeStart = query.dateRange[0]
    payload.applyTimeEnd = query.dateRange[1]
  }
  // 添加产品条件查询
  if (query.industry) payload.industryId = query.industry
  if (query.unitProject) payload.unitProjectId = query.unitProject
@@ -562,7 +563,7 @@
  // 根据是否有产品条件选择不同的API
  const hasProductConditions = query.industry || query.unitProject || query.productType || query.productSubType
  const apiMethod = hasProductConditions ? orderApi.getBuyerOrderPageWithProductConditions : orderApi.getBuyerOrderPage
  const res = (await apiMethod(payload)) as any
  const pageData = res?.data
  const list: any[] = Array.isArray(pageData?.list) ? pageData.list : []
@@ -690,9 +691,9 @@
      type: 'warning',
      confirmButtonClass: 'el-button--danger'
    })
    const res = await orderApi.cancelOrder(order.id)
    if (res && res.code === 200) {
      ElMessage.success('订单取消成功')
      handleSearch() // 刷新列表
@@ -724,13 +725,13 @@
      return
    }
  }
  // 获取初始选项数据
  await Promise.all([
    getIndustryOptions(),
    getProductTypeOptions()
  ])
  // 执行搜索
  handleSearch()
})
@@ -768,7 +769,7 @@
      border-bottom: 2px solid #e4e7ed; // 与分隔行一致的下边框
    }
  }
  // 调整表头高度
  tr:first-child {
    th {
@@ -785,18 +786,18 @@
.search-card {
  margin-bottom: 20px;
  .query-form {
    .form-row {
      display: flex;
      gap: 0;
      width: 100%;
      margin-bottom: 8px;
      &.actions {
        justify-content: flex-end;
      }
      .el-form-item { margin-right: 0 !important; }
      > .el-form-item { padding-right: 8px; }
      > .el-form-item:last-child { padding-right: 0; }
@@ -810,7 +811,7 @@
    .el-form-item {
      margin-bottom: 16px;
      margin-right: 20px;
      &:last-child {
        margin-right: 0;
      }
@@ -821,7 +822,7 @@
.table-container {
  position: relative;
  z-index: 1;
  .custom-table {
    // 表头第二行文字大小调整
    .el-table__header-wrapper {
@@ -834,7 +835,7 @@
        }
      }
    }
    // 确保表头所有行的文字大小一致
    .el-table__header {
      th {
@@ -844,23 +845,23 @@
        }
      }
    }
    .el-table {
      position: relative;
      z-index: 1;
      .main-order-row {
        background-color: #f8f9fa;
        font-weight: 600;
        td {
          border-bottom: 2px solid #e4e7ed;
        }
      }
      .sub-order-row {
        background-color: #ffffff;
        td {
          border-bottom: 1px solid #ebeef5;
        }
@@ -886,14 +887,14 @@
      gap: 8px;
      flex-shrink: 0;
      flex: 1;
      .label {
        color: #909399;
        font-size: 12px;
        min-width: 60px;
        flex-shrink: 0;
      }
      .value {
        color: #303133;
        font-size: 12px;
@@ -908,22 +909,22 @@
.price-info {
  font-size: 12px;
  .price-points {
    color: #e6a23c;
    font-weight: 500;
  }
  .price-currency {
    color: #67c23a;
    font-weight: 500;
  }
  .price-agreement {
    color: #409eff;
    font-weight: 500;
  }
  .price-free {
    color: #909399;
    font-style: italic;
@@ -935,7 +936,7 @@
  align-items: center;
  gap: 8px;
  font-size: 12px;
  .permanent {
    color: #909399;
    font-size: 12px;
@@ -967,18 +968,18 @@
    display: flex;
    align-items: center;
    margin-bottom: 4px;
    &:last-child {
      margin-bottom: 0;
    }
    .label {
      color: #909399;
      font-size: 12px;
      min-width: 60px;
      flex-shrink: 0;
    }
    .value {
      color: #303133;
      font-size: 12px;
@@ -999,7 +1000,7 @@
  color: #303133;
  text-align: center;
  line-height: 1.4;
  .all-actions {
    display: flex;
    flex-direction: column;
@@ -1007,10 +1008,10 @@
    justify-content: center;
    gap: 6px;
    width: 100%;
    .action-item {
      width: 100%;
      .action-buttons {
        display: flex;
        flex-direction: column;
@@ -1018,7 +1019,7 @@
        align-items: center;
        justify-content: center;
        width: 100%;
        .el-button {
          width: 100%;
          text-align: center;
@@ -1030,7 +1031,7 @@
          height: auto;
          line-height: 1.2;
        }
        .op-text {
          margin: 4px 0;
          text-align: center;
@@ -1050,12 +1051,12 @@
  flex-wrap: wrap;
}
.op-text {
  color: #606266;
.op-text {
  color: #606266;
  font-size: 12px;
}
.op-text.warning {
  color: #f59e0b;
.op-text.warning {
  color: #f59e0b;
  font-size: 12px;
}
@@ -1076,11 +1077,11 @@
  .el-table__fixed-right {
    z-index: 2 !important;
  }
  .el-table__fixed-right-patch {
    z-index: 2 !important;
  }
  // 操作列样式优化
  .operation-column {
    .cell {
src/views/tradeManage/detail/index.vue
@@ -24,7 +24,7 @@
          <el-tag :type="getStatusType(detail.status)" size="small">{{ detail.statusName }}</el-tag>
        </el-descriptions-item>
      </el-descriptions>
      <!-- 申请人信息(与订单信息同卡片,复用分隔标题样式) -->
      <el-descriptions
        :column="2"
@@ -74,7 +74,7 @@
          <div class="desc-wrap">{{ detail.productDesc }}</div>
        </el-descriptions-item>
      </el-descriptions>
      <!-- 订单详情(移动到交易内容下面,同一卡片内) -->
      <div ref="orderTableWrapRef">
        <el-table
@@ -228,7 +228,7 @@
    <!-- 审批追踪 -->
    <el-card class="mt15" shadow="never">
      <div class="title">审批追踪</div>
      <!-- 标签页 -->
      <!-- <el-tabs v-model="activeTab" class="approval-tabs">
        <el-tab-pane label="审批记录" name="records">
@@ -280,12 +280,12 @@
          </el-table>
        </el-tab-pane>
      </el-tabs> -->
      <!-- 外部系统审批轨迹 iframe -->
      <div class="iframe-wrap" v-if="workflowIframeUrl">
        <iframe :src="workflowIframeUrl" class="workflow-iframe" referrerpolicy="no-referrer"></iframe>
      </div>
    </el-card>
    <!-- 返回按钮 -->
    <div class="action-buttons">
@@ -302,6 +302,7 @@
import orderApi from '@/api/orderApi'
import createAxios from '@/utils/axios'
import productApi from '@/api/productApi'
import sysUserService from '@/api/sysUser'
import { useUserInfo } from '@/stores/modules/userInfo'
const hostUrl =  import.meta.env.VITE_AXIOS_BASE_URL
@@ -376,17 +377,17 @@
onMounted(async () => {
  const orderId = String(route.params.id || '')
  if (!orderId) return
  try {
    // 并行获取订单详情和协议类型检查
    const [orderRes, agreementRes] = await Promise.all([
      orderApi.getOrderDetail(orderId),
      orderApi.checkAgreementPriceType(orderId)
    ])
    const res = orderRes as any
    const data = res?.data || {}
    // 设置是否为协议订单
    const agreementResult = agreementRes as any
    isAgreementOrder.value = agreementResult?.data === true
@@ -411,8 +412,21 @@
    } catch (e) {
      // 忽略产品详情失败,不阻塞订单详情
    }
    // 获取用户信息
    try {
        const userRes: any = await sysUserService.getUserdetail({ userId: data.userId })
        if (userRes?.code === 200 && userRes.data) {
            // 用产品详情补全头信息
            data.unitName = userRes.data.unitName || data.unitName
            data.userName = userRes.data.name || data.userName
            data.userDept = userRes.data.departmentName || data.userDept
            data.userPhone = userRes.data.phone || data.userPhone
            data.userAccount = userRes.data.username || data.userAccount
        }
    }catch (e){
    }
    // 映射订单详情头部信息
    const head = {
@@ -479,11 +493,11 @@
        endDateObj.setFullYear(endDateObj.getFullYear() + item.period)
        endDate = endDateObj.toISOString().split('T')[0] // 格式化为 YYYY-MM-DD
      }
      return {
      return {
        name: item.name,
        start: data.applyTime ? data.applyTime.split('T')[0] : '', // 使用订单申请时间
        end: endDate,
        end: endDate,
        forever: item.period === 0, // 期限为0时设置为永久
        remark: item.remarks || '' // 使用套件信息中的remarks字段
      }
@@ -546,7 +560,7 @@
}
// 表头文字居中,但第一行的"详情"文字靠左对齐
const headerCenterStyle: CSSProperties = {
const headerCenterStyle: CSSProperties = {
  textAlign: 'center',
  fontSize: '14px',
  background: '#f3f6fb'
@@ -556,7 +570,7 @@
const bodyCellStyle: CSSProperties = { fontSize: '12px' }
// 审批追踪表格样式
const recordTableHeaderStyle: CSSProperties = {
const recordTableHeaderStyle: CSSProperties = {
  textAlign: 'center',
  fontSize: '14px',
  background: '#f3f6fb'
@@ -564,7 +578,7 @@
const recordTableCellStyle: CSSProperties = { fontSize: '12px' }
// 文件列表表格表头文字居中,但第一列的"交易文件"文字靠左对齐
const fileTableHeaderStyle: CSSProperties = {
const fileTableHeaderStyle: CSSProperties = {
  textAlign: 'center',
  fontSize: '14px',
  background: '#f3f6fb'
@@ -623,23 +637,23 @@
    'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', // .xlsx
    'application/vnd.openxmlformats-officedocument.presentationml.presentation', // .pptx
  ]
  // 如果MIME类型匹配,直接返回true
  if (previewableTypes.includes(file.type || '')) {
    return true
  }
  // 如果MIME类型为空或不匹配,根据文件扩展名判断
  const fileName = file.name || ''
  const fileExtension = fileName.toLowerCase().split('.').pop()
  const previewableExtensions = [
    'jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp',
    'txt', 'html', 'htm', 'css', 'js',
    'pdf',
    'docx', 'xlsx', 'pptx'
  ]
  return previewableExtensions.includes(fileExtension)
}
@@ -655,13 +669,13 @@
    ElMessage.warning('文件链接不存在')
    return
  }
  // 获取文件扩展名
  const fileName = file.name || ''
  const fileExtension = fileName.toLowerCase().split('.').pop()
  let previewUrl = file.url
  // 如果文件存储在MinIO,优先使用预览URL
  if (file.url.includes('order-attachments')) {
    try {
@@ -673,9 +687,9 @@
          fileName: file.url
        }
      })
      console.log('预览URL响应:', previewResponse)
      // 检查响应格式
      const responseData = previewResponse as any
      if (responseData && responseData.code === 200 && responseData.data) {
@@ -693,7 +707,7 @@
            originalName: file.name
          }
        })
        // 创建预览URL
        const blob = new Blob([response as any])
        previewUrl = window.URL.createObjectURL(blob)
@@ -705,30 +719,30 @@
      return
    }
  }
  // 图片文件直接在新窗口打开
  if ((file.type && file.type.startsWith('image/')) ||
  if ((file.type && file.type.startsWith('image/')) ||
      ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp'].includes(fileExtension)) {
    console.log('预览图片文件:', previewUrl)
    window.open(previewUrl, '_blank')
    return
  }
  // PDF文件在新窗口打开
  if (file.type === 'application/pdf' || fileExtension === 'pdf') {
    console.log('预览PDF文件:', previewUrl)
    window.open(previewUrl, '_blank')
    return
  }
  // 文本文件在新窗口打开
  if ((file.type && file.type.startsWith('text/')) ||
  if ((file.type && file.type.startsWith('text/')) ||
      ['txt', 'html', 'htm', 'css', 'js'].includes(fileExtension)) {
    console.log('预览文本文件:', previewUrl)
    window.open(previewUrl, '_blank')
    return
  }
  // Office文档和其他文件类型,尝试在新窗口打开
  try {
    console.log('预览其他文件:', previewUrl)
@@ -745,14 +759,14 @@
    ElMessage.warning('文件链接不存在')
    return
  }
  console.log('开始下载文件:', file.name, 'URL:', file.url)
  try {
    // 如果文件存储在MinIO,使用后端直接下载API
    if (file.url.includes('order-attachments')) {
      console.log('使用MinIO下载API')
      // 使用axios通过代理访问后端API
      const response = await createAxios({
        url: `/admin/file/download`,
@@ -763,28 +777,28 @@
          originalName: file.name
        }
      })
      console.log('下载响应:', response)
      // 创建下载链接
      const blob = new Blob([response as any])
      const downloadUrl = window.URL.createObjectURL(blob)
      console.log('创建下载链接:', downloadUrl)
      const link = document.createElement('a')
      link.href = downloadUrl
      link.download = file.name || 'download'
      link.target = '_blank'
      link.rel = 'noopener noreferrer'
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      // 清理URL对象
      window.URL.revokeObjectURL(downloadUrl)
      ElMessage.success('文件下载成功')
    } else {
      console.log('使用直接URL下载')
@@ -794,11 +808,11 @@
      link.download = file.name || 'download'
      link.target = '_blank'
      link.rel = 'noopener noreferrer'
      document.body.appendChild(link)
      link.click()
      document.body.removeChild(link)
      ElMessage.success('开始下载文件')
    }
  } catch (error) {
@@ -1052,7 +1066,7 @@
  gap: 8px;
  align-items: center;
  justify-content: center;
  .preview-btn {
    color: #409eff;
    &:hover {
@@ -1063,7 +1077,7 @@
      cursor: not-allowed;
    }
  }
  .download-btn {
    color: #67c23a;
    &:hover {
src/views/tradeManage/seller/index.vue
@@ -35,11 +35,11 @@
              <el-option v-for="s in statusOptions" :key="s.value" :label="s.label" :value="s.value" />
            </el-select>
          </el-form-item>
          <el-form-item label="" class="col-17">
            <el-select v-model="query.productSubType" placeholder="请选择产品类型子级" clearable style="width: 100%">
              <el-option v-for="item in productSubTypeOptions" :key="item.value" :label="item.label" :value="item.value" />
            </el-select>
          </el-form-item>
<!--          <el-form-item label="" class="col-17">-->
<!--            <el-select v-model="query.productSubType" placeholder="请选择产品类型子级" clearable style="width: 100%">-->
<!--              <el-option v-for="item in productSubTypeOptions" :key="item.value" :label="item.label" :value="item.value" />-->
<!--            </el-select>-->
<!--          </el-form-item>-->
          <el-form-item label="申请时间" class="col-30">
            <el-date-picker
              v-model="query.dateRange"
@@ -102,7 +102,7 @@
              </template>
            </el-table-column>
          </el-table-column>
          <!-- 购买方式 -->
          <el-table-column label="购买方式" align="center">
            <el-table-column label="销售形式/账户数量" width="150">
@@ -136,7 +136,7 @@
              </template>
            </el-table-column>
          </el-table-column>
          <!-- 总价 -->
          <el-table-column label="总价" align="center">
            <el-table-column label="单价" prop="unitPrice" width="90">
@@ -165,7 +165,7 @@
              </template>
            </el-table-column>
          </el-table-column>
          <!-- 期限(年) -->
          <el-table-column label="期限(年)" align="center" width="80">
            <el-table-column label="" prop="period" width="80">
@@ -178,7 +178,7 @@
              </template>
            </el-table-column>
          </el-table-column>
          <!-- 操作 -->
          <el-table-column label="操作" align="center" width="120" class="operation-column">
            <el-table-column label="" width="120">
@@ -189,20 +189,20 @@
                    <div class="action-item">
                      <div class="action-buttons">
                        <template v-for="action in getAvailableActions(row.parentOrder)" :key="action.type">
                          <el-button
                          <el-button
                            v-if="action.type === ActionType.VIEW"
                            type="primary"
                            link
                            size="small"
                            type="primary"
                            link
                            size="small"
                            @click="handleAction(action, row.parentOrder)"
                          >
                            查看
                          </el-button>
                          <!-- <el-button
                          <!-- <el-button
                            v-else-if="action.type === ActionType.TRACK"
                            type="primary"
                            link
                            size="small"
                            type="primary"
                            link
                            size="small"
                            @click="handleAction(action, row.parentOrder)"
                          >
                            追踪
@@ -231,11 +231,11 @@
        />
      </div>
    </el-card>
    <!-- 订单状态对话框 -->
    <ProductOrderStatusDialog
      v-model="orderStatusDialogVisible"
      :order-id="currentOrderId"
    <ProductOrderStatusDialog
      v-model="orderStatusDialogVisible"
      :order-id="currentOrderId"
    />
  </div>
</template>
@@ -342,7 +342,7 @@
// 获取产品类型选项
const getProductTypeOptions = async () => {
  try {
    const res = await productApi.getCategoryByParent({ parentCode: 'product_type' })
    const res = await productApi.getCategoryByParent({ parentCode: 'ProductTechnologyType' })
    if (res?.code === 200 && res.data) {
      productTypeOptions.value = res.data.map((item: any) => ({
        label: item.name,
@@ -407,7 +407,7 @@
  // 清空产品子级选择
  query.productSubType = ''
  // 获取对应的产品子级选项
  await getProductSubTypeOptions(value)
 // await getProductSubTypeOptions(value)
}
@@ -532,7 +532,7 @@
    // 根据是否有产品条件选择不同的API
    const hasProductConditions = query.industry || query.unitProject || query.productType || query.productSubType
    const apiMethod = hasProductConditions ? orderApi.getSellerOrderPageWithProductConditions : orderApi.getSellerOrderPage
    const res = (await apiMethod(payload)) as any
    const pageData = res?.data
    const list: any[] = Array.isArray(pageData?.list) ? pageData.list : []
@@ -652,13 +652,13 @@
      return
    }
  }
  // 获取初始选项数据
  await Promise.all([
    getIndustryOptions(),
    getProductTypeOptions()
  ])
  // 执行搜索
  handleSearch()
})
@@ -696,7 +696,7 @@
      border-bottom: 2px solid #e4e7ed; // 与分隔行一致的下边框
    }
  }
  // 调整表头高度
  tr:first-child {
    th {
@@ -713,18 +713,18 @@
.search-card {
  margin-bottom: 20px;
  .query-form {
    .form-row {
      display: flex;
      gap: 0;
      width: 100%;
      margin-bottom: 8px;
      &.actions {
        justify-content: flex-end;
      }
      .el-form-item { margin-right: 0 !important; }
      > .el-form-item { padding-right: 8px; }
      > .el-form-item:last-child { padding-right: 0; }
@@ -738,7 +738,7 @@
    .el-form-item {
      margin-bottom: 16px;
      margin-right: 20px;
      &:last-child {
        margin-right: 0;
      }
@@ -749,7 +749,7 @@
.table-container {
  position: relative;
  z-index: 1;
  .custom-table {
    // 表头第二行文字大小调整
    .el-table__header-wrapper {
@@ -762,7 +762,7 @@
        }
      }
    }
    // 确保表头所有行的文字大小一致
    .el-table__header {
      th {
@@ -772,23 +772,23 @@
        }
      }
    }
    .el-table {
      position: relative;
      z-index: 1;
      .main-order-row {
        background-color: #f8f9fa;
        font-weight: 600;
        td {
          border-bottom: 2px solid #e4e7ed;
        }
      }
      .sub-order-row {
        background-color: #ffffff;
        td {
          border-bottom: 1px solid #ebeef5;
        }
@@ -805,20 +805,20 @@
    gap: 20px;
    align-items: center;
    overflow: hidden;
    .order-item {
      display: flex;
      align-items: center;
      gap: 8px;
      flex-shrink: 0;
      .label {
        color: #909399;
        font-size: 12px;
        min-width: 60px;
        flex-shrink: 0;
      }
      .value {
        color: #303133;
        font-size: 12px;
@@ -833,22 +833,22 @@
.price-info {
  font-size: 12px;
  .price-points {
    color: #e6a23c;
    font-weight: 500;
  }
  .price-currency {
    color: #67c23a;
    font-weight: 500;
  }
  .price-agreement {
    color: #409eff;
    font-weight: 500;
  }
  .price-free {
    color: #909399;
    font-style: italic;
@@ -860,7 +860,7 @@
  align-items: center;
  gap: 8px;
  font-size: 12px;
  .permanent {
    color: #909399;
    font-size: 12px;
@@ -892,18 +892,18 @@
    display: flex;
    align-items: center;
    margin-bottom: 4px;
    &:last-child {
      margin-bottom: 0;
    }
    .label {
      color: #909399;
      font-size: 12px;
      min-width: 60px;
      flex-shrink: 0;
    }
    .value {
      color: #303133;
      font-size: 12px;
@@ -924,7 +924,7 @@
  color: #303133;
  text-align: center;
  line-height: 1.4;
  .all-actions {
    display: flex;
    flex-direction: column;
@@ -932,10 +932,10 @@
    justify-content: center;
    gap: 6px;
    width: 100%;
    .action-item {
      width: 100%;
      .action-buttons {
        display: flex;
        flex-direction: column;
@@ -943,7 +943,7 @@
        align-items: center;
        justify-content: center;
        width: 100%;
        .el-button {
          width: 100%;
          text-align: center;
@@ -955,7 +955,7 @@
          height: auto;
          line-height: 1.2;
        }
        .op-text {
          margin: 4px 0;
          text-align: center;
@@ -975,12 +975,12 @@
  flex-wrap: wrap;
}
.op-text {
  color: #606266;
.op-text {
  color: #606266;
  font-size: 12px;
}
.op-text.warning {
  color: #f59e0b;
.op-text.warning {
  color: #f59e0b;
  font-size: 12px;
}
@@ -1001,11 +1001,11 @@
  .el-table__fixed-right {
    z-index: 2 !important;
  }
  .el-table__fixed-right-patch {
    z-index: 2 !important;
  }
  // 操作列样式优化
  .operation-column {
    .cell {