src/views/officeProcessAutomation/ApproveManage/approve-list/components/ApproveDetailPanel.vue
@@ -19,9 +19,9 @@
            {{ approvalTypeLabel(row.approvalType) }}
          </span>
        </el-descriptions-item>
        <el-descriptions-item label="申请人编号">{{ row.applicantNo || "—" }}</el-descriptions-item>
        <el-descriptions-item label="申请人名称">{{ row.applicantName || "—" }}</el-descriptions-item>
        <el-descriptions-item label="申请摘要">{{ row.summary || "—" }}</el-descriptions-item>
        <el-descriptions-item label="发起人编号">{{ row.applicantNo || "—" }}</el-descriptions-item>
        <el-descriptions-item label="发起人名称">{{ row.applicantName || "—" }}</el-descriptions-item>
        <el-descriptions-item label="摘要">{{ row.summary || "—" }}</el-descriptions-item>
        <el-descriptions-item v-if="row.rejectReason"
                              label="驳回原因"
                              :span="2">
@@ -50,7 +50,7 @@
            <el-descriptions-item label="发货订单号">{{ detailData.shippingInfo.shippingNo || "--" }}</el-descriptions-item>
            <el-descriptions-item label="客户名称">{{ detailData.shippingInfo.customerName || "--" }}</el-descriptions-item>
            <el-descriptions-item label="发货类型">{{ detailData.shippingInfo.type || "--" }}</el-descriptions-item>
            <el-descriptions-item label="发货日期">{{ detailData.shippingInfo.shippingDateDate || "--" }}</el-descriptions-item>
            <el-descriptions-item label="发货日期">{{ detailData.shippingInfo.shippingDate || "--" }}</el-descriptions-item>
            <el-descriptions-item label="审核状态">{{ detailData.shippingInfo.status || "--" }}</el-descriptions-item>
            <el-descriptions-item label="发货车牌号">{{ detailData.shippingInfo.shippingCarNumber || "--" }}</el-descriptions-item>
            <el-descriptions-item label="快递公司">{{ detailData.shippingInfo.expressCompany || "--" }}</el-descriptions-item>
@@ -83,6 +83,7 @@
            <el-descriptions-item label="签订日期">{{ detailData.executionDate || "--" }}</el-descriptions-item>
            <el-descriptions-item label="录入日期">{{ detailData.entryDate || "--" }}</el-descriptions-item>
            <el-descriptions-item label="付款方式">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
            <el-descriptions-item label="付款类别">{{ detailData.paymentCategory || "--" }}</el-descriptions-item>
            <el-descriptions-item label="合同金额" :span="2">
              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
                ¥{{ Number(detailData.contractAmount ?? 0).toFixed(2) }}
@@ -145,12 +146,61 @@
          </div>
        </div>
      </template>
      <!-- 销售台账审批详情(卖油 / 代储) -->
      <template v-else-if="row.businessType === 19">
        <div v-if="detailData && Object.keys(detailData).length" class="sales-ledger-detail">
          <el-divider content-position="left">销售台账详情</el-divider>
          <el-descriptions :column="2" border>
            <el-descriptions-item label="销售合同号">{{ detailData.salesContractNo || "--" }}</el-descriptions-item>
            <el-descriptions-item label="销售类型">{{ detailData.ledgerType || "--" }}</el-descriptions-item>
            <el-descriptions-item label="客户名称">{{ detailData.customerName || "--" }}</el-descriptions-item>
            <el-descriptions-item label="业务员">{{ detailData.salesman || "--" }}</el-descriptions-item>
            <el-descriptions-item label="项目名称">{{ detailData.projectName || "--" }}</el-descriptions-item>
            <el-descriptions-item label="付款方式">{{ detailData.paymentMethod || "--" }}</el-descriptions-item>
            <el-descriptions-item label="付款类别">{{ detailData.paymentCategory || "--" }}</el-descriptions-item>
            <el-descriptions-item v-if="detailData.ledgerType === '代储'"
                                  label="油库">{{ detailData.oilDepotName || "--" }}</el-descriptions-item>
            <el-descriptions-item v-if="detailData.ledgerType === '代储'"
                                  label="储罐号">{{ detailData.tankNo || "--" }}</el-descriptions-item>
            <el-descriptions-item label="合同金额" :span="2">
              <span style="font-size: 18px; color: #e6a23c; font-weight: bold;">
                ¥{{ Number(detailData.contractAmount ?? 0).toFixed(2) }}
              </span>
              <span v-if="detailData.exceedsTrustFund"
                    class="reject-text"
                    style="margin-left: 12px;">
                已超出该客户信托基金{{ detailData.trustFund != null ? `(信托基金:${detailData.trustFund})` : "" }}
              </span>
            </el-descriptions-item>
          </el-descriptions>
          <div v-if="detailData.productData && detailData.productData.length"
               style="margin-top: 20px;">
            <h4>产品明细</h4>
            <el-table :data="detailData.productData"
                      border
                      style="width: 100%">
              <el-table-column prop="productCategory" label="产品大类" />
              <el-table-column prop="specificationModel" label="规格型号" />
              <el-table-column prop="unit" label="单位" />
              <el-table-column prop="quantity" label="数量" />
              <el-table-column prop="taxInclusiveUnitPrice" label="含税单价">
                <template #default="scope">¥{{ Number(scope.row.taxInclusiveUnitPrice ?? 0).toFixed(2) }}</template>
              </el-table-column>
              <el-table-column prop="taxInclusiveTotalPrice" label="含税总价">
                <template #default="scope">¥{{ Number(scope.row.taxInclusiveTotalPrice ?? 0).toFixed(2) }}</template>
              </el-table-column>
            </el-table>
          </div>
        </div>
      </template>
    </div>
    <div v-if="attachmentList.length"
    <div v-for="group in attachmentGroups"
         :key="group.title"
         class="detail-block">
      <div class="detail-block-title">附件列表</div>
      <div class="detail-block-title">{{ group.title }}</div>
      <div class="attachment-list">
        <div v-for="file in attachmentList"
        <div v-for="file in group.files"
             :key="file.id"
             class="attachment-item">
          <el-icon class="file-icon">
@@ -164,7 +214,7 @@
            <el-link v-if="file.previewURL || file.url"
                     type="primary"
                     :underline="false"
                     @click="openFile(file.previewURL || file.url)">预览</el-link>
                     @click="previewFile(file.previewURL || file.url)">预览</el-link>
            <el-divider v-if="(file.previewURL || file.url) && file.downloadURL"
                        direction="vertical" />
            <el-link v-if="file.downloadURL"
@@ -175,12 +225,14 @@
        </div>
      </div>
    </div>
    <filePreview ref="filePreviewRef" />
  </div>
</template>
<script setup>
  import { computed } from "vue";
  import { computed, ref } from "vue";
  import { Paperclip } from "@element-plus/icons-vue";
  import filePreview from "@/components/filePreview/index.vue";
  import { formatDisplayTime } from "../../approve-template/approveTemplateConstants.js";
  import {
    approvalTypeLabel,
@@ -198,10 +250,12 @@
  const formResolved = computed(() => resolveInstanceFormFields(props.row));
  const filePreviewRef = ref();
  // 是否为特殊审批类型(采购、发货、报价)
  // 是否为特殊审批类型(采购、发货、报价、销售台账)
  const isSpecialApprovalType = computed(() => {
    return [5, 7, 6].includes(props.row.businessType);
    return [5, 7, 6, 19].includes(props.row.businessType);
  });
  // 详情数据(直接使用传入的 detail-data 参数)
@@ -214,6 +268,30 @@
    return Array.isArray(list) ? list : [];
  });
  // 台账自身附件:销售台账 listPage 返回 storageBlobVOs,采购台账 getPurchaseByCode 返回 storageBlobVOS
  const businessAttachments = computed(() => {
    if (![5, 19].includes(props.row.businessType)) return [];
    const detail = props.detailData || {};
    const candidates = [detail.storageBlobVOs, detail.storageBlobVOS, detail.storageBlobVOList];
    return candidates.find(list => Array.isArray(list) && list.length) || [];
  });
  const attachmentGroups = computed(() => {
    const groups = [];
    if (businessAttachments.value.length) {
      groups.push({ title: "台账附件", files: businessAttachments.value });
    }
    if (attachmentList.value.length) {
      groups.push({ title: "审批附件", files: attachmentList.value });
    }
    return groups;
  });
  function previewFile(url) {
    if (!url) return;
    filePreviewRef.value?.open(url);
  }
  function openFile(url) {
    if (!url) return;
    window.open(url, "_blank");