财务门户设计
This commit is contained in:
@@ -1,103 +0,0 @@
|
|||||||
<!--
|
|
||||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
|
||||||
* No deletion without permission, or be held responsible to law.
|
|
||||||
* @author gaoxq
|
|
||||||
-->
|
|
||||||
<template>
|
|
||||||
<BasicModal
|
|
||||||
v-bind="$attrs"
|
|
||||||
:title="t('导入支出信息')"
|
|
||||||
:okText="t('导入')"
|
|
||||||
@register="registerModal"
|
|
||||||
@ok="handleSubmit"
|
|
||||||
:minHeight="120"
|
|
||||||
:width="400"
|
|
||||||
>
|
|
||||||
<Upload accept=".xls,.xlsx" :file-list="fileList" :before-upload="beforeUpload" @remove="handleRemove">
|
|
||||||
<a-button> <Icon icon="ant-design:upload-outlined" /> {{ t('选择文件') }} </a-button>
|
|
||||||
<span class="ml-4">{{ uploadInfo }}</span>
|
|
||||||
</Upload>
|
|
||||||
<div class="ml-4 mt-4">
|
|
||||||
{{ t('提示:仅允许导入“xls”或“xlsx”格式文件!') }}
|
|
||||||
</div>
|
|
||||||
<div class="mt-4">
|
|
||||||
<a-button @click="handleDownloadTemplate()" type="text">
|
|
||||||
<Icon icon="i-fa:file-excel-o" />
|
|
||||||
{{ t('下载模板') }}
|
|
||||||
</a-button>
|
|
||||||
</div>
|
|
||||||
</BasicModal>
|
|
||||||
</template>
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import { ref } from 'vue';
|
|
||||||
import { Upload } from 'ant-design-vue';
|
|
||||||
import { useI18n } from '@jeesite/core/hooks/web/useI18n';
|
|
||||||
import { useMessage } from '@jeesite/core/hooks/web/useMessage';
|
|
||||||
import { useGlobSetting } from '@jeesite/core/hooks/setting';
|
|
||||||
import { downloadByUrl } from '@jeesite/core/utils/file/download';
|
|
||||||
import { Icon } from '@jeesite/core/components/Icon';
|
|
||||||
import { BasicModal, useModalInner } from '@jeesite/core/components/Modal';
|
|
||||||
import { erpExpenseImportData } from '@jeesite/erp/api/erp/expense';
|
|
||||||
import { FileType } from 'ant-design-vue/es/upload/interface';
|
|
||||||
import { AxiosProgressEvent } from 'axios';
|
|
||||||
|
|
||||||
const emit = defineEmits(['success', 'register']);
|
|
||||||
|
|
||||||
const { t } = useI18n('erp.expense');
|
|
||||||
const { showMessage, showMessageModal } = useMessage();
|
|
||||||
|
|
||||||
const fileList = ref<FileType[]>([]);
|
|
||||||
const uploadInfo = ref('');
|
|
||||||
|
|
||||||
const beforeUpload = (file: FileType) => {
|
|
||||||
fileList.value = [file];
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleRemove = () => {
|
|
||||||
fileList.value = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
const [registerModal, { setModalProps, closeModal }] = useModalInner(() => {
|
|
||||||
fileList.value = [];
|
|
||||||
uploadInfo.value = '';
|
|
||||||
});
|
|
||||||
|
|
||||||
async function handleDownloadTemplate() {
|
|
||||||
const { ctxAdminPath } = useGlobSetting();
|
|
||||||
downloadByUrl({ url: ctxAdminPath + '/erp/expense/importTemplate' });
|
|
||||||
}
|
|
||||||
|
|
||||||
function onUploadProgress(progressEvent: AxiosProgressEvent) {
|
|
||||||
const complete = ((progressEvent.loaded / (progressEvent.total || 1)) * 100) | 0;
|
|
||||||
if (complete != 100) {
|
|
||||||
uploadInfo.value = t('正在导入,请稍候') + ' ' + complete + '%...';
|
|
||||||
} else {
|
|
||||||
uploadInfo.value = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleSubmit() {
|
|
||||||
try {
|
|
||||||
if (fileList.value.length == 0) {
|
|
||||||
showMessage(t('请选择要导入的数据文件'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setModalProps({ confirmLoading: true });
|
|
||||||
const params = {
|
|
||||||
file: fileList.value[0],
|
|
||||||
};
|
|
||||||
const { data } = await erpExpenseImportData(params, onUploadProgress);
|
|
||||||
showMessageModal({ content: data.message });
|
|
||||||
setTimeout(closeModal);
|
|
||||||
emit('success');
|
|
||||||
} catch (error: any) {
|
|
||||||
if (error && error.errorFields) {
|
|
||||||
showMessage(error.message || t('common.validateError'));
|
|
||||||
}
|
|
||||||
console.log('error', error);
|
|
||||||
} finally {
|
|
||||||
setModalProps({ confirmLoading: false });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -16,8 +16,6 @@
|
|||||||
</a-button>
|
</a-button>
|
||||||
</template>
|
</template>
|
||||||
</BasicTable>
|
</BasicTable>
|
||||||
<InputForm @register="registerDrawer" @success="handleSuccess" />
|
|
||||||
<FormImport @register="registerImportModal" @success="handleSuccess" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup name="ViewsErpExpenseList">
|
<script lang="ts" setup name="ViewsErpExpenseList">
|
||||||
@@ -34,7 +32,6 @@
|
|||||||
import { useDrawer } from '@jeesite/core/components/Drawer';
|
import { useDrawer } from '@jeesite/core/components/Drawer';
|
||||||
import { useModal } from '@jeesite/core/components/Modal';
|
import { useModal } from '@jeesite/core/components/Modal';
|
||||||
import { FormProps } from '@jeesite/core/components/Form';
|
import { FormProps } from '@jeesite/core/components/Form';
|
||||||
import FormImport from './formImport.vue';
|
|
||||||
|
|
||||||
const { t } = useI18n('erp.expense');
|
const { t } = useI18n('erp.expense');
|
||||||
const { showMessage } = useMessage();
|
const { showMessage } = useMessage();
|
||||||
@@ -142,31 +139,12 @@
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const actionColumn: BasicColumn<ErpExpense> = {
|
|
||||||
width: 160,
|
|
||||||
align: 'center',
|
|
||||||
actions: (record: ErpExpense) => [
|
|
||||||
{
|
|
||||||
icon: 'i-ant-design:delete-outlined',
|
|
||||||
color: 'error',
|
|
||||||
title: t('删除'),
|
|
||||||
popConfirm: {
|
|
||||||
title: t('是否确认删除支出信息?'),
|
|
||||||
confirm: handleDelete.bind(this, record),
|
|
||||||
},
|
|
||||||
auth: 'erp:expense:edit',
|
|
||||||
ifShow: record.isFinish == '0'
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
const [registerTable, { reload, getForm }] = useTable<ErpExpense>({
|
const [registerTable, { reload, getForm }] = useTable<ErpExpense>({
|
||||||
api: erpExpenseListData,
|
api: erpExpenseListData,
|
||||||
beforeFetch: (params) => {
|
beforeFetch: (params) => {
|
||||||
return params;
|
return params;
|
||||||
},
|
},
|
||||||
columns: tableColumns,
|
columns: tableColumns,
|
||||||
actionColumn: actionColumn,
|
|
||||||
formConfig: searchForm,
|
formConfig: searchForm,
|
||||||
showTableSetting: true,
|
showTableSetting: true,
|
||||||
useSearchForm: true,
|
useSearchForm: true,
|
||||||
@@ -195,19 +173,6 @@
|
|||||||
loading.value = false;
|
loading.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const [registerImportModal, { openModal: importModal }] = useModal();
|
|
||||||
|
|
||||||
function handleImport() {
|
|
||||||
importModal(true, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleDelete(record: Recordable) {
|
|
||||||
const params = { expenseId: record.expenseId };
|
|
||||||
const res = await erpExpenseDelete(params);
|
|
||||||
showMessage(res.message);
|
|
||||||
await handleSuccess(record);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleSuccess(record: Recordable) {
|
async function handleSuccess(record: Recordable) {
|
||||||
await reload({ record });
|
await reload({ record });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,103 +0,0 @@
|
|||||||
<!--
|
|
||||||
* Copyright (c) 2013-Now http://jeesite.com All rights reserved.
|
|
||||||
* No deletion without permission, or be held responsible to law.
|
|
||||||
* @author gaoxq
|
|
||||||
-->
|
|
||||||
<template>
|
|
||||||
<BasicModal
|
|
||||||
v-bind="$attrs"
|
|
||||||
:title="t('导入收入信息')"
|
|
||||||
:okText="t('导入')"
|
|
||||||
@register="registerModal"
|
|
||||||
@ok="handleSubmit"
|
|
||||||
:minHeight="120"
|
|
||||||
:width="400"
|
|
||||||
>
|
|
||||||
<Upload accept=".xls,.xlsx" :file-list="fileList" :before-upload="beforeUpload" @remove="handleRemove">
|
|
||||||
<a-button> <Icon icon="ant-design:upload-outlined" /> {{ t('选择文件') }} </a-button>
|
|
||||||
<span class="ml-4">{{ uploadInfo }}</span>
|
|
||||||
</Upload>
|
|
||||||
<div class="ml-4 mt-4">
|
|
||||||
{{ t('提示:仅允许导入“xls”或“xlsx”格式文件!') }}
|
|
||||||
</div>
|
|
||||||
<div class="mt-4">
|
|
||||||
<a-button @click="handleDownloadTemplate()" type="text">
|
|
||||||
<Icon icon="i-fa:file-excel-o" />
|
|
||||||
{{ t('下载模板') }}
|
|
||||||
</a-button>
|
|
||||||
</div>
|
|
||||||
</BasicModal>
|
|
||||||
</template>
|
|
||||||
<script lang="ts" setup>
|
|
||||||
import { ref } from 'vue';
|
|
||||||
import { Upload } from 'ant-design-vue';
|
|
||||||
import { useI18n } from '@jeesite/core/hooks/web/useI18n';
|
|
||||||
import { useMessage } from '@jeesite/core/hooks/web/useMessage';
|
|
||||||
import { useGlobSetting } from '@jeesite/core/hooks/setting';
|
|
||||||
import { downloadByUrl } from '@jeesite/core/utils/file/download';
|
|
||||||
import { Icon } from '@jeesite/core/components/Icon';
|
|
||||||
import { BasicModal, useModalInner } from '@jeesite/core/components/Modal';
|
|
||||||
import { erpIncomeImportData } from '@jeesite/erp/api/erp/income';
|
|
||||||
import { FileType } from 'ant-design-vue/es/upload/interface';
|
|
||||||
import { AxiosProgressEvent } from 'axios';
|
|
||||||
|
|
||||||
const emit = defineEmits(['success', 'register']);
|
|
||||||
|
|
||||||
const { t } = useI18n('erp.income');
|
|
||||||
const { showMessage, showMessageModal } = useMessage();
|
|
||||||
|
|
||||||
const fileList = ref<FileType[]>([]);
|
|
||||||
const uploadInfo = ref('');
|
|
||||||
|
|
||||||
const beforeUpload = (file: FileType) => {
|
|
||||||
fileList.value = [file];
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
const handleRemove = () => {
|
|
||||||
fileList.value = [];
|
|
||||||
};
|
|
||||||
|
|
||||||
const [registerModal, { setModalProps, closeModal }] = useModalInner(() => {
|
|
||||||
fileList.value = [];
|
|
||||||
uploadInfo.value = '';
|
|
||||||
});
|
|
||||||
|
|
||||||
async function handleDownloadTemplate() {
|
|
||||||
const { ctxAdminPath } = useGlobSetting();
|
|
||||||
downloadByUrl({ url: ctxAdminPath + '/erp/income/importTemplate' });
|
|
||||||
}
|
|
||||||
|
|
||||||
function onUploadProgress(progressEvent: AxiosProgressEvent) {
|
|
||||||
const complete = ((progressEvent.loaded / (progressEvent.total || 1)) * 100) | 0;
|
|
||||||
if (complete != 100) {
|
|
||||||
uploadInfo.value = t('正在导入,请稍候') + ' ' + complete + '%...';
|
|
||||||
} else {
|
|
||||||
uploadInfo.value = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleSubmit() {
|
|
||||||
try {
|
|
||||||
if (fileList.value.length == 0) {
|
|
||||||
showMessage(t('请选择要导入的数据文件'));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
setModalProps({ confirmLoading: true });
|
|
||||||
const params = {
|
|
||||||
file: fileList.value[0],
|
|
||||||
};
|
|
||||||
const { data } = await erpIncomeImportData(params, onUploadProgress);
|
|
||||||
showMessageModal({ content: data.message });
|
|
||||||
setTimeout(closeModal);
|
|
||||||
emit('success');
|
|
||||||
} catch (error: any) {
|
|
||||||
if (error && error.errorFields) {
|
|
||||||
showMessage(error.message || t('common.validateError'));
|
|
||||||
}
|
|
||||||
console.log('error', error);
|
|
||||||
} finally {
|
|
||||||
setModalProps({ confirmLoading: false });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
@@ -16,8 +16,6 @@
|
|||||||
</a-button>
|
</a-button>
|
||||||
</template>
|
</template>
|
||||||
</BasicTable>
|
</BasicTable>
|
||||||
<InputForm @register="registerDrawer" @success="handleSuccess" />
|
|
||||||
<FormImport @register="registerImportModal" @success="handleSuccess" />
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script lang="ts" setup name="ViewsErpIncomeList">
|
<script lang="ts" setup name="ViewsErpIncomeList">
|
||||||
@@ -34,7 +32,6 @@
|
|||||||
import { useDrawer } from '@jeesite/core/components/Drawer';
|
import { useDrawer } from '@jeesite/core/components/Drawer';
|
||||||
import { useModal } from '@jeesite/core/components/Modal';
|
import { useModal } from '@jeesite/core/components/Modal';
|
||||||
import { FormProps } from '@jeesite/core/components/Form';
|
import { FormProps } from '@jeesite/core/components/Form';
|
||||||
import FormImport from './formImport.vue';
|
|
||||||
|
|
||||||
const { t } = useI18n('erp.income');
|
const { t } = useI18n('erp.income');
|
||||||
const { showMessage } = useMessage();
|
const { showMessage } = useMessage();
|
||||||
@@ -142,31 +139,12 @@
|
|||||||
},
|
},
|
||||||
];
|
];
|
||||||
|
|
||||||
const actionColumn: BasicColumn<ErpIncome> = {
|
|
||||||
width: 160,
|
|
||||||
align: 'center',
|
|
||||||
actions: (record: ErpIncome) => [
|
|
||||||
{
|
|
||||||
icon: 'i-ant-design:delete-outlined',
|
|
||||||
color: 'error',
|
|
||||||
title: t('删除'),
|
|
||||||
popConfirm: {
|
|
||||||
title: t('是否确认删除收入信息?'),
|
|
||||||
confirm: handleDelete.bind(this, record),
|
|
||||||
},
|
|
||||||
auth: 'erp:income:edit',
|
|
||||||
ifShow: record.isFinish == '0'
|
|
||||||
},
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
const [registerTable, { reload, getForm }] = useTable<ErpIncome>({
|
const [registerTable, { reload, getForm }] = useTable<ErpIncome>({
|
||||||
api: erpIncomeListData,
|
api: erpIncomeListData,
|
||||||
beforeFetch: (params) => {
|
beforeFetch: (params) => {
|
||||||
return params;
|
return params;
|
||||||
},
|
},
|
||||||
columns: tableColumns,
|
columns: tableColumns,
|
||||||
actionColumn: actionColumn,
|
|
||||||
formConfig: searchForm,
|
formConfig: searchForm,
|
||||||
showTableSetting: true,
|
showTableSetting: true,
|
||||||
useSearchForm: true,
|
useSearchForm: true,
|
||||||
@@ -195,19 +173,6 @@
|
|||||||
loading.value = false;
|
loading.value = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const [registerImportModal, { openModal: importModal }] = useModal();
|
|
||||||
|
|
||||||
function handleImport() {
|
|
||||||
importModal(true, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleDelete(record: Recordable) {
|
|
||||||
const params = { incomeId: record.incomeId };
|
|
||||||
const res = await erpIncomeDelete(params);
|
|
||||||
showMessage(res.message);
|
|
||||||
await handleSuccess(record);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function handleSuccess(record: Recordable) {
|
async function handleSuccess(record: Recordable) {
|
||||||
await reload({ record });
|
await reload({ record });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,6 +22,9 @@
|
|||||||
<div v-if="activeKey === '2'" class="config-panel">
|
<div v-if="activeKey === '2'" class="config-panel">
|
||||||
<Income />
|
<Income />
|
||||||
</div>
|
</div>
|
||||||
|
<div v-if="activeKey === '3'" class="config-panel">
|
||||||
|
<Account />
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</PageWrapper>
|
</PageWrapper>
|
||||||
</template>
|
</template>
|
||||||
@@ -32,11 +35,13 @@
|
|||||||
import { Tag, Tabs ,TabPane } from 'ant-design-vue';
|
import { Tag, Tabs ,TabPane } from 'ant-design-vue';
|
||||||
import Expense from './expense/list.vue';
|
import Expense from './expense/list.vue';
|
||||||
import Income from './income/list.vue';
|
import Income from './income/list.vue';
|
||||||
|
import Account from './account/list.vue';
|
||||||
|
|
||||||
const activeKey = ref('1');
|
const activeKey = ref('1');
|
||||||
const configItems = [
|
const configItems = [
|
||||||
{ key: '1', label: '支出信息', icon: 'ant-design:rotate-left-outlined' },
|
{ key: '1', label: '支出信息', icon: 'ant-design:rotate-left-outlined' },
|
||||||
{ key: '2', label: '收入信息', icon: 'ant-design:rotate-right-outlined' }
|
{ key: '2', label: '收入信息', icon: 'ant-design:rotate-right-outlined' },
|
||||||
|
{ key: '3', label: '账户信息', icon: 'ant-design:block-outlined' }
|
||||||
];
|
];
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user