wupengfei
3 天以前 94e941341c4e2ac704f70c5ae61be2d6a61fcef4
feat: 页面
3个文件已添加
1个文件已删除
5个文件已修改
673 ■■■■■ 已修改文件
src/hooks/useEvent.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.ts 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/BalanceManage.vue 137 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/ServiceChargeDetail.vue 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/ServiceChargeManage.vue 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/ServiceChargeSettle.vue 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/components/BalanceDetailDialog.vue 141 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/components/EditAccountInfoDialog.vue 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/constants/columns.ts 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/useEvent.ts
@@ -6,7 +6,6 @@
  'taskManage:add': any;
  'taskManage:edit': any;
  checkReceiveTask: any;
  serviceChargeSettle: any;
};
export type GlobalEventListener<T extends keyof GlobalEvent> = (payload: GlobalEvent[T]) => any;
src/router/index.ts
@@ -257,14 +257,14 @@
        },
      },
      {
        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',
        },
src/views/ServiceChargeManage/BalanceManage.vue
New file
@@ -0,0 +1,137 @@
<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>
src/views/ServiceChargeManage/ServiceChargeDetail.vue
@@ -2,11 +2,6 @@
  <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">
@@ -36,7 +31,6 @@
                ></ProFormDatePicker>
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8"></ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="8">
@@ -49,16 +43,10 @@
                <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">
@@ -79,7 +67,7 @@
            </el-step>
          </el-steps>
        </div>
      </ChunkCell>
      </ChunkCell> -->
      <ChunkCell title="结算名单">
        <ProTableQueryFilterBar @on-reset="reset">
          <template #query>
@@ -87,7 +75,7 @@
              <SearchInput
                v-model="extraParamState.keywords"
                style="width: 300px"
                placeholder="人员姓名/身份证号/手机号"
                placeholder="姓名/手机/身份证号/客户"
                @on-click-search="getList"
              >
              </SearchInput>
@@ -107,6 +95,7 @@
        </ProTableV2>
      </ChunkCell>
    </AppScrollContainer>
    <EditAccountInfoDialog v-bind="dialogProps"></EditAccountInfoDialog>
  </LoadingLayout>
</template>
<script setup lang="ts">
@@ -129,12 +118,14 @@
  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',
@@ -143,8 +134,11 @@
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'downloadBtn',
      name: '下载回单',
      enCode: 'editBtn',
      name: '编辑',
    },
    emits: {
      onClick: (role) => openDialog(role),
    },
  },
]);
@@ -209,10 +203,25 @@
  }
);
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();
});
src/views/ServiceChargeManage/ServiceChargeManage.vue
@@ -169,12 +169,6 @@
const router = useRouter();
const eventContext = useGlobalEventContext();
eventContext.addEvent('serviceChargeSettle', () => {
  getList(paginationState.pageIndex);
});
const BaseState = {
  loading: true,
};
@@ -251,7 +245,7 @@
  handleEdit: handleSettleEdit,
  editForm: settleEditForm,
} = useFormDialog({
  onConfirm: goSettle,
  onConfirm: handleSettle,
  defaultFormParams: {
    id: '',
    name: '',
@@ -259,20 +253,13 @@
  },
});
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,
    },
  });
}
src/views/ServiceChargeManage/ServiceChargeSettle.vue
File was deleted
src/views/ServiceChargeManage/components/BalanceDetailDialog.vue
New file
@@ -0,0 +1,141 @@
<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>
src/views/ServiceChargeManage/components/EditAccountInfoDialog.vue
New file
@@ -0,0 +1,89 @@
<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>
src/views/ServiceChargeManage/constants/columns.ts
@@ -112,16 +112,29 @@
  {
    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: '账户余额',
  },
]);