gaoluyang
2 天以前 a00484ae729aed9a664050362fa2b8c6a4ce4fd6
1.库存管理页面联调
已修改5个文件
已添加4个文件
431 ■■■■ 文件已修改
src/api/salesOutbound/index.js 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/warehouseManagement/index.js 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/getCurrentDate.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/summarizeTable.js 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/inspectionManagement/index.vue 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesOutbound/components/formDia.vue 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/salesOutbound/index.vue 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/warehouseManagement/index.vue 181 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/salesOutbound/index.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
// é”€å”®å‡ºåº“
import request from '@/utils/request'
// æŸ¥è¯¢åˆ—表
export function salesRecordList(query) {
    return request({
        url: '/salesRecord/list',
        method: 'get',
        params: query
    })
}
// æäº¤æ–°å¢žã€ä¿®æ”¹
export function addOrEditSalesRecord(query) {
    return request({
        url: '/salesRecord/addOrEditSalesRecord',
        method: 'post',
        data: query
    })
}
// æŸ¥è¯¢å®¢æˆ·
export function customerList(query) {
    return request({
        url: '/customer/customerList',
        method: 'get',
        params: query
    })
}
src/api/warehouseManagement/index.js
@@ -49,3 +49,19 @@
        params: query
    })
}
// æäº¤åˆå¹¶
export function merge(query) {
    return request({
        url: '/officialInventory/merge',
        method: 'post',
        data: query
    })
}
// æ­£å¼åº“存编辑
export function editOfficial(query) {
    return request({
        url: '/officialInventory/editOfficial',
        method: 'post',
        data: query
    })
}
src/main.js
@@ -43,6 +43,8 @@
import ImagePreview from "@/components/ImagePreview"
// å­—典标签组件
import DictTag from '@/components/DictTag'
import {summarizeTable} from "@/utils/summarizeTable.js";
import {getCurrentDate} from "@/utils/getCurrentDate.js";
const app = createApp(App)
@@ -55,6 +57,8 @@
app.config.globalProperties.addDateRange = addDateRange
app.config.globalProperties.selectDictLabel = selectDictLabel
app.config.globalProperties.selectDictLabels = selectDictLabels
app.config.globalProperties.summarizeTable = summarizeTable
app.config.globalProperties.getCurrentDate = getCurrentDate
// å…¨å±€ç»„件挂载
app.component('DictTag', DictTag)
src/utils/getCurrentDate.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
// src/utils/utils.js
export function getCurrentDate() {
    const today = new Date();
    const year = today.getFullYear();
    const month = String(today.getMonth() + 1).padStart(2, '0'); // æœˆä»½ä»Ž0开始
    const day = String(today.getDate()).padStart(2, '0');
    return `${year}-${month}-${day}`;
}
src/utils/summarizeTable.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
/**
 * é€šç”¨çš„表格合计方法
 * @param {Object} param - åŒ…含表格列配置和数据源的对象
 * @param {Array<string>} summaryProps - éœ€è¦æ±‡æ€»çš„字段名数组
 * @param {Object} specialFormat - ç‰¹æ®Šæ ¼å¼åŒ–规则:字段名 -> æ ¼å¼åŒ–选项(如是否去掉小数)
 * @returns {Array} åˆè®¡è¡Œæ•°æ®
 */
const summarizeTable = (param, summaryProps, specialFormat = {}) => {
    const { columns, data } = param;
    const sums = [];
    columns.forEach((column, index) => {
        if (index === 0) {
            sums[index] = '合计';
            return;
        }
        const prop = column.property;
        if (summaryProps.includes(prop)) {
            const values = data.map(item => Number(item[prop]));
            // åªå¯¹æœ‰æ•ˆæ•°å­—进行求和
            if (!values.every(isNaN)) {
                const sum = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0);
                if (specialFormat[prop] && specialFormat[prop].noDecimal) {
                    // å¦‚果指定了不需要保留小数,则直接转换为整数
                    sums[index] = Math.round(sum).toString();
                } else {
                    // é»˜è®¤ä¿ç•™ä¸¤ä½å°æ•°
                    sums[index] = parseFloat(sum).toFixed(specialFormat[prop]?.decimalPlaces ?? 2);
                }
            } else {
                sums[index] = '';
            }
        } else {
            sums[index] = '';
        }
    });
    return sums;
}
// ä¸å«ç¨Žæ€»ä»·è®¡ç®—
const calculateTaxExclusiveTotalPrice = (taxInclusiveTotalPrice, taxRate) => {
    const taxRateDecimal = taxRate / 100;
    return (taxInclusiveTotalPrice / (1 + taxRateDecimal)).toFixed(2);
}
// å«ç¨Žæ€»ä»·è®¡ç®—
const calculateTaxIncludeTotalPrice = (taxInclusiveUnitPrice, quantity) => {
    return (taxInclusiveUnitPrice * quantity).toFixed(2);
}
// å¯¼å‡ºå‡½æ•°ä¾›å…¶ä»–文件使用
export { summarizeTable, calculateTaxExclusiveTotalPrice ,calculateTaxIncludeTotalPrice};
src/views/inspectionManagement/index.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
<template>
  <div class="app-container">
  </div>
</template>
<script setup>
</script>
<style scoped>
</style>
src/views/salesOutbound/components/formDia.vue
@@ -2,12 +2,12 @@
  <div>
    <el-dialog :title="operationType === 'add' ? '新增出库' : '编辑出库'"
               v-model="dialogVisitable" width="800px" @close="cancel">
      <el-form :model="form" :rules="rules" ref="userRef" label-width="100px">
      <el-form :model="form" :rules="rules" ref="formRef" label-width="120px">
        <el-row>
          <el-col :span="12">
            <el-form-item label="销售日期" prop="userName">
            <el-form-item label="销售日期" prop="saleDate">
              <el-date-picker
                  v-model="form.userName"
                  v-model="form.saleDate"
                  type="date"
                  value-format="YYYY-MM-DD"
                  format="YYYY-MM-DD"
@@ -18,8 +18,8 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="客户" prop="nickName">
              <el-select v-model="form.nickName" placeholder="请选择客户">
            <el-form-item label="客户" prop="customerId">
              <el-select v-model="form.customerId" placeholder="请选择客户">
                <el-option
                    v-for="item in customerOptions"
                    :key="item.value"
@@ -32,8 +32,8 @@
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="煤种" prop="type">
              <el-select v-model="form.nickName" placeholder="请选择煤种">
            <el-form-item label="煤种" prop="coalId">
              <el-select v-model="form.coalId" placeholder="请选择煤种">
                <el-option
                    v-for="item in typeOptions"
                    :key="item.value"
@@ -44,39 +44,56 @@
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="单位" prop="nickName">
              <el-input v-model="form.nickName" placeholder="请输入单位" maxlength="30" />
            <el-form-item label="单位" prop="unit">
              <el-input v-model="form.unit" placeholder="请输入单位" maxlength="30" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="销售数量" prop="userName">
              <el-input v-model="form.userName" placeholder="请输入销售数量" maxlength="30" type="number" />
            <el-form-item label="库存数量" prop="inventoryQuantity">
              <el-input v-model="form.inventoryQuantity" placeholder="请输入销售数量" maxlength="30" type="number" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="销售单价" prop="userName">
              <el-input v-model="form.userName" placeholder="请输入销售单价(含税)" maxlength="30" type="number" />
            <el-form-item label="单价(含税)" prop="priceIncludingTax">
              <el-input v-model="form.priceIncludingTax" placeholder="请输入销售单价(含税)" maxlength="30" type="number" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="销售总价" prop="userName">
              <el-input v-model="form.userName" placeholder="请输入销售总价(含税)" maxlength="30" type="number" />
            <el-form-item label="销售数量" prop="saleQuantity">
              <el-input v-model="form.saleQuantity" placeholder="请输入销售数量" maxlength="30" type="number" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="热值" prop="userName">
              <el-input v-model="form.userName" placeholder="请输入热值" maxlength="30" />
            <el-form-item label="销售单价(含税)" prop="salePrice">
              <el-input v-model="form.salePrice" placeholder="请输入销售单价(含税)" maxlength="30" type="number" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="利润" prop="userName">
              <el-input v-model="form.userName" placeholder="利润" maxlength="30" type="number" />
            <el-form-item label="购销煤税率(%)" prop="taxCoal">
              <el-input v-model="form.taxCoal" placeholder="请输入销售总价(含税)" maxlength="30" type="number" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="运输税率(%)" prop="taxTrans">
              <el-input v-model="form.taxTrans" placeholder="请输入销售总价(含税)" maxlength="30" type="number" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="毛利润" prop="grossProfit">
              <el-input v-model="form.grossProfit" placeholder="毛利润" maxlength="30" type="number" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="净利润" prop="netProfit">
              <el-input v-model="form.netProfit" placeholder="净利润" maxlength="30" type="number" />
            </el-form-item>
          </el-col>
        </el-row>
@@ -93,6 +110,7 @@
<script setup>
import {ref, reactive} from "vue";
import {addOrEditSalesRecord, customerList} from "../../../api/salesOutbound/index.js";
const { proxy } = getCurrentInstance()
const emit = defineEmits()
@@ -101,13 +119,23 @@
const customerOptions = ref([]) // å®¢æˆ·ä¸‹æ‹‰æ¡†
const typeOptions = ref([]) // ç…¤ç§ä¸‹æ‹‰æ¡†
const data = reactive({
  form: {},
  form: {
    saleDate: '',
    customerId: '',
    coalId: '',
    unit: '',
    saleQuantity: '',
    salePrice: '',
    totalAmount: '',
    taxCoal: '',
    taxTrans: '',
    grossProfit: '',
    netProfit: '',
    inventoryQuantity: '',
    priceIncludingTax: '',
  },
  rules: {
    userName: [{ required: true, message: "登录账号不能为空", trigger: "blur" },],
    nickName: [{ required: true, message: "用户姓名不能为空", trigger: "blur" }],
    roleIds: [{ required: true, message: "角色不能为空", trigger: "change" }],
    deptId: [{ required: true, message: "部门不能为空", trigger: "change" }],
    password: [{ required: true, message: "用户密码不能为空", trigger: "blur" }, { min: 5, max: 20, message: "用户密码长度必须介于 5 å’Œ 20 ä¹‹é—´", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "不能包含非法字符:< > \" ' \\\ |", trigger: "blur" }],
    saleDate: [{ required: true, message: "请选择日期", trigger: "change" },],
  }
})
@@ -117,18 +145,25 @@
const openDialog = (type, row) => {
  console.log('openDialog', type, row)
  dialogVisitable.value = true
  form.value.saleDate = proxy.getCurrentDate()
  customerList().then((res) => {
    console.log(res)
  })
}
// æäº¤åˆå¹¶è¡¨å•
const submitForm = () => {
  proxy.$refs["userRef"].validate(valid => {
  proxy.$refs["formRef"].validate(valid => {
    if (valid) {
      addOrEditSalesRecord(form.value).then(() => {
        cancel()
        proxy.$modal.msgSuccess('提交成功')
      })
    }
  })
}
// å…³é—­åˆå¹¶è¡¨å•
const cancel = () => {
  proxy.resetForm("userRef")
  proxy.resetForm("formRef")
  dialogVisitable.value = false
  emit('closeDia')
}
src/views/salesOutbound/index.vue
@@ -79,12 +79,13 @@
</template>
<script setup>
import {ref, reactive} from "vue";
import {ref, reactive, onMounted} from "vue";
const { proxy } = getCurrentInstance()
import {Delete, Download, Plus} from "@element-plus/icons-vue";
import ETable from "@/components/Table/ETable.vue";
import Pagination from "@/components/Pagination/index.vue";
import FormDia from "@/views/salesOutbound/components/formDia.vue";
import {salesRecordList} from "../../api/salesOutbound/index.js";
const formDia = ref()
const activeTab = ref("out");
@@ -96,17 +97,21 @@
const tableLoading = ref(false);
const tableData = ref([]);
const columns = ref([
  { prop: "supplierName", label: "销售日期", minWidth: 160 },
  { prop: "identifyNumber", label: "客户", minWidth: 120 },
  { prop: "address", label: "煤种", minWidth: 150 },
  { prop: "saleDate", label: "销售日期", minWidth: 160 },
  { prop: "customer", label: "客户", minWidth: 120 },
  { prop: "coal", label: "煤种", minWidth: 150 },
  { prop: "unit", label: "单位", minWidth: 150 },
  { prop: "bank", label: "库存数量", minWidth: 120 },
  { prop: "bankAccount", label: "销售单价(含税)", minWidth: 150 },
  { prop: "contacts", label: "销售总价(含税)", minWidth: 120 },
  { prop: "contacts", label: "利润", minWidth: 90 },
  { prop: "contactAddress", label: "热值", minWidth: 150 },
  { prop: "maintainer", label: "维护人", minWidth: 100 },
  { prop: "maintainDate", label: "维护日期", minWidth: 100 },
  { prop: "priceIncludingTax", label: "单价(含税)", minWidth: 150 },
  { prop: "inventoryQuantity", label: "库存数量", minWidth: 120 },
  { prop: "saleQuantity", label: "销售数量", minWidth: 120 },
  { prop: "salePrice", label: "销售单价(含税)", minWidth: 150 },
  { prop: "totalAmount", label: "销售总价(含税)", minWidth: 120 },
  { prop: "taxCoal", label: "购销煤税率(%)", minWidth: 120 },
  { prop: "taxTrans", label: "运输税率(%)", minWidth: 120 },
  { prop: "grossProfit", label: "毛利润", minWidth: 90 },
  { prop: "netProfit", label: "净利润", minWidth: 90 },
  { prop: "registrant", label: "登记人", minWidth: 100 },
  { prop: "registrationDate", label: "登记日期", minWidth: 100 },
]);
const selectedRows = ref([]);
const total = ref(0);
@@ -119,13 +124,22 @@
  identifyNumber: "",
  address: "",
})
onMounted(() => {
  handleQuery()
});
// ç‚¹å‡»æŸ¥è¯¢
const handleQuery = () => {
  pageNum.value = 1
  pageSize.value = 10
  getList()
}
const getList = () => {
  tableLoading.value = true;
  setTimeout(() => {
  salesRecordList({...queryParams, current: pageNum.value, size: pageSize.value}).then(res => {
    tableLoading.value = false;
  }, 500);
    tableData.value = res.data.records;
    total.value = res.data.total;
  })
}
// é‡ç½®æŸ¥è¯¢
const resetQuery = () => {
src/views/warehouseManagement/index.vue
@@ -38,29 +38,32 @@
      </el-tabs>
      <!-- æ“ä½œæŒ‰é’®åŒº -->
      <el-space>
        <el-button type="danger" :icon="Delete">删除</el-button>
<!--        <el-button type="danger" :icon="Delete">删除</el-button>-->
        <el-button type="info" plain :icon="Download">导出</el-button>
        <el-button type="success" plain :icon="Refresh" v-if="activeTab=== 'officialInventory'" @click="mergeRows">合并</el-button>
        <el-button type="success" plain :icon="Refresh" v-if="activeTab=== 'officialInventory'" @click="mergeRows('merge')">合并</el-button>
      </el-space>
      <div>
        <el-table :data="tableData" border @selection-change="selectionChange" style="width: 100%">
        <el-table :data="tableData" border @selection-change="selectionChange" style="width: 100%" show-summary :summary-method="summarizeChildrenTable">
          <el-table-column type="selection" width="55" align="center" />
          <el-table-column label="序号" type="index" width="60" align="center" />
          <el-table-column prop="supplierName" label="供货商名称" width="180" sortable/>
          <el-table-column prop="coal" label="煤种" sortable/>
          <el-table-column prop="unit" label="单位" width="70"/>
          <el-table-column prop="inventoryQuantity" label="库存数量" sortable min-width="110"/>
          <el-table-column prop="priceIncludingTax" label="单价(含税)" sortable width="130"/>
          <el-table-column prop="totalPriceIncludingTax" label="总价(含税)" width="130" />
          <el-table-column prop="costPerUnit" label="成本单价" />
          <el-table-column prop="priceIncludingTax" label="单价(含税)" sortable width="130"/>
          <el-table-column prop="totalPriceIncludingTax" label="总价(含税)" width="130" />
          <el-table-column prop="priceExcludingTax" label="单价(不含税)" width="130" />
          <el-table-column prop="totalPriceExcludingTax" label="总价(不含税)" width="130" />
          <el-table-column prop="pendingReplenishment" label="待补库" width="130" />
          <el-table-column label="煤质" align="center" v-if="activeTab=== 'officialInventory'" width="600">
            <el-table-column v-for="col in columnTitle" :key="col.prop" :prop="col.prop" :label="col.label" align="center" sortable min-width="200"/>
          </el-table-column>
          <el-table-column prop="registrantId" label="登记人" width="180"/>
          <el-table-column prop="registrationDate" label="登记日期" width="180"/>
          <el-table-column fixed="right" label="操作" min-width="60" align="center" v-if="activeTab !== 'officialInventory'">
          <el-table-column fixed="right" label="操作" min-width="60" align="center">
            <template #default="scope">
              <el-button link type="primary" size="small" @click="reviewDia(scope.row)">审核</el-button>
              <el-button link type="primary" size="small" @click="reviewDia(scope.row)" v-if="activeTab !== 'officialInventory'">审核</el-button>
              <el-button link type="primary" size="small" @click="mergeRows('edit', scope.row)" v-else>编辑</el-button>
            </template>
          </el-table-column>
        </el-table>
@@ -115,10 +118,17 @@
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="成本单价" prop="costPerUnit">
              <el-input v-model="form.costPerUnit" placeholder="请输入成本单价" maxlength="30" />
            <el-form-item label="单价(不含税)" prop="priceExcludingTax">
              <el-input v-model="form.priceExcludingTax" placeholder="请输入成本单价" maxlength="30" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="总价(不含税)" prop="totalPriceExcludingTax">
              <el-input v-model="form.totalPriceExcludingTax" placeholder="请输入成本单价" maxlength="30" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="煤质方案" prop="qualityPlan">
              <el-select v-model="form.qualityPlan" placeholder="请选择" @change="coalPlanByIdList" clearable>
@@ -150,40 +160,60 @@
    </el-dialog>
    <!-- åˆå¹¶æ•°æ®å¼¹æ¡† -->
    <el-dialog title="合并库存" v-model="mergeVisible" width="800px">
      <el-form :model="form" :rules="rules" ref="userRef" label-width="100px">
      <el-form :model="mergeForm" :rules="mergeRules" ref="mergeRef" label-width="100px">
        <el-row>
          <el-col :span="12">
            <el-form-item label="供货商名称" prop="supplierName">
              <el-input v-model="form.supplierName" placeholder="请输入手机号码" maxlength="30" />
              <el-input v-model="mergeForm.supplierName" placeholder="请输入供货商名称" maxlength="30" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="煤种" prop="coal">
              <el-input v-model="form.coal" placeholder="请输入姓名" maxlength="30" />
              <el-input v-model="mergeForm.coal" placeholder="请输入煤种" maxlength="30" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="单位" prop="unit">
              <el-input v-model="mergeForm.unit" placeholder="请输入单位" maxlength="30" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="库存数量" prop="inventoryQuantity">
              <el-input v-model="mergeForm.inventoryQuantity" placeholder="请输入库存数量" :max="inventoryQuantity" type="number"/>
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="单价(含税)" prop="priceIncludingTax">
              <el-input v-model="form.priceIncludingTax" placeholder="请输入手机号码" maxlength="30" />
              <el-input v-model="mergeForm.priceIncludingTax" placeholder="请输入单价(含税)" maxlength="30" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="总价(含税)" prop="totalPriceIncludingTax">
              <el-input v-model="form.totalPriceIncludingTax" placeholder="请输入手机号码" maxlength="30" />
              <el-input v-model="mergeForm.totalPriceIncludingTax" placeholder="请输入总价(含税)" maxlength="30" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="12">
            <el-form-item label="成本单价" prop="costPerUnit">
              <el-input v-model="form.costPerUnit" placeholder="请输入姓名" maxlength="30" />
            <el-form-item label="单价(不含税)" prop="priceExcludingTax">
              <el-input v-model="mergeForm.priceExcludingTax" placeholder="请输入单价(不含税)" maxlength="30" />
            </el-form-item>
          </el-col>
          <el-col :span="12">
            <el-form-item label="煤质" prop="userName">
              <el-input v-model="form.userName" placeholder="请输入手机号码" maxlength="30" />
            <el-form-item label="总价(不含税)" prop="totalPriceExcludingTax">
              <el-input v-model="mergeForm.totalPriceExcludingTax" placeholder="请输入总价(不含税)" maxlength="30" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-divider></el-divider>
        <el-row>
          <el-col :span="12" v-for="item in filteredList" :key="item.id">
            <el-form-item :label="item.fieldName">
              <el-input v-model="mergeForm[item.fields]" />
            </el-form-item>
          </el-col>
        </el-row>
@@ -208,12 +238,12 @@
  coalPlanList, officialInventoryList,
  pendingInventoryList
} from "@/api/warehouseManagement/index.js";
import {editOfficial, merge} from "../../api/warehouseManagement/index.js";
const { proxy } = getCurrentInstance()
const tableData = ref([])
const selectedRows = ref([])
const columns = ref([])
const qualityPlanOption = ref([])
const filteredList = ref([])
const tableLoading = ref(false);
@@ -221,10 +251,14 @@
const pageNum = ref(1);
const pageSize = ref(10);
const inventoryQuantity = ref(0);
const count = ref(0);
const mean = ref(0);
const totalPrice = ref(0);
// å®¡æ ¸å¼¹æ¡†
const reviewVisible = ref(false);
// åˆå¹¶å¼¹æ¡†
const mergeVisible = ref(false)
const operationType = ref('')
const data = reactive({
  form: {
    supplierName: '',
@@ -233,7 +267,20 @@
    inventoryQuantity: '',
    priceIncludingTax: '',
    totalPriceIncludingTax: '',
    costPerUnit: '',
    priceExcludingTax: '',
    totalPriceExcludingTax: '',
    qualityPlan: '',
    pId: '',
  },
  mergeForm: {
    supplierName: '',
    coal: '',
    unit: '',
    inventoryQuantity: '',
    priceIncludingTax: '',
    totalPriceIncludingTax: '',
    priceExcludingTax: '',
    totalPriceExcludingTax: '',
    qualityPlan: '',
    pId: '',
  },
@@ -242,10 +289,16 @@
    coal: [{ required: true, message: "请输入煤种", trigger: "blur" }],
    unit: [{ required: true, message: "请输入单位", trigger: "blur" }],
    qualityPlan: [{ required: true, message: "请选择", trigger: "change" }],
  },
  mergeRules: {
    supplierName: [{ required: true, message: "请输入供应商名称", trigger: "blur" }],
    coal: [{ required: true, message: "请输入煤种", trigger: "blur" }],
    unit: [{ required: true, message: "请输入单位", trigger: "blur" }],
    qualityPlan: [{ required: true, message: "请选择", trigger: "change" }],
  }
})
const { form, rules } = toRefs(data)
const { form, rules, mergeForm, mergeRules } = toRefs(data)
// å½“前标签
const activeTab = ref("pendingInbound");
const tabName = ref("pendingInbound");
@@ -269,6 +322,9 @@
  tableData.value = [];
  getList();
};
const summarizeChildrenTable = (param) => {
  return proxy.summarizeTable(param, ['inventoryQuantity', 'priceIncludingTax', 'totalPriceIncludingTax','priceExcludingTax','totalPriceExcludingTax']);
}
// ç‚¹å‡»æŸ¥è¯¢
const handleQuery = () => {
  pageNum.value = 1
@@ -326,6 +382,7 @@
// æ‰“开审核弹框
const reviewDia = (row) => {
  reviewVisible.value = true
  filteredList.value = []
  form.value = {...row}
  form.value.pId = row.id
  inventoryQuantity.value = row.inventoryQuantity
@@ -359,19 +416,93 @@
  })
}
// åˆå¹¶åº“存数据方法
const mergeRows = () => {
const mergeRows = (type,row) => {
  coalFieldListOption();
  mergeVisible.value = true;
  operationType.value = type;
  if (type === 'edit') {
    mergeForm.value = {...row}
  } else {
  if (selectedRows.value.length < 2) {
    proxy.$modal.msgWarning('请至少选择两条数据')
    return
  }
  mergeVisible.value = true
    filteredList.value.forEach(item => {
      mergeForm.value[item.fields] = ''
    })
    const data = selectedRows.value
    const selectedIds = selectedRows.value.map(row => row.id);
    // åˆå§‹åŒ–合计和均值变量
    let totalInventory = 0;
    let totalPriceIncludingTax = 0;
    let totalPriceExcludingTax = 0;
    let priceIncludingTaxSum = 0;
    let priceExcludingTaxSum = 0;
    // éåŽ†æ‰€æœ‰é€‰ä¸­æ•°æ®ï¼Œç´¯åŠ è®¡ç®—
    data.forEach(row => {
      totalInventory += parseFloat(row.inventoryQuantity) || 0;
      priceIncludingTaxSum += parseFloat(row.priceIncludingTax) || 0;
      totalPriceIncludingTax += parseFloat(row.totalPriceIncludingTax) || 0;
      priceExcludingTaxSum += parseFloat(row.priceExcludingTax) || 0;
      totalPriceExcludingTax += parseFloat(row.totalPriceExcludingTax) || 0;
    });
    // è®¡ç®—平均值并保留两位小数
    const avgPriceIncludingTax = Number((priceIncludingTaxSum / data.length).toFixed(2));
    const avgTotalPriceIncludingTax = Number((totalPriceIncludingTax / data.length).toFixed(2));
    const avgPriceExcludingTax = Number((priceExcludingTaxSum / data.length).toFixed(2));
    const avgTotalPriceExcludingTax = Number((totalPriceExcludingTax / data.length).toFixed(2));
    // è®¾ç½®è¡¨å•显示
    mergeForm.value.inventoryQuantity = totalInventory;
    mergeForm.value.priceIncludingTax = avgPriceIncludingTax;
    mergeForm.value.totalPriceIncludingTax = avgTotalPriceIncludingTax;
    mergeForm.value.priceExcludingTax = avgPriceExcludingTax;
    mergeForm.value.totalPriceExcludingTax = avgTotalPriceExcludingTax;
    mergeForm.value.ids = selectedIds;
  }
}
// æäº¤åˆå¹¶è¡¨å•
const submitForm = () => {
  proxy.$refs.mergeRef.validate(valid => {
    if (valid) {
      delete mergeForm.value.createTime
      delete mergeForm.value.updateTime
      if (operationType.value === 'edit') {
        mergeForm.value.fields = filteredList.value.reduce((acc, item) => {
          const key = item.fields;
          const value = mergeForm.value[key];
          // åˆ¤æ–­æ˜¯å¦æœ‰å€¼ï¼ˆä½ å¯ä»¥æ ¹æ®éœ€è¦ä¿®æ”¹åˆ¤æ–­æ¡ä»¶ï¼‰
          if (value !== null && value !== undefined && value !== '') {
            acc.push({ [key]: value });
          }
          return acc;
        }, []);
        editOfficial(mergeForm.value).then(() => {
          cancel()
          proxy.$modal.msgSuccess('修改成功')
          handleQuery()
        })
      } else {
        mergeForm.value.fields = filteredList.value.reduce((acc, item) => {
          const key = item.fields;
          const value = mergeForm.value[key];
          // åˆ¤æ–­æ˜¯å¦æœ‰å€¼ï¼ˆä½ å¯ä»¥æ ¹æ®éœ€è¦ä¿®æ”¹åˆ¤æ–­æ¡ä»¶ï¼‰
          if (value !== null && value !== undefined && value !== '') {
            acc.push({ [key]: value });
          }
          return acc;
        }, []);
        merge(mergeForm.value).then(() => {
          cancel()
          proxy.$modal.msgSuccess('合并成功')
          handleQuery()
        })
      }
    }
  })
}
// å…³é—­åˆå¹¶è¡¨å•
const cancel = () => {
  proxy.$refs.mergeRef.resetFields();
  mergeVisible.value = false
}
// æäº¤å®¡æ ¸è¡¨å•