zhangwencui
9 小时以前 db76255e483a8829c3c79e752fa0538c9b226289
 完善采购台账功能,新增入库管控与模板导入能力
已修改4个文件
440 ■■■■ 文件已修改
src/api/procurementManagement/procurementLedger.js 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/procurementLedger/detail.vue 359 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/procurementLedger/index.vue 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/pages/procurementManagement/procurementLedger/view.vue 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/procurementManagement/procurementLedger.js
@@ -73,6 +73,24 @@
  });
}
// 查询采购模板列表
export function getPurchaseTemplateList(query) {
  return request({
    url: "/purchase/ledger/getPurchaseTemplateList",
    method: "get",
    params: query,
  });
}
// 根据销售合同号(salesLedgerId)导入产品
export function getProductInfoByContractNo(query) {
  return request({
    url: "/purchase/ledger/getProductBySalesNo",
    method: "get",
    params: query,
  });
}
// 查询采购详情
export function getPurchaseByCode(query) {
  return request({
@@ -88,4 +106,4 @@
        method: 'get',
        params: query,
    })
}
}
src/pages/procurementManagement/procurementLedger/detail.vue
@@ -15,18 +15,18 @@
                  placeholder="自动生成"
                  disabled />
      </up-form-item>
      <up-form-item label="销售合同号"
                    prop="salesContractNo"
                    required>
        <up-input v-model="form.salesContractNo"
      <up-form-item v-if="showSalesContractBinding"
                    label="销售合同号"
                    prop="salesLedgerId">
        <up-input v-model="salesContractNoText"
                  placeholder="点击选择销售合同号"
                  readonly
                  :disabled="isReadOnly"
                  @click="!isReadOnly && (showPicker = true)"
                  placeholder="点击选择销售合同号" />
                  @click="!isReadOnly && openSalesContractPicker()" />
        <template #right>
          <up-icon name="arrow-right"
                   v-if="!isReadOnly"
                   @click="showPicker = true"></up-icon>
                   @click="openSalesContractPicker()"></up-icon>
        </template>
      </up-form-item>
      <up-form-item label="供应商名称"
@@ -81,6 +81,19 @@
                  placeholder="请输入"
                  disabled />
      </up-form-item>
      <up-form-item label="入库状态"
                    prop="stockInStatus">
        <up-input v-model="form.stockInStatus"
                  placeholder="--"
                  disabled />
      </up-form-item>
      <up-form-item label="备注"
                    prop="remarks">
        <up-textarea v-model="form.remarks"
                     placeholder="请输入备注"
                     auto-height
                     :disabled="isReadOnly" />
      </up-form-item>
      <up-popup :show="showTimePicker"
                mode="bottom"
                @close="showTimePicker = false">
@@ -90,18 +103,24 @@
                            @cancel="showTimePicker = false"
                            mode="date" />
      </up-popup>
      <!-- 销售合同号选择 -->
      <up-action-sheet :show="showPicker"
                       :actions="salesContractActionList"
                       title="选择销售合同号"
                       @select="onSalesmanSelect"
                       @close="showPicker = false" />
      <!-- 供应商选择 -->
      <up-action-sheet :show="showCustomerPicker"
                       :actions="supplierActionList"
                       title="选择供应商"
                       @select="onCustomerSelect"
                       @close="showCustomerPicker = false" />
      <!-- 模板选择 -->
      <up-action-sheet :show="showTemplatePicker"
                       :actions="templateActionList"
                       title="选择模板"
                       @select="onTemplateSelect"
                       @close="showTemplatePicker = false" />
      <!-- 销售合同号选择 -->
      <up-action-sheet :show="showSalesContractPicker"
                       :actions="salesContractActionList"
                       title="选择销售合同号"
                       @select="onSalesContractSelect"
                       @close="showSalesContractPicker = false" />
      <!-- 产品大类选择器 -->
      <up-popup :show="showCategoryPicker"
                mode="bottom">
@@ -166,7 +185,7 @@
            </view>
            <!-- 操作按钮 -->
            <view class="product-actions"
                  v-if="canEditProducts">
                  v-if="canEditProducts && canEditProductRow(product)">
              <up-button type="error"
                         size="mini"
                         @click="removeProduct(idx)"
@@ -185,11 +204,11 @@
              <up-input v-model="product.productCategory"
                        readonly
                        placeholder="请选择"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        @click="openCategoryPicker(idx)" />
              <template #right>
                <up-icon name="arrow-right"
                         v-if="canEditProducts"
                         v-if="canEditProducts && canEditProductRow(product)"
                         @click="openCategoryPicker(idx)"></up-icon>
              </template>
            </up-form-item>
@@ -201,11 +220,11 @@
              <up-input v-model="product.specificationModel"
                        readonly
                        placeholder="请选择"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        @click="openSpecificationPicker(idx)" />
              <template #right>
                <up-icon name="arrow-right"
                         v-if="canEditProducts"
                         v-if="canEditProducts && canEditProductRow(product)"
                         @click="openSpecificationPicker(idx)"></up-icon>
              </template>
            </up-form-item>
@@ -215,7 +234,7 @@
                          required
                          :rules="productRules">
              <up-input v-model="product.unit"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        placeholder="请输入" />
            </up-form-item>
            <!-- 税率 -->
@@ -226,11 +245,11 @@
              <up-input v-model="product.taxRate"
                        readonly
                        placeholder="请选择"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        @click="openTaxRatePicker(idx)" />
              <template #right>
                <up-icon name="arrow-right"
                         v-if="canEditProducts"
                         v-if="canEditProducts && canEditProductRow(product)"
                         @click="openTaxRatePicker(idx)"></up-icon>
              </template>
            </up-form-item>
@@ -241,7 +260,7 @@
                          :rules="productRules">
              <up-input v-model="product.taxInclusiveUnitPrice"
                        type="number"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        placeholder="请输入"
                        @blur="formatTaxPrice(idx)" />
            </up-form-item>
@@ -252,7 +271,7 @@
                          :rules="productRules">
              <up-input v-model="product.quantity"
                        type="number"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        placeholder="请输入"
                        @blur="formatAmount(idx)" />
            </up-form-item>
@@ -263,7 +282,7 @@
                          :rules="productRules">
              <up-input v-model="product.taxInclusiveTotalPrice"
                        type="number"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        placeholder="请输入"
                        @blur="formatTaxTotal(idx)" />
            </up-form-item>
@@ -274,9 +293,15 @@
                          :rules="productRules">
              <up-input v-model="product.taxExclusiveTotalPrice"
                        type="number"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        placeholder="请输入"
                        @blur="formatNoTaxTotal(idx)" />
            </up-form-item>
            <up-form-item label="入库审核状态"
                          prop="stockInApprovalStatus">
              <up-input v-model="product.stockInApprovalStatus"
                        placeholder="--"
                        disabled />
            </up-form-item>
            <!-- 发票类型 -->
            <up-form-item label="发票类型"
@@ -286,11 +311,11 @@
              <up-input v-model="product.invoiceType"
                        readonly
                        placeholder="请选择"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        @click="openInvoiceTypePicker(idx)" />
              <template #right>
                <up-icon name="arrow-right"
                         v-if="canEditProducts"
                         v-if="canEditProducts && canEditProductRow(product)"
                         @click="openInvoiceTypePicker(idx)"></up-icon>
              </template>
            </up-form-item>
@@ -301,7 +326,7 @@
                          :rules="productRules">
              <up-input v-model="product.warnNum"
                        type="number"
                        :disabled="!canEditProducts"
                        :disabled="!canEditProductRow(product)"
                        placeholder="请输入" />
            </up-form-item>
            <up-form-item label="是否质检"
@@ -309,16 +334,16 @@
                          required
                          :rules="productRules">
              <u-radio-group v-model="product.isChecked"
                             :disabled="!canEditProducts"
                             :disabled="!canEditProductRow(product)"
                             placement="row"
                             @change="groupChange">
                <u-radio :customStyle="{marginRight: '40rpx'}"
                         label="是"
                         :disabled="!canEditProducts"
                         :disabled="!canEditProductRow(product)"
                         :name="true">
                </u-radio>
                <u-radio label="否"
                         :disabled="!canEditProducts"
                         :disabled="!canEditProductRow(product)"
                         :name="false">
                </u-radio>
              </u-radio-group>
@@ -327,6 +352,12 @@
        </view>
      </view>
      <!-- 使用公共底部按钮组件 -->
      <view v-if="operationType === 'add' && !isReadOnly"
            class="footer-template-tool"
            @click="openTemplatePicker()">
        <text class="footer-template-tool__label">模板</text>
        <text class="footer-template-tool__value">{{ templateName || '选择' }}</text>
      </view>
      <FooterButtons :show="operationType !== 'view' && !isApprovalPassed"
                     cancelText="取消"
                     confirmText="保存"
@@ -347,8 +378,10 @@
    createPurchaseNo,
    getOptions,
    getPurchaseById,
    getSalesNo,
    approveProcessGetInfo,
    getPurchaseTemplateList,
    getProductInfoByContractNo,
    getSalesNo,
  } from "@/api/procurementManagement/procurementLedger";
  import { delProduct } from "@/api/salesManagement/salesLedger";
  import PageHeader from "@/components/PageHeader.vue";
@@ -358,26 +391,38 @@
  const operationType = ref("");
  const editData = ref(null);
  const formRef = ref(null);
  const showSalesContractBinding = false;
  // 审批通过(approvalStatus === 3)后,整单禁止编辑(含产品、基本信息、审批流程)
  const isApprovalPassed = computed(() => {
    const status = editData.value?.approvalStatus ?? form.value?.approvalStatus;
    return Number(status) === 3;
  });
  const isStockInFully = computed(() => {
    const status = editData.value?.stockInStatus ?? form.value?.stockInStatus;
    return status === "完全入库";
  });
  const canEditProducts = computed(() => {
    return operationType.value !== "view" && !isApprovalPassed.value;
    return (
      operationType.value !== "view" &&
      !isApprovalPassed.value &&
      !isStockInFully.value
    );
  });
  // 是否整体只读:查看模式 或 已审批通过
  const isReadOnly = computed(() => {
    return operationType.value === "view" || isApprovalPassed.value;
    return (
      operationType.value === "view" ||
      isApprovalPassed.value ||
      isStockInFully.value
    );
  });
  const userStore = useUserStore();
  const form = ref({
    id: "",
    salesContractNo: "",
    // 关联销售台账ID(编辑回显时可能缺失,需要从合同号反查补齐)
    salesLedgerId: "",
    purchaseContractNumber: "",
    salesLedgerId: "",
    supplierId: "",
    supplierName: "",
    projectName: "",
@@ -387,21 +432,20 @@
    entryDate: "",
    approveUserIds: "",
    executionDate: "",
    stockInStatus: "",
    remarks: "",
  });
  const showTimePicker = ref(false);
  const showPicker = ref(false);
  const showCustomerPicker = ref(false);
  const salesContractList = ref([]);
  const supplierList = ref([]);
  const productData = ref([]);
  const currentDate = ref(Date.now());
  // 计算销售合同号选择列表
  const salesContractActionList = computed(() => {
    return salesContractList.value.map(item => ({
      name: item.text,
      value: item.value,
    }));
  });
  const templateList = ref([]);
  const templateName = ref("");
  const showTemplatePicker = ref(false);
  const salesContractList = ref([]);
  const showSalesContractPicker = ref(false);
  const salesContractNoText = ref("");
  // 计算供应商选择列表(只保留 isWhite === 0 的供应商)
  const supplierActionList = computed(() => {
@@ -411,6 +455,20 @@
        name: item.text,
        value: item.value,
      }));
  });
  const templateActionList = computed(() => {
    return templateList.value.map(item => ({
      name: item.templateName,
      value: item.templateName,
    }));
  });
  const salesContractActionList = computed(() => {
    return salesContractList.value.map(item => ({
      name: item.salesContractNo,
      value: item.id,
    }));
  });
  // 选择器相关变量
@@ -468,9 +526,6 @@
  // 表单校验规则
  const rules = {
    salesContractNo: [
      { required: true, message: "请选择销售合同号", trigger: "blur" },
    ],
    supplierName: [
      { required: true, message: "请选择供应商名称", trigger: "blur" },
    ],
@@ -535,34 +590,17 @@
      taxInclusiveTotalPrice: "",
      taxExclusiveTotalPrice: "",
      invoiceType: "",
      stockInApprovalStatus: "",
      availableQuality: "",
      returnQuality: "",
      isChecked: false,
      warnNum: "",
    });
  };
  // 销售合同号选择事件
  const onSalesmanSelect = item => {
    form.value.salesContractNo = item.name;
    // 查找对应的id
    const selectedItem = salesContractList.value.find(
      contract => contract.text === item.name
    );
    if (selectedItem) {
      form.value.salesLedgerId = selectedItem.value;
    }
    showPicker.value = false;
  };
  // 编辑回显场景:只有 salesContractNo,没有 salesLedgerId 时,尝试从列表反查补齐
  const syncSalesLedgerIdFromContractNo = () => {
    if (form.value.salesLedgerId) return;
    if (!form.value.salesContractNo) return;
    const selectedItem = salesContractList.value.find(
      contract => contract.text === form.value.salesContractNo
    );
    if (selectedItem) {
      form.value.salesLedgerId = selectedItem.value;
    }
  const canEditProductRow = product => {
    if (!canEditProducts.value) return false;
    return product?.stockInApprovalStatus !== "完全入库";
  };
  // 供应商选择事件
@@ -581,6 +619,7 @@
  const removeProduct = idx => {
    if (!canEditProducts.value) return;
    const row = productData.value[idx];
    if (!canEditProductRow(row)) return;
    // 新增模式或还未落库的产品,直接前端删除
    if (operationType.value === "add" || !row?.id) {
@@ -624,26 +663,113 @@
  // 显示选择器
  const openCategoryPicker = idx => {
    if (!canEditProducts.value) return;
    if (!canEditProductRow(productData.value[idx])) return;
    currentProductIndex.value = idx;
    showCategoryPicker.value = true;
  };
  const openSpecificationPicker = idx => {
    if (!canEditProducts.value) return;
    if (!canEditProductRow(productData.value[idx])) return;
    currentProductIndex.value = idx;
    showSpecificationPicker.value = true;
  };
  const openTaxRatePicker = idx => {
    if (!canEditProducts.value) return;
    if (!canEditProductRow(productData.value[idx])) return;
    currentProductIndex.value = idx;
    showTaxRatePicker.value = true;
  };
  const openInvoiceTypePicker = idx => {
    if (!canEditProducts.value) return;
    if (!canEditProductRow(productData.value[idx])) return;
    currentProductIndex.value = idx;
    showInvoiceTypePicker.value = true;
  };
  const normalizeProductRow = row => {
    const source = row || {};
    return {
      id: source.id,
      productCategory: source.productCategory || "",
      specificationModel: source.specificationModel || "",
      productModelId: source.productModelId || source.materialModelId || "",
      unit: source.unit || "",
      taxRate: source.taxRate ?? "",
      taxInclusiveUnitPrice: source.taxInclusiveUnitPrice ?? "",
      quantity: source.quantity ?? "",
      taxInclusiveTotalPrice: source.taxInclusiveTotalPrice ?? "",
      taxExclusiveTotalPrice: source.taxExclusiveTotalPrice ?? "",
      invoiceType: source.invoiceType || "",
      stockInApprovalStatus: source.stockInApprovalStatus || "",
      availableQuality: source.availableQuality ?? "",
      returnQuality: source.returnQuality ?? "",
      isChecked:
        typeof source.isChecked === "boolean"
          ? source.isChecked
          : Boolean(source.isChecked),
      warnNum: source.warnNum ?? "",
    };
  };
  const openTemplatePicker = async () => {
    if (isReadOnly.value) return;
    if (!templateList.value.length) {
      const res = await getPurchaseTemplateList();
      if (res && res.code === 200 && Array.isArray(res.data)) {
        templateList.value = res.data;
      }
    }
    showTemplatePicker.value = true;
  };
  const onTemplateSelect = item => {
    const selected = templateList.value.find(t => t.templateName === item.name);
    if (!selected) {
      showTemplatePicker.value = false;
      return;
    }
    templateName.value = selected.templateName || "";
    if (selected.supplierId) form.value.supplierId = selected.supplierId;
    if (selected.supplierName) form.value.supplierName = selected.supplierName;
    if (selected.projectName) form.value.projectName = selected.projectName;
    if (selected.paymentMethod) form.value.paymentMethod = selected.paymentMethod;
    const list =
      selected.productList ||
      selected.productData ||
      selected.purchaseLedgerProductList ||
      [];
    productData.value = Array.isArray(list) ? list.map(normalizeProductRow) : [];
    showTemplatePicker.value = false;
  };
  const openSalesContractPicker = async () => {
    if (isReadOnly.value) return;
    if (!salesContractList.value.length) {
      const res = await getSalesNo();
      if (res && res.code === 200 && Array.isArray(res.data)) {
        salesContractList.value = res.data;
      } else if (Array.isArray(res)) {
        salesContractList.value = res;
      }
    }
    showSalesContractPicker.value = true;
  };
  const onSalesContractSelect = async item => {
    form.value.salesLedgerId = item.value;
    salesContractNoText.value = item.name || "";
    showSalesContractPicker.value = false;
    const res = await getProductInfoByContractNo({
      contractNo: form.value.salesLedgerId,
    });
    if (res && res.code === 200 && Array.isArray(res.data)) {
      productData.value = res.data.map(normalizeProductRow);
    } else if (Array.isArray(res)) {
      productData.value = res.map(normalizeProductRow);
    }
  };
  // 选择器确认事件
@@ -875,6 +1001,13 @@
      });
      return;
    }
    if (isStockInFully.value) {
      uni.showToast({
        title: "完全入库的台账不允许修改",
        icon: "none",
      });
      return;
    }
    const hasEmptyApprover = approverNodes.value.some(node => !node.userId);
    if (hasEmptyApprover) {
      uni.showToast({
@@ -894,8 +1027,6 @@
      });
      return;
    }
    // 编辑回显时可能只有合同号,提交前尝试补齐 salesLedgerId
    syncSalesLedgerIdFromContractNo();
    if (operationType.value == "add") {
      delete form.value.id;
    }
@@ -932,9 +1063,17 @@
  const fillFormData = () => {
    if (!editData.value) return;
    getPurchaseById({ id: editData.value.id, type: 2 }).then(res => {
      productData.value = res.productData;
      if (res && res.approveUserIds) {
        const userIds = res.approveUserIds.split(",");
      const data = res?.data ? res.data : res || {};
      const products =
        data.purchaseLedgerProductList ||
        res?.productData ||
        data.productData ||
        [];
      productData.value = Array.isArray(products)
        ? products.map(normalizeProductRow)
        : [];
      if (data && data.approveUserIds) {
        const userIds = data.approveUserIds.split(",");
        approverNodes.value = userIds.map((userId, idx) => {
          const userIdNum = parseInt(userId.trim());
          // 从userList中找到对应的用户信息
@@ -957,29 +1096,24 @@
    // 填充基本信息
    form.value.purchaseContractNumber =
      editData.value.purchaseContractNumber || "";
    form.value.salesContractNo = editData.value.salesContractNo || "";
    form.value.supplierName = editData.value.supplierName || "";
    form.value.projectName = editData.value.projectName || "";
    form.value.paymentMethod = editData.value.paymentMethod || "";
    form.value.salesLedgerId = editData.value.salesLedgerId || "";
    form.value.recorderId = editData.value.recorderId || "";
    form.value.recorderName = editData.value.recorderName || "";
    form.value.entryDate = editData.value.entryDate || "";
    form.value.id = editData.value.id || "";
    form.value.supplierId = editData.value.supplierId || "";
    form.value.executionDate = editData.value.executionDate || "";
  };
  const getSalesNoList = () => {
    getSalesNo().then(res => {
      // 将用户数据组装成 picker 需要的格式
      salesContractList.value = res.map(user => ({
        text: user.salesContractNo,
        value: user.id,
      }));
      // 列表回来后,补齐编辑回显的 salesLedgerId
      syncSalesLedgerIdFromContractNo();
    });
    form.value.stockInStatus = editData.value.stockInStatus || "";
    form.value.remarks = editData.value.remarks || "";
    form.value.salesLedgerId = editData.value.salesLedgerId || "";
    if (showSalesContractBinding && form.value.salesLedgerId) {
      const match = salesContractList.value.find(
        i => i.id === form.value.salesLedgerId
      );
      if (match) salesContractNoText.value = match.salesContractNo || "";
    }
  };
  const getOptionsLIst = () => {
@@ -1032,8 +1166,6 @@
    userListNoPageByTenantId().then(res => {
      userList.value = res.data;
    });
    // 获取销售合同号列表
    getSalesNoList();
    // 获取供应商列表
    getOptionsLIst();
    // 获取产品大类tree数据
@@ -1043,6 +1175,15 @@
      setUserInfo();
      createPurchaseNo().then(res => {
        form.value.purchaseContractNumber = res.data;
      });
    }
    if (showSalesContractBinding) {
      getSalesNo().then(res => {
        if (res && res.code === 200 && Array.isArray(res.data)) {
          salesContractList.value = res.data;
        } else if (Array.isArray(res)) {
          salesContractList.value = res;
        }
      });
    }
@@ -1500,4 +1641,34 @@
    color: #3b82f6;
    font-size: 14px;
  }
</style>
  .footer-template-tool {
    position: fixed;
    right: 12px;
    bottom: 78px;
    z-index: 1001;
    display: flex;
    align-items: center;
    gap: 6px;
    padding: 6px 10px;
    background: rgba(255, 255, 255, 0.96);
    border: 1px solid #e5e7eb;
    border-radius: 999px;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.08);
  }
  .footer-template-tool__label {
    font-size: 12px;
    color: #6b7280;
  }
  .footer-template-tool__value {
    font-size: 12px;
    color: #006cfb;
    font-weight: 600;
    max-width: 180px;
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }
</style>
src/pages/procurementManagement/procurementLedger/index.vue
@@ -45,10 +45,14 @@
          </view>
          <up-divider></up-divider>
          <view class="item-details">
            <!-- <view class="detail-row">
              <text class="detail-label">销售合同号</text>
              <text class="detail-value">{{ item.salesContractNo }}</text>
            </view> -->
            <view class="detail-row">
              <text class="detail-label">入库状态</text>
              <view class="detail-value">
                <u-tag :type="getStockInStatusType(item.stockInStatus)">
                  {{ item.stockInStatus || '--' }}
                </u-tag>
              </view>
            </view>
            <view class="detail-row">
              <text class="detail-label">供应商名称</text>
              <text class="detail-value">{{ item.supplierName }}</text>
@@ -78,7 +82,7 @@
            </view>
            <!-- 仅非“审批通过”的台账展示删除按钮 -->
            <view class="detail-row"
                  v-if="item.approvalStatus !== 3"
                  v-if="item.approvalStatus !== 3 && item.stockInStatus !== '完全入库'"
                  style="justify-content: flex-end; margin-top: 8px;">
              <up-button type="error"
                         size="small"
@@ -130,6 +134,14 @@
      4: "error", // 审批失败 - 红色
    };
    return typeMap[status] || "";
  };
  const getStockInStatusType = status => {
    const typeMap = {
      待入库: "info",
      入库中: "warning",
      完全入库: "success",
    };
    return typeMap[status] || "info";
  };
  // 搜索关键词
  const purchaseContractNumber = ref("");
@@ -201,6 +213,13 @@
          });
          return;
        }
        if (row.stockInStatus === "完全入库") {
          uni.setStorageSync("editData", JSON.stringify(row));
          uni.navigateTo({
            url: "/pages/procurementManagement/procurementLedger/view",
          });
          return;
        }
        // 录入人编辑:存储数据并跳转到编辑页面
        uni.setStorageSync("editData", JSON.stringify(row));
src/pages/procurementManagement/procurementLedger/view.vue
@@ -12,10 +12,6 @@
          <text class="info-value">{{ form.purchaseContractNumber }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">销售合同号</text>
          <text class="info-value">{{ form.salesContractNo }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">供应商名称</text>
          <text class="info-value">{{ form.supplierName }}</text>
        </view>
@@ -28,12 +24,20 @@
          <text class="info-value">{{ form.paymentMethod }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">入库状态</text>
          <text class="info-value">{{ form.stockInStatus || '--' }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">录入人</text>
          <text class="info-value">{{ form.recorderName }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">录入日期</text>
          <text class="info-value">{{ form.entryDate }}</text>
        </view>
        <view class="info-item">
          <text class="info-label">备注</text>
          <text class="info-value">{{ form.remarks || '--' }}</text>
        </view>
      </view>
    </view>
@@ -64,6 +68,10 @@
              <text class="info-value">{{ product.unit }}</text>
            </view>
            <view class="info-item">
              <text class="info-label">入库审核状态</text>
              <text class="info-value">{{ product.stockInApprovalStatus || '--' }}</text>
            </view>
            <view class="info-item">
              <text class="info-label">税率(%)</text>
              <text class="info-value">{{ product.taxRate }}</text>
            </view>
@@ -74,6 +82,14 @@
            <view class="info-item">
              <text class="info-label">数量</text>
              <text class="info-value highlight">{{ product.quantity }}</text>
            </view>
            <view class="info-item">
              <text class="info-label">可用数量</text>
              <text class="info-value">{{ product.availableQuality ?? '--' }}</text>
            </view>
            <view class="info-item">
              <text class="info-label">退货数量</text>
              <text class="info-value">{{ product.returnQuality ?? '--' }}</text>
            </view>
            <view class="info-item">
              <text class="info-label">含税总价(元)</text>
@@ -106,7 +122,6 @@
// 表单数据
const form = ref({
  id: '',
  salesContractNo: '',
  customerContractNo: '',
  customerId: '',
  customerName: '',
@@ -138,8 +153,11 @@
  
  // 获取完整的产品信息
    getPurchaseById({ id: editData.value.id, type: 2 }).then((res) => {
    productData.value = res.productData || [];
        form.value = {...res}
    const data = res?.data ? res.data : res || {};
    const products =
      data.purchaseLedgerProductList || res?.productData || data.productData || [];
    productData.value = Array.isArray(products) ? products : [];
        form.value = { ...data }
  });
};