diff --git a/src/api/v1/financial/debtTracking.ts b/src/api/v1/financial/debtTracking.ts new file mode 100644 index 0000000..869949b --- /dev/null +++ b/src/api/v1/financial/debtTracking.ts @@ -0,0 +1,22 @@ +import { http } from '@/api/service/request'; +import type { BaseResult, ResultTable } from '@/api/service/types'; + +/** 债务追踪---获取债务追踪列表 */ +export const fetchGetDebtTrackingList = (data: any) => { + return http.request>('get', `debtTracking/getDebtTrackingList/${data.currentPage}/${data.pageSize}`, { params: data }); +}; + +/** 债务追踪---添加债务追踪 */ +export const fetchAddDebtTracking = (data: any) => { + return http.request>('post', 'debtTracking/addDebtTracking', { data }); +}; + +/** 债务追踪---更新债务追踪 */ +export const fetchUpdateDebtTracking = (data: any) => { + return http.request>('put', 'debtTracking/updateDebtTracking', { data }); +}; + +/** 债务追踪---删除债务追踪 */ +export const fetchDeleteDebtTracking = (data: any) => { + return http.request>('delete', 'debtTracking/deleteDebtTracking', { data }); +}; diff --git a/src/router/modules/bill.ts b/src/router/modules/bill.ts index 8ee1634..71dcacc 100644 --- a/src/router/modules/bill.ts +++ b/src/router/modules/bill.ts @@ -58,5 +58,15 @@ export default { title: 'debtCollectionManagement', }, }, + // 债务追踪 + { + path: '/financial/debtTracking', + name: 'debtTracking', + component: () => import('@/views/financial/debtTracking/index.vue'), + meta: { + icon: 'iconamoon:category', + title: 'debtTracking', + }, + }, ], } satisfies RouteConfigsTable; diff --git a/src/store/financial/debtTracking.ts b/src/store/financial/debtTracking.ts new file mode 100644 index 0000000..2f9a51b --- /dev/null +++ b/src/store/financial/debtTracking.ts @@ -0,0 +1,77 @@ +import { defineStore } from 'pinia'; +import { fetchAddDebtTracking, fetchDeleteDebtTracking, fetchGetDebtTrackingList, fetchUpdateDebtTracking } from '@/api/v1/financial/debtTracking'; +import { pageSizes } from '@/enums/baseConstant'; +import { storeMessage } from '@/utils/message'; +import { storePagination } from '@/store/useStorePagination'; + +/** + * 债务追踪 Store + */ +export const useDebtTrackingStore = defineStore('debtTrackingStore', { + state() { + return { + // 债务追踪列表 + datalist: [], + // 查询表单 + form: { + // 绑定的用户 + userId: undefined, + // 债务人姓名 + debtorName: undefined, + // 债务金额 + debtAmount: undefined, + // 债务类型 + debtType: undefined, + // 债务状态 + debtStatus: undefined, + // 还款截止日期 + dueDate: undefined, + }, + // 分页查询结果 + pagination: { + currentPage: 1, + pageSize: 30, + total: 1, + pageSizes, + }, + // 加载 + loading: false, + }; + }, + getters: {}, + actions: { + /** 获取债务追踪 */ + async getDebtTrackingList() { + // 整理请求参数 + const data = { ...this.pagination, ...this.form }; + delete data.pageSizes; + delete data.total; + delete data.background; + + // 获取债务追踪列表 + const result = await fetchGetDebtTrackingList(data); + + // 公共页面函数hook + const pagination = storePagination.bind(this); + return pagination(result); + }, + + /** 添加债务追踪 */ + async addDebtTracking(data: any) { + const result = await fetchAddDebtTracking(data); + return storeMessage(result); + }, + + /** 修改债务追踪 */ + async updateDebtTracking(data: any) { + const result = await fetchUpdateDebtTracking(data); + return storeMessage(result); + }, + + /** 删除债务追踪 */ + async deleteDebtTracking(data: any) { + const result = await fetchDeleteDebtTracking(data); + return storeMessage(result); + }, + }, +}); diff --git a/src/views/financial/debtTracking/debt-tracking-dialog.vue b/src/views/financial/debtTracking/debt-tracking-dialog.vue new file mode 100644 index 0000000..0cbe370 --- /dev/null +++ b/src/views/financial/debtTracking/debt-tracking-dialog.vue @@ -0,0 +1,64 @@ + + + diff --git a/src/views/financial/debtTracking/index.vue b/src/views/financial/debtTracking/index.vue new file mode 100644 index 0000000..6a6a3f2 --- /dev/null +++ b/src/views/financial/debtTracking/index.vue @@ -0,0 +1,133 @@ + + + diff --git a/src/views/financial/debtTracking/utils/columns.ts b/src/views/financial/debtTracking/utils/columns.ts new file mode 100644 index 0000000..a9d6d9e --- /dev/null +++ b/src/views/financial/debtTracking/utils/columns.ts @@ -0,0 +1,40 @@ +import { reactive } from 'vue'; +import { $t } from '@/plugins/i18n'; +import type { FormRules } from 'element-plus'; + +// 表格列 +export const columns: TableColumnList = [ + { type: 'selection', align: 'left' }, + { type: 'index', index: (index: number) => index + 1, label: '序号', width: 60 }, + // 绑定的用户 + { label: $t('userId'), prop: 'userId' }, + // 债务人姓名 + { label: $t('debtorName'), prop: 'debtorName' }, + // 债务金额 + { label: $t('debtAmount'), prop: 'debtAmount' }, + // 债务类型 + { label: $t('debtType'), prop: 'debtType' }, + // 债务状态 + { label: $t('debtStatus'), prop: 'debtStatus' }, + // 还款截止日期 + { label: $t('dueDate'), prop: 'dueDate' }, + { label: $t('table.updateTime'), prop: 'updateTime', sortable: true, width: 160 }, + { label: $t('table.createTime'), prop: 'createTime', sortable: true, width: 160 }, + { label: $t('table.operation'), fixed: 'right', width: 210, slot: 'operation' }, +]; + +// 添加规则 +export const rules = reactive({ + // 绑定的用户 + userId: [{ required: true, message: `${$t('input')}${$t('userId')}`, trigger: 'blur' }], + // 债务人姓名 + debtorName: [{ required: true, message: `${$t('input')}${$t('debtorName')}`, trigger: 'blur' }], + // 债务金额 + debtAmount: [{ required: true, message: `${$t('input')}${$t('debtAmount')}`, trigger: 'blur' }], + // 债务类型 + debtType: [{ required: true, message: `${$t('input')}${$t('debtType')}`, trigger: 'blur' }], + // 债务状态 + debtStatus: [{ required: true, message: `${$t('input')}${$t('debtStatus')}`, trigger: 'blur' }], + // 还款截止日期 + dueDate: [{ required: true, message: `${$t('input')}${$t('dueDate')}`, trigger: 'blur' }], +}); diff --git a/src/views/financial/debtTracking/utils/hooks.ts b/src/views/financial/debtTracking/utils/hooks.ts new file mode 100644 index 0000000..73a1202 --- /dev/null +++ b/src/views/financial/debtTracking/utils/hooks.ts @@ -0,0 +1,134 @@ +import { addDialog } from '@/components/BaseDialog/index'; +import DebtTrackingDialog from '@/views/financial/debtTracking/debt-tracking-dialog.vue'; +import { useDebtTrackingStore } from '@/store/financial/debtTracking'; +import { h, ref } from 'vue'; +import { message, messageBox } from '@/utils/message'; +import type { FormItemProps } from '@/views/financial/debtTracking/utils/types'; +import { $t } from '@/plugins/i18n'; +import DeleteBatchDialog from '@/components/Table/DeleteBatchDialog.vue'; + +export const formRef = ref(); +// 删除ids +export const deleteIds = ref([]); +const debtTrackingStore = useDebtTrackingStore(); + +/** 搜索初始化债务追踪 */ +export async function onSearch() { + debtTrackingStore.loading = true; + await debtTrackingStore.getDebtTrackingList(); + debtTrackingStore.loading = false; +} + +/** 添加债务追踪 */ +export function onAdd() { + addDialog({ + title: `${$t('addNew')}${$t('debtTracking')}`, + width: '30%', + props: { + formInline: { + userId: undefined, + debtorName: undefined, + debtAmount: undefined, + debtType: undefined, + debtStatus: undefined, + dueDate: undefined, + }, + }, + draggable: true, + fullscreenIcon: true, + closeOnClickModal: false, + contentRenderer: () => h(DebtTrackingDialog, { ref: formRef }), + beforeSure: (done, { options }) => { + const form = options.props.formInline as FormItemProps; + formRef.value.formRef.validate(async (valid: any) => { + if (!valid) return; + + const result = await debtTrackingStore.addDebtTracking(form); + if (!result) return; + done(); + await onSearch(); + }); + }, + }); +} + +/** 更新债务追踪 */ +export function onUpdate(row: any) { + addDialog({ + title: `${$t('modify')}${$t('debtTracking')}`, + width: '30%', + props: { + formInline: { + userId: row.userId, + debtorName: row.debtorName, + debtAmount: row.debtAmount, + debtType: row.debtType, + debtStatus: row.debtStatus, + dueDate: row.dueDate, + }, + }, + draggable: true, + fullscreenIcon: true, + closeOnClickModal: false, + contentRenderer: () => h(DebtTrackingDialog, { ref: formRef }), + beforeSure: (done, { options }) => { + const form = options.props.formInline as FormItemProps; + formRef.value.formRef.validate(async (valid: any) => { + if (!valid) return; + + const result = await debtTrackingStore.updateDebtTracking({ ...form, id: row.id }); + if (!result) return; + done(); + await onSearch(); + }); + }, + }); +} + +/** 删除债务追踪 */ +export const onDelete = async (row: any) => { + const id = row.id; + + // 是否确认删除 + const result = await messageBox({ + title: $t('confirmDelete'), + showMessage: false, + confirmMessage: undefined, + cancelMessage: $t('cancel_delete'), + }); + if (!result) return; + + // 删除数据 + await debtTrackingStore.deleteDebtTracking([id]); + await onSearch(); +}; + +/** 批量删除 */ +export const onDeleteBatch = async () => { + const ids = deleteIds.value; + const formDeletedBatchRef = ref(); + + addDialog({ + title: $t('deleteBatchTip'), + width: '30%', + props: { formInline: { confirmText: '' } }, + draggable: true, + fullscreenIcon: true, + closeOnClickModal: false, + contentRenderer: () => h(DeleteBatchDialog, { ref: formDeletedBatchRef }), + beforeSure: (done, { options }) => { + formDeletedBatchRef.value.formDeletedBatchRef.validate(async (valid: any) => { + if (!valid) return; + + const text = options.props.formInline.confirmText.toLowerCase(); + if (text === 'yes' || text === 'y') { + // 删除数据 + await debtTrackingStore.deleteDebtTracking(ids); + await onSearch(); + + done(); + } else message($t('deleteBatchTip'), { type: 'warning' }); + }); + }, + }); +}; diff --git a/src/views/financial/debtTracking/utils/types.ts b/src/views/financial/debtTracking/utils/types.ts new file mode 100644 index 0000000..0790c84 --- /dev/null +++ b/src/views/financial/debtTracking/utils/types.ts @@ -0,0 +1,20 @@ +// 添加或者修改表单元素 +export interface FormItemProps { + // 绑定的用户 + userId: number; + // 债务人姓名 + debtorName: string; + // 债务金额 + debtAmount: any; + // 债务类型 + debtType: string; + // 债务状态 + debtStatus: string; + // 还款截止日期 + dueDate: any; +} + +// 添加或修改表单Props +export interface FormProps { + formInline: FormItemProps; +}