<template>
|
<div class="app-container">
|
<el-form :inline="true" :model="queryParams" class="search-form">
|
<el-form-item label="搜索">
|
<el-input
|
v-model="queryParams.searchText"
|
placeholder="请输入关键词"
|
clearable
|
:style="{ width: '100%' }"
|
/>
|
</el-form-item>
|
<el-form-item label="供应商名称">
|
<el-input
|
v-model="queryParams.supplierName"
|
placeholder="请输入"
|
clearable
|
:style="{ width: '100%' }"
|
/>
|
</el-form-item>
|
<el-form-item label="统一人识别号">
|
<el-input
|
v-model="queryParams.identifyNumber"
|
placeholder="请输入"
|
clearable
|
:style="{ width: '100%' }"
|
/>
|
</el-form-item>
|
<el-form-item label="经营地址">
|
<el-input
|
v-model="queryParams.address"
|
placeholder="请输入"
|
clearable
|
:style="{ width: '100%' }"
|
/>
|
</el-form-item>
|
<el-form-item>
|
<el-button type="primary" @click="handleQuery">查询</el-button>
|
<el-button @click="resetQuery">重置</el-button>
|
</el-form-item>
|
</el-form>
|
<el-card>
|
<!-- 标签页 -->
|
<el-tabs
|
v-model="activeTab"
|
class="info-tabs"
|
@tab-click="handleTabClick"
|
>
|
<el-tab-pane
|
v-for="tab in tabs"
|
:key="tab.name"
|
:label="tab.label"
|
:name="tab.name"
|
/>
|
</el-tabs>
|
<!-- 操作按钮区 -->
|
<el-space>
|
<el-button type="primary" :icon="Plus" >新建</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-space>
|
<div>
|
<el-table :data="tableData" border @selection-change="selectionChange">
|
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column label="序号" type="index" width="60" align="center" />
|
<el-table-column prop="name" label="供货商名称" width="180" sortable/>
|
<el-table-column prop="type" label="煤种" sortable/>
|
<el-table-column prop="unit" label="单位" width="70"/>
|
<el-table-column prop="number" label="库存数量" sortable/>
|
<el-table-column prop="money" label="单价(含税)" sortable width="130"/>
|
<el-table-column prop="money1" label="总价(含税)" width="130" />
|
<el-table-column prop="money2" label="成本单价" />
|
<el-table-column prop="money3" label="利润" />
|
<el-table-column prop="money4" label="煤质" sortable/>
|
<el-table-column prop="createUser" label="登记人" />
|
<el-table-column prop="createTime" label="登记日期" />
|
<el-table-column fixed="right" label="操作" min-width="90" align="center">
|
<template #default>
|
<el-button link type="primary" size="small">编辑</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
<pagination
|
v-if="total>0"
|
:page-num="pageNum"
|
:page-size="pageSize"
|
:total="total"
|
@pagination="handleQuery"
|
:layout="'total, prev, pager, next, jumper'"
|
/>
|
</div>
|
</el-card>
|
<!-- 合并数据弹框 -->
|
<el-dialog title="合并库存" v-model="mergeVisible" width="800px">
|
<el-form :model="form" :rules="rules" ref="userRef" label-width="100px">
|
<el-row>
|
<el-col :span="12">
|
<el-form-item label="供货商名称" prop="userName">
|
<el-input v-model="form.userName" placeholder="请输入手机号码" maxlength="30" />
|
</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>
|
</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" />
|
</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>
|
</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" />
|
</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="cancel">取 消</el-button>
|
</div>
|
</template>
|
</el-dialog>
|
</div>
|
</template>
|
|
<script setup>
|
import {onMounted, ref} from "vue";
|
import {Delete, Download, Plus, Refresh} from "@element-plus/icons-vue";
|
import Pagination from "@/components/Pagination/index.vue";
|
const { proxy } = getCurrentInstance()
|
|
const tableData = ref([])
|
const selectedRows = ref([])
|
const columns = ref([])
|
const tableLoading = ref(false);
|
const total = ref(0);
|
const pageNum = ref(1);
|
const pageSize = ref(10);
|
// 合并弹框
|
const mergeVisible = ref(false)
|
const data = reactive({
|
form: {},
|
rules: {
|
userName: [{ required: true, message: "登录账号不能为空", trigger: "blur" }, { pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/, 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" }],
|
}
|
})
|
|
const { form, rules } = toRefs(data)
|
// 当前标签
|
const activeTab = ref("pendingInbound");
|
const tabName = ref("pendingInbound");
|
// 标签页数据
|
const tabs = reactive([
|
{ name: "pendingInbound", label: "待入库" },
|
{ name: "officialInventory", label: "正式库存" },
|
]);
|
// 查询参数
|
const queryParams = reactive({
|
searchText: "",
|
supplierName: "",
|
identifyNumber: "",
|
address: "",
|
})
|
onMounted(() => {
|
handleTabClick({ props: { name: "supplier" } });
|
});
|
// 标签页点击
|
const handleTabClick = (tab) => {
|
getList();
|
tableLoading.value = true;
|
tabName.value = tab.props.name;
|
tableData.value = [];
|
getList();
|
// switch (tabName.value) {
|
// case "pendingInbound":
|
// columns.value = pendingColumns;
|
// break;
|
// case "officialInventory":
|
// columns.value = officialColumns;
|
// break;
|
// }
|
setTimeout(() => {
|
tableLoading.value = false;
|
}, 500);
|
};
|
// 点击查询
|
const handleQuery = () => {
|
tableLoading.value = true;
|
setTimeout(() => {
|
tableLoading.value = false;
|
}, 500);
|
}
|
const getList = () => {
|
tableLoading.value = true;
|
setTimeout(() => {
|
// 暂时引入测试数据
|
tableData.value = [
|
{ name: "供应商A", type: "动力煤", unit: "吨", number: 120, money: 500, money1: 200, money2: 200, money3: 300, money4: '高位', createUser: 'admin', createTime: '2025-06-01' },
|
{ name: "供应商A", type: "动力煤", unit: "吨", number: 100, money: 600, money1: 300, money2: 300, money3: 300, money4: '低位', createUser: 'admin', createTime: '2025-06-01' },
|
{ name: "供应商B", type: "焦煤", unit: "吨", number: 300, money: 789,money1: 400, money2: 400, money3: 400, money4: '高位', createUser: 'admin', createTime: '2025-06-01' },
|
{ name: "供应商B", type: "焦煤", unit: "吨", number: 256, money: 800, money1: 420, money2: 420, money3: 420, money4: '低位', createUser: 'admin', createTime: '2025-06-01' },
|
{ name: "供应商C", type: "无烟煤", unit: "吨", number: 256, money: 700, money1: 300, money2: 300, money3: 300, money4: '高位', createUser: 'admin', createTime: '2025-06-01' }
|
];
|
total.value = tableData.value.length;
|
tableLoading.value = false;
|
}, 500);
|
};
|
// 重置查询
|
const resetQuery = () => {
|
Object.keys(queryParams).forEach((key) => {
|
if (key !== "pageNum" && key !== "pageSize") {
|
queryParams[key] = "";
|
}
|
});
|
handleQuery();
|
};
|
// 合并相同行的方法
|
const mergeSameRows = ({ row, column, rowIndex, columnIndex }) => {
|
const fieldsToMerge = ['number', 'money', 'money1', 'money2', 'money3', 'money4', 'type', 'unit', 'name'];
|
|
if (fieldsToMerge.includes(column.property)) {
|
const prevRow = tableData.value[rowIndex - 1]
|
const nextRow = tableData.value[rowIndex + 1]
|
// 判断当前行和下一行是否相等
|
if (
|
(!prevRow || prevRow[column.property] !== row[column.property]) &&
|
(!nextRow || nextRow[column.property] === row[column.property])
|
) {
|
let count = 1
|
while (
|
tableData.value[rowIndex + count] &&
|
tableData.value[rowIndex + count][column.property] === row[column.property]
|
) {
|
count++
|
}
|
return { rowspan: count, colspan: 1 }
|
} else if (prevRow && prevRow[column.property] === row[column.property]) {
|
// 隐藏被合并的单元格
|
return { rowspan: 0, colspan: 0 }
|
}
|
return { rowspan: 1, colspan: 1 }
|
}
|
|
// 其他列不合并
|
return { rowspan: 1, colspan: 1 }
|
}
|
// 表格选择数据
|
const selectionChange = (rows) => {
|
selectedRows.value = rows
|
}
|
// 合并库存数据方法
|
const mergeRows = () => {
|
if (selectedRows.value.length < 2) {
|
proxy.$modal.msgWarning('请至少选择两条数据')
|
return
|
}
|
mergeVisible.value = true
|
}
|
// 提交合并表单
|
const submitForm = () => {
|
|
}
|
// 关闭合并表单
|
const cancel = () => {
|
mergeVisible.value = false
|
}
|
</script>
|
|
<style scoped>
|
:deep(.el-table) {
|
margin: 20px 0;
|
}
|
</style>
|