<template> <div class="user"> <div class="content"> <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row :selectConfig="selectConfig" :table-events="{ //element talbe事件都能传 select: select, }" :action-list="[]" @get-list="getList" > <template #pic="{ item }"> <div v-if="item.fileList.length > 0"> <img :src="item.fileList[0].fileUrl" class="pic" @click="handleClickFile(item.fileList[0])" /> </div> <div v-else></div> </template> </byTable> </div> <el-dialog :title="modalType == 'add' ? '添加' : '编辑'" v-model="dialogVisible" width="500" v-loading="loading" > <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform" > <template #productPic> <div> <el-upload v-model:fileList="fileList" action="https://winfaster.obs.cn-south-1.myhuaweicloud.com" :data="uploadData" list-type="picture-card" :on-remove="handleRemove" :on-success="handleSuccess" :before-upload="handleBeforeUpload" > <el-icon><Plus /></el-icon> </el-upload> </div> </template> </byForm> <template #footer> <el-button @click="dialogVisible = false" size="large" >取 消</el-button > <el-button type="primary" @click="submitForm('byform')" size="large" :loading="submitLoading" > 确 定 </el-button> </template> </el-dialog> <el-dialog title="Excel导入" v-model="openExcelDialog" width="400" v-loading="loading" > <template #footer> <el-button @click="openExcelDialog = false" size="large" >取 消</el-button > <el-button type="primary" @click="submitExcel()" size="large" :loading="submitLoading" > 确 定 </el-button> </template> </el-dialog> </div> </template> <script setup> /* eslint-disable vue/no-unused-components */ import { ElMessage, ElMessageBox } from 'element-plus' import byTable from '@/components/byTable/index' import byForm from '@/components/byForm/index' import Cookies from 'js-cookie' import { computed, defineComponent, ref } from 'vue' const loading = ref(false) const submitLoading = ref(false) const sourceList = ref({ data: [], pagination: { total: 3, pageNum: 1, pageSize: 10, type: '', productClassifyId: '', keyword: '', definition: '2', }, }) let dialogVisible = ref(false) let openExcelDialog = ref(false) let modalType = ref('add') let rules = ref({ productClassifyId: [ { required: true, message: '请选择物料分类', trigger: 'change' }, ], type: [{ required: true, message: '请选择物料类型', trigger: 'change' }], name: [{ required: true, message: '请输入物料名称', trigger: 'blur' }], unit: [{ required: true, message: '请选择单位', trigger: 'change' }], }) const { proxy } = getCurrentInstance() const selectConfig = computed(() => { return [ { label: '打款状态', prop: 'paymentStatus', data: [], }, ] }) const config = computed(() => { return [ { attrs: { label: '归属公司', prop: 'corporationName', }, }, { attrs: { label: '归属部门', prop: 'deptName', }, }, { attrs: { label: '付款类型', prop: 'type', render(type) { return proxy.dictDataEcho(type, dictsData.value.payment_type) }, }, }, { attrs: { label: '申请人', prop: 'userName', }, }, { attrs: { label: '申请时间', prop: 'createTime', }, }, { attrs: { label: '用款时间', prop: 'paymentTime', }, }, { attrs: { label: '金额', prop: 'total', }, }, { attrs: { label: '款项说明', prop: 'paymentRemarks', }, }, { attrs: { label: '打款状态', prop: 'status', }, }, { attrs: { label: '操作', width: '200', align: 'right', }, // 渲染 el-button,一般用在最后一列。 renderHTML(row) { return [ { attrs: { label: '查看', type: 'primary', text: true, }, el: 'button', click() { getDtl(row) }, }, { attrs: { label: '删除', type: 'danger', text: true, }, el: 'button', click() { // 弹窗提示是否删除 ElMessageBox.confirm( '此操作将永久删除该数据, 是否继续?', '提示', { confirmButtonText: '确定', cancelButtonText: '取消', type: 'warning', } ).then(() => { // 删除 proxy .post('/productInfo/delete', { id: row.id, }) .then((res) => { ElMessage({ message: '删除成功', type: 'success', }) getList() }) }) }, }, ] }, }, ] }) let formData = reactive({ data: {}, }) const formOption = reactive({ inline: true, labelWidth: 100, itemWidth: 100, rules: [], }) const byform = ref(null) const treeListData = ref([]) const formConfig = computed(() => { return [ { type: 'title', label: '请款信息', }, { type: 'input', prop: 'businessManagementName', label: '付款账户', readonly: true, }, { type: 'input', prop: 'incomeAmount', label: '请款金额', readonly: true, }, { type: 'input', prop: 'paymentMethod', label: '付款方式', readonly: true, }, { type: 'input', prop: 'name', label: '户名', readonly: true, }, { type: 'input', prop: 'accountOpening', label: '银行账号', readonly: true, }, { type: 'input', prop: 'openingBank', label: '开户银行', readonly: true, }, { type: 'input', prop: 'interbankNumber', label: '联行号', readonly: true, }, { type: 'input', prop: 'remark', label: '摘要', readonly: true, }, { type: 'title', label: '付款信息', }, { type: 'select', prop: 'accountManagementId', label: '付款账户', required: true, isLoad: { url: '/accountManagement/page', req: { pageNum: 1, pageSize: 9999, }, labelKey: 'name', labelVal: 'id', method: 'post', resUrl: 'rows', }, }, { type: 'selectInput', label: '付款金额', itemWidth: 60, prop: 'amount', data: [], placeholder: '请输入', selectPlaceholder: '币种', selectProp: 'businessCurrency', }, { type: 'date', prop: 'expensesTime', label: '打款时间', }, { type: 'input', prop: 'remark', label: '摘要', }, { type: 'slot', slotName: 'productPic', prop: 'fileList', label: '上传附件', }, ] }) const newPassword = () => { formData.data.password = generatePassword() } const generatePassword = () => { var length = 12, charset = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789', password = '' for (var i = 0, n = charset.length; i < length; ++i) { password += charset.charAt(Math.floor(Math.random() * n)) } return password } const getList = async (req) => { sourceList.value.pagination = { ...sourceList.value.pagination, ...req } loading.value = true proxy .post('/accountPayment/page', sourceList.value.pagination) .then((message) => { console.log(message) sourceList.value.data = message.rows sourceList.value.pagination.total = message.total setTimeout(() => { loading.value = false }, 200) }) } const uploadData = ref({}) const fileList = ref([]) const fileListCopy = ref([]) let dictsData = reactive({}) proxy .getDict(['payment_status', 'payment_type','account_currency']) .then((res) => { dictsData = res console.log(res) formConfig.value[11].data = res.account_currency.map(item => { return { label: item.dictValue, value: item.dictKey, } }) console.log(formConfig.value[11].data) }) const openModal = () => { dialogVisible.value = true modalType.value = 'add' formData.data = { definition: '2', fileList: [], type: '1', } fileList.value = [] fileListCopy.value = [] } const openExcel = () => { openExcelDialog.value = true } const submitExcel = () => { openExcelDialog.value = false } const selection = ref({ data: [], }) const select = (_selection, row) => { selection.value.data = _selection console.log(_selection.length) } const submitForm = () => { console.log(byform.value) byform.value.handleSubmit((valid) => { submitLoading.value = true proxy.post('/accountPayment/add', formData.data).then( (res) => { ElMessage({ message: '打款成功', type: 'success', }) dialogVisible.value = false submitLoading.value = false getList() }, (err) => { submitLoading.value = false } ) }) } const getTreeList = () => { proxy .post('/productClassify/tree', { parentId: '', name: '', definition: '2', }) .then((message) => { treeListData.value = message formConfig.value[0].data = message }) } const getDtl = (row) => { modalType.value = 'edit' proxy.post('/accountPayment/detail', { id: row.id }).then((res) => { formData.data = res dialogVisible.value = true }) } getTreeList() getList() const handleBeforeUpload = async (file) => { const res = await proxy.post('/fileInfo/getSing', { fileName: file.name }) uploadData.value = res.uploadBody fileListCopy.value.push({ id: res.id, fileName: res.fileName, path: res.fileUrl, url: res.fileUrl, uid: file.uid, }) } const handleSuccess = (res, file, files) => { // 查当前file的index值去赋值对应的copy变量的值 // let uid = file.uid; // const index = fileList.value.findIndex((x) => x.uid === uid); // fileListCopy.value[index].uid = uid; } const handleRemove = (file) => { const index = fileListCopy.value.findIndex( (x) => x.uid === file.uid || x.id === file.id ) fileListCopy.value.splice(index, 1) } const handleClickFile = (file) => { window.open(file.fileUrl, '_blank') } </script> <style lang="scss" scoped> .user { padding: 20px; } .pic { object-fit: contain; width: 50px; height: 50px; cursor: pointer; vertical-align: middle; } </style>