| | |
| | | 'taskManage:add': any; |
| | | 'taskManage:edit': any; |
| | | checkReceiveTask: any; |
| | | serviceChargeSettle: any; |
| | | }; |
| | | |
| | | export type GlobalEventListener<T extends keyof GlobalEvent> = (payload: GlobalEvent[T]) => any; |
| | |
| | | }, |
| | | }, |
| | | { |
| | | path: '/ServiceChargeSettle/:id', |
| | | name: 'ServiceChargeSettle', |
| | | hidden: true, |
| | | alwaysShow: false, |
| | | component: () => import('@/views/ServiceChargeManage/ServiceChargeSettle.vue'), |
| | | path: '/BalanceManage', |
| | | name: 'BalanceManage', |
| | | hidden: false, |
| | | alwaysShow: true, |
| | | component: () => import('@/views/ServiceChargeManage/BalanceManage.vue'), |
| | | meta: { |
| | | rank: 10042, |
| | | title: '结算', |
| | | title: '余额管理', |
| | | // rootMenu: true, |
| | | icon: 'home', |
| | | }, |
New file |
| | |
| | | <template> |
| | | <LoadingLayout :loading="state.loading"> |
| | | <AppContainer> |
| | | <ProTableQueryFilterBar @on-reset="reset"> |
| | | <template #query> |
| | | <QueryFilterItem tip-content="余额范围"> |
| | | <el-input-number |
| | | v-model="extraParamState.minAmount" |
| | | placeholder="余额最小金额" |
| | | size="small" |
| | | style="width: 150px" |
| | | :controls="false" |
| | | />~ |
| | | <el-input-number |
| | | v-model="extraParamState.maxAmount" |
| | | placeholder="余额最大金额" |
| | | size="small" |
| | | style="width: 150px" |
| | | :controls="false" |
| | | /> |
| | | </QueryFilterItem> |
| | | <QueryFilterItem> |
| | | <SearchInput |
| | | v-model="extraParamState.keyword" |
| | | style="width: 260px" |
| | | placeholder="姓名/手机号/身份证号" |
| | | @on-click-search="getList" |
| | | > |
| | | </SearchInput> |
| | | </QueryFilterItem> |
| | | </template> |
| | | </ProTableQueryFilterBar> |
| | | <ProTableV2 |
| | | v-bind="proTableProps" |
| | | :columns="BalanceManageColumns" |
| | | :operationBtns="operationBtns" |
| | | > |
| | | </ProTableV2> |
| | | </AppContainer> |
| | | <BalanceDetailDialog v-bind="dialogProps" /> |
| | | </LoadingLayout> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { |
| | | ProTableQueryFilterBar, |
| | | ProTableV2, |
| | | SearchInput, |
| | | LoadingLayout, |
| | | AppContainer, |
| | | QueryFilterItem, |
| | | useTable, |
| | | useFormDialog, |
| | | defineOperationBtns, |
| | | } from '@bole-core/components'; |
| | | import * as enterpriseServices from '@/services/api/enterprise'; |
| | | import BalanceDetailDialog from './components/BalanceDetailDialog.vue'; |
| | | import { BalanceManageColumns } from './constants'; |
| | | |
| | | defineOptions({ |
| | | name: 'BalanceManage', |
| | | }); |
| | | |
| | | const operationBtns = defineOperationBtns([ |
| | | { |
| | | data: { |
| | | enCode: 'detailBtn', |
| | | name: '明细', |
| | | }, |
| | | emits: { |
| | | onClick: (role) => openDialog(role), |
| | | }, |
| | | extraProps: { |
| | | hide: () => false, |
| | | }, |
| | | }, |
| | | ]); |
| | | |
| | | const router = useRouter(); |
| | | const BaseState = { |
| | | loading: true, |
| | | }; |
| | | |
| | | const state = reactive({ ...BaseState }); |
| | | |
| | | onMounted(async () => { |
| | | await getList(); |
| | | state.loading = false; |
| | | }); |
| | | |
| | | const { |
| | | getDataSource: getList, |
| | | proTableProps, |
| | | paginationState, |
| | | extraParamState, |
| | | reset, |
| | | } = useTable( |
| | | async ({ pageIndex, pageSize }, extraParamState) => { |
| | | try { |
| | | let params: API.GetEnterprisesQuery = { |
| | | pageModel: { |
| | | rows: pageSize, |
| | | page: pageIndex, |
| | | orderInput: extraParamState.orderInput, |
| | | }, |
| | | // searchKeys: extraParamState.keyword, |
| | | }; |
| | | let res = await enterpriseServices.getEnterprises(params, { |
| | | showLoading: !state.loading, |
| | | }); |
| | | return res; |
| | | } catch (error) {} |
| | | }, |
| | | { |
| | | defaultExtraParams: { |
| | | keyword: '', |
| | | status: '', |
| | | minAmount: null as number, |
| | | maxAmount: null as number, |
| | | orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], |
| | | }, |
| | | columnsRenderProps: {}, |
| | | } |
| | | ); |
| | | |
| | | const { dialogProps, handleEdit, editForm } = useFormDialog({ |
| | | defaultFormParams: { |
| | | id: '', |
| | | }, |
| | | }); |
| | | |
| | | function openDialog(row) { |
| | | handleEdit({ |
| | | id: row.id, |
| | | }); |
| | | } |
| | | </script> |
| | |
| | | <LoadingLayout :loading="isLoading"> |
| | | <AppScrollContainer> |
| | | <ChunkCell title="结算单详情"> |
| | | <template #titleRight> |
| | | <el-button type="primary" icon="Download" @click="handleDownloadTemplate()" |
| | | >电子回单下载</el-button |
| | | > |
| | | </template> |
| | | <ProForm :model="form" ref="formRef" label-width="120px" :is-read="true"> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="8"> |
| | |
| | | ></ProFormDatePicker> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | <ProFormColItem :span="8"></ProFormColItem> |
| | | </ProFormCol> |
| | | <ProFormCol> |
| | | <ProFormColItem :span="8"> |
| | |
| | | <ProFormInputNumber v-model="form.money"> </ProFormInputNumber> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | <ProFormColItem :span="8"> |
| | | <ProFormItemV2 label="状态:" prop="status"> |
| | | <ProFormRadio v-model="form.status" :value-enum="[{ label: '是', value: 1 }]"> |
| | | </ProFormRadio> |
| | | </ProFormItemV2> |
| | | </ProFormColItem> |
| | | </ProFormCol> |
| | | </ProForm> |
| | | </ChunkCell> |
| | | <ChunkCell title="结算流程"> |
| | | <!-- <ChunkCell title="结算流程"> |
| | | <div class="step-wrapper"> |
| | | <el-steps :active="1" align-center finish-status="process"> |
| | | <el-step title="结算单上传" :icon="Edit"> |
| | |
| | | </el-step> |
| | | </el-steps> |
| | | </div> |
| | | </ChunkCell> |
| | | </ChunkCell> --> |
| | | <ChunkCell title="结算名单"> |
| | | <ProTableQueryFilterBar @on-reset="reset"> |
| | | <template #query> |
| | |
| | | <SearchInput |
| | | v-model="extraParamState.keywords" |
| | | style="width: 300px" |
| | | placeholder="人员姓名/身份证号/手机号" |
| | | placeholder="姓名/手机/身份证号/客户" |
| | | @on-click-search="getList" |
| | | > |
| | | </SearchInput> |
| | |
| | | </ProTableV2> |
| | | </ChunkCell> |
| | | </AppScrollContainer> |
| | | <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog> |
| | | </LoadingLayout> |
| | | </template> |
| | | <script setup lang="ts"> |
| | |
| | | QueryFilterItem, |
| | | ProTableQueryFilterBar, |
| | | TextOverTooltip, |
| | | useFormDialog, |
| | | } from '@bole-core/components'; |
| | | import { Edit, Upload } from '@element-plus/icons-vue'; |
| | | import { SettlementListColumns } from './constants'; |
| | | import { useQuery } from '@tanstack/vue-query'; |
| | | import { downloadFileByUrl } from '@bole-core/core'; |
| | | import * as taskServices from '@/services/api/task'; |
| | | import EditAccountInfoDialog from './components/EditAccountInfoDialog.vue'; |
| | | |
| | | defineOptions({ |
| | | name: 'ServiceChargeDetail', |
| | |
| | | const operationBtns = defineOperationBtns([ |
| | | { |
| | | data: { |
| | | enCode: 'downloadBtn', |
| | | name: '下载回单', |
| | | enCode: 'editBtn', |
| | | name: '编辑', |
| | | }, |
| | | emits: { |
| | | onClick: (role) => openDialog(role), |
| | | }, |
| | | }, |
| | | ]); |
| | |
| | | } |
| | | ); |
| | | |
| | | function handleDownloadTemplate() { |
| | | downloadFileByUrl('', '电子回单'); |
| | | const { dialogProps, handleAdd, handleEdit, editForm } = useFormDialog({ |
| | | onConfirm: handleAddOrEdit, |
| | | defaultFormParams: { |
| | | id: '', |
| | | name: '', |
| | | }, |
| | | }); |
| | | |
| | | function openDialog(row?) { |
| | | if (row) { |
| | | handleEdit({ |
| | | id: row?.id, |
| | | name: row?.name, |
| | | }); |
| | | } |
| | | } |
| | | |
| | | async function handleAddOrEdit() {} |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | | }); |
| | |
| | | |
| | | const router = useRouter(); |
| | | |
| | | const eventContext = useGlobalEventContext(); |
| | | |
| | | eventContext.addEvent('serviceChargeSettle', () => { |
| | | getList(paginationState.pageIndex); |
| | | }); |
| | | |
| | | const BaseState = { |
| | | loading: true, |
| | | }; |
| | |
| | | handleEdit: handleSettleEdit, |
| | | editForm: settleEditForm, |
| | | } = useFormDialog({ |
| | | onConfirm: goSettle, |
| | | onConfirm: handleSettle, |
| | | defaultFormParams: { |
| | | id: '', |
| | | name: '', |
| | |
| | | }, |
| | | }); |
| | | |
| | | async function handleSettle() {} |
| | | |
| | | function openSettleDialog(row?) { |
| | | handleSettleEdit({ |
| | | id: row.id, |
| | | name: row.name, |
| | | count: row.count, |
| | | }); |
| | | } |
| | | |
| | | async function goSettle() { |
| | | router.push({ |
| | | name: 'ServiceChargeSettle', |
| | | params: { |
| | | id: settleEditForm.id, |
| | | }, |
| | | }); |
| | | } |
| | | |
New file |
| | |
| | | <template> |
| | | <ProDialog title="余额明细" v-model="visible" destroy-on-close draggable> |
| | | <ProDialogTableWrapper :height="500"> |
| | | <ProTableQueryFilterBar @on-reset="reset"> |
| | | <template #query> |
| | | <QueryFilterItem> |
| | | <FieldSelect |
| | | v-model="extraParamState.status" |
| | | :valueEnum="[]" |
| | | clearable |
| | | filterable |
| | | placeholder="交易类型" |
| | | /> |
| | | </QueryFilterItem> |
| | | <QueryFilterItem tip-content="查询日期"> |
| | | <FieldDatePicker |
| | | v-model="extraParamState.creationTime" |
| | | type="daterange" |
| | | range-separator="~" |
| | | start-placeholder="起始日期" |
| | | end-placeholder="截止日期" |
| | | clearable |
| | | @change="getList()" |
| | | ></FieldDatePicker> |
| | | </QueryFilterItem> |
| | | </template> |
| | | </ProTableQueryFilterBar> |
| | | <ProTableV2 v-bind="proTableProps" :columns="columns" :showOperationColumn="false"> |
| | | </ProTableV2> |
| | | </ProDialogTableWrapper> |
| | | </ProDialog> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { |
| | | defineColumns, |
| | | ProDialog, |
| | | useTable, |
| | | ProDialogTableWrapper, |
| | | QueryFilterItem, |
| | | FieldDatePicker, |
| | | FieldSelect, |
| | | ProTableV2, |
| | | ProTableQueryFilterBar, |
| | | } from '@bole-core/components'; |
| | | import * as enterpriseServices from '@/services/api/enterprise'; |
| | | import { ModelValueType } from 'element-plus'; |
| | | |
| | | defineOptions({ |
| | | name: 'FinanceDetailDialog', |
| | | }); |
| | | |
| | | type Form = { |
| | | id?: string; |
| | | }; |
| | | |
| | | const visible = defineModel({ type: Boolean }); |
| | | const form = defineModel<Form>('form'); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'update:modelValue', value: boolean): void; |
| | | (e: 'onCancel'): void; |
| | | }>(); |
| | | |
| | | const columns = defineColumns([ |
| | | { |
| | | id: '1', |
| | | enCode: 'name', |
| | | name: '交易时间', |
| | | }, |
| | | { |
| | | id: '2', |
| | | enCode: 'name', |
| | | name: '收入', |
| | | }, |
| | | { |
| | | id: '3', |
| | | enCode: 'name', |
| | | name: '支出', |
| | | }, |
| | | { |
| | | id: '4', |
| | | enCode: 'name', |
| | | name: '账户余额', |
| | | }, |
| | | { |
| | | id: '4', |
| | | enCode: 'name', |
| | | name: '对方帐号/户名', |
| | | }, |
| | | { |
| | | id: '4', |
| | | enCode: 'name', |
| | | name: '用途', |
| | | }, |
| | | ]); |
| | | |
| | | watch( |
| | | () => visible.value, |
| | | (value) => { |
| | | if (value) { |
| | | getList(); |
| | | } |
| | | } |
| | | ); |
| | | |
| | | const { |
| | | getDataSource: getList, |
| | | proTableProps, |
| | | paginationState, |
| | | extraParamState, |
| | | reset, |
| | | } = useTable( |
| | | async ({ pageIndex, pageSize }, extraParamState) => { |
| | | try { |
| | | let params: API.GetEnterprisesQuery = { |
| | | pageModel: { |
| | | rows: pageSize, |
| | | page: pageIndex, |
| | | orderInput: extraParamState.orderInput, |
| | | }, |
| | | // searchKeys: extraParamState.keyword, |
| | | }; |
| | | let res = await enterpriseServices.getEnterprises(params); |
| | | return res; |
| | | } catch (error) {} |
| | | }, |
| | | { |
| | | defaultExtraParams: { |
| | | status: '', |
| | | creationTime: [] as unknown as ModelValueType, |
| | | orderInput: [{ property: 'id', order: EnumPagedListOrder.Asc }], |
| | | }, |
| | | columnsRenderProps: {}, |
| | | } |
| | | ); |
| | | </script> |
| | | |
| | | <style lang="scss" scoped> |
| | | @use '@/style/common.scss' as *; |
| | | </style> |
New file |
| | |
| | | <template> |
| | | <ProDialog |
| | | title="编辑" |
| | | v-model="visible" |
| | | @close="onDialogClose" |
| | | destroy-on-close |
| | | draggable |
| | | :width="700" |
| | | > |
| | | <ProForm :model="form" ref="dialogForm" label-width="120px"> |
| | | <ProFormItemV2 label="所属银行:" prop="name" :check-rules="[{ message: '请输入所属银行' }]"> |
| | | <ProFormText placeholder="请输入所属银行" v-model.trim="form.name"></ProFormText> |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 label="收款账户:" prop="name" :check-rules="[{ message: '请输入收款账户' }]"> |
| | | <ProFormText placeholder="请输入收款账户" v-model.trim="form.name"></ProFormText> |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 label="结算金额:" prop="name" :check-rules="[{ message: '请输入结算金额' }]"> |
| | | <ProFormInputNumber |
| | | placeholder="请输入结算金额" |
| | | v-model.trim="form.name" |
| | | :controls="false" |
| | | :min="0" |
| | | ></ProFormInputNumber> |
| | | </ProFormItemV2> |
| | | <ProFormItemV2 label="实发金额:" prop="name" :check-rules="[{ message: '请输入实发金额' }]"> |
| | | <ProFormInputNumber |
| | | placeholder="请输入实发金额" |
| | | v-model.trim="form.name" |
| | | :controls="false" |
| | | :min="0" |
| | | ></ProFormInputNumber> |
| | | </ProFormItemV2> |
| | | </ProForm> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="emit('onCancel')">取消</el-button> |
| | | <el-button type="primary" @click="handleConfirm">确认</el-button> |
| | | </span> |
| | | </template> |
| | | </ProDialog> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { FormInstance } from 'element-plus'; |
| | | import { |
| | | ProDialog, |
| | | ProForm, |
| | | ProFormInputNumber, |
| | | ProFormItemV2, |
| | | ProFormText, |
| | | UploadUserFile, |
| | | } from '@bole-core/components'; |
| | | |
| | | defineOptions({ |
| | | name: 'EditAccountInfoDialog', |
| | | }); |
| | | |
| | | type Form = { |
| | | title?: string; |
| | | name: string; |
| | | }; |
| | | |
| | | const visible = defineModel({ type: Boolean }); |
| | | |
| | | const form = defineModel<Form>('form'); |
| | | |
| | | const emit = defineEmits<{ |
| | | (e: 'onConfirm'): void; |
| | | (e: 'onCancel'): void; |
| | | }>(); |
| | | |
| | | const dialogForm = ref<FormInstance>(); |
| | | |
| | | function onDialogClose() { |
| | | if (!dialogForm.value) return; |
| | | dialogForm.value.resetFields(); |
| | | } |
| | | |
| | | function handleConfirm() { |
| | | if (!dialogForm.value) return; |
| | | dialogForm.value.validate((valid) => { |
| | | if (valid) { |
| | | emit('onConfirm'); |
| | | } else { |
| | | return; |
| | | } |
| | | }); |
| | | } |
| | | </script> |
| | |
| | | { |
| | | id: '9', |
| | | enCode: 'name', |
| | | name: '状态', |
| | | }, |
| | | { |
| | | id: '10', |
| | | enCode: 'name', |
| | | name: '结算流水号', |
| | | }, |
| | | { |
| | | id: '11', |
| | | enCode: 'name', |
| | | name: '结算时间', |
| | | }, |
| | | ]); |
| | | |
| | | export const BalanceManageColumns = defineColumns([ |
| | | { |
| | | id: '1', |
| | | enCode: 'name', |
| | | name: '姓名', |
| | | }, |
| | | { |
| | | id: '2', |
| | | enCode: 'name', |
| | | name: '手机号', |
| | | }, |
| | | { |
| | | id: '3', |
| | | enCode: 'name', |
| | | name: '身份证号', |
| | | }, |
| | | { |
| | | id: '4', |
| | | enCode: 'name', |
| | | name: '账户余额', |
| | | }, |
| | | ]); |