zhengyiming
6 天以前 307e714ec9f85bae11ed892cb90e199a341b6be3
Merge branch 'master' of http://120.26.58.240:8888/r/flexJobAdminBClient
6个文件已添加
1 文件已重命名
14个文件已修改
13631 ■■■■ 已修改文件
pnpm-lock.yaml 12569 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/useEvent.ts 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.ts 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/CheckManage.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/EmploymentManage.vue 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/EmploymentManageArrange.vue 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/EmploymentSignList.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/components/AddOrEditEmploymentView.vue 170 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/EmploymentManage/constants/columns.ts 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FinanceManage/FinanceManage.vue 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FinanceManage/components/DistributionDetailView.vue 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FinanceManage/components/UsageDetailView.vue 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FinanceManage/constants/columns.ts 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FinanceManage/constants/index.ts 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/FlexJobManage.vue 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/components/SendShotMessageDialog.vue 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/FlexJobManage/constants/columns.ts 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/ServiceChargeDetail.vue 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/ServiceChargeManage.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/ServiceChargeSettle.vue 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/ServiceChargeManage/constants/columns.ts 70 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pnpm-lock.yaml
Diff too large
src/hooks/useEvent.ts
@@ -3,8 +3,8 @@
export type GlobalEvent = {
  'home:add': any;
  'taskManage:add': any;
  'taskManage:edit': any;
  'employment:add': any;
  'employment:edit': any;
};
export type GlobalEventListener<T extends keyof GlobalEvent> = (payload: GlobalEvent[T]) => any;
src/router/index.ts
@@ -137,11 +137,11 @@
    },
    children: [
      {
        path: '/TaskManage',
        name: 'TaskManage',
        path: '/EmploymentManageList',
        name: 'EmploymentManageList',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/EmploymentManage/TaskManage.vue'),
        component: () => import('@/views/EmploymentManage/EmploymentManage.vue'),
        meta: {
          rank: 10021,
          title: '任务管理',
@@ -150,7 +150,7 @@
        },
      },
      {
        path: '/AddOrEditEmployment',
        path: '/AddOrEditEmployment/:id?',
        name: 'AddOrEditEmployment',
        hidden: true,
        alwaysShow: false,
@@ -163,7 +163,7 @@
        },
      },
      {
        path: '/EmploymentManageDetail',
        path: '/EmploymentManageDetail/:id',
        name: 'EmploymentManageDetail',
        hidden: true,
        alwaysShow: false,
@@ -176,7 +176,7 @@
        },
      },
      {
        path: '/EmploymentSignList',
        path: '/EmploymentSignList/:id',
        name: 'EmploymentSignList',
        hidden: true,
        alwaysShow: false,
@@ -189,7 +189,7 @@
        },
      },
      {
        path: '/EmploymentManageArrange',
        path: '/EmploymentManageArrange/:id',
        name: 'EmploymentManageArrange',
        hidden: true,
        alwaysShow: false,
@@ -244,10 +244,10 @@
        },
      },
      {
        path: '/ServiceChargeSettle',
        path: '/ServiceChargeSettle/:id',
        name: 'ServiceChargeSettle',
        hidden: false,
        alwaysShow: true,
        hidden: true,
        alwaysShow: false,
        component: () => import('@/views/ServiceChargeManage/ServiceChargeSettle.vue'),
        meta: {
          rank: 10042,
@@ -257,13 +257,13 @@
        },
      },
      {
        path: '/ServiceChargeDetail',
        path: '/ServiceChargeDetail/:id',
        name: 'ServiceChargeDetail',
        hidden: false,
        alwaysShow: true,
        hidden: true,
        alwaysShow: false,
        component: () => import('@/views/ServiceChargeManage/ServiceChargeDetail.vue'),
        meta: {
          rank: 10042,
          rank: 10043,
          title: '详情',
          // rootMenu: true,
          icon: 'home',
@@ -272,6 +272,34 @@
    ],
  },
  {
    path: '/FinanceManage',
    redirect: 'noRedirect',
    component: Layout,
    hidden: false,
    alwaysShow: true,
    meta: {
      rank: 10050,
      title: '财务管理',
      rootMenu: true,
      icon: 'home',
    },
    children: [
      {
        path: '/FinanceManageList',
        name: 'FinanceManageList',
        hidden: false,
        alwaysShow: true,
        component: () => import('@/views/FinanceManage/FinanceManage.vue'),
        meta: {
          rank: 10051,
          title: '财务管理',
          // rootMenu: true,
          icon: 'home',
        },
      },
    ],
  },
  {
    path: '/Login',
    name: 'Login',
    hidden: true,
src/views/EmploymentManage/CheckManage.vue
@@ -145,7 +145,7 @@
  }
);
const { dialogProps, handleEdit, editForm } = useFormDialog({
const { dialogProps, dialogState, handleEdit, editForm } = useFormDialog({
  defaultFormParams: {
    id: '',
    type: '',
@@ -161,5 +161,6 @@
function handleCheck(val) {
  console.log('val: ', val);
  dialogState.dialogVisible = false;
}
</script>
src/views/EmploymentManage/EmploymentManage.vue
File was renamed from src/views/EmploymentManage/TaskManage.vue
@@ -60,7 +60,7 @@
        :operationBtns="operationBtns"
      >
        <template #signNum="{ row }">
          <el-button type="text" @click="goSignList(row.id)">{{ row.signNum || 0 }}</el-button>
          <el-button link type="primary" @click="goSignList(row)">{{ row.signNum || 0 }}</el-button>
        </template>
      </ProTableV2>
    </AppContainer>
@@ -86,7 +86,7 @@
import { useGlobalEventContext } from '@/hooks';
defineOptions({
  name: 'TaskManage',
  name: 'EmploymentManageList',
});
const operationBtns = defineOperationBtns([
@@ -153,11 +153,11 @@
const eventContext = useGlobalEventContext();
eventContext.addEvent('taskManage:add', () => {
eventContext.addEvent('employment:add', () => {
  getList();
});
eventContext.addEvent('taskManage:edit', () => {
eventContext.addEvent('employment:edit', () => {
  getList(paginationState.pageIndex);
});
src/views/EmploymentManage/EmploymentManageArrange.vue
@@ -43,7 +43,7 @@
            <SearchInput
              v-model="extraParamState.searchWord"
              style="width: 250px"
              placeholder="任务名称"
              placeholder="姓名/身份证/电话"
              @on-click-search="getList"
              @keyup.enter="getList()"
            >
@@ -146,11 +146,6 @@
);
function handleArrange(row) {
  router.push({
    name: 'EmploymentManageArrange',
    params: {
      id: row?.id ?? '',
    },
  });
  console.log('row: ', row);
}
</script>
src/views/EmploymentManage/EmploymentSignList.vue
@@ -99,7 +99,8 @@
]);
const router = useRouter();
const route = useRoute();
const id = route.params.id as string;
const BaseState = {
  loading: true,
};
src/views/EmploymentManage/components/AddOrEditEmploymentView.vue
@@ -11,27 +11,30 @@
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormItemV2 label="服务费:" prop="salaryType">
              <RadioWithExtra
                v-model="form.salaryType"
                :value-enum="[
                  { label: '按月', value: 1 },
                  { label: '按日', value: 2 },
                ]"
                :showExtra="true"
              >
                <template #extra>
                  <ProFormInputNumber
                    :controls="false"
                    :min="0"
                    :max="999"
                    v-model="form.name"
                    placeholder="请输入"
                    :unit="form.salaryType === 1 ? '元/月' : '元/天'"
                  ></ProFormInputNumber>
                </template>
              </RadioWithExtra>
            </ProFormItemV2>
            <ProFormColItem :span="12">
              <ProFormItemV2 label="服务费:" prop="salaryType">
                <RadioWithExtra
                  v-model="form.salaryType"
                  :value-enum="[
                    { label: '按月', value: 1 },
                    { label: '按日', value: 2 },
                  ]"
                  :showExtra="true"
                  :button-style="false"
                >
                  <template #extra>
                    <ProFormInputNumber
                      :controls="false"
                      :min="0"
                      :max="999"
                      v-model="form.name"
                      placeholder="请输入"
                      :unit="form.salaryType === 1 ? '元/月' : '元/天'"
                    ></ProFormInputNumber>
                  </template>
                </RadioWithExtra>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="12">
@@ -39,19 +42,39 @@
                <ProFormRadio
                  v-model="form.salaryType"
                  :value-enum="[{ label: '是', value: 1 }]"
                  :button-style="false"
                ></ProFormRadio>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="12">
              <ProFormItemV2 label="年龄要求:" prop="ageRange">
              <ProFormItemV2 label="福利:" prop="benefits">
                <el-checkbox
                  v-model="state.checBenefitskAll"
                  style="margin-right: 30px"
                  :indeterminate="state.isBenefitsIndeterminate"
                  @change="handleCheckBenefitsAllChange"
                  >全选</el-checkbox
                >
                <ProFormCheckbox
                  v-model="form.benefits"
                  :value-enum="[]"
                  enumLabelKey="name"
                  enum-value-key="id"
                  @change="handleCheckedBenefitsServicesChange"
                ></ProFormCheckbox>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="12">
              <ProFormItemV2 label="年龄范围:" prop="ageRange" class="form-age-range">
                <ProFormInputNumber
                  :controls="false"
                  :min="0"
                  v-model="form.ageStart"
                  placeholder="请输入"
                  disabled
                ></ProFormInputNumber>
                <div class="form-input-separator">至</div>
                <ProFormInputNumber
@@ -59,7 +82,6 @@
                  :min="0"
                  v-model="form.ageEnd"
                  placeholder="请输入"
                  disabled
                ></ProFormInputNumber>
              </ProFormItemV2>
            </ProFormColItem>
@@ -67,35 +89,50 @@
          <ProFormCol>
            <ProFormColItem :span="12">
              <ProFormItemV2 label="性别要求:" prop="sexRequirement" required>
                <RadioWithExtra
                <ProFormRadio
                  v-model="form.sexRequirement"
                  :value-enum="[
                    {
                      label: '不限',
                      value: 1,
                    },
                  ]"
                  :showExtra="true"
                  :value-enum="[{ label: '不限', value: 1 }]"
                ></ProFormRadio>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="12">
              <ProFormItemV2 label="资格证书:" prop="benefits">
                <el-checkbox
                  v-model="state.checBenefitskAll"
                  style="margin-right: 30px"
                  :indeterminate="state.isBenefitsIndeterminate"
                  @change="handleCheckBenefitsAllChange"
                  >全选</el-checkbox
                >
                  <template #extra>
                    <div class="form-input-separator">男性</div>
                    <ProFormInputNumber
                      :controls="false"
                      :min="0"
                      v-model="form.manNumber"
                      placeholder="请输入"
                      disabled
                    ></ProFormInputNumber>
                    <div class="form-input-separator">女性</div>
                    <ProFormInputNumber
                      :controls="false"
                      :min="0"
                      v-model="form.womanNumber"
                      placeholder="请输入"
                      disabled
                    ></ProFormInputNumber>
                  </template>
                </RadioWithExtra>
                <ProFormCheckbox
                  v-model="form.benefits"
                  :value-enum="[]"
                  enumLabelKey="name"
                  enum-value-key="id"
                  @change="handleCheckedBenefitsServicesChange"
                ></ProFormCheckbox>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="12">
              <ProFormItemV2 label="任务地点:" prop="areaList">
                <!-- <ProFromAddressSelect :areaList="form.areaList" :address="form.address" /> -->
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="12">
              <ProFormItemV2 label="任务时间:" prop="name">
                <ProFormDatePicker
                  v-model="form.name"
                  type="daterange"
                  range-separator="至"
                  start-placeholder="开始日期"
                  end-placeholder="结束日期"
                ></ProFormDatePicker>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
@@ -120,6 +157,8 @@
  ProFormText,
  ProFormInputNumber,
  ProFormRadio,
  ProFormDatePicker,
  ProFormCheckbox,
} from '@bole-core/components';
import { FormInstance } from 'element-plus';
import { Message } from '@bole-core/core';
@@ -141,6 +180,11 @@
const { closeViewPush } = useRouteView();
const state = reactive({
  checBenefitskAll: false,
  isBenefitsIndeterminate: false,
});
const form = reactive({
  name: '',
  salaryType: 1,
@@ -149,6 +193,9 @@
  sexRequirement: 1,
  manNumber: 0,
  womanNumber: 0,
  benefits: [],
  areaList: [] as number[],
  address: '',
});
const { isLoading } = useQuery({
@@ -161,6 +208,7 @@
      }
    );
  },
  placeholderData: () => ({} as API.GetFlexTaskDetailForBackOutput),
  onSuccess(data) {
    form.name = data.taskName;
  },
@@ -169,7 +217,7 @@
function handleBack() {
  closeViewPush(route, {
    name: 'TaskManage',
    name: 'EmploymentManageList',
  });
}
const productFormRef = ref<FormInstance>();
@@ -189,12 +237,28 @@
    let res;
    if (res) {
      Message.successMessage('操作成功');
      eventContext.emit(isEdit ? 'taskManage:edit' : 'taskManage:add');
      eventContext.emit(isEdit ? 'employment:edit' : 'employment:add');
      handleBack();
    }
  } catch (error) {}
}
function handleCheckBenefitsAllChange() {}
function handleCheckedBenefitsServicesChange() {}
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
:deep() {
  .radio-with-input-extra-wrapper {
    display: flex;
  }
  .form-age-range {
    .pro-from-item-read-content-wrapper {
      width: auto;
    }
  }
}
</style>
src/views/EmploymentManage/constants/columns.ts
@@ -5,13 +5,11 @@
    id: '1',
    enCode: 'name',
    name: '任务名称',
    width: 180,
  },
  {
    id: '2',
    enCode: 'name',
    name: '任务单号',
    width: 180,
  },
  {
    id: '3',
@@ -27,43 +25,36 @@
    id: '5',
    enCode: 'name',
    name: '结算方式',
    width: 140,
  },
  {
    id: '6',
    enCode: 'name',
    name: '性别要求',
    width: 140,
  },
  {
    id: '7',
    enCode: 'signNum',
    name: '报名人数',
    width: 140,
  },
  {
    id: '8',
    enCode: 'name',
    name: '任务状态',
    width: 140,
  },
  {
    id: '9',
    enCode: 'name',
    name: '发布日期',
    width: 160,
  },
  {
    id: '10',
    enCode: 'name',
    name: '结束日期',
    width: 160,
  },
  {
    id: '11',
    enCode: 'name',
    name: '发布状态',
    width: 160,
  },
]);
@@ -72,13 +63,11 @@
    id: '1',
    enCode: 'name',
    name: '姓名',
    width: 180,
  },
  {
    id: '2',
    enCode: 'name',
    name: '身份证号',
    width: 180,
  },
  {
    id: '3',
@@ -94,19 +83,16 @@
    id: '5',
    enCode: 'name',
    name: '性别',
    width: 140,
  },
  {
    id: '6',
    enCode: 'name',
    name: '学历',
    width: 140,
  },
  {
    id: '7',
    enCode: 'name',
    name: '排班状态',
    width: 140,
  },
]);
@@ -115,13 +101,11 @@
    id: '1',
    enCode: 'name',
    name: '姓名',
    width: 180,
  },
  {
    id: '2',
    enCode: 'name',
    name: '身份证号',
    width: 180,
  },
  {
    id: '3',
@@ -137,19 +121,16 @@
    id: '5',
    enCode: 'name',
    name: '性别',
    width: 140,
  },
  {
    id: '6',
    enCode: 'name',
    name: '学历',
    width: 140,
  },
  {
    id: '7',
    enCode: 'name',
    name: '录用状态',
    width: 140,
  },
]);
@@ -158,13 +139,11 @@
    id: '1',
    enCode: 'name',
    name: '姓名',
    width: 180,
  },
  {
    id: '2',
    enCode: 'name',
    name: '身份证号',
    width: 180,
  },
  {
    id: '3',
@@ -180,24 +159,20 @@
    id: '5',
    enCode: 'name',
    name: '手机号',
    width: 140,
  },
  {
    id: '6',
    enCode: 'name',
    name: '所属客户',
    width: 140,
  },
  {
    id: '7',
    enCode: 'name',
    name: '提交时间',
    width: 140,
  },
  {
    id: '8',
    enCode: 'name',
    name: '验收状态',
    width: 140,
  },
]);
src/views/FinanceManage/FinanceManage.vue
New file
@@ -0,0 +1,31 @@
<template>
  <AppContainer>
    <ProTabs v-model="state.tabType" hasBorder>
      <ProTabPane lazy label="发放明细" :name="FinanceTabType.DistributionDetail">
        <DistributionDetailView />
      </ProTabPane>
      <ProTabPane lazy label="用量明细" :name="FinanceTabType.UsageDetail">
        <UsageDetailView />
      </ProTabPane>
    </ProTabs>
  </AppContainer>
</template>
<script setup lang="ts">
import { AppContainer, ProTabs, ProTabPane } from '@bole-core/components';
import DistributionDetailView from './components/DistributionDetailView.vue';
import UsageDetailView from './components/UsageDetailView.vue';
defineOptions({
  name: 'FinanceManageList',
});
enum FinanceTabType {
  DistributionDetail = 10,
  UsageDetail = 20,
}
const state = reactive({
  tabType: FinanceTabType.DistributionDetail,
});
</script>
src/views/FinanceManage/components/DistributionDetailView.vue
New file
@@ -0,0 +1,81 @@
<template>
  <LoadingLayout :loading="state.loading">
    <AppContainer>
      <ProTableV2
        v-bind="proTableProps"
        :columns="DistributionDetailColumns"
        :operationBtns="operationBtns"
      >
      </ProTableV2>
    </AppContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import {
  ProTableV2,
  LoadingLayout,
  AppContainer,
  useTable,
  defineOperationBtns,
} from '@bole-core/components';
import * as flexEnterpriseServices from '@/services/api/FlexEnterprise';
import { DistributionDetailColumns } from '../constants';
import { FlexEnterpriseSettingStatus } from '@/constants';
import { OrderInputType } from '@bole-core/core';
defineOptions({
  name: 'DistributionDetailView',
});
const operationBtns = defineOperationBtns([]);
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.GetFlexEnterpriseInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        flexEnterpriseSettingStatus: extraParamState.flexEnterpriseSettingStatus,
        searchWord: extraParamState.searchWord,
      };
      let res = await flexEnterpriseServices.getFlexEnterpriseList(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {
      console.log('error: ', error);
    }
  },
  {
    defaultExtraParams: {
      searchWord: '',
      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
      flexEnterpriseSettingStatus: '' as any as FlexEnterpriseSettingStatus,
    },
    queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'],
    columnsRenderProps: {},
  }
);
</script>
src/views/FinanceManage/components/UsageDetailView.vue
New file
@@ -0,0 +1,69 @@
<template>
  <LoadingLayout :loading="state.loading">
    <AppContainer>
      <ProTableV2 v-bind="proTableProps" :columns="UsageDetailColumns" :showOperationColumn="false">
      </ProTableV2>
    </AppContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import { ProTableV2, LoadingLayout, AppContainer, useTable } from '@bole-core/components';
import * as flexEnterpriseServices from '@/services/api/FlexEnterprise';
import { UsageDetailColumns } from '../constants';
import { FlexEnterpriseSettingStatus } from '@/constants';
import { OrderInputType } from '@bole-core/core';
defineOptions({
  name: 'UsageDetailView',
});
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.GetFlexEnterpriseInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        flexEnterpriseSettingStatus: extraParamState.flexEnterpriseSettingStatus,
        searchWord: extraParamState.searchWord,
      };
      let res = await flexEnterpriseServices.getFlexEnterpriseList(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {
      console.log('error: ', error);
    }
  },
  {
    defaultExtraParams: {
      searchWord: '',
      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
      flexEnterpriseSettingStatus: '' as any as FlexEnterpriseSettingStatus,
    },
    queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'],
    columnsRenderProps: {},
  }
);
</script>
src/views/FinanceManage/constants/columns.ts
New file
@@ -0,0 +1,67 @@
import { defineColumns } from '@bole-core/components';
export const DistributionDetailColumns = defineColumns([
  {
    id: '1',
    enCode: 'name',
    name: '所属客户',
  },
  {
    id: '2',
    enCode: 'name',
    name: '所属任务',
  },
  {
    id: '3',
    enCode: 'name',
    name: '结算单名称',
  },
  {
    id: '4',
    enCode: 'name',
    name: '姓名',
  },
  {
    id: '5',
    enCode: 'name',
    name: '手机号',
  },
  {
    id: '6',
    enCode: 'name',
    name: '结算金额',
  },
  {
    id: '7',
    enCode: 'signNum',
    name: '结算状态',
  },
  {
    id: '8',
    enCode: 'name',
    name: '结算日期',
  },
]);
export const UsageDetailColumns = defineColumns([
  {
    id: '1',
    enCode: 'name',
    name: '使用时间',
  },
  {
    id: '2',
    enCode: 'name',
    name: '用量类型',
  },
  {
    id: '3',
    enCode: 'name',
    name: '扣费状态',
  },
  {
    id: '4',
    enCode: 'name',
    name: '费用(元)',
  },
]);
src/views/FinanceManage/constants/index.ts
New file
@@ -0,0 +1 @@
export * from './columns';
src/views/FlexJobManage/FlexJobManage.vue
@@ -100,6 +100,9 @@
        :operationBtns="operationBtns"
        show-column-check
        ref="proTable"
        :table-props="{
          rowKey: 'id',
        }"
      >
      </ProTableV2>
    </AppContainer>
@@ -108,6 +111,7 @@
      v-bind="dialogBatchImportProps"
      @onDownloadTemplate="handleDownloadTemplate"
    />
    <SendShotMessageDialog v-bind="dialogShotMessageProps" />
  </LoadingLayout>
</template>
@@ -134,6 +138,7 @@
import { convertApi2FormUrlOnlyOne, downloadFileByUrl } from '@/utils';
import StaffInfoDialog from './components/StaffInfoDialog.vue';
import BatchImportDialog from './components/BatchImportDialog.vue';
import SendShotMessageDialog from './components/SendShotMessageDialog.vue';
defineOptions({
  name: 'EnterpriseManageList',
@@ -326,12 +331,44 @@
async function handleBatchImport() {}
const {
  dialogProps: dialogShotMessageProps,
  handleAdd: handleShotMessageAdd,
  editForm: editShotMessageForm,
} = useFormDialog({
  onConfirm: sendMessageForSign,
  defaultFormParams: {
    ids: [] as string[],
    customerId: '',
    name: '',
  },
});
async function handleSendShotMessage() {
  try {
    const selectionRows = getSelectionRows();
    if (selectionRows) {
      if (selectionRows.some((x) => x.status === 10)) {
        await Message.tipMessage('勾选人员中包含已签约完成人员,确认要继续发送短信通知吗?');
      }
      handleShotMessageAdd({
        ids: selectionRows.map((x) => x.id),
        name: '人员签约通道短信',
      });
    }
  } catch (error) {}
}
async function sendMessageForSign() {
  try {
  } catch (error) {}
}
function handleDownloadTemplate() {
  downloadFileByUrl('', '批量导入模板');
}
function handleBatchUnSign() {}
function handleSendShotMessage() {}
function handleSign(row) {}
function handleBatchSign() {}
src/views/FlexJobManage/components/SendShotMessageDialog.vue
New file
@@ -0,0 +1,58 @@
<template>
  <ProDialog title="短信发送" v-model="visible" @close="onDialogClose" destroy-on-close draggable>
    <ProForm :model="form" ref="dialogForm" label-width="90px">
      <ProFormItemV2 label="短信类型:" prop="name" required>
        <div>{{ '人员签约通道短信' }}</div>
      </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, ProFormItemV2 } from '@bole-core/components';
defineOptions({
  name: 'SendShotMessageDialog',
});
const visible = defineModel({ type: Boolean });
type Form = {
  title?: string;
  ids: string[];
  customerId: string;
  name: string;
};
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/FlexJobManage/constants/columns.ts
@@ -5,13 +5,11 @@
    id: '1',
    enCode: 'name',
    name: '姓名',
    width: 180,
  },
  {
    id: '2',
    enCode: 'idNumber',
    name: '身份证号',
    width: 180,
  },
  {
    id: '3',
@@ -27,54 +25,45 @@
    id: '6',
    enCode: 'phoneNumber',
    name: '手机号',
    width: 140,
  },
  {
    id: '8',
    enCode: 'regiterStatus',
    name: '录用状态',
    width: 140,
  },
  {
    id: '9',
    enCode: 'realVerifyStatus',
    name: '实名状态',
    width: 140,
  },
  {
    id: '10',
    enCode: 'signStatus',
    name: '灵工签约状态',
    width: 140,
  },
  {
    id: '11',
    enCode: 'regiterTime',
    name: '录用时间',
    width: 160,
  },
  {
    id: '12',
    enCode: 'realVerifyTime',
    name: '实名时间',
    width: 160,
  },
  {
    id: '13',
    enCode: 'signTime',
    name: '签约时间',
    width: 160,
  },
  {
    id: '14',
    enCode: 'enterSignStatus',
    name: '企业签约状态',
    width: 160,
  },
  {
    id: '15',
    enCode: 'enterSignTime',
    name: '企业签约时间',
    width: 160,
  },
]);
src/views/ServiceChargeManage/ServiceChargeDetail.vue
@@ -1,25 +1,160 @@
<template>
  <LoadingLayout :loading="isLoading">
    <AppScrollContainer>
      <ChunkCell title="结算单详情"> </ChunkCell>
      <ChunkCell title="结算流程"> </ChunkCell>
      <ChunkCell title="结算名单"> </ChunkCell>
      <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">
              <ProFormItemV2 label="所属任务:" prop="name">
                <ProFormText v-model="form.name"> </ProFormText>
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="任务编号:" prop="name">
                <ProFormText v-model="form.name"> </ProFormText>
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8"></ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="结算单名称:" prop="name">
                <ProFormText v-model="form.name"> </ProFormText>
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="上传时间:" prop="name">
                <ProFormDatePicker
                  v-model="form.name"
                  type="date"
                  format="YYYY-MM-DD HH:mm"
                ></ProFormDatePicker>
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8"></ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="结算金额:" prop="money">
                <ProFormInputNumber v-model="form.money"> </ProFormInputNumber>
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="实发金额:" prop="money">
                <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="结算流程">
        <div class="step-wrapper">
          <el-steps :active="1" align-center finish-status="process">
            <el-step title="结算单上传" :icon="Edit">
              <template #description>
                <div>创建人:{{ form.name }}</div>
                <div>时间:{{ form.name }}</div>
                <TextOverTooltip>备注:{{ form.name }}</TextOverTooltip>
              </template>
            </el-step>
            <el-step title="结算付款" :icon="Upload">
              <template #description>
                <div>创建人:{{ form.name }}</div>
                <div>时间:{{ form.name }}</div>
                <TextOverTooltip
                  >备注:{{ 'form.nameform.nameform.eform.nameform.nameform.name' }}</TextOverTooltip
                >
              </template>
            </el-step>
          </el-steps>
        </div>
      </ChunkCell>
      <ChunkCell title="结算名单">
        <ProTableQueryFilterBar @on-reset="reset">
          <template #query>
            <QueryFilterItem>
              <SearchInput
                v-model="extraParamState.searchWord"
                style="width: 300px"
                placeholder="人员姓名/身份证号/手机号"
                @on-click-search="getList"
              >
              </SearchInput>
            </QueryFilterItem>
          </template>
        </ProTableQueryFilterBar>
        <ProTableV2
          v-bind="proTableProps"
          :columns="SettlementListColumns"
          :operationBtns="operationBtns"
          :auto-height="false"
          ref="proTable"
          :tableProps="{
            maxHeight: '400px',
          }"
        >
        </ProTableV2>
      </ChunkCell>
    </AppScrollContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import { LoadingLayout, AppScrollContainer, ChunkCell } from '@bole-core/components';
import {
  LoadingLayout,
  AppScrollContainer,
  ChunkCell,
  ProForm,
  ProFormItemV2,
  ProFormText,
  ProFormCol,
  ProFormColItem,
  ProFormDatePicker,
  ProFormInputNumber,
  ProFormRadio,
  useTable,
  ProTableV2,
  defineOperationBtns,
  SearchInput,
  QueryFilterItem,
  ProTableQueryFilterBar,
  TextOverTooltip,
} from '@bole-core/components';
import { Edit, Upload } from '@element-plus/icons-vue';
import { SettlementListColumns } from './constants';
import { useQuery } from '@tanstack/vue-query';
import { downloadFileByUrl, OrderInputType } from '@bole-core/core';
defineOptions({
  name: 'ServiceChargeDetail',
});
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'downloadBtn',
      name: '下载回单',
    },
  },
]);
const route = useRoute();
const id = (route.params.id as string) ?? '';
const state = reactive({
  loading: true,
const form = reactive({
  name: '',
  money: 0,
  status: 1,
});
const { isLoading } = useQuery({
@@ -32,13 +167,65 @@
      }
    );
  },
  placeholderData: () => ({} as API.GetFlexTaskDetailForBackOutput),
  onSuccess(data) {},
  enabled: !!id,
});
onMounted(() => {});
const {
  getDataSource: getList,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.GetFlexEnterpriseInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        searchWord: extraParamState.searchWord,
      };
      let res = await flexEnterpriseServices.getFlexEnterpriseList(params);
      return res;
    } catch (error) {
      console.log('error: ', error);
    }
  },
  {
    defaultExtraParams: {
      searchWord: '',
      orderInput: [{ property: 'id', order: OrderInputType.Desc }],
    },
    queryKey: ['flexEnterpriseServices/getFlexEnterpriseList'],
    columnsRenderProps: {},
  }
);
function handleDownloadTemplate() {
  downloadFileByUrl('', '电子回单');
}
onMounted(() => {
  getList();
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
.step-wrapper {
  margin: 0 auto;
  padding: 24px 0;
}
</style>
<style lang="scss">
.text-over-tooltip-content {
  max-width: 600px;
  word-break: break-all;
}
</style>
src/views/ServiceChargeManage/ServiceChargeManage.vue
@@ -52,7 +52,18 @@
        </template>
        <template #btn>
          <el-button type="primary" link @click="handleDownloadTemplate()">结算单模板</el-button>
          <el-button type="primary" @click="handleDownloadTemplate()">上传结算单</el-button>
          <BlFileUpload
            :limitFileSize="10"
            accept="xls,xlsx"
            :showTip="false"
            :show-file-list="false"
            :on-success="handleUploadSuccess"
            style="margin-right: 10px; margin-left: 10px"
          >
            <template #default>
              <el-button type="primary">上传结算单</el-button>
            </template>
          </BlFileUpload>
          <el-button type="primary" @click="handleDownloadTemplate()">导出</el-button>
        </template>
      </ProTableQueryFilterBar>
@@ -94,6 +105,7 @@
  FieldRadio,
  defineOperationBtns,
  BlFileUpload,
  UploadUserFile,
} from '@bole-core/components';
import { ServiceChargeManageColumns } from './constants';
import { FlexEnterpriseSettingStatus, Gender } from '@/constants';
@@ -101,7 +113,7 @@
import { downloadFileByUrl } from '@/utils';
defineOptions({
  name: 'ServiceChargeManage',
  name: 'ServiceChargeManageList',
});
const operationBtns = defineOperationBtns([
@@ -194,7 +206,7 @@
function goSettle(row) {
  router.push({
    name: 'ServiceChargeSettle',
    query: {
    params: {
      id: row.id,
    },
  });
@@ -203,12 +215,14 @@
function goDetail(row) {
  router.push({
    name: 'ServiceChargeDetail',
    query: {
    params: {
      id: row.id,
    },
  });
}
function handleUploadSuccess(response: UploadUserFile) {}
function handleUpload(val, row) {
  console.log('val: ', val);
}
src/views/ServiceChargeManage/ServiceChargeSettle.vue
@@ -1,15 +1,118 @@
<template>
  <LoadingLayout :loading="isLoading">
    <AppScrollContainer>
      <ChunkCell title="付款方信息"> </ChunkCell>
      <ChunkCell title="收款方信息"> </ChunkCell>
      <ChunkCell title="转账信息"> </ChunkCell>
      <ChunkCell title="付款方信息">
        <ProForm :model="form" ref="formRef" label-width="120px">
          <ProFormItemV2
            label="付款账户:"
            prop="name"
            :check-rules="[{ message: '请选择付款账户' }]"
          >
            <ProFormSelect
              v-model="form.name"
              :valueEnum="[]"
              placeholder="请选择您的付款方式"
              clearable
            >
            </ProFormSelect>
          </ProFormItemV2>
          <ProFormMixinsItemContainer>
            <ProFormItemV2
              label="付款金额:"
              prop="money"
              :check-rules="[{ message: '请输入付款金额' }]"
              mode="read"
            >
              <ProFormInputNumber v-model="form.money"> </ProFormInputNumber>
            </ProFormItemV2>
          </ProFormMixinsItemContainer>
        </ProForm>
      </ChunkCell>
      <ChunkCell title="收款方信息">
        <ProForm :model="form" ref="formRef" label-width="120px">
          <ProFormItemV2
            label="收款方账户:"
            prop="name"
            :check-rules="[{ message: '请选择收款方账户' }]"
          >
            <ProFormRadio
              v-model="form.name"
              :valueEnum="[]"
              placeholder="请选择收款方账户"
              clearable
            >
            </ProFormRadio>
          </ProFormItemV2>
          <ProFormMixinsItemContainer>
            <ProFormItemV2
              label="收款方户名:"
              prop="name"
              :check-rules="[{ message: '请输入收款方户名' }]"
              mode="read"
            >
              <ProFormText v-model="form.name"> </ProFormText>
            </ProFormItemV2>
            <ProFormItemV2
              label="收款方账号:"
              prop="name"
              :check-rules="[{ message: '请输入收款方账号' }]"
              mode="read"
            >
              <ProFormText v-model="form.name"> </ProFormText>
            </ProFormItemV2>
            <ProFormItemV2
              label="收款方开户行:"
              prop="name"
              :check-rules="[{ message: '请输入收款开户行' }]"
              mode="read"
            >
              <ProFormText v-model="form.name"> </ProFormText>
            </ProFormItemV2>
          </ProFormMixinsItemContainer>
        </ProForm>
      </ChunkCell>
      <ChunkCell title="转账信息">
        <ProForm :model="form" ref="formRef" label-width="120px">
          <ProFormMixinsItemContainer>
            <ProFormItemV2 label="交易用途:" prop="name" mode="read">
              <ProFormText v-model="form.name"> </ProFormText>
            </ProFormItemV2>
          </ProFormMixinsItemContainer>
          <ProFormItemV2 label="附言:" prop="name">
            <ProFormText v-model="form.name" :maxlength="30" show-word-limit> </ProFormText>
          </ProFormItemV2>
          <ProFormItemV2 label="备注:" prop="name">
            <ProFormText v-model="form.name" :maxlength="30" show-word-limit> </ProFormText>
          </ProFormItemV2>
          <div class="chuck-add-or-edit-actions">
            <el-button class="chuck-add-or-edit-actions" @click="handleBack()">取消</el-button>
            <el-button class="chuck-add-or-edit-actions" type="primary" @click="handleSubmit"
              >提交审核</el-button
            >
          </div>
        </ProForm>
      </ChunkCell>
    </AppScrollContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import { LoadingLayout, AppScrollContainer, ChunkCell } from '@bole-core/components';
import {
  LoadingLayout,
  AppScrollContainer,
  ChunkCell,
  ProForm,
  ProFormItemV2,
  ProFormText,
  ProFormSelect,
  ProFormInputNumber,
  ProFormRadio,
  ProFormMixinsItemContainer,
} from '@bole-core/components';
import {} from '@/constants';
import { useQuery } from '@tanstack/vue-query';
import { useRouteView } from '@/hooks';
import { FormInstance } from 'element-plus';
import { validateFormList } from '@/utils';
defineOptions({
  name: 'ServiceChargeSettle',
@@ -18,8 +121,11 @@
const route = useRoute();
const id = (route.params.id as string) ?? '';
const state = reactive({
  loading: true,
const { closeViewPush } = useRouteView();
const form = reactive({
  name: '',
  money: 0,
});
const { isLoading } = useQuery({
@@ -32,10 +138,26 @@
      }
    );
  },
  placeholderData: () => ({} as API.GetFlexTaskDetailForBackOutput),
  onSuccess(data) {},
  enabled: !!id,
});
function handleBack() {
  closeViewPush(route, {
    name: 'ServiceChargeManageList',
  });
}
const formRef = ref<FormInstance>();
async function handleSubmit() {
  try {
    const valid = await validateFormList([formRef.value]);
    if (valid) {
      //
    }
  } catch (error) {}
}
onMounted(() => {});
</script>
src/views/ServiceChargeManage/constants/columns.ts
@@ -5,13 +5,11 @@
    id: '1',
    enCode: 'name',
    name: '所属任务',
    width: 180,
  },
  {
    id: '2',
    enCode: 'name',
    name: '发放方式',
    width: 180,
  },
  {
    id: '3',
@@ -27,60 +25,108 @@
    id: '5',
    enCode: 'name',
    name: '结算单状态',
    width: 140,
  },
  {
    id: '6',
    enCode: 'name',
    name: '结算单名称',
    width: 140,
  },
  {
    id: '7',
    enCode: 'signNum',
    name: '上传时间',
    width: 140,
  },
  {
    id: '8',
    enCode: 'name',
    name: '结算状态',
    width: 140,
  },
  {
    id: '9',
    enCode: 'name',
    name: '实发金额',
    width: 160,
  },
  {
    id: '10',
    enCode: 'name',
    name: '结算金额',
    width: 160,
  },
  {
    id: '11',
    enCode: 'name',
    name: '失败金额',
    width: 160,
  },
  {
    id: '12',
    enCode: 'name',
    name: '退款金额',
    width: 160,
  },
  {
    id: '13',
    enCode: 'name',
    name: '结算时间',
    width: 160,
  },
  {
    id: '14',
    enCode: 'name',
    name: '备注',
    width: 160,
  },
]);
export const SettlementListColumns = defineColumns([
  {
    id: '1',
    enCode: 'name',
    name: '姓名',
  },
  {
    id: '2',
    enCode: 'name',
    name: '身份证号',
  },
  {
    id: '3',
    enCode: 'name',
    name: '手机号',
  },
  {
    id: '4',
    enCode: 'name',
    name: '所属银行',
  },
  {
    id: '5',
    enCode: 'name',
    name: '所属支行',
  },
  {
    id: '6',
    enCode: 'name',
    name: '收款帐户',
  },
  {
    id: '7',
    enCode: 'signNum',
    name: '结算金额',
  },
  {
    id: '8',
    enCode: 'name',
    name: '实发金额',
  },
  {
    id: '9',
    enCode: 'name',
    name: '状态',
  },
  {
    id: '10',
    enCode: 'name',
    name: '结算流水号',
  },
  {
    id: '11',
    enCode: 'name',
    name: '结算时间',
  },
]);