<template>
|
<div class="app-container">
|
<div style="display: flex;justify-content: space-between">
|
<el-form :inline="true" style="display: flex;align-items: center;flex-wrap: wrap;" >
|
<el-form-item>
|
<el-button
|
type="primary"
|
plain
|
icon="Plus"
|
@click="openDialog('add',{})"
|
>新增</el-button>
|
</el-form-item>
|
<el-form-item v-if="isAdmin" label="企业:" >
|
<el-select v-model="data.queryParams.companyId" placeholder="请选择" clearable>
|
<el-option
|
v-for="item in companyList"
|
:key="item.id"
|
:label="item.name"
|
:value="item.id">
|
</el-option>
|
</el-select>
|
</el-form-item>
|
<el-form-item >
|
<el-button v-if="isAdmin" type="primary" @click="getList">查询</el-button>
|
<el-button v-if="isAdmin" type="primary" plain @click="reset">重置</el-button>
|
<!-- <el-button type="primary">导出</el-button>-->
|
</el-form-item>
|
</el-form>
|
</div>
|
<!-- 表格数据 -->
|
<el-table v-loading="loading" :data="dataList" :border="true">
|
<el-table-column type="index" label="序号"></el-table-column>
|
<el-table-column prop="recordName" align="center" label="记录名称" v-if="isAdmin"></el-table-column>
|
<el-table-column label="操作" align="center">
|
<template #default="scope">
|
<el-button link type="primary" @click="openDialog('view',scope.row)">查看</el-button>
|
<el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
|
<el-button link type="primary" @click="downloadFile(scope.row)">导出</el-button>
|
<el-button link type="danger" @click="handleDelete(scope.row)">删除</el-button>
|
</template>
|
</el-table-column>
|
</el-table>
|
|
<pagination
|
v-show="total > 0"
|
:total="total"
|
v-model:page="queryParams.pageNum"
|
v-model:limit="queryParams.pageSize"
|
@pagination="getList"
|
/>
|
|
<edit-dialog ref="dialogRef" @getList=getList></edit-dialog>
|
</div>
|
</template>
|
|
<script setup>
|
import {getCurrentInstance, onMounted, onUnmounted, reactive, ref, toRefs} from "vue";
|
import {ElMessage, ElMessageBox} from "element-plus";
|
import {delCompany, getCompany} from "@/api/onlineEducation/company";
|
import Cookies from "js-cookie";
|
import editDialog from './components/editDialog.vue'
|
import useUserStore from "@/store/modules/user";
|
import { utils, writeFile } from 'xlsx-js-style';
|
import {
|
delWarehousingRecord,
|
getWarehousingRecordDetail,
|
getWarehousingRecordList
|
} from "@/api/outsourcingCooperate/outsourcingCooperate";
|
|
|
const userStore = useUserStore()
|
const { proxy } = getCurrentInstance();
|
const loading = ref(false);
|
const dialogRef = ref();
|
const data = reactive({
|
queryParams: {
|
pageNum: 1,
|
pageSize: 10,
|
companyId: null
|
},
|
total: 0,
|
dataList: [],
|
companyList: [],
|
isAdmin: false,
|
});
|
|
const { queryParams, total, dataList,companyList, isAdmin } = toRefs(data);
|
const userInfo = ref()
|
onMounted(async ()=>{
|
if(userStore.roles.includes('admin')){
|
data.isAdmin = true
|
await getCompanyList()
|
}else{
|
data.isAdmin = false
|
data.queryParams.companyId = userStore.companyId
|
}
|
await getList()
|
})
|
|
onUnmounted(()=>{
|
|
})
|
|
const getList = async () => {
|
loading.value = true
|
const res = await getWarehousingRecordList(data.queryParams)
|
if(res.code == 200){
|
data.dataList = res.data.list || []
|
data.total = res.data.total
|
}else{
|
ElMessage.warning(res.message)
|
}
|
loading.value = false
|
}
|
|
const getCompanyList = async ()=>{
|
const queryParams = {
|
pageNum: 1,
|
pageSize: 999
|
}
|
const res = await getCompany(queryParams)
|
if (res.code == 200) {
|
data.companyList = res.data.list?res.data.list:[]
|
// data.queryParams.companyId = data.companyList[0].id
|
} else {
|
ElMessage.warning(res.message)
|
}
|
}
|
|
const downloadFile = async (val)=>{
|
const res = await getWarehousingRecordDetail({id: val.id})
|
if(res.code == 200){
|
if(res.data){
|
const jsonData = res.data
|
const columns = [
|
{ label: '序号', key: 'index' },
|
{ label: '登记时间', key: 'boardingTime' },
|
{ label: '名称', key: 'name' },
|
{ label: '入库单位', key: 'enterCompany' },
|
{ label: '入库数量', key: 'enterNum' },
|
{ label: '入库经手人', key: 'enterPerson' },
|
{ label: '出库单位', key: 'outboundCompany' },
|
{ label: '出库数量', key: 'outboundNum' },
|
{ label: '出库经手人', key: 'outboundPerson' },
|
{ label: '库存数量', key: 'amount' },
|
{ label: '备注', key: 'remark' }
|
];
|
|
// 样式定义
|
const headerStyle = {
|
font: { bold: true, sz: 12, color: { rgb: "FFFFFF" } },
|
fill: { fgColor: { rgb: "3498DB" } },
|
alignment: { horizontal: "center", vertical: "center" },
|
border: {
|
top: { style: "thin", color: { rgb: "000000" } },
|
bottom: { style: "thin", color: { rgb: "000000" } },
|
left: { style: "thin", color: { rgb: "000000" } },
|
right: { style: "thin", color: { rgb: "000000" } }
|
}
|
};
|
|
const dataStyle = {
|
font: { sz: 11 },
|
alignment: { vertical: "center" },
|
border: {
|
top: { style: "thin", color: { rgb: "000000" } },
|
bottom: { style: "thin", color: { rgb: "000000" } },
|
left: { style: "thin", color: { rgb: "000000" } },
|
right: { style: "thin", color: { rgb: "000000" } }
|
}
|
};
|
|
const titleStyle = {
|
font: { bold: true, sz: 16, color: { rgb: "2C3E50" } },
|
alignment: { horizontal: "center", vertical: "center" }
|
};
|
|
// 处理数据,添加序号
|
const processData = () => {
|
return jsonData.warehousingRecordDetails.map((item, index) => {
|
return {
|
index: index + 1,
|
...item
|
};
|
});
|
};
|
// 创建工作簿
|
const wb = utils.book_new();
|
const wsData = [];
|
|
// 添加标题行(合并所有列)
|
const titleRow = [{
|
v: jsonData.recordName,
|
t: 's',
|
s: titleStyle
|
}];
|
// 填充空单元格以匹配列数
|
for (let i = 1; i < columns.length; i++) {
|
titleRow.push({ v: '', t: 's', s: titleStyle });
|
}
|
wsData.push(titleRow);
|
|
// 添加表头
|
const headerRow = columns.map(col => ({
|
v: col.label,
|
t: 's',
|
s: headerStyle
|
}));
|
wsData.push(headerRow);
|
|
// 添加数据行
|
const processedData = processData();
|
processedData.forEach(item => {
|
const row = columns.map(col => ({
|
v: item[col.key],
|
t: typeof item[col.key] === 'number' ? 'n' : 's',
|
s: dataStyle
|
}));
|
wsData.push(row);
|
});
|
|
// 创建工作表
|
const ws = utils.aoa_to_sheet(wsData);
|
|
// 设置合并单元格(标题行)
|
ws['!merges'] = [
|
{ s: { r: 0, c: 0 }, e: { r: 0, c: columns.length - 1 } }
|
];
|
|
// 设置列宽
|
const colWidths = [
|
{ wch: 8 }, // 序号
|
{ wch: 20 }, // 登记时间
|
{ wch: 15 }, // 名称
|
{ wch: 15 }, // 入库单位
|
{ wch: 12 }, // 入库数量
|
{ wch: 15 }, // 入库经手人
|
{ wch: 15 }, // 出库单位
|
{ wch: 12 }, // 出库数量
|
{ wch: 15 }, // 出库经手人
|
{ wch: 12 }, // 库存数量
|
{ wch: 20 } // 备注
|
];
|
ws['!cols'] = colWidths;
|
|
// 添加工作表到工作簿
|
utils.book_append_sheet(wb, ws, jsonData.recordName);
|
|
// 生成Excel文件并下载
|
writeFile(wb, `${jsonData.recordName}.xlsx`);
|
}else{
|
ElMessage.warning('暂无数据')
|
}
|
}else{
|
ElMessage.warning(res.message)
|
}
|
}
|
|
const openDialog = (type, value) => {
|
dialogRef.value.openDialog(type, value, data.queryParams.companyId, data.isAdmin, data.companyList);
|
}
|
|
/** 重置新增的表单以及其他数据 */
|
const reset= async()=> {
|
data.queryParams = {
|
pageNum: 1,
|
pageSize: 10,
|
companyId: null
|
}
|
await getCompanyList()
|
await getList()
|
}
|
const handleDelete = (val) => {
|
ElMessageBox.confirm(
|
'确定删除此条数据?',
|
'提示',
|
{
|
confirmButtonText: '确定',
|
cancelButtonText: '取消',
|
type: 'warning',
|
})
|
.then( async() => {
|
const res = await delWarehousingRecord({id: val.id})
|
if(res.code == 200){
|
ElMessage.success('数据删除成功')
|
await getList()
|
}else{
|
ElMessage.warning(res.message)
|
}
|
})
|
}
|
|
</script>
|