gaoluyang
3 天以前 5022e805982370412c16d3b630780595fe9f6cb1
双奇点
1.修改采购、销售相关字段
已修改4个文件
735 ■■■■■ 文件已修改
src/views/inventoryManagement/receiptManagement/components/formDia.vue 658 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/receiptManagement/components/formDiaManual.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/receiptManagement/index.vue 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inventoryManagement/receiptManagement/components/formDia.vue
@@ -1,100 +1,81 @@
<template>
  <el-dialog v-model="dialogFormVisible" :title="getDialogTitle()" width="70%"
    @close="closeDia">
    <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
      <el-form-item label="采购订单号" prop="purchaseContractNumber">
        <el-select
          v-model="form.purchaseContractNumber"
          placeholder="请选择采购订单号"
          clearable
          filterable
          :loading="loadingPurchaseOptions"
          @change="handlePurchaseChange"
          :disabled="operationType === 'edit'"
          style="width: 100%"
        >
          <el-option
            v-for="item in purchaseOptions"
            :key="item.purchaseContractNumber"
            :label="formatPurchaseOption(item)"
            :value="item.purchaseContractNumber"
          />
        </el-select>
      </el-form-item>
      <el-table
        :data="productList"
        border
        v-loading="loadingProducts"
        @selection-change="handleSelectionChange"
      >
        <el-table-column align="center" type="selection" width="55" />
        <el-table-column
          align="center"
          label="序号"
          type="index"
          width="60"
        />
        <el-table-column label="产品" prop="productCategory" />
        <el-table-column label="产品高度" prop="specificationModel" >
          <template #default="scope">
            <div>{{ scope.row.specificationModel }}{{ scope.row.unit }}</div>
          </template>
        </el-table-column>
        <!-- <el-table-column label="高度单位" prop="unit" width="70" /> -->
        <!-- <el-table-column label="供应商" prop="supplierName" width="100" /> -->
        <el-table-column label="采购数量/件" prop="quantity" width="100" />
        <el-table-column label="每件数量/支" prop="boxNum" width="150">
          <template #default="scope">
            <el-input-number :step="1" :min="0" style="width: 100%" v-model="scope.row.boxNum"/>
          </template>
        </el-table-column>
        <el-table-column label="待入库数量/件" prop="quantity0" width="150" />
        <el-table-column label="本次入库数量/件" prop="quantityStock" width="150">
          <template #default="scope">
            <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.quantityStock" @change="() => calculateTotalPrice(scope.row)" />
          </template>
        </el-table-column>
        <el-table-column label="税率(%)" prop="taxRate" width="120" />
        <el-table-column label="单价(元)/件" prop="taxInclusiveUnitPrice" width="150">
    <el-dialog v-model="dialogFormVisible" :title="getDialogTitle()" width="70%"
                         @close="closeDia">
        <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
            <el-form-item label="采购订单号" prop="purchaseContractNumber">
                <el-select
                    v-model="form.purchaseContractNumber"
                    placeholder="请选择采购订单号"
                    clearable
                    filterable
                    :loading="loadingPurchaseOptions"
                    @change="handlePurchaseChange"
                    :disabled="operationType === 'edit'"
                    style="width: 100%"
                >
                    <el-option
                        v-for="item in purchaseOptions"
                        :key="item.purchaseContractNumber"
                        :label="formatPurchaseOption(item)"
                        :value="item.purchaseContractNumber"
                    />
                </el-select>
            </el-form-item>
            <el-table
                :data="productList"
                border
                v-loading="loadingProducts"
                @selection-change="handleSelectionChange"
            >
                <el-table-column align="center" type="selection" width="55" />
                <el-table-column
                    align="center"
                    label="序号"
                    type="index"
                    width="60"
                />
                <el-table-column label="产品大类" prop="productCategory" />
                <el-table-column label="规格型号" prop="specificationModel" />
                <el-table-column label="单位" prop="unit" width="70" />
                <!-- <el-table-column label="供应商" prop="supplierName" width="100" /> -->
                <el-table-column label="采购数量" prop="quantity" width="100" />
                <el-table-column label="待入库数量" prop="quantity0" width="100" />
                <el-table-column label="本次入库数量" prop="quantityStock" width="150">
                    <template #default="scope">
                        <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.quantityStock" @change="() => calculateTotalPrice(scope.row)" />
                    </template>
                </el-table-column>
                <el-table-column label="税率(%)" prop="taxRate" width="120" />
                <el-table-column label="单价(元)" prop="taxInclusiveUnitPrice" width="150">
                    <template #default="scope">
                        <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.taxInclusiveUnitPrice" @change="() => calculateTotalPrice(scope.row)" :disabled="operationType === 'edit'"/>
                    </template>
                </el-table-column>
        <el-table-column label="单价(美元)/件" prop="dollarPrice" width="150">
                    <template #default="scope">
                        <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.dollarPrice" :disabled="operationType === 'edit'"/>
                    </template>
                </el-table-column>
        <el-table-column label="纸箱规格" prop="cartonSpecifications" width="150">
                    <template #default="scope">
            <el-input v-model="scope.row.cartonSpecifications" placeholder="请输入纸箱规格" style="width: 100%" />
                    </template>
                </el-table-column>
        <el-table-column
          label="总价(元)"
                <el-table-column
                    label="总价(元)"
                    :formatter="formattedNumber"
          prop="taxInclusiveTotalPrice"
          width="150"
        >
        </el-table-column>
      </el-table>
    </el-form>
    <template #footer>
      <div class="dialog-footer">
        <el-button type="primary" @click="submitForm">确认</el-button>
        <el-button @click="closeDia">取消</el-button>
      </div>
    </template>
  </el-dialog>
                    prop="taxInclusiveTotalPrice"
                    width="150"
                >
                </el-table-column>
            </el-table>
        </el-form>
        <template #footer>
            <div class="dialog-footer">
                <el-button type="primary" @click="submitForm">确认</el-button>
                <el-button @click="closeDia">取消</el-button>
            </div>
        </template>
    </el-dialog>
</template>
<script setup>
import { ref, reactive, toRefs, getCurrentInstance } from 'vue'
import useUserStore from '@/store/modules/user'
import {
  updateStockIn,
  addSutockIn,
  selectProductRecordListByPuechaserId
    updateStockIn,
    addSutockIn,
    selectProductRecordListByPuechaserId
} from "@/api/inventoryManagement/stockIn.js";
import { purchaseListPage } from "@/api/procurementManagement/procurementLedger.js";
@@ -112,331 +93,298 @@
const loading = ref(false);
const data = reactive({
  form: {
    id: null,
    purchaseContractNumber: '', // 采购订单号
    supplierId: null,       // 供应商ID
    supplierName: '',       // 供应商名称
    inboundTime: '',        // 入库时间
    inboundBatch: '',       // 入库批次
    recorderId: userStore.userId, // 录入人ID
    recorderName: userStore.name, // 录入人姓名
    entryDate: getCurrentDate(),  // 录入日期
    remark: '',             // 备注
  },
  rules: {
    purchaseContractNumber: [{ required: true, message: "请输入采购合同号", trigger: "blur" }],
    supplierId: [{ required: true, message: "请选择供应商", trigger: "change" }],
    inboundTime: [{ required: true, message: "请选择入库时间", trigger: "change" }],
    inboundBatch: [{ required: true, message: "请输入入库批次", trigger: "blur" }]
  }
    form: {
        id: null,
        purchaseContractNumber: '', // 采购订单号
        supplierId: null,       // 供应商ID
        supplierName: '',       // 供应商名称
        inboundTime: '',        // 入库时间
        inboundBatch: '',       // 入库批次
        recorderId: userStore.userId, // 录入人ID
        recorderName: userStore.name, // 录入人姓名
        entryDate: getCurrentDate(),  // 录入日期
        remark: '',             // 备注
    },
    rules: {
        purchaseContractNumber: [{ required: true, message: "请输入采购合同号", trigger: "blur" }],
        supplierId: [{ required: true, message: "请选择供应商", trigger: "change" }],
        inboundTime: [{ required: true, message: "请选择入库时间", trigger: "change" }],
        inboundBatch: [{ required: true, message: "请输入入库批次", trigger: "blur" }]
    }
})
const { form, rules } = toRefs(data)
// 动态计算对话框标题
const getDialogTitle = () => {
  return operationType.value === 'add' ? '新增入库' : '编辑入库'
    return operationType.value === 'add' ? '新增入库' : '编辑入库'
}
const formatPurchaseOption = (item = {}) => {
  const contract = item.purchaseContractNumber || '--';
  const supplier = item.supplierName ? ` · ${item.supplierName}` : '';
  return `${contract}${supplier}`;
    const contract = item.purchaseContractNumber || '--';
    const supplier = item.supplierName ? ` · ${item.supplierName}` : '';
    return `${contract}${supplier}`;
};
const loadPurchaseOptions = async (keyword = '') => {
  try {
    loadingPurchaseOptions.value = true;
    const res = await purchaseListPage({
      current: -1,
      size: -1,
      purchaseContractNumber: keyword,
    });
    const records = res.data?.records || [];
    purchaseOptions.value = records;
    if (
      form.value.purchaseContractNumber &&
      !purchaseOptions.value.find(
        (item) => item.purchaseContractNumber === form.value.purchaseContractNumber
      )
    ) {
      purchaseOptions.value.push({
        purchaseContractNumber: form.value.purchaseContractNumber,
        supplierName: form.value.supplierName,
        supplierId: form.value.supplierId,
      });
    }
  } finally {
    loadingPurchaseOptions.value = false;
  }
    try {
        loadingPurchaseOptions.value = true;
        const res = await purchaseListPage({
            current: -1,
            size: -1,
            purchaseContractNumber: keyword,
        });
        const records = res.data?.records || [];
        purchaseOptions.value = records;
        if (
            form.value.purchaseContractNumber &&
            !purchaseOptions.value.find(
                (item) => item.purchaseContractNumber === form.value.purchaseContractNumber
            )
        ) {
            purchaseOptions.value.push({
                purchaseContractNumber: form.value.purchaseContractNumber,
                supplierName: form.value.supplierName,
                supplierId: form.value.supplierId,
            });
        }
    } finally {
        loadingPurchaseOptions.value = false;
    }
};
const handlePurchaseChange = (value) => {
  form.value.purchaseContractNumber = value || '';
  const matched = purchaseOptions.value.find(
    (item) => item.purchaseContractNumber === value
  );
  if (matched) {
    form.value.supplierName = matched.supplierName || form.value.supplierName;
    form.value.supplierId = matched.supplierId || form.value.supplierId;
  }
  if (!value) {
    productList.value = [];
    return;
  }
  fetchProductsByContract();
    form.value.purchaseContractNumber = value || '';
    const matched = purchaseOptions.value.find(
        (item) => item.purchaseContractNumber === value
    );
    if (matched) {
        form.value.supplierName = matched.supplierName || form.value.supplierName;
        form.value.supplierId = matched.supplierId || form.value.supplierId;
    }
    if (!value) {
        productList.value = [];
        return;
    }
    fetchProductsByContract();
};
const exceedsAddLimit = (product) => {
  const stock = Number(product?.quantityStock ?? 0);
  const waiting = Number(product?.quantity0 ?? 0);
  if (!Number.isFinite(stock) || !Number.isFinite(waiting)) {
    return false;
  }
  return stock > waiting;
    const stock = Number(product?.quantityStock ?? 0);
    const waiting = Number(product?.quantity0 ?? 0);
    if (!Number.isFinite(stock) || !Number.isFinite(waiting)) {
        return false;
    }
    return stock > waiting;
};
const exceedsEditLimit = (product) => {
  const stock = Number(product?.quantityStock ?? 0);
  const waiting = Number(product?.quantity0 ?? 0);
  const original = Number(product?.originalQuantityStock ?? 0);
  if (!Number.isFinite(stock) || !Number.isFinite(waiting) || !Number.isFinite(original)) {
    return false;
  }
  return stock > waiting + original;
    const stock = Number(product?.quantityStock ?? 0);
    const waiting = Number(product?.quantity0 ?? 0);
    const original = Number(product?.originalQuantityStock ?? 0);
    if (!Number.isFinite(stock) || !Number.isFinite(waiting) || !Number.isFinite(original)) {
        return false;
    }
    return stock > waiting + original;
};
const formattedNumber = (row, column, cellValue) => {
  return parseFloat(cellValue).toFixed(2);
    return parseFloat(cellValue).toFixed(2);
};
// 计算总价
const calculateTotalPrice = (row) => {
  const quantityStock = Number(row?.quantityStock ?? 0);
  const taxInclusiveUnitPrice = Number(row?.taxInclusiveUnitPrice ?? 0);
  if (Number.isFinite(quantityStock) && Number.isFinite(taxInclusiveUnitPrice)) {
    row.taxInclusiveTotalPrice = quantityStock * taxInclusiveUnitPrice;
  } else {
    row.taxInclusiveTotalPrice = 0;
  }
    const quantityStock = Number(row?.quantityStock ?? 0);
    const taxInclusiveUnitPrice = Number(row?.taxInclusiveUnitPrice ?? 0);
    if (Number.isFinite(quantityStock) && Number.isFinite(taxInclusiveUnitPrice)) {
        row.taxInclusiveTotalPrice = quantityStock * taxInclusiveUnitPrice;
    } else {
        row.taxInclusiveTotalPrice = 0;
    }
};
const fetchProductsByContract = async () => {
  if (!form.value.purchaseContractNumber) {
    proxy.$modal.msgWarning('请选择合同号')
    return
  }
  try {
    loadingProducts.value = true
    const productRes = await selectProductRecordListByPuechaserId({
      purchaseContractNumber: form.value.purchaseContractNumber
    });
    if (!productRes.data || productRes.data.length === 0) {
      proxy.$modal.msgWarning('该合同下没有产品记录')
      productList.value = [];
      return
    }
    productList.value = productRes.data.map(item => ({
      ...item,
      quantityStock: 0,
      taxInclusiveUnitPrice: Number(item?.taxInclusiveUnitPrice ?? 0),
      taxInclusiveTotalPrice: 0,
      originalQuantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? 0),
      boxNum: item.boxNum || 0,
      dollarPrice: item.dollarPrice || 0,
    }))
  } catch (error) {
    console.error('查询产品记录失败:', error)
    proxy.$modal.msgError('查询产品记录失败')
    productList.value = [];
  } finally {
    loadingProducts.value = false
  }
    if (!form.value.purchaseContractNumber) {
        proxy.$modal.msgWarning('请选择合同号')
        return
    }
    try {
        loadingProducts.value = true
        const productRes = await selectProductRecordListByPuechaserId({
            purchaseContractNumber: form.value.purchaseContractNumber
        });
        if (!productRes.data || productRes.data.length === 0) {
            proxy.$modal.msgWarning('该合同下没有产品记录')
            productList.value = [];
            return
        }
        productList.value = productRes.data.map(item => ({
            ...item,
            quantityStock: 0,
            taxInclusiveUnitPrice: Number(item?.taxInclusiveUnitPrice ?? 0),
            taxInclusiveTotalPrice: 0,
            originalQuantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? 0),
        }))
    } catch (error) {
        console.error('查询产品记录失败:', error)
        proxy.$modal.msgError('查询产品记录失败')
        productList.value = [];
    } finally {
        loadingProducts.value = false
    }
}
const updatePro = async () => {
  if (selectedRows.value.length === 0) {
    proxy.$modal.msgWarning('请先选择产品');
    return;
  }
  const target = selectedRows.value[0];
  const stock = Number(target?.quantityStock ?? 0);
  if (!Number.isFinite(stock) || stock <= 0) {
    proxy.$modal.msgWarning('请填写有效的入库数量');
    return;
  }
  if (exceedsEditLimit(target)) {
    proxy.$modal.msgError('本次入库数量不能超过原入库数量与待入库数量之和');
    return;
  }
  const stockInData = {
    id: selectedRows.value[0].recordId,
    quantityStock: Number(selectedRows.value[0].quantityStock),
  };
  await updateStockIn(stockInData)
  proxy.$modal.msgSuccess('修改入库成功')
  closeDia()
  emit('success')
    if (selectedRows.value.length === 0) {
        proxy.$modal.msgWarning('请先选择产品');
        return;
    }
    const target = selectedRows.value[0];
    const stock = Number(target?.quantityStock ?? 0);
    if (!Number.isFinite(stock) || stock <= 0) {
        proxy.$modal.msgWarning('请填写有效的入库数量');
        return;
    }
    if (exceedsEditLimit(target)) {
        proxy.$modal.msgError('本次入库数量不能超过原入库数量与待入库数量之和');
        return;
    }
    const stockInData = {
        id: selectedRows.value[0].recordId,
        quantityStock: Number(selectedRows.value[0].quantityStock),
    };
    await updateStockIn(stockInData)
    proxy.$modal.msgSuccess('修改入库成功')
    closeDia()
    emit('success')
}
const submitForm = async () => {
  if (selectedRows.value.length === 0) {
    proxy.$modal.msgWarning('请先选择采购合同并选择产品')
    return
  }
  if(operationType.value !== 'add'){
    await updatePro()
    return
  }
  try {
    await proxy.$refs.formRef.validate()
    const invalidProducts = selectedRows.value.filter((product) => {
        const stock = Number(product?.quantityStock ?? 0);
        if (!Number.isFinite(stock) || stock <= 0) {
          return true;
        }
        return exceedsAddLimit(product);
    })
    if (invalidProducts.length > 0) {
      proxy.$modal.msgError('本次入库数量需大于0,且不能超过待入库数量')
      return
    }
    let isVerify = true
    selectedRows.value.some((product) => {
        if(!product.boxNum){
          proxy.$modal.msgError('请填写每件数量/支')
          isVerify = false
          return true
        }
        if(!product.cartonSpecifications){
          proxy.$modal.msgError('请填写纸箱规格')
          isVerify = false
          return true
        }
        if(!product.dollarPrice){
          proxy.$modal.msgError('请填写单价(美元)/件')
          isVerify = false
          return true
        }
        return false
    })
    if(!isVerify)return
    const stockInData = {
      ...form.value,
      inboundTime: formatDateTime(),
      nickName: userStore.nickName,
      details: selectedRows.value.map(product => ({
        id: product.id,
        inboundQuantity: Number(product.quantityStock),
    if (selectedRows.value.length === 0) {
        proxy.$modal.msgWarning('请先选择采购合同并选择产品')
        return
    }
    if(operationType.value !== 'add'){
        await updatePro()
        return
    }
    try {
        await proxy.$refs.formRef.validate()
        const invalidProducts = selectedRows.value.filter((product) => {
            const stock = Number(product?.quantityStock ?? 0);
            if (!Number.isFinite(stock) || stock <= 0) {
                return true;
            }
            return exceedsAddLimit(product);
        })
        const stockInData = {
            ...form.value,
            inboundTime: formatDateTime(),
            nickName: userStore.nickName,
            details: selectedRows.value.map(product => ({
                id: product.id,
                inboundQuantity: Number(product.quantityStock),
                unitPrice: Number(product.taxInclusiveUnitPrice),
                taxInclusiveTotalPrice: Number(product.taxInclusiveTotalPrice),
        boxNum: Number(product.boxNum),
        cartonSpecifications: product.cartonSpecifications,
        dollarPrice: Number(product.dollarPrice)
      })),
    };
    loading.value = true
    await addSutockIn(stockInData)
    proxy.$modal.msgSuccess('新增入库成功')
    closeDia()
    emit('success')
  } catch (error) {
    console.error('提交失败:', error)
    if (!error.errors) {
      proxy.$modal.msgError('操作失败,请重试')
    }
  } finally {
    loading.value = false
  }
                taxInclusiveTotalPrice: Number(product.taxInclusiveTotalPrice)
            })),
        };
        loading.value = true
        await addSutockIn(stockInData)
        proxy.$modal.msgSuccess('新增入库成功')
        closeDia()
        emit('success')
    } catch (error) {
        console.error('提交失败:', error)
        if (!error.errors) {
            proxy.$modal.msgError('操作失败,请重试')
        }
    } finally {
        loading.value = false
    }
}
const closeDia = () => {
  proxy.$refs.formRef.resetFields()
  dialogFormVisible.value = false
  emit('close')
    proxy.$refs.formRef.resetFields()
    dialogFormVisible.value = false
    emit('close')
}
const handleSelectionChange = (selection) => {
  selectedRows.value = selection.filter(item => item.id);
    selectedRows.value = selection.filter(item => item.id);
}
function formatDateTime(date = new Date(), includeTime = true) {
  const d = new Date(date);
  const year = d.getFullYear();
  const month = String(d.getMonth() + 1).padStart(2, '0');
  const day = String(d.getDate()).padStart(2, '0');
  if (!includeTime) {
    return `${year}-${month}-${day}`;
  }
  const hours = String(d.getHours()).padStart(2, '0');
  const minutes = String(d.getMinutes()).padStart(2, '0');
  const seconds = String(d.getSeconds()).padStart(2, '0');
  return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
    const d = new Date(date);
    const year = d.getFullYear();
    const month = String(d.getMonth() + 1).padStart(2, '0');
    const day = String(d.getDate()).padStart(2, '0');
    if (!includeTime) {
        return `${year}-${month}-${day}`;
    }
    const hours = String(d.getHours()).padStart(2, '0');
    const minutes = String(d.getMinutes()).padStart(2, '0');
    const seconds = String(d.getSeconds()).padStart(2, '0');
    return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
}
function getCurrentDate() {
  return formatDateTime(new Date(), false);
    return formatDateTime(new Date(), false);
}
const openDialog = async (type, row) => {
  operationType.value = type
  dialogFormVisible.value = true
  selectedRows.value = []
  await loadPurchaseOptions();
  if (type === 'add') {
    form.value = {
      id: null,
      purchaseContractNumber: '',
      supplierId: null,
      supplierName: '',
      inboundTime: '',
      inboundBatch: '',
      recorderId: userStore.userId,
      recorderName: userStore.name,
      entryDate: getCurrentDate(),
      remark: ''
    }
    productList.value = []
  } else {
    form.value = JSON.parse(JSON.stringify(row))
    try {
      loadingProducts.value = true
      const res = await selectProductRecordListByPuechaserId({
        purchaseContractNumber: form.value.purchaseContractNumber,
        id: row.id
      });
      productList.value = res.data.map(item => ({
        ...item,
        quantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? row.inboundNum ?? 0),
        taxInclusiveUnitPrice: Number(item?.taxInclusiveUnitPrice ?? 0),
        taxInclusiveTotalPrice: Number(item?.quantityStock ?? 0) * Number(item?.taxInclusiveUnitPrice ?? 0),
        originalQuantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? row.inboundNum ?? 0),
      }))
      selectedRows.value = productList.value
    } catch (error) {
      console.error('加载产品失败:', error)
      proxy.$modal.msgError('加载产品失败')
      productList.value = []
    } finally {
      loadingProducts.value = false
    }
  }
    operationType.value = type
    dialogFormVisible.value = true
    selectedRows.value = []
    await loadPurchaseOptions();
    if (type === 'add') {
        form.value = {
            id: null,
            purchaseContractNumber: '',
            supplierId: null,
            supplierName: '',
            inboundTime: '',
            inboundBatch: '',
            recorderId: userStore.userId,
            recorderName: userStore.name,
            entryDate: getCurrentDate(),
            remark: ''
        }
        productList.value = []
    } else {
        form.value = JSON.parse(JSON.stringify(row))
        try {
            loadingProducts.value = true
            const res = await selectProductRecordListByPuechaserId({
                purchaseContractNumber: form.value.purchaseContractNumber,
                id: row.id
            });
            productList.value = res.data.map(item => ({
                ...item,
                quantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? row.inboundNum ?? 0),
                taxInclusiveUnitPrice: Number(item?.taxInclusiveUnitPrice ?? 0),
                taxInclusiveTotalPrice: Number(item?.quantityStock ?? 0) * Number(item?.taxInclusiveUnitPrice ?? 0),
                originalQuantityStock: Number(item.quantityStock ?? item.inboundQuantity ?? row.inboundNum ?? 0),
            }))
            selectedRows.value = productList.value
        } catch (error) {
            console.error('加载产品失败:', error)
            proxy.$modal.msgError('加载产品失败')
            productList.value = []
        } finally {
            loadingProducts.value = false
        }
    }
}
defineExpose({
  openDialog,
    openDialog,
})
</script>
src/views/inventoryManagement/receiptManagement/components/formDiaManual.vue
@@ -81,14 +81,9 @@
            <el-input-number :step="1" :min="0" style="width: 100%" v-model="scope.row.boxNum" @change="() => calculateTotalPrice(scope.row)" />
          </template>
        </el-table-column>
        <el-table-column label="单价(元)/件" prop="taxInclusiveUnitPrice" width="150">
        <el-table-column label="单价(美元)/件" prop="taxInclusiveUnitPrice" width="150">
         <template #default="scope">
           <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.taxInclusiveUnitPrice" @change="() => calculateTotalPrice(scope.row)" />
         </template>
       </el-table-column>
       <el-table-column label="单价(美元)/件" prop="dollarPrice" width="150">
         <template #default="scope">
           <el-input-number :step="0.01" :min="0" style="width: 100%" v-model="scope.row.dollarPrice"/>
         </template>
       </el-table-column>
        <el-table-column label="入库日期" prop="inboundDate" width="180">
@@ -225,7 +220,6 @@
    taxRate: null,
    taxExclusiveTotalPrice: 0,
    boxNum: 0,
    dollarPrice: 0
  });
};
@@ -293,11 +287,6 @@
        proxy.$modal.msgError(`第${i + 1}行单价(元)需大于0`)
        return
      }
      const dollarPrice = Number(product?.dollarPrice ?? 0);
      if (!Number.isFinite(dollarPrice) || dollarPrice <= 0) {
        proxy.$modal.msgError(`第${i + 1}行单价(美元)需大于0`)
        return
      }
      if (!product.inboundDate) {
        proxy.$modal.msgError(`第${i + 1}行请选择入库日期`)
        return
@@ -321,7 +310,6 @@
      boxNum:Number(product.boxNum),
      cartonSpecifications: product.cartonSpecifications,
      url: product.url||'',
      dollarPrice: Number(product.dollarPrice || 0),
    }));
    loading.value = true
    if (operationType.value === 'edit') {
@@ -419,7 +407,6 @@
      boxNum: Number(row?.boxNum ?? 0),
      cartonSpecifications: row?.cartonSpecifications ?? '',
      url: row?.url ?? '',
      dollarPrice: Number(row?.dollarPrice ?? 0),
    }]
  }
}
src/views/inventoryManagement/receiptManagement/index.vue
@@ -42,12 +42,9 @@
              <div>{{ scope.row.specificationModel }}{{ scope.row.unit }}</div>
            </template>
          </el-table-column>
          <el-table-column label="入库数量/件" prop="inboundNum" width="100" show-overflow-tooltip />
          <el-table-column label="每件数量/支" prop="boxNum" width="100" show-overflow-tooltip />
          <el-table-column label="入库数量" prop="inboundNum" width="100" show-overflow-tooltip />
          <el-table-column label="单价(元)/件" prop="taxInclusiveUnitPrice" width="150"></el-table-column>
          <el-table-column label="单价(美元)/件" prop="dollarPrice" width="150"></el-table-column>
          <el-table-column label="纸箱规格" prop="cartonSpecifications" width="150"></el-table-column>
          <el-table-column label="入库人" prop="createBy" width="80" show-overflow-tooltip />
          <el-table-column label="入库人" prop="createBy" width="120" show-overflow-tooltip />
           <el-table-column fixed="right" label="操作" min-width="60" align="center">
             <template #default="scope">
               <el-button link type="primary" size="small" @click="openForm('edit', scope.row, 'purchase');">编辑</el-button>
@@ -110,7 +107,6 @@
                        <el-table-column label="入库数量/件" prop="inboundNum" width="100" show-overflow-tooltip />
                        <el-table-column label="每件数量/支" prop="boxNum" width="100" show-overflow-tooltip />
                        <el-table-column label="单价(元)/件" prop="taxInclusiveUnitPrice" width="150"></el-table-column>
                        <el-table-column label="单价(美元)/件" prop="dollarPrice" width="150"></el-table-column>
                        <el-table-column label="纸箱规格" prop="cartonSpecifications" width="150"></el-table-column>
            <el-table-column label="入库人" prop="createBy" width="150" show-overflow-tooltip />
            <el-table-column fixed="right" label="操作" width="100" align="center">
@@ -187,13 +183,7 @@
          <el-col :span="12">
            <div class="barcode-item">
              <div class="barcode-label">单价</div>
              <div class="barcode-value">{{barcodeDetail.taxInclusiveUnitPrice}}元/件</div>
            </div>
          </el-col>
          <el-col :span="12">
            <div class="barcode-item">
              <div class="barcode-label">单价</div>
              <div class="barcode-value">{{barcodeDetail.dollarPrice}}美元/件</div>
              <div class="barcode-value">{{barcodeDetail.taxInclusiveUnitPrice}}美元/件</div>
            </div>
          </el-col>
        </el-row>
src/views/salesManagement/salesLedger/index.vue
@@ -53,11 +53,8 @@
                  <div>{{ scope.row.specificationModel }}{{ scope.row.unit }}</div>
                </template>
              </el-table-column>
              <el-table-column label="数量/件" prop="quantity"/>
              <el-table-column label="每件数量/支" prop="boxNum" width="100"/>
              <el-table-column label="单价(元)/件" prop="taxInclusiveUnitPrice" :formatter="formattedNumber"></el-table-column>
              <el-table-column label="单价(美元)/件" prop="dollarPrice"></el-table-column>
              <el-table-column label="纸箱规格" prop="cartonSpecifications"></el-table-column>
              <el-table-column label="数量" prop="quantity"/>
              <el-table-column label="单价(美元)/件" prop="taxInclusiveUnitPrice" :formatter="formattedNumber"></el-table-column>
              <el-table-column label="税率(%)" prop="taxRate" />
              <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
@@ -177,12 +174,9 @@
            </template>
          </el-table-column>
          <!-- <el-table-column label="单位" prop="unit" /> -->
          <el-table-column label="数量/件" prop="quantity" />
          <el-table-column label="每件数量/支" prop="boxNum" />
          <el-table-column label="数量" prop="quantity" />
          <!-- <el-table-column label="税率(%)" prop="taxRate" /> -->
          <el-table-column label="单价(元)/件" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
          <el-table-column label="单价(美元)/件" prop="dollarPrice" />
          <el-table-column label="纸箱规格/cm" prop="cartonSpecifications" />
          <el-table-column label="单价(美元)/件" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" />
          <!-- <el-table-column label="含税总价(元)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" />
          <el-table-column label="不含税总价(元)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" /> -->
          <el-table-column fixed="right" label="操作" min-width="60" align="center" v-if="operationType !== 'view'">
@@ -264,33 +258,18 @@
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="单价(元)/件:" prop="taxInclusiveUnitPrice">
            <el-form-item label="单价(美元)/件:" prop="taxInclusiveUnitPrice">
              <el-input-number :step="0.01" :min="0" v-model="productForm.taxInclusiveUnitPrice" style="width: 100%"
                                                             :precision="2"
                                                             placeholder="请输入" clearable @change="calculateFromUnitPrice" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="单价(美元)/件:" prop="dollarPrice">
              <el-input-number :step="0.01" :min="0" v-model="productForm.dollarPrice" style="width: 100%"
                                                             :precision="2"
                                                             placeholder="请输入" clearable/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
                    <el-col :span="12">
                        <el-form-item label="数量/件:" prop="quantity">
                        <el-form-item label="数量:" prop="quantity">
                            <el-input-number  :min="0" v-model="productForm.quantity" placeholder="请输入" clearable
                                                                @change="calculateFromQuantity" style="width: 100%" />
                        </el-form-item>
                    </el-col>
          <el-col :span="12">
            <el-form-item label="每件数量/支:" prop="boxNum">
              <el-input-number  :min="0" v-model="productForm.boxNum" placeholder="请输入" clearable
                                                                @change="calculateFromQuantity" style="width: 100%" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
@@ -305,11 +284,6 @@
          </el-col>
        </el-row>
        <el-row :gutter="30">
                    <el-col :span="12">
                        <el-form-item label="纸箱规格/cm:" prop="cartonSpecifications">
              <el-input v-model="productForm.cartonSpecifications" placeholder="请输入" clearable />
            </el-form-item>
                    </el-col>
          <el-col :span="12">
            <el-form-item label="发票类型:" prop="invoiceType">
              <el-select v-model="productForm.invoiceType" placeholder="请选择" clearable>
@@ -585,8 +559,6 @@
    taxExclusiveTotalPrice: "",
    invoiceType: "",
    cartonSpecifications:'',
    boxNum: "",
    dollarPrice: ''
  },
  productRules: {
    productCategory: [{ required: true, message: "请选择", trigger: "change" }],
@@ -599,13 +571,7 @@
    taxInclusiveUnitPrice: [
      { required: true, message: "请输入", trigger: "blur" },
    ],
    dollarPrice: [
      { required: true, message: "请输入", trigger: "blur" },
    ],
    cartonSpecifications: [{ required: true, message: "请输入", trigger: "blur" }],
    boxNum: [
      { required: true, message: "请输入", trigger: "blur" },
    ],
    taxRate: [{ required: true, message: "请选择", trigger: "change" }],
    taxInclusiveTotalPrice: [
      { required: true, message: "请输入", trigger: "blur" },