spring
7 小时以前 0841c0c2c24056d142af161ec814d757a8c826d9
Merge branch 'dev_New' of http://114.132.189.42:9002/r/product-inventory-management into dev_New
已修改26个文件
已删除1个文件
3050 ■■■■■ 文件已修改
src/api/procurementManagement/procurementInvoiceLedger.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/salesManagement/receiptPayment.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/PIMTable/PIMTable.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/basicData/product/index.vue 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/advancedPriceManagement/index.vue 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/arrivalManagement/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/invoiceEntry/components/Modal.vue 373 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/invoiceEntry/index.vue 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/invoiceEntry/indexOld.vue 727 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/paymentEntry/index.vue 324 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/priceManagement/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementLedger/index.vue 456 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/procurementPlan/index.vue 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/purchaseOrder/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/qualityInspection/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/returnManagement/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/procurementManagement/transferManagement/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/deliveryLedger/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/invoiceLedger/index.vue 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/invoiceRegistration/index.vue 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/orderManagement/index.vue 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/paymentShipping/index.vue 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/receiptPayment/index.vue 350 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/receiptPaymentHistory/index.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesLedger/index.vue 141 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salesQuotation/index.vue 98 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesManagement/salespersonManagement/index.vue 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/procurementManagement/procurementInvoiceLedger.js
@@ -61,7 +61,7 @@
// æŸ¥è¯¢åˆ—表
export function invoiceListPage(query) {
  return request({
    url: "/purchase/registration/listPage",
    url: "/sales/product/listPagePurchaseLedger",
    method: "get",
    params: query,
  });
src/api/salesManagement/receiptPayment.js
@@ -40,7 +40,7 @@
// æŸ¥è¯¢å·²ç»ç»‘定发票的开票台账
export function bindInvoiceNoRegPage(query) {
    return request({
        url: '/receiptPayment/bindInvoiceNoRegPage',
        url: '/sales/product/listPageSalesLedger',
        method: 'get',
        params: query
    })
src/components/PIMTable/PIMTable.vue
@@ -40,7 +40,7 @@
      :fixed="item.fixed"
      :label="item.label"
      :prop="item.prop"
      show-overflow-tooltip
      :show-overflow-tooltip="item.dataType !== 'action'"
      :align="item.align"
      :sortable="!!item.sortable"
      :type="item.type"
src/views/basicData/product/index.vue
@@ -25,9 +25,7 @@
          :data="list"
          @node-click="handleNodeClick"
          :expand-on-click-node="false"
          default-expand-all
          :default-expanded-keys="expandedKeys"
          :draggable="true"
          :filter-node-method="filterNode"
          :props="{ children: 'children', label: 'label' }"
          highlight-current
src/views/procurementManagement/advancedPriceManagement/index.vue
@@ -139,7 +139,7 @@
    </el-card>
    <!-- æ–°å¢ž/编辑对话框 -->
    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增价格' : '编辑价格'" width="800px">
    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增价格' : '编辑价格'" :width="'800px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="formData" :rules="formRules" ref="formRef" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="12">
@@ -266,14 +266,10 @@
          <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
      </template>
    </el-dialog>
    </FormDialog>
    <!-- æ‰¹é‡æŠ˜æ‰£å¯¹è¯æ¡† -->
    <el-dialog v-model="batchDiscountVisible" title="批量设置折扣" width="600px">
    <FormDialog v-model="batchDiscountVisible" title="批量设置折扣" :width="'600px'" @close="batchDiscountVisible = false" @confirm="handleBatchDiscount" @cancel="batchDiscountVisible = false">
      <el-form :model="batchDiscountForm" label-width="120px">
        <el-form-item label="折扣类型">
          <el-select v-model="batchDiscountForm.discountType" placeholder="请选择折扣类型" style="width: 100%">
@@ -303,14 +299,10 @@
          </div>
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="batchDiscountVisible = false">取消</el-button>
        <el-button type="primary" @click="handleBatchDiscount">确定</el-button>
      </template>
    </el-dialog>
    </FormDialog>
    <!-- ä»·æ ¼æŽ§åˆ¶å¯¹è¯æ¡† -->
    <el-dialog v-model="priceControlVisible" title="价格控制设置" width="700px">
    <FormDialog v-model="priceControlVisible" title="价格控制设置" :width="'700px'" @close="priceControlVisible = false" @confirm="handlePriceControl" @cancel="priceControlVisible = false">
      <el-form :model="priceControlForm" label-width="120px">
        <el-form-item label="默认最低价格">
          <el-input-number v-model="priceControlForm.defaultMinPrice" :min="0" :precision="2" style="width: 200px" />
@@ -322,16 +314,13 @@
          <el-input-number v-model="priceControlForm.changeThreshold" :min="0" :max="100" :precision="1" style="width: 200px" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="priceControlVisible = false">取消</el-button>
        <el-button type="primary" @click="handlePriceControl">保存设置</el-button>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import {ref, reactive, computed, onMounted, getCurrentInstance} from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import {
src/views/procurementManagement/arrivalManagement/index.vue
@@ -51,7 +51,7 @@
      />
    </el-card>
    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增到货' : '编辑到货'" width="600px">
    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增到货' : '编辑到货'" :width="'600px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="formData" label-width="120px">
        <el-form-item label="到货单号">
          <el-input v-model="formData.arrivalNo" placeholder="到货单号" />
@@ -69,15 +69,12 @@
          <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">确定</el-button>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { ref, reactive,onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import {listPage,add,update,del} from "@/api/procurementManagement/arrivalManagement.js"
src/views/procurementManagement/invoiceEntry/components/Modal.vue
@@ -1,5 +1,5 @@
<template>
  <el-dialog :title="modalOptions.title" v-model="visible" width="70%">
    <el-dialog :title="modalOptions.title" v-model="visible" width="70%" draggable>
    <el-form
      ref="formRef"
      :model="form"
@@ -10,7 +10,7 @@
      <el-row :gutter="30">
        <el-col :span="12">
          <el-form-item label="采购合同号:" prop="purchaseLedgerNo">
            <el-input v-model="form.purchaseLedgerNo" disabled />
                        <el-input v-model="form.purchaseLedgerNo" disabled placeholder="多合同批量处理(具体合同号见产品列表)" />
          </el-form-item>
        </el-col>
        <el-col :span="12">
@@ -33,16 +33,16 @@
            />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="项目名称:" prop="projectName">
            <el-input
              v-model="form.projectName"
              placeholder="自动填充"
              clearable
              disabled
            />
          </el-form-item>
        </el-col>
<!--                <el-col :span="12">-->
<!--                    <el-form-item label="项目名称:" prop="projectName">-->
<!--                        <el-input-->
<!--                            v-model="form.projectName"-->
<!--                            placeholder="自动填充"-->
<!--                            clearable-->
<!--                            disabled-->
<!--                        />-->
<!--                    </el-form-item>-->
<!--                </el-col>-->
        <el-col :span="12">
          <el-form-item label="发票号:" prop="invoiceNumber">
            <el-input
@@ -56,9 +56,8 @@
          <el-form-item label="发票金额(元):" prop="invoiceAmount">
            <el-input-number :step="0.01" :min="0" style="width: 100%"
              v-model="form.invoiceAmount"
              placeholder="自动填充"
                                                         placeholder="请输入发票金额"
              clearable
              :disabled="true"
            />
          </el-form-item>
        </el-col>
@@ -85,6 +84,18 @@
          </el-form-item>
        </el-col>
        <el-col :span="12">
                    <el-form-item label="录入日期:" prop="enterDate">
                        <el-date-picker
                            style="width: 100%"
                            v-model="form.enterDate"
                            type="date"
                            value-format="YYYY-MM-DD"
                            format="YYYY-MM-DD"
                            clearable
                        />
                    </el-form-item>
                </el-col>
                <el-col :span="12">
          <el-form-item label="上传附件">
            <FileUpload
              :showTip="false"
@@ -100,59 +111,90 @@
            />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="录入日期:" prop="enterDate">
            <el-date-picker
              style="width: 100%"
              v-model="form.enterDate"
              type="date"
              value-format="YYYY-MM-DD"
              format="YYYY-MM-DD"
              clearable
            />
          </el-form-item>
        </el-col>
      </el-row>
      <el-form-item label="产品信息:"> </el-form-item>
      <PIMTable
        rowKey="id"
        :column="columns"
        :tableData="form.productData"
                :summaryMethod="summarizeChildrenTable"
                :isShowSummary="true"
        height="auto"
            <el-table
                :data="form.productData"
                border
                show-summary
                :summary-method="summarizeChildrenTable"
      >
        <template #ticketsNumRef="{ row }">
          <el-input-number
            v-model="row.ticketsNum"
            placeholder="请输入"
            :min="0"
            :step="0.1"
                <el-table-column align="center" label="序号" type="index" width="60" />
                <el-table-column label="所属合同" prop="purchaseLedgerNo" width="200">
                    <template #default="{ row }">
                        <el-tag type="primary">{{ row.purchaseLedgerNo }}</el-tag>
                    </template>
                </el-table-column>
                <el-table-column label="产品大类" prop="productCategory" />
                <el-table-column label="规格型号" prop="specificationModel" width="150" />
                <el-table-column label="单位" prop="unit" width="70" />
                <el-table-column label="数量" prop="quantity" width="70" />
                <el-table-column label="税率(%)" prop="taxRate" width="80" />
                <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 label="本次开票数" prop="ticketsNum" width="180">
                    <template #default="scope">
                        <el-input-number :step="0.1" :min="0" style="width: 100%"
                        :precision="2"
            clearable
            style="width: 100%"
            @change="invoiceNumBlur(row)"
                                                         v-model="scope.row.ticketsNum"
                                                         @change="invoiceNumBlur(scope.row)"
          />
        </template>
        <template #ticketsAmountRef="{ row }">
          <el-input-number
            v-model="row.ticketsAmount"
            placeholder="请输入"
            :min="0"
                </el-table-column>
                <el-table-column
                    label="本次开票金额(元)"
                    prop="ticketsAmount"
                    width="180"
                >
                    <template #default="scope">
                        <el-input-number :step="0.01" :min="0" style="width: 100%"
                        :precision="2"
            :step="0.1"
            clearable
            style="width: 100%"
            @change="invoiceAmountBlur(row)"
                                                         v-model="scope.row.ticketsAmount"
                                                         @change="invoiceAmountBlur(scope.row)"
          />
        </template>
      </PIMTable>
                </el-table-column>
                <el-table-column
                    label="未来票数"
                    prop="futureTickets"
                    :formatter="formattedNumber"
                />
                <el-table-column
                    label="本次来票金额(元)"
                    prop="ticketsAmount"
                    :formatter="formattedNumber"
                />
                <el-table-column
                    label="未来票数"
                    prop="futureTickets"
                    :formatter="formattedNumber"
                />
                <el-table-column
                    label="未来票金额(元)"
                    prop="futureTicketsAmount"
                    :formatter="formattedNumber"
                />
            </el-table>
    </el-form>
    <template #footer>
            <el-button type="primary" :loading="modalLoading" @click="submitForm">
                {{ modalOptions.confirmText }}
                ç¡®è®¤
            </el-button>
      <el-button @click="closeModal">{{ modalOptions.cancelText }}</el-button>
            <el-button @click="closeModal">取消</el-button>
    </template>
  </el-dialog>
</template>
@@ -196,6 +238,8 @@
  productData: [], // è¡¨æ ¼
  tempFileIds: [], // æ–‡ä»¶
});
const selectedContracts = ref([]); // å­˜å‚¨é€‰ä¸­çš„合同数据
const rules = ref({
  invoiceNumber: [
@@ -305,22 +349,102 @@
        width: 200,
  },
];
const getTableData = async (type, id) => {
const formattedNumber = (row, column, cellValue) => {
    if (cellValue == 0) {
        return parseFloat(cellValue).toFixed(2);
    }
    if (cellValue) {
        return parseFloat(cellValue).toFixed(2);
    } else {
        return cellValue;
    }
};
const getTableData = async (type, selectedRows) => {
  if (type == "add") {
    const { data } = await getPurchaseNoById({ id });
    form.purchaseLedgerNo = data.purchaseContractNumber;
    form.invoiceAmount = data.invoiceAmount;
    form.invoiceNumber = data.invoiceNumber;
    form.entryDate = data.entryDate;
    form.salesContractNoId = data.salesContractNoId;
        // æ£€æŸ¥æ‰€æœ‰é€‰æ‹©çš„合同是否具有相同的供应商名称
        const firstRow = selectedRows[0];
        const isSameSupplier = selectedRows.every(row =>
            row.supplierName === firstRow.supplierName
        );
    const { data: infoData } = await getInfo({ id });
    form.salesContractNo = infoData.salesContractNo;
    form.projectName = infoData.projectName;
    form.supplierName = infoData.supplierName;
    form.productData = infoData.productData;
        if (!isSameSupplier) {
            proxy.$modal.msgError("请选择相同供应商名称的合同");
            return;
        }
        // å…è®¸ä¸åŒçš„采购合同号批量处理,无需检查重复
        // æ¸…空表单数据
        Object.keys(form).forEach(key => {
            if (key !== 'productData') {
                form[key] = undefined;
            }
        });
        form.productData = [];
        // åŠ è½½æ‰€æœ‰é€‰ä¸­åˆåŒçš„äº§å“æ•°æ®
        const promises = selectedRows.map(row =>
            getInfo({ id: row.id })
        );
        Promise.all(promises).then(results => {
            // åˆå¹¶æ‰€æœ‰åˆåŒçš„产品数据,并为每个产品添加对应的合同信息
            const allProductData = [];
            results.forEach((result, index) => {
                const contract = selectedRows[index];
                const contractId = contract.id;
                if (result.data && result.data.productData) {
                    result.data.productData.forEach(item => {
                        allProductData.push({
                            ...item,
                            id: contractId, // æ˜Žç¡®è®¾ç½®åˆåŒID
                            purchaseLedgerNo: contract.purchaseContractNumber, // æ·»åŠ é‡‡è´­åˆåŒå·
                            supplierName: contract.supplierName, // æ·»åŠ ä¾›åº”å•†åç§°
                            projectName: contract.projectName // æ·»åŠ é¡¹ç›®åç§°
                        });
                    });
                }
            });
            // è®¾ç½®è¡¨å•数据(使用第一个合同的基本信息,采购合同号留空)
            form.purchaseLedgerNo = ""; // é‡‡è´­åˆåŒå·ç•™ç©ºï¼Œå› ä¸ºä¼šåœ¨äº§å“è¡¨æ ¼ä¸­åˆ†åˆ«æ˜¾ç¤º
            form.invoiceNumber = "";
            form.entryDate = dayjs().format("YYYY-MM-DD");
            form.enterDate = dayjs().format("YYYY-MM-DD");
            form.salesContractNo = results[0].data.salesContractNo;
            form.projectName = results[0].data.projectName;
            form.supplierName = results[0].data.supplierName;
            // ä¿ç•™å½•入人信息
            form.issUerId = userStore.id;
            form.issUer = userStore.nickName;
            // è®¾ç½®äº§å“æ•°æ®ï¼Œå¹¶åˆå§‹åŒ–开票数量和金额
            allProductData.forEach(item => {
                // æœ¬æ¬¡å¼€ç¥¨æ•°é»˜è®¤ä¸ºæ€»æ•°é‡
                item.ticketsNum = Number(item.quantity || 0);
                // æœ¬æ¬¡å¼€ç¥¨é‡‘额默认为含税总价
                item.ticketsAmount = Number(item.taxInclusiveTotalPrice || 0);
                // ä¿å­˜åŽŸå§‹æœªæ¥ç¥¨æ•°å’Œé‡‘é¢ï¼ˆç”¨äºŽè®¡ç®—ï¼‰
                item.tempFutureTickets = Number(item.quantity || 0);
                item.tempFutureTicketsAmount = Number(item.taxInclusiveTotalPrice || 0);
                // æœªæ¥ç¥¨æ•°å’Œé‡‘额初始为0(因为全部开票)
                item.futureTickets = 0;
                item.futureTicketsAmount = 0;
            });
            form.productData = allProductData;
            // è®¡ç®—发票金额:所有产品的含税总价之和
            const totalAmount = allProductData.reduce((sum, item) => {
                return sum + (Number(item.taxInclusiveTotalPrice) || 0);
            }, 0);
            form.invoiceAmount = totalAmount.toFixed(2);
            // å­˜å‚¨é€‰ä¸­çš„合同数据
            selectedContracts.value = selectedRows;
        });
  } else if (type == "edit") {
        const id = Array.isArray(selectedRows) ? selectedRows[0].id : selectedRows;
    const data = await getPurchaseById({ id, type: 2 });
    form.purchaseLedgerNo = data.purchaseContractNumber;
    form.invoiceAmount = data.invoiceAmount;
@@ -395,10 +519,23 @@
  form.invoiceAmount = invoiceAmountTotal.toFixed(2);
};
const open = (type, eid) => {
  openModal();
  getTableData(type, eid);
  id.value = eid;
const open = async (type, selectedRows) => {
    visible.value = true;
    // å¦‚果是批量操作,设置标题
    if (Array.isArray(selectedRows) && selectedRows.length > 1) {
        modalOptions.title = `批量新增 (${selectedRows.length}条)`;
    } else {
        modalOptions.title = type === "add" ? "新增" : "编辑";
    }
    // å¦‚果是单个操作,获取id
    if (!Array.isArray(selectedRows) || selectedRows.length === 1) {
        const idValue = Array.isArray(selectedRows) ? selectedRows[0].id : selectedRows;
        id.value = idValue;
    }
    await getTableData(type, selectedRows);
};
const uploadSuccess = (response) => {
@@ -417,32 +554,96 @@
};
const submitForm = () => {
  formRef.value.validate(async (valid, fields) => {
    proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      // modalLoading.value = true;
      const { code } = await addOrUpdateRegistration({
        purchaseLedgerId: id.value,
        purchaseContractNumber: form.purchaseLedgerNo,
            // å¦‚果是批量操作,将所有合同的数据放在一个数组里,只调用一次接口
            if (selectedContracts.value.length > 1) {
                // åˆ›å»ºåŒ…含所有合同数据的数组
                const batchData = selectedContracts.value.map(contract => {
                    // ç­›é€‰å‡ºå±žäºŽå½“前合同的产品数据
                    const contractProductData = form.productData.filter(item =>
                        item.id === contract.id
                    );
                    // ä¸ºæ¯ä¸ªé‡‡è´­åˆåŒåˆ›å»ºç‹¬ç«‹çš„对象
                    return {
                        // åŸºç¡€è¡¨å•数据
        invoiceNumber: form.invoiceNumber,
        invoiceAmount: form.invoiceAmount,
        salesContractNo: form.salesContractNo,
        projectName: form.projectName,
        productData: form.productData,
        issueDate: form.entryDate,
                        entryDate: form.entryDate,
                        enterDate: form.enterDate,
        issUerId: form.issUerId, // å½•入人id
        issUer: form.issUer, // å½•入人
        salesContractNoId: form.salesContractNoId,
        supplierName: form.supplierName,
        tempFileIds: form.tempFileIds,
        enterDate: form.enterDate,
        type: 4,
                        // åˆåŒå®žé™…信息
                        purchaseLedgerId: contract.id, // ä½¿ç”¨id作为字段名,值为purchaseLedgerId
                        purchaseContractNumber: contract.purchaseContractNumber, // ä½¿ç”¨å®žé™…的采购合同号
                        salesContractNo: contract.salesContractNo, // ä½¿ç”¨å®žé™…的销售合同号
                        supplierName: contract.supplierName, // ä½¿ç”¨å®žé™…的供应商名称
                        projectName: contract.projectName, // ä½¿ç”¨å®žé™…的项目名称
                        // äº§å“æ•°æ®
                        productData: proxy.HaveJson(contractProductData),
                        // æ‰¹é‡æ ‡è¯†
                        isBatch: true,
                        type: 4
                    };
      });
                // åªè°ƒç”¨ä¸€æ¬¡æŽ¥å£ï¼Œä¼ é€’包含所有合同数据的数组
                modalLoading.value = true;
                addOrUpdateRegistration(batchData).then((res) => {
      modalLoading.value = false;
      if (code == 200) {
                    if (res.code === 200) {
                        proxy.$modal.msgSuccess("批量登记成功");
        closeAndRefresh();
      }
    } else {
                }).catch(() => {
      modalLoading.value = false;
                    proxy.$modal.msgError("批量登记失败");
                });
            } else {
                    // å•个合同提交逻辑 - ä»¥æ•°ç»„格式传递
                    const singleContract = selectedContracts.value[0];
                    const singleFormArray = [{
                        // åŸºç¡€è¡¨å•数据
                        invoiceNumber: form.invoiceNumber,
                        invoiceAmount: form.invoiceAmount,
                        entryDate: form.entryDate,
                        enterDate: form.enterDate,
                        issUerId: form.issUerId, // å½•入人id
                        issUer: form.issUer, // å½•入人
                        tempFileIds: form.tempFileIds,
                        // åˆåŒå®žé™…信息
                        purchaseLedgerId: singleContract.id, // ä½¿ç”¨id作为字段名,值为purchaseLedgerId
                        purchaseContractNumber: singleContract.purchaseContractNumber, // ä½¿ç”¨å®žé™…的采购合同号
                        salesContractNo: singleContract.salesContractNo, // ä½¿ç”¨å®žé™…的销售合同号
                        supplierName: singleContract.supplierName, // ä½¿ç”¨å®žé™…的供应商名称
                        projectName: singleContract.projectName, // ä½¿ç”¨å®žé™…的项目名称
                        // äº§å“æ•°æ®
                        productData: proxy.HaveJson(form.productData),
                        // æ‰¹é‡æ ‡è¯†
                        isBatch: false,
                        type: 4
                    }];
                    modalLoading.value = true;
                    addOrUpdateRegistration(singleFormArray).then((res) => {
                        modalLoading.value = false;
                        if (res.code === 200) {
                            proxy.$modal.msgSuccess("登记成功");
                            closeAndRefresh();
                        }
                    }).catch(() => {
                        modalLoading.value = false;
                        proxy.$modal.msgError("登记失败");
                    });
                }
    }
  });
};
src/views/procurementManagement/invoiceEntry/index.vue
@@ -28,13 +28,6 @@
              clearable
          />
        </el-form-item>
        <el-form-item label="项目名称">
          <el-input
              v-model="filters.projectName"
              placeholder="请输入项目名称"
              clearable
          />
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="getTableData"> æœç´¢ </el-button>
          <el-button @click="resetFilters"> é‡ç½® </el-button>
@@ -47,7 +40,7 @@
        <div>
          <el-button @click="handleExport" style="margin-right: 10px">导出</el-button>
          <el-button type="primary" @click="handleAdd('add')">
            æ–°å¢žç™»è®°
            æ¥ç¥¨ç™»è®°
          </el-button>
<!--          <el-button type="danger" plain @click="handleDelete">删除</el-button>-->
        </div>
@@ -143,11 +136,6 @@
      width:300
    },
    {
      label: "项目名称",
      prop: "projectName",
      width:400
    },
    {
      label: "录入人",
      prop: "recorderName",
    },
@@ -198,11 +186,11 @@
};
const handleAdd = (type) => {
  if (selectedRows.value.length !== 1) {
    proxy.$modal.msgWarning("请先选中一条数据");
    if (selectedRows.value.length < 1) {
        proxy.$modal.msgWarning("请至少选中一条数据");
    return;
  }
  modalRef.value.open(type, selectedRows.value[0].id);
    modalRef.value.open(type, selectedRows.value);
};
const handleEdit = (type, id) => {
src/views/procurementManagement/invoiceEntry/indexOld.vue
ÎļþÒÑɾ³ý
src/views/procurementManagement/paymentEntry/index.vue
@@ -27,10 +27,10 @@
          </el-col>
          <el-col :span="4">
            <el-form-item style="float: right; margin-right: unset">
              <el-button @click="handleExport" style="margin-right: 10px">导出</el-button>
              <el-button type="primary" @click="openForm('add')">
                æ–°å¢žä»˜æ¬¾
              </el-button>
              <el-button @click="handleExport" style="margin-right: 10px">导出</el-button>
<!--              <el-button type="danger" plain @click="handleDelete">-->
<!--                åˆ é™¤-->
<!--              </el-button>-->
@@ -127,145 +127,100 @@
                </template>
            </PIMTable>
    </div>
    <el-dialog
    <FormDialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增付款登记' : '编辑付款登记'"
      width="60%"
      title="新增付款页面"
      :width="'90%'"
      @close="closeDia"
      @confirm="submitForm"
      @cancel="closeDia"
    >
      <el-form
        :model="form"
        label-width="140px"
        label-position="top"
        :rules="rules"
        ref="formRef"
      <el-table
        v-if="forms.length"
        :data="forms"
        border
        style="width: 100%"
        size="small"
      >
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="采购合同号:" prop="purchaseContractNumber">
              <el-input
                v-model="form.purchaseContractNumber"
                placeholder="自动填充"
                clearable
                disabled
        <el-table-column type="index" label="序号" width="50" align="center"/>
        <el-table-column label="采购合同号" prop="purchaseContractNumber" show-overflow-tooltip />
        <el-table-column label="销售合同号" prop="salesContractNo" show-overflow-tooltip />
        <el-table-column label="供应商名称" prop="supplierName" show-overflow-tooltip />
        <el-table-column
          label="产品大类"
          prop="productCategory"
          show-overflow-tooltip
          width="100"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="销售合同号:" prop="salesContractNo">
              <el-input
                v-model="form.salesContractNo"
                placeholder="自动填充"
                clearable
                disabled
        <el-table-column
          label="规格型号"
          prop="specificationModel"
          show-overflow-tooltip
          width="150"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="供应商名称:" prop="supplierName">
              <el-input
                v-model="form.supplierName"
                placeholder="自动填充"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="发票号:" prop="invoiceNumber">
              <el-input
                v-model="form.invoiceNumber"
                placeholder="自动填充"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="发票金额(元):" prop="invoiceAmount">
              <el-input
                v-model="form.invoiceAmount"
                placeholder="自动填充"
                clearable
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="本次付款金额:" prop="currentPaymentAmount">
              <el-input-number :step="0.01" :min="0" style="width: 100%"
        <el-table-column
          label="待付款金额(元)"
          prop="pendingTicketsTotal"
          show-overflow-tooltip
          width="170"
        >
          <template #default="{ row, column }">
            <el-text type="danger">
              {{ formattedNumber(row, column, row.pendingTicketsTotal) }}
            </el-text>
          </template>
        </el-table-column>
        <el-table-column label="本次付款金额(元)" width="180">
          <template #default="{ row }">
            <el-input-number
              v-model="row.currentPaymentAmount"
              :step="0.01"
              :min="0"
              :max="Number(row.pendingTicketsTotal || 0)"
                                                             :precision="2"
                v-model="form.currentPaymentAmount"
              style="width: 100%"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="付款方式:" prop="paymentMethod">
              <el-select
                v-model="form.paymentMethod"
                placeholder="请选择"
                clearable
              >
          </template>
        </el-table-column>
        <el-table-column label="付款方式" width="160">
          <template #default="{ row }">
            <el-select v-model="row.paymentMethod" placeholder="请选择" clearable>
                <el-option label="电汇" value="电汇" />
                <el-option label="承兑" value="承兑" />
              </el-select>
            </el-form-item>
          </el-col>
                    <el-col :span="12">
                        <el-form-item label="付款日期:" prop="paymentDate">
          </template>
        </el-table-column>
        <el-table-column label="付款日期" width="170">
          <template #default="{ row }">
                            <el-date-picker
                                style="width: 100%"
                                v-model="form.paymentDate"
              v-model="row.paymentDate"
                                value-format="YYYY-MM-DD"
                                format="YYYY-MM-DD"
                                type="date"
                                placeholder="请选择"
                                clearable
              style="width: 100%"
                            />
                        </el-form-item>
                    </el-col>
        </el-row>
        <el-row :gutter="30">
                    <el-col :span="12">
                        <el-form-item label="登记人:" prop="registrant">
                            <el-input
                                v-model="form.registrant"
                                placeholder="请输入"
                                clearable
                                disabled
                            />
                        </el-form-item>
                    </el-col>
          <el-col :span="12">
            <el-form-item label="登记日期:" prop="registrationtDate">
              <el-input
                v-model="form.registrationtDate"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
      </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>
        </el-table-column>
        <el-table-column label="登记人" width="140">
          <template #default="{ row }">
            <el-input v-model="row.registrant" disabled />
          </template>
        </el-table-column>
        <el-table-column label="登记日期" width="170">
          <template #default="{ row }">
            <el-input v-model="row.registrationtDate" />
          </template>
        </el-table-column>
      </el-table>
      <div v-else class="empty-tip">请选择需要付款的记录</div>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { ref, reactive, toRefs, getCurrentInstance, nextTick, onMounted } from "vue";
import { Search } from "@element-plus/icons-vue";
import { ElMessageBox } from "element-plus";
@@ -296,10 +251,12 @@
  {
    label: "采购合同号",
    prop: "purchaseContractNumber",
    width:160
  },
  {
    label: "销售合同号",
    prop: "salesContractNo",
    width:160
  },
  {
    label: "供应商名称",
@@ -309,6 +266,7 @@
    {
        label: "付款状态",
        prop: "statusName",
    width:110,
        dataType: "tag",
        formatType: (params) => {
            if (params == '未完成付款') {
@@ -321,34 +279,32 @@
        },
    },
  {
    label: "发票号",
    prop: "invoiceNumber",
    width:200
        label: "产品大类",
        prop: "productCategory",
        showOverflowTooltip: true,
        width: 100
  },
  {
    label: "发票金额(元)",
    prop: "invoiceAmount",
    formatData: (params) => {
      return params ? parseFloat(params).toFixed(2) : 0;
    },
        label: "规格型号",
        prop: "specificationModel",
        showOverflowTooltip: true,
        width: 150
  },
  {
    label: "已付款金额(元)",
    prop: "paymentAmountTotal",
    prop: "ticketsTotal",
    width: 120,
    formatData: (params) => {
      return params ? parseFloat(params).toFixed(2) : 0;
    },
  },
  {
    label: "待付款金额(元)",
    prop: "unPaymentAmountTotal",
    prop: "pendingTicketsTotal",
    width: 120,
    formatData: (params) => {
      return params ? parseFloat(params).toFixed(2) : 0;
    },
  },
  {
    label: "录入人",
    prop: "issUer",
  },
]);
const tableData = ref([]);
@@ -356,6 +312,7 @@
const selectedRows = ref([]);
const tableLoading = ref(false);
const childrenLoading = ref(false);
const forms = ref([]);
const userStore = useUserStore();
const page = reactive({
  current: 1,
@@ -376,8 +333,6 @@
    purchaseLedgerId: "",
    salesContractNo: "",
    supplierName: "",
    invoiceNumber: "",
    invoiceAmount: "",
    taxRate: "",
    currentPaymentAmount: "",
    paymentMethod: "",
@@ -394,9 +349,6 @@
      { required: true, message: "请输入", trigger: "blur" },
    ],
    paymentMethod: [{ required: true, message: "请选择", trigger: "change" }],
    invoiceNumber: [
      { required: true, message: "请选择采购合同号", trigger: "change" },
    ],
  },
});
const { form, rules } = toRefs(data);
@@ -409,11 +361,16 @@
    if (!normalized) return 'info';
    return normalized === '未完成付款' ? 'danger' : 'success';
};
const formattedNumber = (row, column, cellValue) => {
  const val = Number(cellValue ?? 0);
  return Number.isFinite(val) ? val.toFixed(2) : "0.00";
};
// å­è¡¨åˆè®¡æ–¹æ³•
const summarizeMainTable1 = (param) => {
  return proxy.summarizeTable(
    param,
    ["invoiceAmount", "paymentAmountTotal", "unPaymentAmountTotal"],
    ["ticketsTotal", "pendingTicketsTotal"],
    {
      ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
@@ -442,8 +399,8 @@
  tableLoading.value = true;
  invoiceListPage({ ...searchForm, ...page }).then((res) => {
    tableLoading.value = false;
    tableData.value = res.records;
        page.total = res.total;
    tableData.value = res.data.records;
        page.total = res.data.total;
        if (expandedRowKeys.value.length > 0) {
            const arr = []
            const index = tableData.value.findIndex(item => item.id === expandedRowKeys.value[0]);
@@ -501,48 +458,66 @@
};
// æ‰“开弹框
const openForm = (type, row) => {
  if (selectedRows.value.length !== 1) {
    proxy.$message.error("请选择一条发票数据");
  if (selectedRows.value.length === 0) {
    proxy.$modal.msgError("请选择至少一条数据");
    return;
  }
    if (selectedRows.value[0].unPaymentAmountTotal == 0) {
        proxy.$message.warning("无需再付款");
  const validRows = selectedRows.value.filter((item) => Number(item.pendingTicketsTotal || 0) !== 0);
  if (validRows.length === 0) {
    proxy.$modal.msgWarning("所选记录均无需付款");
        return;
    }
  operationType.value = type;
  form.value = {};
  form.value = { ...selectedRows.value[0] };
  form.value.ticketRegistrationId = selectedRows.value[0].id;
  form.value.id = null;
  // æŸ¥è¯¢é‡‡è´­åˆåŒå·
  form.value.registrationtDate = getCurrentDate();
  form.value.paymentDate = getCurrentDate();
  form.value.registrant = userStore.name;
  forms.value = validRows.map((row) => ({
    purchaseContractNumber: row.purchaseContractNumber || "",
    salesContractNo: row.salesContractNo || "",
    supplierName: row.supplierName || "",
    supplierId: row.supplierId,
    productCategory: row.productCategory || "",
    specificationModel: row.specificationModel || "",
    pendingTicketsTotal: Number(row.pendingTicketsTotal || 0),
    currentPaymentAmount: "",
    paymentMethod: "",
    paymentDate: "",
    registrant: userStore.nickName,
    registrationtDate: getCurrentDate(),
    ticketRegistrationId: row.id,
    purchaseLedgerId: row.salesLedgerId,
    salesLedgerProductId: row.id,
  }));
  dialogFormVisible.value = true;
};
// æäº¤è¡¨å•
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      if (operationType.value === "edit") {
        submitEdit();
      } else {
        submitAdd();
  if (forms.value.length === 0) {
    proxy.$modal.msgError("请选择付款记录");
    return;
  }
  for (let i = 0; i < forms.value.length; i++) {
    const item = forms.value[i];
    const pendingAmount = Number(item.pendingTicketsTotal || 0);
    const currentAmount = Number(item.currentPaymentAmount);
    if (!item.currentPaymentAmount && item.currentPaymentAmount !== 0) {
      proxy.$modal.msgError(`第 ${i + 1} æ¡ï¼šè¯·å¡«å†™ä»˜æ¬¾é‡‘额`);
      return;
    }
    if (currentAmount > pendingAmount) {
      proxy.$modal.msgError(
        `第 ${i + 1} æ¡ï¼šä»˜æ¬¾é‡‘额不能超过待付款金额(待付款:${pendingAmount.toFixed(
          2
        )})`
      );
      return;
    }
    if (!item.paymentMethod) {
      proxy.$modal.msgError(`第 ${i + 1} æ¡ï¼šè¯·é€‰æ‹©ä»˜æ¬¾æ–¹å¼`);
      return;
    }
    if (!item.paymentDate) {
      proxy.$modal.msgError(`第 ${i + 1} æ¡ï¼šè¯·é€‰æ‹©ä»˜æ¬¾æ—¥æœŸ`);
      return;
      }
    }
  });
};
// æäº¤æ–°å¢ž
const submitAdd = () => {
  paymentRegistrationAdd(form.value).then((res) => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
  });
};
// æäº¤ä¿®æ”¹
const submitEdit = () => {
  paymentRegistrationEdit(form.value).then((res) => {
  paymentRegistrationAdd(forms.value).then(() => {
    proxy.$modal.msgSuccess("提交成功");
    closeDia();
    getList();
@@ -550,7 +525,7 @@
};
// å…³é—­å¼¹æ¡†
const closeDia = () => {
  proxy.resetForm("formRef");
  forms.value = [];
  dialogFormVisible.value = false;
};
// åˆ é™¤
@@ -602,4 +577,9 @@
::v-deep(.el-checkbox__label) {
  font-weight: bold;
}
.empty-tip {
  text-align: center;
  padding: 20px 0;
  color: #909399;
}
</style>
src/views/procurementManagement/priceManagement/index.vue
@@ -62,7 +62,7 @@
      </el-table>
    </el-card>
    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增价格' : '编辑价格'" width="600px">
    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增价格' : '编辑价格'" :width="'600px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="formData" label-width="120px">
        <el-form-item label="商品名称">
          <el-select v-model="formData.productName" placeholder="请选择商品" style="width: 100%">
@@ -102,15 +102,12 @@
          <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">确定</el-button>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { ref, reactive, computed } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
src/views/procurementManagement/procurementLedger/index.vue
@@ -39,7 +39,6 @@
    <div class="table_list">
      <div style="display: flex;justify-content: flex-end;margin-bottom: 20px;">
        <el-button type="primary" @click="openForm('add')">新增台账</el-button>
        <el-button type="success" @click="openScanAddDialog">扫码新增</el-button>
        <el-button @click="handleOut">导出</el-button>
        <el-button type="danger" plain @click="handleDelete">删除</el-button>
      </div>
@@ -167,7 +166,7 @@
        <el-table-column
            fixed="right"
            label="操作"
            min-width="150"
            width="100"
            align="center"
        >
          <template #default="scope">
@@ -177,13 +176,6 @@
                size="small"
                @click="openForm('edit', scope.row)"
            >编辑</el-button
            >
            <el-button
                link
                type="success"
                size="small"
                @click="showQRCode(scope.row)"
            >生成二维码</el-button
            >
          </template>
@@ -198,11 +190,14 @@
          @pagination="paginationChange"
      />
    </div>
    <el-dialog
    <FormDialog
        v-model="dialogFormVisible"
        :title="operationType === 'add' ? '新增采购台账页面' : '编辑采购台账页面'"
        width="70%"
        :width="'70%'"
        :operation-type="operationType"
        @close="closeDia"
        @confirm="submitForm"
        @cancel="closeDia"
    >
      <el-form
          :model="form"
@@ -474,18 +469,15 @@
          </el-col>
        </el-row>
      </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>
    <el-dialog
    </FormDialog>
    <FormDialog
        v-model="productFormVisible"
        :title="productOperationType === 'add' ? '新增产品' : '编辑产品'"
        width="40%"
        :width="'40%'"
        :operation-type="productOperationType"
        @close="closeProductDia"
        @confirm="submitProduct"
        @cancel="closeProductDia"
    >
      <el-form
          :model="productForm"
@@ -632,228 +624,7 @@
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitProduct">确认</el-button>
          <el-button @click="closeProductDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
    <!-- äºŒç»´ç æ˜¾ç¤ºå¯¹è¯æ¡† -->
    <el-dialog
        v-model="qrCodeDialogVisible"
        title="采购合同号二维码"
        width="400px"
        center
    >
      <div style="text-align: center;">
        <img :src="qrCodeUrl" alt="二维码" style="width:200px;height:200px;" />
        <div style="margin: 20px;">
          <el-button type="primary" @click="downloadQRCode">下载二维码图片</el-button>
        </div>
      </div>
    </el-dialog>
    <!-- æ‰«ç æ–°å¢žå¯¹è¯æ¡† -->
    <el-dialog
        v-model="scanAddDialogVisible"
        title="扫码新增采购台账"
        width="70%"
        @close="closeScanAddDialog"
    >
      <el-form
          :model="scanAddForm"
          label-width="140px"
          label-position="top"
          :rules="scanAddRules"
          ref="scanAddFormRef"
      >
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="扫码内容:">
              <el-input
                  v-model="scanAddForm.scanContent"
                  type="textarea"
                  :rows="3"
                  placeholder="请扫描二维码或手动输入采购合同信息"
                  @input="parseScanContent"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="采购合同号:" prop="purchaseContractNumber">
              <el-input
                  v-model="scanAddForm.purchaseContractNumber"
                  placeholder="请输入"
                  clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="供应商名称:" prop="supplierName">
              <el-input
                  v-model="scanAddForm.supplierName"
                  placeholder="请输入"
                  clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="项目名称:" prop="projectName">
              <el-input
                  v-model="scanAddForm.projectName"
                  placeholder="请输入"
                  clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="合同金额(元):" prop="contractAmount">
              <el-input-number
                  v-model="scanAddForm.contractAmount"
                  :precision="2"
                  :step="0.1"
                  clearable
                  style="width: 100%"
                  placeholder="请输入"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="付款方式:">
              <el-input
                  v-model="scanAddForm.paymentMethod"
                  placeholder="请输入"
                  clearable
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="录入人:">
              <el-input v-model="scanAddForm.recorderName" disabled />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="备注:">
              <el-input
                  v-model="scanAddForm.remark"
                  type="textarea"
                  :rows="2"
                  placeholder="请输入备注信息"
                  clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitScanAdd">确认新增</el-button>
          <el-button @click="closeScanAddDialog">取消</el-button>
        </div>
      </template>
    </el-dialog>
    <!-- æ‰«ç ç™»è®°å¯¹è¯æ¡† -->
    <el-dialog
        v-model="scanDialogVisible"
        title="扫码登记"
        width="60%"
        @close="closeScanDialog"
    >
      <el-form
          :model="scanForm"
          label-width="120px"
          label-position="left"
          :rules="scanRules"
          ref="scanFormRef"
      >
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="采购合同号:">
              <el-input v-model="scanForm.purchaseContractNumber" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="供应商名称:">
              <el-input v-model="scanForm.supplierName" disabled />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="项目名称:">
              <el-input v-model="scanForm.projectName" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="扫码时间:">
              <el-input v-model="scanForm.scanTime" disabled />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="12">
            <el-form-item label="扫码人:">
              <el-input v-model="scanForm.scannerName" disabled />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="扫码状态:">
              <el-tag :type="scanForm.scanStatus === '已扫码' ? 'success' : 'warning'">
                {{ scanForm.scanStatus }}
              </el-tag>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="扫码备注:">
              <el-input
                  v-model="scanForm.scanRemark"
                  type="textarea"
                  :rows="3"
                  placeholder="请输入扫码备注信息"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="20">
          <el-col :span="24">
            <el-form-item label="扫码记录:">
              <el-table :data="scanRecords" border style="width: 100%">
                <el-table-column label="序号" type="index" width="60" align="center" />
                <el-table-column label="扫码时间" prop="scanTime" width="180" />
                <el-table-column label="扫码人" prop="scannerName" width="120" />
                <el-table-column label="扫码状态" prop="scanStatus" width="100">
                  <template #default="scope">
                    <el-tag :type="scope.row.scanStatus === '已扫码' ? 'success' : 'warning'">
                      {{ scope.row.scanStatus }}
                    </el-tag>
                  </template>
                </el-table-column>
                <el-table-column label="备注" prop="scanRemark" />
              </el-table>
            </el-form-item>
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitScan">确认扫码</el-button>
          <el-button @click="closeScanDialog">取消</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
@@ -861,6 +632,7 @@
<script setup>
import {getToken} from "@/utils/auth";
import pagination from "@/components/PIMTable/Pagination.vue";
import FormDialog from '@/components/Dialog/FormDialog.vue';
import {getCurrentInstance, nextTick, onMounted, reactive, ref, toRefs} from "vue";
import {Search} from "@element-plus/icons-vue";
import {ElMessage, ElMessageBox} from "element-plus";
@@ -885,7 +657,6 @@
  purchaseListPage
} from "@/api/procurementManagement/procurementLedger.js";
import useFormData from "@/hooks/useFormData.js";
import QRCode from "qrcode";
import useUserStore from "@/store/modules/user";
import {modelList, productTreeList} from "@/api/basicData/product.js";
import dayjs from "dayjs";
@@ -910,10 +681,6 @@
const fileList = ref([]);
const userStore = useUserStore();
// äºŒç»´ç ç›¸å…³å˜é‡
const qrCodeDialogVisible = ref(false);
const qrCodeUrl = ref("");
// è®¢å•审批状态显示文本
const approvalStatusText = {
@@ -1753,201 +1520,6 @@
    productData.value = data;
  }
};
// æ˜¾ç¤ºäºŒç»´ç 
const showQRCode = async (row) => {
  try {
    // æž„建二维码内容,只包含采购合同号(纯文本)
    const qrContent = row.purchaseContractNumber || '';
    // æ£€æŸ¥å†…容是否为空
    if (!qrContent || qrContent.trim() === '') {
      proxy.$modal.msgWarning("该行没有采购合同号,无法生成二维码");
      return;
    }
    qrCodeUrl.value = await QRCode.toDataURL(qrContent, {
      width: 200,
      margin: 2,
      color: {
        dark: '#000000',
        light: '#FFFFFF'
      }
    });
    qrCodeDialogVisible.value = true;
  } catch (error) {
    console.error('生成二维码失败:', error);
    proxy.$modal.msgError("生成二维码失败:" + error.message);
  }
};
// ä¸‹è½½äºŒç»´ç 
const downloadQRCode = () => {
  if (!qrCodeUrl.value) {
    proxy.$modal.msgWarning("二维码未生成");
    return;
  }
  try {
    const a = document.createElement('a');
    a.href = qrCodeUrl.value;
    a.download = `采购合同号二维码_${dayjs().format('YYYYMMDDHHmmss')}.png`;
    document.body.appendChild(a);
    a.click();
    document.body.removeChild(a);
    proxy.$modal.msgSuccess("下载成功");
  } catch (error) {
    console.error('下载二维码失败:', error);
    proxy.$modal.msgError("下载失败,请稍后重试");
  }
};
// æ‰«ç æ–°å¢žå¯¹è¯æ¡†ç›¸å…³å˜é‡
const scanAddDialogVisible = ref(false);
const scanAddForm = reactive({
  scanContent: "",
  purchaseContractNumber: "",
  supplierName: "",
  projectName: "",
  contractAmount: "",
  paymentMethod: "",
  recorderName: "",
  scanRemark: "",
});
const scanAddRules = {
  purchaseContractNumber: [{ required: true, message: "请输入采购合同号", trigger: "blur" }],
  supplierName: [{ required: true, message: "请输入供应商名称", trigger: "blur" }],
  projectName: [{ required: true, message: "请输入项目名称", trigger: "blur" }],
};
// æ‰«ç ç™»è®°å¯¹è¯æ¡†ç›¸å…³å˜é‡
const scanDialogVisible = ref(false);
const scanForm = reactive({
  purchaseContractNumber: "",
  supplierName: "",
  projectName: "",
  scanTime: "",
  scannerName: "",
  scanStatus: "未扫码",
  scanRemark: "",
});
const scanRules = {
  scanRemark: [{ required: true, message: "请输入扫码备注", trigger: "blur" }],
};
const scanRecords = ref([]);
// æ‰“开扫码新增对话框
const openScanAddDialog = () => {
  scanAddForm.scanContent = "";
  scanAddForm.purchaseContractNumber = "";
  scanAddForm.supplierName = "";
  scanAddForm.projectName = "";
  scanAddForm.contractAmount = "";
  scanAddForm.paymentMethod = "";
  scanAddForm.recorderName = userStore.nickName;
  scanAddForm.scanRemark = "";
  scanAddDialogVisible.value = true;
};
// è§£æžæ‰«ç å†…容(模拟解析二维码数据)
const parseScanContent = (content) => {
  if (!content) return;
  // æ¨¡æ‹Ÿè§£æžäºŒç»´ç å†…容,这里可以根据实际需求调整解析逻辑
  // å‡è®¾æ‰«ç å†…容格式为:合同号|供应商|项目|金额|付款方式
  const parts = content.split('|');
  if (parts.length >= 3) {
    scanAddForm.purchaseContractNumber = parts[0] || "";
    scanAddForm.supplierName = parts[1] || "";
    scanAddForm.projectName = parts[2] || "";
    scanAddForm.contractAmount = parts[3] || "";
    scanAddForm.paymentMethod = parts[4] || "";
  }
};
// å…³é—­æ‰«ç æ–°å¢žå¯¹è¯æ¡†
const closeScanAddDialog = () => {
  scanAddDialogVisible.value = false;
  proxy.resetForm("scanAddFormRef");
};
// æäº¤æ‰«ç æ–°å¢ž
const submitScanAdd = async () => {
  try {
    const valid = await proxy.$refs["scanAddFormRef"].validate().catch(() => false);
    if (!valid) {
      return;
    }
    // æž„建新增数据
    const newData = {
      purchaseContractNumber: scanAddForm.purchaseContractNumber,
      supplierName: scanAddForm.supplierName,
      projectName: scanAddForm.projectName,
      contractAmount: scanAddForm.contractAmount,
      paymentMethod: scanAddForm.paymentMethod,
      recorderName: scanAddForm.recorderName,
      entryDate: getCurrentDate(),
      remark: scanAddForm.scanRemark,
      type: 2
    };
    // await addOrEditPurchase(newData);
    proxy.$modal.msgSuccess("扫码新增成功!");
    closeScanAddDialog();
    getList(); // åˆ·æ–°åˆ—表
  } catch (error) {
    console.error('提交扫码新增失败:', error);
    proxy.$modal.msgError("提交失败,请稍后重试");
  }
};
// æ‰“开扫码登记对话框
const openScanDialog = (row) => {
  scanForm.purchaseContractNumber = row.purchaseContractNumber;
  scanForm.supplierName = row.supplierName;
  scanForm.projectName = row.projectName;
  scanForm.scanTime = getCurrentDateTime();
  scanForm.scannerName = userStore.nickName;
  scanForm.scanStatus = "未扫码";
  scanForm.scanRemark = "";
  scanRecords.value = [];
  scanDialogVisible.value = true;
};
// å…³é—­æ‰«ç ç™»è®°å¯¹è¯æ¡†
const closeScanDialog = () => {
  scanDialogVisible.value = false;
  proxy.resetForm("scanFormRef");
};
// æäº¤æ‰«ç ç™»è®°
const submitScan = async () => {
  try {
    const valid = await proxy.$refs["scanFormRef"].validate().catch(() => false);
    if (!valid) {
      return;
    }
    // æ·»åŠ æ‰«ç è®°å½•
    scanRecords.value.push({
      ...scanForm,
      id: Date.now(), // æ¨¡æ‹ŸID
      scanTime: getCurrentDateTime(),
    });
    scanForm.scanStatus = "已扫码";
    scanForm.scanRemark = scanForm.scanRemark || "无";
    proxy.$modal.msgSuccess("扫码登记成功!");
    closeScanDialog();
  } catch (error) {
    console.error('提交扫码登记失败:', error);
    proxy.$modal.msgError("提交失败,请稍后重试");
  }
};
// èŽ·å–å½“å‰æ—¥æœŸæ—¶é—´
function getCurrentDateTime() {
  return dayjs().format("YYYY-MM-DD HH:mm:ss");
}
// æ·»åŠ è¡Œç±»åæ–¹æ³•
const tableRowClassName = ({ row }) => {
src/views/procurementManagement/procurementPlan/index.vue
@@ -88,11 +88,15 @@
    </el-card>
    <!-- æ–°å¢ž/编辑对话框 -->
    <el-dialog
    <FormDialog
      v-model="dialogVisible"
      :title="dialogType === 'add' ? '新增采购计划' : '编辑采购计划'"
      width="1000px"
      :width="'1000px'"
      :operation-type="dialogType"
      :close-on-click-modal="false"
      @close="dialogVisible = false"
      @confirm="handleSubmit"
      @cancel="dialogVisible = false"
    >
      <div class="form-container">
        <!-- åŸºæœ¬ä¿¡æ¯ -->
@@ -202,21 +206,17 @@
          </div>
        </div>
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="dialogVisible = false">取消</el-button>
          <el-button type="primary" @click="handleSubmit" :loading="submitLoading">确定</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
    <!-- äº§å“é€‰æ‹©å¯¹è¯æ¡† -->
    <el-dialog
    <FormDialog
      v-model="productSelectDialogVisible"
      title="选择产品"
      width="800px"
      :width="'800px'"
      :close-on-click-modal="false"
      @close="productSelectDialogVisible = false"
      @confirm="handleConfirmProductSelection"
      @cancel="productSelectDialogVisible = false"
    >
      <div class="product-select">
        <el-alert
@@ -247,23 +247,17 @@
          <el-table-column prop="inboundNum0" label="预计入库" width="100" align="right" />
        </el-table>
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="productSelectDialogVisible = false">取消</el-button>
          <el-button type="primary" @click="handleConfirmProductSelection" :disabled="selectedProducts.length === 0">
            ç¡®è®¤è®¡ç®—
          </el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
    <!-- è®¡ç®—结果对话框 -->
    <el-dialog
    <FormDialog
      v-model="calculateDialogVisible"
      title="采购计算结果"
      width="1000px"
      :width="'1000px'"
      :close-on-click-modal="false"
      @close="calculateDialogVisible = false"
      @confirm="handleCreatePurchaseOrder"
      @cancel="calculateDialogVisible = false"
    >
      <div class="calculate-result">
        <el-alert
@@ -300,18 +294,12 @@
          </el-table-column>
        </el-table>
      </div>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="calculateDialogVisible = false">关闭</el-button>
          <el-button type="primary" @click="handleCreatePurchaseOrder">确认</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import {ref, reactive, onMounted, getCurrentInstance} from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import { Search, Refresh, Plus, Download } from '@element-plus/icons-vue'
src/views/procurementManagement/purchaseOrder/index.vue
@@ -48,7 +48,7 @@
      </el-table>
    </el-card>
    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增采购订单' : '编辑采购订单'" width="800px">
    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增采购订单' : '编辑采购订单'" :width="'800px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="formData" ref="formRef" label-width="120px">
        <el-form-item label="供应商名称" prop="supplierName">
          <el-select v-model="formData.supplierName" placeholder="请选择供应商" style="width: 100%">
@@ -60,15 +60,12 @@
          <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">确定</el-button>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { ref, reactive } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
src/views/procurementManagement/qualityInspection/index.vue
@@ -49,7 +49,7 @@
      </el-table>
    </el-card>
    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增质检单' : '编辑质检单'" width="1000px">
    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增质检单' : '编辑质检单'" :width="'1000px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="formData" label-width="120px">
        <el-row :gutter="20">
          <el-col :span="12">
@@ -120,15 +120,12 @@
          <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">确定</el-button>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { ref, reactive } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
src/views/procurementManagement/returnManagement/index.vue
@@ -60,7 +60,7 @@
      />
    </el-card>
    <el-dialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增退货单' : '编辑退货单'" width="600px">
    <FormDialog v-model="dialogVisible" :title="dialogType === 'add' ? '新增退货单' : '编辑退货单'" :width="'600px'" :operation-type="dialogType" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="formData" label-width="120px">
        <el-form-item label="退货类型">
          <el-select v-model="formData.returnType" placeholder="请选择退货类型" style="width: 100%">
@@ -87,15 +87,12 @@
          <el-input v-model="formData.remark" type="textarea" :rows="3" placeholder="请输入备注信息" />
        </el-form-item>
      </el-form>
      <template #footer>
        <el-button @click="dialogVisible = false">取消</el-button>
        <el-button type="primary" @click="handleSubmit">确定</el-button>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { ref, reactive,onMounted } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import Pagination from '@/components/PIMTable/Pagination.vue'
src/views/procurementManagement/transferManagement/index.vue
@@ -64,7 +64,7 @@
        @pagination="paginationChange"
    />
    <!-- ç¡®è®¤æ”¶è´§å¯¹è¯æ¡† -->
    <el-dialog v-model="receiptDialogVisible" title="确认收货" width="70%">
    <FormDialog v-model="receiptDialogVisible" title="确认收货" :width="'70%'" @close="receiptDialogVisible = false" @confirm="submitReceipt" @cancel="receiptDialogVisible = false">
      <el-form :model="receiptForm" label-width="120px" ref="formRef">
        <el-form-item label="采购合同号">
          <el-input v-model="receiptForm.purchaseContractNumber" disabled />
@@ -130,15 +130,12 @@
          />
        </el-table>
      </el-form>
      <template #footer>
        <el-button @click="receiptDialogVisible = false">取消</el-button>
        <el-button type="primary" @click="submitReceipt">确认收货</el-button>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
<script setup>
import FormDialog from '@/components/Dialog/FormDialog.vue';
import {ref, onMounted, getCurrentInstance} from 'vue'
import {
  getPurchaseOrders,
src/views/salesManagement/deliveryLedger/index.vue
@@ -41,8 +41,8 @@
      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
        :page="page.current" :limit="page.size" @pagination="paginationChange" />
    </div>
    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '新增发货台账' : '编辑发货台账'" width="50%"
      @close="closeDia">
    <FormDialog v-model="dialogFormVisible" :title="operationType === 'add' ? '新增发货台账' : '编辑发货台账'" :width="'50%'"
      :operation-type="operationType" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
      <el-form :model="form" label-width="120px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="24">
@@ -81,18 +81,13 @@
        </el-row>
        
      </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>
    </FormDialog>
  </div>
</template>
<script setup>
import pagination from "@/components/PIMTable/Pagination.vue";
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { onMounted, ref, reactive, toRefs, getCurrentInstance } from "vue";
import { ElMessageBox } from "element-plus";
import { getCurrentDate } from "@/utils/index.js";
src/views/salesManagement/invoiceLedger/index.vue
@@ -31,9 +31,8 @@
        <el-table-column align="center" type="selection" width="55" />
        <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column label="销售合同号" prop="salesContractNo" show-overflow-tooltip width="180" />
        <el-table-column label="客户合同号" prop="customerContractNo" show-overflow-tooltip width="180" />
        <el-table-column label="客户名称" prop="customerName" show-overflow-tooltip width="240" />
        <el-table-column label="项目" prop="projectName" width="320" />
<!--        <el-table-column label="项目" prop="projectName" width="320" />-->
        <el-table-column label="产品大类" prop="productCategory" width="200" />
        <el-table-column label="规格型号" prop="specificationModel" width="160" show-overflow-tooltip />
        <el-table-column label="发票号" prop="invoiceNo" width="200" show-overflow-tooltip />
@@ -43,7 +42,7 @@
        <el-table-column label="录入人" prop="invoicePerson" show-overflow-tooltip />
        <el-table-column label="录入日期" prop="createTime" show-overflow-tooltip :formatter="formatDate" width="180" />
        <el-table-column label="开票日期" prop="invoiceDate" show-overflow-tooltip width="120" />
        <el-table-column label="发票" prop="invoiceFileName" width="120" align="center" show-overflow-tooltip fixed="right">
        <!-- <el-table-column label="发票" prop="invoiceFileName" width="120" align="center" show-overflow-tooltip fixed="right">
          <template #default="scope">
            <el-button v-if="scope.row.invoiceFileName" text bg type="primary"
              @click="handleFile(scope.row.commonFiles)">
@@ -53,10 +52,11 @@
              ä¸Šä¼ 
            </el-button>
          </template>
        </el-table-column>
        </el-table-column> -->
        <el-table-column fixed="right" label="操作" width="150" align="center">
          <template #default="scope">
            <el-button link type="primary" size="small" @click="openForm(scope.row)">编辑</el-button>
            <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">附件</el-button>
            <el-button link type="primary" size="small" @click="delInvoiceLedger(scope.row)">删除</el-button>
          </template>
        </el-table-column>
@@ -64,7 +64,7 @@
      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
        :page="page.current" :limit="page.size" @pagination="paginationChange" />
    </div>
    <el-dialog v-model="dialogFormVisible" title="开票台账页面" width="70%" @close="closeDia">
    <FormDialog v-model="dialogFormVisible" title="开票台账页面" :width="'70%'" @close="closeDia" @confirm="submitForm" @cancel="closeDia">
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
@@ -108,7 +108,7 @@
            <el-form-item label="附件材料:" prop="remark">
              <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload
                :headers="upload.headers" accept=".pdf" :limit="10" :before-upload="handleBeforeUpload"
                :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove">
                :on-error="handleUploadError" :on-success="handleUploadSuccess">
                <el-button type="primary">上传</el-button>
                <template #tip>
                  <!--                  æ–‡ä»¶æ ¼å¼æ”¯æŒ doc,docx,xls,xlsx,ppt,pptx,pdf,txt,xml,jpg,jpeg,png,gif,bmp,rar,zip,7z-->
@@ -119,13 +119,7 @@
          </el-col>
        </el-row>
      </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>
    </FormDialog>
    <el-dialog title="上传弹窗" width="50%" v-model="uploadModal">
      <el-row :gutter="30">
        <el-col :span="24">
@@ -149,11 +143,13 @@
        </div>
      </template>
    </el-dialog>
    <FileListDialog ref="fileListRef" v-model="fileListDialogVisible" />
  </div>
</template>
<script setup>
import pagination from "@/components/PIMTable/Pagination.vue";
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { ref } from "vue";
import { Search } from "@element-plus/icons-vue";
import { ElMessageBox } from "element-plus";
@@ -164,10 +160,11 @@
  commitFile,
  registrationProductPage,
  delInvoiceLedgerByRegProductId,
} from "../../../api/salesManagement/invoiceLedger.js";
} from "@/api/salesManagement/invoiceLedger.js";
import useUserStore from "@/store/modules/user.js";
import useFormData from "@/hooks/useFormData";
import dayjs from "dayjs";
import FileListDialog from '@/components/Dialog/FileListDialog.vue';
import { getCurrentDate } from "@/utils/index.js";
const { proxy } = getCurrentInstance();
@@ -246,7 +243,11 @@
const getList = () => {
  tableLoading.value = true;
  const { invoiceDate, ...rest } = searchForm;
  registrationProductPage({ ...rest, ...page }).then((res) => {
  // å°†èŒƒå›´æ—¥æœŸå­—段传递给后端
  const params = { ...rest, ...page };
  // ç§»é™¤å¼€ç¥¨æ—¥æœŸçš„默认值设置,只保留范围日期字段
  delete params.invoiceDate;
  registrationProductPage(params).then((res) => {
    tableLoading.value = false;
    tableData.value = res.data.records;
    total.value = res.data.total;
@@ -273,12 +274,12 @@
  invoiceLedgerProductInfo({ id: row.id }).then((res) => {
    form.value = { ...res.data };
    fileList.value = res.data.fileList;
    // ä¿å­˜ticketRegistrationId到表单数据中
    if (row.ticketRegistrationId) {
      form.value.ticketRegistrationId = row.ticketRegistrationId;
    }
    if (!form.value.invoicePerson) {
      form.value.invoicePerson = userStore.nickName;
      form.value.entryDate = getCurrentDate();
    }
    if (!form.value.invoiceDate) {
      form.value.invoiceDate = getCurrentDate();
    }
  });
  dialogFormVisible.value = true;
@@ -292,7 +293,6 @@
};
// ä¸Šä¼ å‰æ ¡æ£€
function handleBeforeUpload(file) {
  console.log("file", file);
  // æ ¡æ£€æ–‡ä»¶å¤§å°
  if (file.size > 1024 * 1024 * 10) {
    proxy.$modal.msgError("上传文件大小不能超过10MB!");
@@ -316,19 +316,25 @@
function handleUploadSuccess(res, file, uploadFiles) {
  proxy.$modal.closeLoading();
  if (res.code === 200) {
    proxy.$refs["fileUpload"].handleRemove(file);
    fileList.value.push(res.data);
    proxy.$modal.msgSuccess("上传成功");
    // å°†ä¸Šä¼ æˆåŠŸçš„æ–‡ä»¶ä¿¡æ¯æ·»åŠ åˆ°fileList中
    const fileInfo = {
      name: file.name,
      url: res.data.url || file.response?.data?.url || file.url,
      response: file.response
    };
    // æ£€æŸ¥æ˜¯å¦å·²å­˜åœ¨ç›¸åŒæ–‡ä»¶ï¼Œé¿å…é‡å¤æ·»åŠ 
    const existingFileIndex = fileList.value.findIndex(f => f.name === fileInfo.name);
    if (existingFileIndex === -1) {
      fileList.value.push(fileInfo);
    } else {
      fileList.value[existingFileIndex] = fileInfo;
    }
    // ç¡®ä¿è¡¨å•数据中的fileList也更新
    form.value.fileList = fileList.value;
  } else {
    proxy.$modal.msgError(res.msg);
    proxy.$refs.fileUpload.handleRemove(file);
  }
}
// ç§»é™¤æ–‡ä»¶
function handleRemove(file) {
  let index = fileList.value.findIndex((item) => item.url === file.url);
  if (index > -1) {
    fileList.value.splice(index, 1);
  }
}
// æäº¤è¡¨å•
@@ -362,13 +368,6 @@
    .catch(() => {
      proxy.$modal.msg("已取消");
    });
};
// æ‰“开附件上传弹窗
const handleDownload = (val) => {
  fileList.value = [];
  uploadModal.value = true;
  currentId.value = val.id;
};
// ç¡®è®¤æ–‡ä»¶ä¸Šä¼ 
@@ -426,7 +425,26 @@
  getList();
};
//附件相关
const fileListRef = ref(null)
const fileListDialogVisible = ref(false)
//查看附件
const downLoadFile = (row) => {
    invoiceLedgerProductInfo({ id: row.id }).then((res) => {
        if (fileListRef.value) {
            fileListRef.value.open(res.data.fileList)
            fileListDialogVisible.value = true
        }
    });
}
onMounted(() => {
  // è®¾ç½®å¼€ç¥¨æ—¥æœŸèŒƒå›´é»˜è®¤å€¼ä¸ºå½“天
  const today = dayjs().format('YYYY-MM-DD');
  searchForm.invoiceDate = [today, today];
  // è®¾ç½®èŒƒå›´æ—¥æœŸå­—段的起始和结束时间
  searchForm.invoiceDateStart = today;
  searchForm.invoiceDateEnd = today;
  getList();
});
</script>
src/views/salesManagement/invoiceRegistration/index.vue
@@ -12,20 +12,6 @@
            @change="handleQuery"
          />
        </el-form-item>
        <el-form-item label="客户合同号">
          <el-input
            v-model="searchForm.customerContractNo"
            placeholder="请输入客户合同号"
            clearable
          />
        </el-form-item>
        <el-form-item label="项目名称">
          <el-input
            v-model="searchForm.projectName"
            placeholder="请输入项目名称"
            clearable
          />
        </el-form-item>
        <el-form-item>
          <el-checkbox
            v-model="searchForm.status"
@@ -45,7 +31,7 @@
        <div></div>
        <div>
        <el-button type="primary" @click="openForm" style="margin-bottom: 8px">
          æ–°å¢žç™»è®°
                        å¼€ç¥¨ç™»è®°
        </el-button>
        </div>
      </div>
@@ -128,33 +114,24 @@
          label="销售合同号"
          prop="salesContractNo"
          show-overflow-tooltip
          width="200"
        />
        <el-table-column
          label="客户合同号"
          prop="customerContractNo"
          width="200"
          show-overflow-tooltip
        />
<!--                <el-table-column-->
<!--                    label="客户合同号"-->
<!--                    prop="customerContractNo"-->
<!--                    width="200"-->
<!--                    show-overflow-tooltip-->
<!--                />-->
        <el-table-column
          label="客户名称"
          prop="customerName"
          show-overflow-tooltip
          width="240"
        />
        <el-table-column label="业务员" prop="salesman" show-overflow-tooltip width="90"/>
        <el-table-column
          label="项目名称"
          prop="projectName"
          show-overflow-tooltip
          width="200"
        />
                <el-table-column label="业务员" prop="salesman" show-overflow-tooltip/>
        <el-table-column
          label="合同金额(元)"
          prop="contractAmount"
          show-overflow-tooltip
          :formatter="formattedNumber"
                    width="220"
        />
        <el-table-column
@@ -162,7 +139,6 @@
          prop="invoiceTotal"
          show-overflow-tooltip
          :formatter="formattedNumber"
          width="120"
        />
        <el-table-column
          label="未开票金额(元)"
@@ -186,11 +162,13 @@
        @pagination="paginationChange"
      />
    </div>
    <el-dialog
        <FormDialog
      v-model="dialogFormVisible"
      title="新增开票登记页面"
      width="85%"
            :width="'85%'"
      @close="closeDia"
            @confirm="submitForm"
            @cancel="closeDia"
    >
      <el-form
        :model="form"
@@ -202,7 +180,7 @@
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="销售合同号:" prop="salesContractNo">
              <el-input v-model="form.salesContractNo" disabled></el-input>
                            <el-input v-model="form.salesContractNo" disabled placeholder="多合同批量处理(具体合同号见产品列表)"></el-input>
            </el-form-item>
          </el-col>
          <el-col :span="12">
@@ -226,21 +204,16 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="项目名称:" prop="projectName">
                        <el-form-item label="发票号码:" prop="invoiceNo">
              <el-input
                v-model="form.projectName"
                placeholder="自动填充"
                disabled
                                v-model="form.invoiceNo"
                                placeholder="请输入"
                                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="录入人" prop="createUer">
              <el-input v-model="form.createUer" placeholder="请输入录入人" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="开票日期" prop="issueDate">
              <el-date-picker
@@ -257,6 +230,11 @@
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
                        <el-form-item label="录入人" prop="createUer">
                            <el-input v-model="form.createUer" placeholder="请输入录入人" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12">
            <el-form-item label="录入日期:" prop="createTime">
              <el-date-picker
                style="width: 100%"
@@ -267,15 +245,7 @@
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="发票号码:" prop="invoiceNo">
              <el-input
                v-model="form.invoiceNo"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-form-item label="产品信息:" prop="entryDate"> </el-form-item>
@@ -292,6 +262,11 @@
            type="index"
            width="60"
          />
                    <el-table-column label="所属合同" prop="salesContractNo" width="200">
                        <template #default="{ row }">
                            <el-tag type="primary">{{ row.salesContractNo }}</el-tag>
                        </template>
                    </el-table-column>
          <el-table-column label="产品大类" prop="productCategory" />
          <el-table-column
            label="规格型号"
@@ -393,18 +368,13 @@
          </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>
        </FormDialog>
  </div>
</template>
<script setup>
import pagination from "@/components/PIMTable/Pagination.vue";
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { onMounted, ref } from "vue";
import { Search } from "@element-plus/icons-vue";
import { ElMessageBox } from "element-plus";
@@ -442,6 +412,8 @@
    createUer: undefined, // ç™»è®°äºº
    issueDate: undefined, // å¼€ç¥¨æ—¥æœŸ
    createTime: undefined, // å½•入日期:
        productCategory: "",
        isInvoice: 1
  },
  form: {
    salesLedgerId: "",
@@ -452,9 +424,10 @@
    invoiceNo: "",
    createUer: userStore.nickName,
    issueDate: dayjs().format("YYYY-MM-DD"),
        selectedContractIds: [], // æ–°å¢žï¼šå­˜å‚¨æ‰€æœ‰é€‰ä¸­çš„合同ID
        isBatch: false // æ–°å¢žï¼šæ ‡è¯†æ˜¯å¦ä¸ºæ‰¹é‡æ“ä½œ
  },
  rules: {
    salesLedgerId: [{ required: true, message: "请选择", trigger: "change" }],
    createUer: [{ required: true, message: "请选择", trigger: "blur" }],
    issueDate: [{ required: true, message: "请选择", trigger: "change" }],
    invoiceNo: [{ required: true, message: "请输入", trigger: "change" }],
@@ -550,21 +523,62 @@
};
// æ‰“开弹框
const openForm = () => {
  // åˆ¤æ–­æ˜¯å¦å¤šé€‰
  if (selectedRows.value.length != 1) {
    proxy.$modal.msgError("请选择一条合同");
    // åˆ¤æ–­æ˜¯å¦é€‰æ‹©äº†åˆåŒ
    if (selectedRows.value.length === 0) {
        proxy.$modal.msgError("请至少选择一条合同");
    return;
  }
    // æ£€æŸ¥æ‰€æœ‰é€‰æ‹©çš„合同是否具有相同的客户名称
    const firstRow = selectedRows.value[0];
    const isSameCustomer = selectedRows.value.every(row =>
        row.customerName === firstRow.customerName
    );
    if (!isSameCustomer) {
        proxy.$modal.msgError("请选择相同客户名称的合同");
        return;
    }
    // å…è®¸ä¸åŒçš„销售合同号批量处理,无需检查重复
  form.value = {};
  productData.value = [];
  getSalesLedgerWithProducts({ id: selectedRows.value[0].id }).then((res) => {
    form.value = { ...res };
    // åŠ è½½æ‰€æœ‰é€‰ä¸­åˆåŒçš„äº§å“æ•°æ®
    const promises = selectedRows.value.map(row =>
        getSalesLedgerWithProducts({ id: row.id })
    );
    Promise.all(promises).then(results => {
        // åˆå¹¶æ‰€æœ‰åˆåŒçš„产品数据,并为每个产品添加对应的合同信息
        const allProductData = [];
        results.forEach((result, index) => {
            const contract = selectedRows.value[index];
            const contractId = contract.id;
            if (result.productData) {
                result.productData.forEach(item => {
                    allProductData.push({
                        ...item,
                        id: contractId, // æ˜Žç¡®è®¾ç½®åˆåŒID
                        salesContractNo: contract.salesContractNo, // æ·»åŠ é”€å”®åˆåŒå·
                        customerName: contract.customerName, // æ·»åŠ å®¢æˆ·åç§°
                        customerContractNo: contract.customerContractNo // æ·»åŠ å®¢æˆ·åˆåŒå·
                    });
                });
            }
        });
        // è®¾ç½®è¡¨å•数据(使用第一个合同的基本信息,销售合同号留空)
        form.value = { ...results[0] };
    form.value.createTime = dayjs().format("YYYY-MM-DD");
    form.value.issueDate = dayjs().format("YYYY-MM-DD");
    form.value.createUer = userStore.nickName;
    productData.value = form.value.productData.map((item) => {
      return item;
    });
        form.value.selectedContractIds = selectedRows.value.map(row => row.id); // å­˜å‚¨æ‰€æœ‰é€‰ä¸­çš„合同ID
        form.value.salesContractNo = ""; // é”€å”®åˆåŒå·ç•™ç©ºï¼Œå› ä¸ºä¼šåœ¨äº§å“è¡¨æ ¼ä¸­åˆ†åˆ«æ˜¾ç¤º
        productData.value = allProductData;
    dialogFormVisible.value = true;
    console.log("productData.value ", productData.value);
  });
@@ -573,12 +587,79 @@
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      form.value.productData = proxy.HaveJson(productData.value);
      invoiceRegistrationSave(form.value).then((res) => {
            // å¦‚果是批量操作,将所有合同的数据放在一个数组里,只调用一次接口
            if (selectedRows.value.length > 1) {
                // åˆ›å»ºåŒ…含所有合同数据的数组
                const batchData = selectedRows.value.map(contract => {
                    // ç­›é€‰å‡ºå±žäºŽå½“前合同的产品数据
                    const contractProductData = productData.value.filter(item =>
                        item.salesLedgerId === contract.id
                    );
                    // ä¸ºæ¯ä¸ªé”€å”®åˆåŒå·åˆ›å»ºç‹¬ç«‹çš„对象
                    return {
                        // åŸºç¡€è¡¨å•数据
                        issueDate: form.value.issueDate,
                        createTime: form.value.createTime,
                        createUer: form.value.createUer,
                        invoiceNo: form.value.invoiceNo,
                        // åˆåŒå®žé™…信息
                        id: contract.id, // ä½¿ç”¨id作为字段名,值为salesLedgerId
                        salesContractNo: contract.salesContractNo, // ä½¿ç”¨å®žé™…的销售合同号
                        customerName: contract.customerName, // ä½¿ç”¨å®žé™…的客户名称
                        customerId: contract.customerId, // æ·»åŠ å®¢æˆ·ID
                        customerContractNo: contract.customerContractNo, // ä½¿ç”¨å®žé™…的客户合同号
                        projectName: contract.projectName, // ä½¿ç”¨å®žé™…的项目名称
                        salesman: contract.salesman, // ä½¿ç”¨å®žé™…的业务员
                        // äº§å“æ•°æ®
                        productData: proxy.HaveJson(contractProductData),
                        // æ‰¹é‡æ ‡è¯†
                        isBatch: true
                    };
                });
                // åªè°ƒç”¨ä¸€æ¬¡æŽ¥å£ï¼Œä¼ é€’包含所有合同数据的数组
                invoiceRegistrationSave(batchData).then(() => {
                    proxy.$modal.msgSuccess("批量新增成功");
                    closeDia();
                    getList();
                });
            } else {
                // å•个合同提交逻辑 - ä¹Ÿä»¥æ•°ç»„形式传递
                const singleContract = selectedRows.value[0];
                const singleFormArray = [
                    {
                        // åŸºç¡€è¡¨å•数据
                        issueDate: form.value.issueDate,
                        createTime: form.value.createTime,
                        createUer: form.value.createUer,
                        invoiceNo: form.value.invoiceNo,
                        // åˆåŒå®žé™…信息
                        id: singleContract.id, // ä½¿ç”¨id作为字段名,值为salesLedgerId
                        salesContractNo: singleContract.salesContractNo, // ä½¿ç”¨å®žé™…的销售合同号
                        customerName: singleContract.customerName, // ä½¿ç”¨å®žé™…的客户名称
                        customerId: singleContract.customerId, // æ·»åŠ å®¢æˆ·ID
                        customerContractNo: singleContract.customerContractNo, // ä½¿ç”¨å®žé™…的客户合同号
                        projectName: singleContract.projectName, // ä½¿ç”¨å®žé™…的项目名称
                        salesman: singleContract.salesman, // ä½¿ç”¨å®žé™…的业务员
                        // äº§å“æ•°æ®
                        productData: proxy.HaveJson(productData.value),
                        // æ‰¹é‡æ ‡è¯†
                        isBatch: false
                    }
                ];
                invoiceRegistrationSave(singleFormArray).then((res) => {
        proxy.$modal.msgSuccess("提交成功");
        closeDia();
        getList();
      });
            }
    }
  });
};
@@ -684,3 +765,8 @@
  font-weight: bold;
}
</style>
src/views/salesManagement/orderManagement/index.vue
@@ -89,7 +89,7 @@
    </el-card>
    <!-- æ–°å¢ž/编辑对话框 -->
    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="700px">
    <FormDialog v-model="dialogVisible" :title="dialogTitle" :width="'700px'" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
        <el-row :gutter="20">
          <el-col :span="12">
@@ -169,7 +169,7 @@
    </el-dialog>
    <!-- è®¢å•审核对话框 -->
    <el-dialog v-model="reviewDialogVisible" title="订单审核" width="500px">
    <FormDialog v-model="reviewDialogVisible" title="订单审核" :width="'500px'" @close="reviewDialogVisible = false" @confirm="saveReview" @cancel="reviewDialogVisible = false">
      <el-form label-width="100px">
        <el-form-item label="订单号">
          <span>{{ currentOrder.orderNo }}</span>
@@ -199,7 +199,7 @@
    </el-dialog>
    <!-- è®¢å•转单对话框 -->
    <el-dialog v-model="transferDialogVisible" title="订单转单" width="500px">
    <FormDialog v-model="transferDialogVisible" title="订单转单" :width="'500px'" @close="transferDialogVisible = false" @confirm="saveTransfer" @cancel="transferDialogVisible = false">
      <el-form label-width="100px">
        <el-form-item label="订单号">
          <span>{{ currentOrder.orderNo }}</span>
@@ -218,13 +218,7 @@
          <el-input type="textarea" v-model="transferReason" rows="3" placeholder="请输入转单原因"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="transferDialogVisible = false">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="saveTransfer">ç¡® å®š</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
@@ -233,6 +227,7 @@
import { ElMessage, ElMessageBox } from 'element-plus'
import { Plus, Search } from '@element-plus/icons-vue'
import Pagination from '@/components/PIMTable/Pagination.vue'
import FormDialog from '@/components/Dialog/FormDialog.vue'
// å“åº”式数据
const loading = ref(false)
src/views/salesManagement/paymentShipping/index.vue
@@ -98,7 +98,7 @@
    </el-card>
    <!-- æ–°å¢ž/编辑对话框 -->
    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="700px">
    <FormDialog v-model="dialogVisible" :title="dialogTitle" :width="'700px'" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
        <el-row :gutter="20">
          <el-col :span="12">
@@ -188,7 +188,7 @@
    </el-dialog>
    <!-- ä»˜æ¬¾å¯¹è¯æ¡† -->
    <el-dialog v-model="paymentDialogVisible" title="订单付款" width="500px">
    <FormDialog v-model="paymentDialogVisible" title="订单付款" :width="'500px'" @close="paymentDialogVisible = false" @confirm="savePayment" @cancel="paymentDialogVisible = false">
      <el-form label-width="100px">
        <el-form-item label="订单号">
          <span>{{ currentRecord.orderNo }}</span>
@@ -214,16 +214,10 @@
          <el-input type="textarea" v-model="paymentRemark" rows="3" placeholder="请输入付款备注"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="paymentDialogVisible = false">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="savePayment">ç¡® å®š</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
    <!-- å‘货对话框 -->
    <el-dialog v-model="shippingDialogVisible" title="订单发货" width="500px">
    <FormDialog v-model="shippingDialogVisible" title="订单发货" :width="'500px'" @close="shippingDialogVisible = false" @confirm="saveShipping" @cancel="shippingDialogVisible = false">
      <el-form label-width="100px">
        <el-form-item label="订单号">
          <span>{{ currentRecord.orderNo }}</span>
@@ -257,13 +251,7 @@
          <el-input type="textarea" v-model="shippingRemark" rows="3" placeholder="请输入发货备注"></el-input>
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="shippingDialogVisible = false">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="saveShipping">ç¡® å®š</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
@@ -273,6 +261,7 @@
import { Plus, Search } from '@element-plus/icons-vue'
import {listPage,add,update,deletePaymentShipping} from "@/api/salesManagement/paymentShipping.js"
import Pagination from '@/components/PIMTable/Pagination.vue'
import FormDialog from '@/components/Dialog/FormDialog.vue'
const total = ref(0)
onMounted(() => {
src/views/salesManagement/receiptPayment/index.vue
@@ -13,24 +13,6 @@
                prefix-icon="Search"
              />
            </el-form-item>
            <el-form-item label="客户合同号">
              <el-input
                v-model="searchForm.customerContractNo"
                placeholder="请输入"
                @change="handleQuery"
                clearable
                prefix-icon="Search"
              />
            </el-form-item>
            <el-form-item label="项目名称">
              <el-input
                v-model="searchForm.projectName"
                placeholder="请输入"
                @change="handleQuery"
                clearable
                prefix-icon="Search"
              />
            </el-form-item>
            <el-form-item>
              <el-checkbox
                v-model="searchForm.status"
@@ -152,23 +134,10 @@
          width="240"
        />
        <el-table-column
          label="客户合同号"
          prop="customerContractNo"
          show-overflow-tooltip
          width="240"
        />
        <el-table-column
          label="客户名称"
          prop="customerName"
          show-overflow-tooltip
          width="240"
        />
        <el-table-column
          label="项目名称"
          prop="projectName"
          show-overflow-tooltip
          width="340"
        />
        <el-table-column
          label="回款状态"
@@ -188,35 +157,28 @@
          width="100"
        />
        <el-table-column
          label="发票号"
          prop="invoiceNo"
          label="规格型号"
          prop="specificationModel"
          show-overflow-tooltip
          width="200"
        />
        <el-table-column
          label="发票金额(元)"
          prop="invoiceTotal"
          show-overflow-tooltip
          :formatter="formattedNumber"
          width="200"
        />
        <el-table-column label="税率(%)" prop="taxRate" show-overflow-tooltip />
        <el-table-column
          label="回款金额(元)"
          prop="receiptPaymentAmountTotal"
          label="已回款金额(元)"
          prop="invoiceTotal"
          show-overflow-tooltip
          :formatter="formattedNumber"
          width="200"
        />
        <el-table-column
          label="待回款金额(元)"
          prop="noReceiptAmount"
          prop="pendingInvoiceTotal"
          show-overflow-tooltip
          width="200"
        >
          <template #default="{ row, column }">
            <el-text type="danger">
              {{ formattedNumber(row, column, row.noReceiptAmount) }}
              {{ formattedNumber(row, column, row.pendingInvoiceTotal) }}
            </el-text>
          </template>
        </el-table-column>
@@ -230,145 +192,108 @@
        @pagination="paginationChange"
      />
    </div>
    <el-dialog
    <FormDialog
      v-model="dialogFormVisible"
      title="新增回款页面"
      width="70%"
      :width="'90%'"
      @close="closeDia"
      @confirm="submitForm"
      @cancel="closeDia"
    >
      <el-form
        :model="form"
        label-width="140px"
        label-position="top"
        :rules="rules"
        ref="formRef"
      <el-table
        v-if="forms.length"
        :data="forms"
        border
        style="width: 100%"
        size="small"
      >
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="销售合同号:" prop="salesContractNo">
              <el-input
                v-model="form.salesContractNo"
                placeholder="自动填充"
                disabled
        <el-table-column type="index" label="序号" width="50" align="center"/>
        <el-table-column label="销售合同号" prop="salesContractNo" show-overflow-tooltip />
        <el-table-column label="客户名称" prop="customerName" show-overflow-tooltip />
                <el-table-column
                    label="产品大类"
                    prop="productCategory"
                    show-overflow-tooltip
                    width="100"
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="客户名称:" prop="customerName">
              <el-input
                v-model="form.customerName"
                placeholder="自动填充"
                disabled
                <el-table-column
                    label="规格型号"
                    prop="specificationModel"
                    show-overflow-tooltip
                    width="200"
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="发票号:" prop="invoiceNo">
              <el-input
                v-model="form.invoiceNo"
                placeholder="自动填充"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="发票金额(元):" prop="invoiceTotal">
              <el-input
                type="number"
                v-model="form.invoiceTotal"
                placeholder="自动填充"
        <el-table-column label="税率(%)" width="110">
          <template #default="{ row }">
            <el-input v-model="row.taxRate" disabled />
          </template>
        </el-table-column>
        <el-table-column
          label="待回款金额(元)"
          prop="pendingInvoiceTotal"
          show-overflow-tooltip
          width="170"
        >
          <template #default="{ row, column }">
            <el-text type="danger">
              {{ formattedNumber(row, column, row.pendingInvoiceTotal) }}
            </el-text>
          </template>
        </el-table-column>
        <el-table-column label="本次回款金额(元)" width="180">
          <template #default="{ row }">
            <el-input-number
              v-model="row.receiptPaymentAmount"
                :step="0.01"
                disabled
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="税率:" prop="taxRate">
              <el-input
                type="number"
                v-model="form.taxRate"
                placeholder="自动填充"
                :step="0.01"
                disabled
              />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="本次回款金额:" prop="receiptPaymentAmount">
              <el-input-number :step="0.01" :min="0" style="width: 100%"
              :min="0"
              :max="Number(row.pendingInvoiceTotal || 0)"
                                                             :precision="2"
                v-model="form.receiptPaymentAmount"
              style="width: 100%"
                placeholder="请输入"
                clearable
              />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="回款形式:" prop="receiptPaymentType">
              <el-select
                v-model="form.receiptPaymentType"
                placeholder="请选择"
                clearable
              >
          </template>
        </el-table-column>
        <el-table-column label="回款形式" width="160">
          <template #default="{ row }">
            <el-select v-model="row.receiptPaymentType" placeholder="请选择" clearable>
                <el-option
                  v-for="item in receipt_payment_type"
                  :key="item.value"
                  :label="item.label"
                  :value="item.value"
                v-for="opt in receipt_payment_type"
                :key="opt.value"
                :label="opt.label"
                :value="opt.value"
                />
              </el-select>
            </el-form-item>
          </el-col>
                    <el-col :span="12">
                        <el-form-item label="回款日期:" prop="receiptPaymentDate">
          </template>
        </el-table-column>
        <el-table-column label="回款日期" width="170">
          <template #default="{ row }">
                            <el-date-picker
                                style="width: 100%"
                                v-model="form.receiptPaymentDate"
              v-model="row.receiptPaymentDate"
                                value-format="YYYY-MM-DD"
                                format="YYYY-MM-DD"
                                type="date"
                                placeholder="请选择"
                                clearable
              style="width: 100%"
                            />
                        </el-form-item>
                    </el-col>
        </el-row>
        <el-row :gutter="30">
                    <el-col :span="12">
                        <el-form-item label="登记人:" prop="registrant">
                            <el-input
                                v-model="form.registrant"
                                placeholder="请输入"
                                clearable
                                disabled
                            />
                        </el-form-item>
                    </el-col>
        </el-row>
      </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>
        </el-table-column>
        <el-table-column label="登记人" width="140">
          <template #default="{ row }">
            <el-input v-model="row.registrant" />
          </template>
        </el-table-column>
      </el-table>
      <div v-else class="empty-tip">请选择需要回款的记录</div>
    </FormDialog>
  </div>
</template>
<script setup>
import pagination from "@/components/PIMTable/Pagination.vue";
import { onMounted, ref } from "vue";
import FormDialog from '@/components/Dialog/FormDialog.vue';
import { onMounted, ref, reactive, getCurrentInstance } from "vue";
import {
  receiptPaymentSaveOrUpdate,
  bindInvoiceNoRegPage,
  invoiceInfo,
  receiptPaymentHistoryListNoPage,
  receiptPaymentDel,
} from "../../../api/salesManagement/receiptPayment.js";
@@ -381,6 +306,7 @@
const tableData = ref([]);
const selectedRows = ref([]);
const tableLoading = ref(false);
const forms = ref([]);
const page = reactive({
  current: 1,
  size: 100,
@@ -395,44 +321,15 @@
    searchText: "",
    status: true,
    customerName: "",
    customerContractNo: "",
    projectName: "",
  },
  form: {
    salesContractNo: "",
    customerName: "",
    invoiceNo: "",
    invoiceTotal: "",
    taxRate: "",
    receiptPaymentAmount: "",
    receiptPaymentType: "",
    registrant: "",
    receiptPaymentDate: "",
  },
  rules: {
    salesContractNo: [{ required: true, message: "请选择", trigger: "change" }],
    customerName: [{ required: true, message: "请输入", trigger: "blur" }],
    invoiceNo: [{ required: true, message: "请选择", trigger: "change" }],
    invoiceTotal: [{ required: true, message: "请输入", trigger: "blur" }],
    taxRate: [{ required: true, message: "请选择", trigger: "change" }],
    receiptPaymentAmount: [
      { required: true, message: "请选择", trigger: "change" },
    ],
    receiptPaymentType: [
      { required: true, message: "请选择", trigger: "change" },
    ],
    registrant: [{ required: true, message: "请选择", trigger: "change" }],
    receiptPaymentDate: [
      { required: true, message: "请选择", trigger: "change" },
    ],
    specificationModel: "",
  },
});
const { form, rules } = toRefs(data);
const { form: searchForm, resetForm } = useFormData(data.searchForm);
const { form: searchForm } = useFormData(data.searchForm);
const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
const formattedNumber = (row, column, cellValue) => {
  return parseFloat(cellValue).toFixed(2);
  const val = Number(cellValue ?? 0);
  return Number.isFinite(val) ? val.toFixed(2) : "0.00";
};
const getStatusTagType = (statusName = '') => {
@@ -501,15 +398,13 @@
// è¡¨æ ¼é€‰æ‹©æ•°æ®
const handleSelectionChange = (selection) => {
  console.log("selection", selection);
  selectedRows.value = selection.filter(
    (item) => item.customerContractNo !== null
  );
  selectedRows.value = selection;
};
// ä¸»è¡¨åˆè®¡æ–¹æ³•
const summarizeMainTable = (param) => {
  return proxy.summarizeTable(
    param,
    ["invoiceTotal", "receiptPaymentAmountTotal", "noReceiptAmount"],
    ["receiptPaymentAmountTotal", "noReceiptAmount"],
    {
      ticketsNum: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
      futureTickets: { noDecimal: true }, // ä¸ä¿ç•™å°æ•°
@@ -522,38 +417,72 @@
};
// æ‰“开弹框
const openForm = () => {
  form.value = {};
  if (selectedRows.value.length !== 1) {
    proxy.$modal.msgError("请选择一条数据");
  if (selectedRows.value.length === 0) {
    proxy.$modal.msgError("请选择至少一条数据");
    return;
  }
  if (selectedRows.value[0].noReceiptAmount == 0) {
    proxy.$modal.msgWarning("无需再回款");
  const validRows = selectedRows.value.filter((item) => item.noReceiptAmount !== 0);
  if (validRows.length === 0) {
    proxy.$modal.msgWarning("所选记录均无需回款");
    return;
  }
  invoiceInfo({ id: selectedRows.value[0].id }).then((res) => {
    form.value = { ...res.data };
    form.value.invoiceLedgerId = form.value.id;
    form.value.id = "";
    form.value.registrant = userStore.nickName;
  });
  forms.value = validRows.map((row) => ({
    salesContractNo: row.salesContractNo || "",
    customerName: row.customerName || "",
    productCategory: row.productCategory || "",
    specificationModel: row.specificationModel || "",
    pendingInvoiceTotal: Number(row.pendingInvoiceTotal || 0),
    taxRate: row.taxRate ?? "",
    receiptPaymentAmount: "",
    receiptPaymentType: "",
    registrant: userStore.nickName,
    receiptPaymentDate: "",
    invoiceLedgerId: row.id,
    salesLedgerId: row.salesLedgerId,
    salesLedgerProductId: row.id,
  }));
  dialogFormVisible.value = true;
};
// æäº¤è¡¨å•
const submitForm = () => {
  proxy.$refs["formRef"].validate((valid) => {
    if (valid) {
      receiptPaymentSaveOrUpdate(form.value).then((res) => {
  if (forms.value.length === 0) {
    proxy.$modal.msgError("请选择回款记录");
    return;
  }
  for (let i = 0; i < forms.value.length; i++) {
    const item = forms.value[i];
    const pendingAmount = Number(item.pendingInvoiceTotal || 0);
    const currentAmount = Number(item.receiptPaymentAmount);
    if (!item.receiptPaymentAmount && item.receiptPaymentAmount !== 0) {
      proxy.$modal.msgError(`第 ${i + 1} æ¡ï¼šè¯·å¡«å†™å›žæ¬¾é‡‘额`);
      return;
    }
    if (currentAmount > pendingAmount) {
      proxy.$modal.msgError(
        `第 ${i + 1} æ¡ï¼šå›žæ¬¾é‡‘额不能超过待回款金额(待回款:${pendingAmount.toFixed(
          2
        )})`
      );
      return;
    }
    if (!item.receiptPaymentType) {
      proxy.$modal.msgError(`第 ${i + 1} æ¡ï¼šè¯·é€‰æ‹©å›žæ¬¾å½¢å¼`);
      return;
    }
    if (!item.receiptPaymentDate) {
      proxy.$modal.msgError(`第 ${i + 1} æ¡ï¼šè¯·é€‰æ‹©å›žæ¬¾æ—¥æœŸ`);
      return;
    }
  }
  receiptPaymentSaveOrUpdate(forms.value).then(() => {
        proxy.$modal.msgSuccess("提交成功");
        closeDia();
        getList();
      });
    }
  });
};
// å…³é—­å¼¹æ¡†
const closeDia = () => {
  proxy.resetForm("formRef");
  forms.value = [];
  dialogFormVisible.value = false;
};
@@ -638,4 +567,9 @@
  justify-content: space-between;
  margin-bottom: 10px;
}
.empty-tip {
  text-align: center;
  padding: 20px 0;
  color: #909399;
}
</style>
src/views/salesManagement/receiptPaymentHistory/index.vue
@@ -10,24 +10,6 @@
          :prefix-icon="Search"
        />
      </el-form-item>
      <el-form-item label="客户合同号">
        <el-input
          v-model="searchForm.customerContractNo"
          placeholder="输入客户合同号"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
      </el-form-item>
      <el-form-item label="项目名称">
        <el-input
          v-model="searchForm.projectName"
          placeholder="输入项目名称"
          @change="handleQuery"
          clearable
          :prefix-icon="Search"
        />
      </el-form-item>
      <el-form-item label="回款日期">
        <el-date-picker
          v-model="searchForm.receiptPaymentDate"
@@ -66,7 +48,7 @@
</template>
<script setup>
import { ref, reactive, getCurrentInstance } from "vue";
import { ref, reactive, getCurrentInstance, onMounted } from "vue";
import { Search } from "@element-plus/icons-vue";
import { receiptPaymentHistoryListPage } from "@/api/salesManagement/receiptPayment.js";
import useFormData from "@/hooks/useFormData";
@@ -80,11 +62,6 @@
    width:240
  },
  {
    label: "客户合同号",
    prop: "customerContractNo",
    width:240
  },
  {
    label: "回款日期",
    prop: "receiptPaymentDate",
    width:100
@@ -93,11 +70,6 @@
    label: "客户名称",
    prop: "customerName",
    width:240
  },
  {
    label: "项目名称",
    prop: "projectName",
    width:200
  },
  {
    label: "回款金额(元)",
@@ -149,8 +121,6 @@
  receiptPaymentDate: [],
  receiptPaymentDateStart: undefined,
  receiptPaymentDateEnd: undefined,
  customerContractNo: undefined,
  projectName: undefined,
});
const { receipt_payment_type } = proxy.useDict("receipt_payment_type");
const isShowSummarySon = ref(true);
src/views/salesManagement/salesLedger/index.vue
@@ -6,16 +6,8 @@
          <el-input v-model="searchForm.customerName" placeholder="请输入" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="客户合同号:">
          <el-input v-model="searchForm.customerContractNo" placeholder="请输入" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="销售合同号:">
          <el-input v-model="searchForm.salesContractNo" placeholder="请输入" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="项目名称:">
          <el-input v-model="searchForm.projectName" placeholder="请输入" clearable prefix-icon="Search"
            @change="handleQuery" />
        </el-form-item>
        <el-form-item label="录入日期:">
@@ -41,7 +33,7 @@
      </div>
      <el-table :data="tableData" border v-loading="tableLoading" @selection-change="handleSelectionChange"
        :expand-row-keys="expandedRowKeys" :row-key="(row) => row.id" show-summary style="width: 100%"
        :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 18.5em)">
        :summary-method="summarizeMainTable" @expand-change="expandChange" height="calc(100vh - 21em)">
        <el-table-column align="center" type="selection" width="55" />
        <el-table-column type="expand">
          <template #default="props">
@@ -60,14 +52,29 @@
        </el-table-column>
        <el-table-column align="center" label="序号" type="index" width="60" />
        <el-table-column label="销售合同号" prop="salesContractNo" width="180" show-overflow-tooltip />
        <el-table-column label="客户合同号" prop="customerContractNo" width="180" show-overflow-tooltip />
        <el-table-column label="客户名称" prop="customerName" width="300" show-overflow-tooltip />
        <el-table-column label="业务员" prop="salesman" width="100" show-overflow-tooltip />
        <el-table-column label="项目名称" prop="projectName" width="180" show-overflow-tooltip />
        <el-table-column label="付款方式" prop="paymentMethod" show-overflow-tooltip />
        <el-table-column label="合同金额(元)" prop="contractAmount" width="220" show-overflow-tooltip
          :formatter="formattedNumber" />
        <el-table-column label="录入人" prop="entryPersonName" width="100" show-overflow-tooltip />
                <el-table-column label="生产状态" prop="productionStatus" width="100" show-overflow-tooltip >
                    <template #default="scope">
                        <div>
                            <el-tag v-if="scope.row.productionStatus === '已完成'" type="success">已完成</el-tag>
                            <el-tag v-if="scope.row.productionStatus === '生产中'" type="warning">生产中</el-tag>
                            <el-tag v-if="scope.row.productionStatus === '未开始'" type="danger">未开始</el-tag>
                        </div>
                    </template>
                </el-table-column>
        <el-table-column label="发货车牌" prop="shippingCarNumber" width="120" show-overflow-tooltip>
          <template #default="scope">
            <div>
              <div v-if="scope.row.shippingCarNumber">{{ scope.row.shippingCarNumber }}</div>
              <el-tag v-else type="warning">未发货</el-tag>
            </div>
          </template>
        </el-table-column>
        <el-table-column label="发货日期" prop="shippingDate" width="120" show-overflow-tooltip />
        <el-table-column label="录入日期" prop="entryDate" width="120" show-overflow-tooltip />
        <el-table-column label="签订日期" prop="executionDate" width="120" show-overflow-tooltip />
        <el-table-column fixed="right" label="操作" min-width="200" align="center">
@@ -75,15 +82,21 @@
            <el-button link type="primary" size="small" @click="openForm('edit', scope.row)">编辑</el-button>
<!--            <el-button link type="primary" size="small" @click="openForm('view', scope.row)">详情</el-button>-->
            <el-button link type="primary" size="small" @click="downLoadFile(scope.row)">附件</el-button>
            <el-button link type="primary" size="small" @click="openDeliveryForm(scope.row)">发货</el-button>
            <el-button v-if="!scope.row.shippingCarNumber" link type="primary" size="small" @click="openDeliveryForm(scope.row)">发货</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper"
        :page="page.current" :limit="page.size" @pagination="paginationChange" />
    </div>
    <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? '新增销售台账页面' : '编辑销售台账页面'" width="70%"
      @close="closeDia">
    <FormDialog
      v-model="dialogFormVisible"
      :title="operationType === 'add' ? '新增销售台账页面' : '编辑销售台账页面'"
      :width="'70%'"
      :operation-type="operationType"
      @close="closeDia"
      @confirm="submitForm"
      @cancel="closeDia">
      <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef">
        <el-row :gutter="30">
          <el-col :span="12">
@@ -93,7 +106,9 @@
          </el-col>
          <el-col :span="12">
            <el-form-item label="业务员:" prop="salesman">
              <el-select v-model="form.salesman" placeholder="请选择" clearable :disabled="operationType === 'view'">
              <el-select v-model="form.salesman"
                                                 filterable
                         :reserve-keyword="false" placeholder="请选择" clearable :disabled="operationType === 'view'">
                <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName"
                  :value="item.nickName" />
              </el-select>
@@ -102,26 +117,14 @@
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="客户合同号:" prop="customerContractNo">
              <el-input v-model="form.customerContractNo" placeholder="请输入" clearable :disabled="operationType === 'view'"/>
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="客户名称:" prop="customerId">
              <el-select v-model="form.customerId" placeholder="请选择" clearable :disabled="operationType === 'view'">
              <el-select v-model="form.customerId" placeholder="请选择" clearable :disabled="operationType === 'view'" filterable>
                <el-option v-for="item in customerOption" :key="item.id" :label="item.customerName" :value="item.id">
                  {{
                    item.customerName + "——" + item.taxpayerIdentificationNumber
                  }}
                </el-option>
              </el-select>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="项目名称:" prop="projectName">
              <el-input v-model="form.projectName" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
                    <el-col :span="12">
@@ -134,7 +137,10 @@
        <el-row :gutter="30">
                    <el-col :span="12">
                        <el-form-item label="录入人:" prop="entryPerson">
                            <el-select v-model="form.entryPerson" placeholder="请选择" clearable @change="changs" disabled>
                            <el-select v-model="form.entryPerson"
                                                 filterable
                         default-first-option
                         :reserve-keyword="false" placeholder="请选择" clearable @change="changs">
                                <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId" />
                            </el-select>
                        </el-form-item>
@@ -146,13 +152,7 @@
            </el-form-item>
          </el-col>
        </el-row>
        <el-row :gutter="30">
          <el-col :span="12">
            <el-form-item label="付款方式">
              <el-input v-model="form.paymentMethod" placeholder="请输入" clearable :disabled="operationType === 'view'" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-form-item label="产品信息:" prop="entryDate">
            <el-button v-if="operationType !== 'view'" type="primary" @click="openProductForm('add')">添加</el-button>
@@ -202,15 +202,15 @@
          </el-col>
        </el-row>
      </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>
    <el-dialog v-model="productFormVisible" :title="productOperationType === 'add' ? '新增产品' : '编辑产品'" width="40%"
      @close="closeProductDia">
    </FormDialog>
    <FormDialog
      v-model="productFormVisible"
      :title="productOperationType === 'add' ? '新增产品' : '编辑产品'"
      :width="'40%'"
      :operation-type="productOperationType"
      @close="closeProductDia"
      @confirm="submitProduct"
      @cancel="closeProductDia">
      <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef">
        <el-row :gutter="30">
          <el-col :span="24">
@@ -226,7 +226,7 @@
        <el-row :gutter="30">
          <el-col :span="24">
            <el-form-item label="规格型号:" prop="productModelId">
              <el-select v-model="productForm.productModelId" placeholder="请选择" clearable @change="getProductModel">
              <el-select v-model="productForm.productModelId" placeholder="请选择" clearable @change="getProductModel" filterable>
                <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id" />
              </el-select>
            </el-form-item>
@@ -287,13 +287,7 @@
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button type="primary" @click="submitProduct">确认</el-button>
          <el-button @click="closeProductDia">取消</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
        <!-- æ‰“印预览弹窗 -->
        <el-dialog
            v-model="printPreviewVisible"
@@ -328,12 +322,15 @@
                                        <span class="value">{{ formatDate(item.createTime) }}</span>
                                    </div>
                                    <div>
                                        <span class="label">客户名称:</span>
                                        <span class="value">{{ item.customerName || '张爱有' }}</span>
                                        <span class="label">发货车牌号:</span>
                                        <span class="value">{{ item.shippingCarNumber }}</span>
                                    </div>
                                </div>
                                <div class="info-row">
                                    <div>
                                        <span class="label">客户名称:</span>
                                        <span class="value">{{ item.customerName || '张爱有' }}</span>
                                    </div>
                                    <span class="label">单号:</span>
                                    <span class="value">{{ item.salesContractNo }}</span>
                                </div>
@@ -459,10 +456,11 @@
import pagination from "@/components/PIMTable/Pagination.vue";
import {onMounted, ref} from "vue";
import { addShippingInfo } from "@/api/salesManagement/deliveryLedger.js";
import {ElMessage, ElMessageBox} from "element-plus";
import { ElMessageBox } from "element-plus";
import useUserStore from "@/store/modules/user";
import { userListNoPage } from "@/api/system/user.js";
import FileListDialog from '@/components/Dialog/FileListDialog.vue';
import FormDialog from '@/components/Dialog/FormDialog.vue';
import {
  ledgerListPage,
  productList,
@@ -503,9 +501,7 @@
const data = reactive({
  searchForm: {
    customerName: "", // å®¢æˆ·åç§°
    customerContractNo: "", // å®¢æˆ·åˆåŒç¼–号
    salesContractNo: "", // é”€å”®åˆåŒç¼–号
    projectName: "", // é¡¹ç›®åç§°
    entryDate: null, // å½•入日期
    entryDateStart: undefined,
    entryDateEnd: undefined,
@@ -513,23 +509,16 @@
  form: {
    salesContractNo: "",
    salesman: "",
    customerContractNo: "",
    customerId: "",
    projectName: "",
    entryPerson: "",
    entryDate: "",
    maintenanceTime: "",
    productData: [],
    executionDate: "",
    paymentMethod: "",
  },
  rules: {
    salesman: [{ required: true, message: "请选择", trigger: "change" }],
    customerContractNo: [
      { required: true, message: "请输入", trigger: "blur" },
    ],
    customerId: [{ required: true, message: "请选择", trigger: "change" }],
    projectName: [{ required: true, message: "请输入", trigger: "blur" }],
    entryPerson: [{ required: true, message: "请选择", trigger: "change" }],
    entryDate: [{ required: true, message: "请选择", trigger: "change" }],
    executionDate: [{ required: true, message: "请选择", trigger: "change" }],
@@ -620,7 +609,11 @@
// æŸ¥è¯¢åˆ—表
/** æœç´¢æŒ‰é’®æ“ä½œ */
const handleQuery = () => {
  // åªæœ‰åœ¨ç‚¹å‡»æœç´¢æŒ‰é’®æ—¶æ‰é‡ç½®é¡µç åˆ°ç¬¬ä¸€é¡µ
  // é¿å…è¡¨å•字段change事件干扰分页
  if (arguments.length === 0) {
  page.current = 1;
  }
    expandedRowKeys.value = [];
  getList();
};
@@ -632,7 +625,11 @@
const getList = () => {
  tableLoading.value = true;
  const { entryDate, ...rest } = searchForm;
  ledgerListPage({ ...rest, ...page })
  // å°†èŒƒå›´æ—¥æœŸå­—段传递给后端
  const params = { ...rest, ...page };
  // ç§»é™¤å½•入日期的默认值设置,只保留范围日期字段
  delete params.entryDate;
  ledgerListPage(params)
    .then((res) => {
      tableLoading.value = false;
      tableData.value = res.records;
@@ -662,7 +659,6 @@
  });
};
const getProductModel = (value) => {
  console.log("value", value);
  const index = modelOptions.value.findIndex((item) => item.id === value);
  if (index !== -1) {
    productForm.value.specificationModel = modelOptions.value[index].model;
@@ -756,7 +752,12 @@
    customerOption.value = res;
  });
  form.value.entryPerson = userStore.id;
  if (type !== "add") {
  if (type === "add") {
    // æ–°å¢žæ—¶è®¾ç½®å½•入日期为当天
    form.value.entryDate = getCurrentDate();
    // ç­¾è®¢æ—¥æœŸé»˜è®¤ä¸ºå½“天
    form.value.executionDate = getCurrentDate();
  } else {
    currentId.value = row.id;
    getSalesLedgerWithProducts({ id: row.id, type: 1 }).then((res) => {
      form.value = { ...res };
src/views/salesManagement/salesQuotation/index.vue
@@ -61,13 +61,6 @@
            Â¥{{ scope.row.totalAmount.toFixed(2) }}
          </template>
        </el-table-column>
<!--        <el-table-column prop="status" label="报价状态" width="100">-->
<!--          <template #default="scope">-->
<!--            <el-tag :type="getStatusType(scope.row.status)">-->
<!--              {{ scope.row.status }}-->
<!--            </el-tag>-->
<!--          </template>-->
<!--        </el-table-column>-->
        <el-table-column label="操作" width="250" fixed="right" align="center">
          <template #default="scope">
            <el-button link type="primary" @click="handleView(scope.row)">查看</el-button>
@@ -88,7 +81,7 @@
    </el-card>
    <!-- æ–°å¢ž/编辑对话框 -->
    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="1300px" :close-on-click-modal="false">
    <FormDialog v-model="dialogVisible" :title="dialogTitle" width="80%" :close-on-click-modal="false" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
        <!-- åŸºæœ¬ä¿¡æ¯ -->
        <el-card class="form-card" shadow="never">
@@ -152,18 +145,6 @@
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="12">
              <el-form-item label="交货期" prop="deliveryPeriod">
                <el-date-picker
                  v-model="form.deliveryPeriod"
                  type="date"
                  placeholder="选择交货期"
                  style="width: 100%"
                  format="YYYY-MM-DD"
                  value-format="YYYY-MM-DD"
                />
              </el-form-item>
            </el-col>
          </el-row>
        </el-card>
@@ -207,11 +188,6 @@
                                </el-select>
              </template>
            </el-table-column>
            <el-table-column prop="quantity" label="数量">
              <template #default="scope">
                <el-input-number v-model="scope.row.quantity" :min="1" :precision="0" style="width: 100%" />
              </template>
            </el-table-column>
            <el-table-column prop="unit" label="单位">
              <template #default="scope">
                <el-input v-model="scope.row.unit" placeholder="单位" />
@@ -219,12 +195,7 @@
            </el-table-column>
            <el-table-column prop="unitPrice" label="单价">
              <template #default="scope">
                <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="2" style="width: 100%" @change="calculateAmount(scope.row)" />
              </template>
            </el-table-column>
            <el-table-column prop="amount" label="金额" width="120">
              <template #default="scope">
                <span>Â¥{{ scope.row.amount.toFixed(2) }}</span>
                <el-input-number v-model="scope.row.unitPrice" :min="0" :precision="2" style="width: 100%" />
              </template>
            </el-table-column>
            <el-table-column label="操作" width="80" align="center">
@@ -233,47 +204,6 @@
              </template>
            </el-table-column>
          </el-table>
        </el-card>
        <!-- è´¹ç”¨ä¿¡æ¯ -->
        <el-card class="form-card" shadow="never">
          <template #header>
            <span class="card-title">费用信息</span>
          </template>
          <el-row :gutter="20">
            <el-col :span="8">
              <el-form-item label="产品小计">
                <el-input-number v-model="form.subtotal" :precision="2" :min="0" style="width: 100%" readonly />
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="运费">
                <el-input-number v-model="form.freight" :precision="2" :min="0" style="width: 100%" @change="calculateTotal" />
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="其他费用">
                <el-input-number v-model="form.otherFee" :precision="2" :min="0" style="width: 100%" @change="calculateTotal" />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="20">
            <el-col :span="8">
              <el-form-item label="折扣率(%)">
                <el-input-number v-model="form.discountRate" :precision="2" :min="0" :max="100" style="width: 100%" @change="calculateTotal" />
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="折扣金额">
                <el-input-number v-model="form.discountAmount" :precision="2" :min="0" style="width: 100%" readonly />
              </el-form-item>
            </el-col>
            <el-col :span="8">
              <el-form-item label="报价总额">
                <el-input-number v-model="form.totalAmount" :precision="2" :min="0" style="width: 100%" readonly />
              </el-form-item>
            </el-col>
          </el-row>
        </el-card>
        <!-- å¤‡æ³¨ä¿¡æ¯ -->
@@ -286,13 +216,7 @@
          </el-form-item>
        </el-card>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="handleSubmit">ç¡® å®š</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
    <!-- æŸ¥çœ‹è¯¦æƒ…对话框 -->
    <el-dialog v-model="viewDialogVisible" title="报价详情" width="800px">
@@ -303,7 +227,6 @@
        <el-descriptions-item label="报价日期">{{ currentQuotation.quotationDate }}</el-descriptions-item>
        <el-descriptions-item label="有效期至">{{ currentQuotation.validDate }}</el-descriptions-item>
        <el-descriptions-item label="付款方式">{{ currentQuotation.paymentMethod }}</el-descriptions-item>
        <el-descriptions-item label="交货期">{{ currentQuotation.deliveryPeriod }}</el-descriptions-item>
<!--        <el-descriptions-item label="报价状态">-->
<!--          <el-tag :type="getStatusType(currentQuotation.status)">{{ currentQuotation.status }}</el-tag>-->
<!--        </el-descriptions-item>-->
@@ -317,16 +240,10 @@
        <el-table :data="currentQuotation.products" border style="width: 100%">
          <el-table-column prop="product" label="产品名称" />
          <el-table-column prop="specification" label="规格型号" />
          <el-table-column prop="quantity" label="数量" />
          <el-table-column prop="unit" label="单位" />
          <el-table-column prop="unitPrice" label="单价">
            <template #default="scope">
              Â¥{{ scope.row.unitPrice.toFixed(2) }}
            </template>
          </el-table-column>
          <el-table-column prop="amount" label="金额">
            <template #default="scope">
              Â¥{{ scope.row.amount.toFixed(2) }}
            </template>
          </el-table-column>
        </el-table>
@@ -345,6 +262,7 @@
import { ElMessage, ElMessageBox } from 'element-plus'
import { Search } from '@element-plus/icons-vue'
import Pagination from '@/components/PIMTable/Pagination.vue'
import FormDialog from '@/components/Dialog/FormDialog.vue'
import {getQuotationList,addQuotation,updateQuotation,deleteQuotation} from '@/api/salesManagement/salesQuotation.js'
import {userListNoPage} from "@/api/system/user.js";
import {customerList} from "@/api/salesManagement/salesLedger.js";
@@ -377,7 +295,6 @@
  quotationDate: '',
  validDate: '',
  paymentMethod: '',
  deliveryPeriod: '',
  status: '草稿',
  remark: '',
  products: [],
@@ -394,8 +311,7 @@
  salesperson: [{ required: true, message: '请选择业务员', trigger: 'change' }],
  quotationDate: [{ required: true, message: '请选择报价日期', trigger: 'change' }],
  validDate: [{ required: true, message: '请选择有效期', trigger: 'change' }],
  paymentMethod: [{ required: true, message: '请选择付款方式', trigger: 'change' }],
  deliveryPeriod: [{ required: true, message: '请选择交货期', trigger: 'change' }]
  paymentMethod: [{ required: true, message: '请选择付款方式', trigger: 'change' }]
}
const userList = ref([]);
const customerOption = ref([]);
@@ -545,7 +461,6 @@
    quotationDate: row.quotationDate || '',
    validDate: row.validDate || '',
    paymentMethod: row.paymentMethod || '',
    deliveryPeriod: row.deliveryPeriod || '',
    status: row.status || '',
    remark: row.remark || '',
    products: row.products ? row.products.map(product => ({
@@ -574,7 +489,6 @@
  form.quotationDate = row.quotationDate || ''
  form.validDate = row.validDate || ''
  form.paymentMethod = row.paymentMethod || ''
  form.deliveryPeriod = row.deliveryPeriod || ''
  form.status = row.status || '草稿'
  form.remark = row.remark || ''
  form.products = row.products ? row.products.map(product => ({
@@ -625,7 +539,6 @@
  form.quotationDate = ''
  form.validDate = ''
  form.paymentMethod = ''
  form.deliveryPeriod = ''
  form.status = '草稿'
  form.remark = ''
  form.products = []
@@ -746,7 +659,6 @@
        quotationDate: item.quotationDate || '',
        validDate: item.validDate || '',
        paymentMethod: item.paymentMethod || '',
        deliveryPeriod: item.deliveryPeriod || '',
        status: item.status || '草稿',
        remark: item.remark || '',
        products: item.products ? item.products.map(product => ({
src/views/salesManagement/salespersonManagement/index.vue
@@ -86,7 +86,7 @@
    </el-card>
    <!-- æ–°å¢ž/编辑对话框 -->
    <el-dialog v-model="dialogVisible" :title="dialogTitle" width="600px">
    <FormDialog v-model="dialogVisible" :title="dialogTitle" :width="'600px'" @close="dialogVisible = false" @confirm="handleSubmit" @cancel="dialogVisible = false">
      <el-form :model="form" :rules="rules" ref="formRef" label-width="100px">
        <el-row :gutter="20">
          <el-col :span="12">
@@ -147,16 +147,10 @@
          </el-col>
        </el-row>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="dialogVisible = false">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="handleSubmit">ç¡® å®š</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
    <!-- æƒé™è®¾ç½®å¯¹è¯æ¡† -->
    <el-dialog v-model="permissionDialogVisible" title="权限设置" width="500px">
    <FormDialog v-model="permissionDialogVisible" title="权限设置" :width="'500px'" @close="permissionDialogVisible = false" @confirm="savePermissions" @cancel="permissionDialogVisible = false">
      <el-form label-width="100px">
        <el-form-item label="业务员姓名">
          <span>{{ currentSalesperson.name }}</span>
@@ -172,13 +166,7 @@
          </el-checkbox-group>
        </el-form-item>
      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="permissionDialogVisible = false">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="savePermissions">ç¡® å®š</el-button>
        </div>
      </template>
    </el-dialog>
    </FormDialog>
  </div>
</template>
@@ -188,6 +176,7 @@
import {listPage,add,update,deleteSalespersonManagement} from '@/api/salesManagement/salespersonManagement.js'
import { Plus, Search } from '@element-plus/icons-vue'
import Pagination from '@/components/PIMTable/Pagination.vue'
import FormDialog from '@/components/Dialog/FormDialog.vue'
const salespersonList = ref([])
const total = ref(0)