wupengfei
2025-03-21 77f32b6d96237dc874ca81c0ecab1a21500cc5ab
feat: init
6个文件已修改
8个文件已添加
1756 ■■■■ 已修改文件
src/constants/app.ts 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.ts 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/InsuranceOrder.ts 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/typings.d.ts 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/BatchChange.vue 228 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/Home.vue 234 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/InsuranceOrderDetail.vue 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/BatchChangeRecordDetailDialog.vue 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/BatchChangeRecordView.vue 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/ChangePersonInfoDialog.vue 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/InsureOrderInfoView.vue 328 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/UploadInsurePersonDialog.vue 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/UploadStampFileDialog.vue 95 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/constants/index.ts 173 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/app.ts
@@ -1,4 +1 @@
export const AppType = import.meta.env.VITE_AppType || 'one';
export const isJYB =
  AppType === 'other' || AppType === 'jx' || AppType === 'jy' || AppType === 'backup';
export const AppType = import.meta.env.VITE_AppType || 'other';
src/router/index.ts
@@ -73,6 +73,12 @@
    component: Layout,
    redirect: '/home',
    alwaysShow: true,
    meta: {
      rank: 1001,
      icon: 'home',
      title: '保单管理',
      rootMenu: true,
    },
    children: [
      {
        path: 'home',
@@ -80,22 +86,41 @@
        hidden: false,
        component: () => import('@/views/Home/Home.vue'),
        meta: {
          rank: 10001,
          title: '首页',
          rank: 1001,
          title: '保单管理',
          affix: true,
          // rootMenu: true,
          icon: 'home',
        },
      },
    ],
      {
        path: '/InsuranceOrderDetail/:id',
        name: 'InsuranceOrderDetail',
        hidden: true,
        component: () => import('@/views/Home/InsuranceOrderDetail.vue'),
    meta: {
      rank: 1001,
          rank: 10002,
          title: '保单详情',
          // rootMenu: true,
      icon: 'home',
      title: '首页',
      rootMenu: true,
    },
  },
  {
        path: '/BatchChange/:id',
        name: 'BatchChange',
        hidden: true,
        component: () => import('@/views/Home/BatchChange.vue'),
        meta: {
          rank: 10002,
          title: '批改',
          // rootMenu: true,
          icon: 'home',
        },
      },
    ],
  },
  {
    path: '/InsuranceClaim',
    redirect: 'noRedirect',
    component: Layout,
src/services/api/InsuranceOrder.ts
@@ -2,6 +2,21 @@
// @ts-ignore
import { request } from '@/utils/request';
/** 批量添加保单文件 POST /api/InsuranceOrder/AddInsuranceOrderBillFile */
export async function addInsuranceOrderBillFile(
  body: API.AddInsuranceOrderBillFile,
  options?: API.RequestConfig
) {
  return request<number>('/api/InsuranceOrder/AddInsuranceOrderBillFile', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 添加保单材料 POST /api/InsuranceOrder/AddInsuranceOrderMaterial */
export async function addInsuranceOrderMaterial(
  body: API.AddInsuranceOrderMaterialInput,
@@ -17,9 +32,9 @@
  });
}
/** 检查导入保单模板 POST /api/InsuranceOrder/CheckImportInsuranceOrderData */
export async function checkImportInsuranceOrderData(body: string, options?: API.RequestConfig) {
  return request<number>('/api/InsuranceOrder/CheckImportInsuranceOrderData', {
/** 删除保单材料 POST /api/InsuranceOrder/DeleteInsuranceOrderMaterial */
export async function deleteInsuranceOrderMaterial(body: string, options?: API.RequestConfig) {
  return request<number>('/api/InsuranceOrder/DeleteInsuranceOrderMaterial', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
@@ -29,9 +44,27 @@
  });
}
/** 删除保单材料 POST /api/InsuranceOrder/DeleteInsuranceOrderMaterial */
export async function deleteInsuranceOrderMaterial(body: string, options?: API.RequestConfig) {
  return request<number>('/api/InsuranceOrder/DeleteInsuranceOrderMaterial', {
/** 批量减员保单数据 POST /api/InsuranceOrder/DownsizingInsuranceOrderData */
export async function downsizingInsuranceOrderData(
  body: API.DownsizingInsuranceOrderData,
  options?: API.RequestConfig
) {
  return request<any>('/api/InsuranceOrder/DownsizingInsuranceOrderData', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 批量减员保单数据校验 POST /api/InsuranceOrder/DownsizingInsuranceOrderDataCheck */
export async function downsizingInsuranceOrderDataCheck(
  body: API.DownsizingInsuranceOrderData,
  options?: API.RequestConfig
) {
  return request<number>('/api/InsuranceOrder/DownsizingInsuranceOrderDataCheck', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
src/services/api/typings.d.ts
@@ -94,6 +94,13 @@
    attachments?: AddInsuranceClaimAttachmentInput[];
  }
  interface AddInsuranceOrderBillFile {
    /** 保单号 */
    orderNo?: string;
    /** 保单文件 */
    orderBillFile?: string;
  }
  interface AddInsuranceOrderMaterialInput {
    insuranceOrderId?: string;
    /** 文件名称 */
@@ -457,6 +464,12 @@
    clientId?: string;
    /** 角色 */
    roleNames?: string[];
    /** 是否理赔提醒 */
    sendClaimMessage?: boolean;
    /** 是否保单到期提醒 */
    sendBillExpireMessage?: boolean;
    /** 是否短信提醒 */
    isSendMessage?: boolean;
  }
  interface CreateOrUpdateRoleInput {
@@ -518,6 +531,15 @@
    dateSeparator?: string;
    shortTimePattern?: string;
    longTimePattern?: string;
  }
  interface DownsizingInsuranceOrderData {
    /** 导入地址 */
    url?: string;
    /** 保单号 */
    orderNo?: string;
    /** 减员保单id */
    downsizingInsuranceList?: string[];
  }
  interface EntityExtensionDto {
@@ -895,6 +917,7 @@
    laborContractEnterprise?: string;
    /** 实际工作单位 */
    workEnterprise?: string;
    workAddress?: string;
    /** 保险起始时间 */
    insuranceBeginTime?: string;
    insuranceBeginTimeShow?: string;
@@ -905,6 +928,8 @@
    insuredInstitution?: string;
    /** 投保方案 */
    insuranceScheme?: string;
    /** 投保方式 */
    insuranceType?: string;
    /** 在职标识 */
    onJobFlag?: string;
    /** 性别 */
@@ -934,6 +959,8 @@
    orderNo?: string;
    /** 保单关联唯一字符串 */
    orderRelevanceStr?: string;
    /** 保单文件 */
    orderBillFile?: string;
  }
  interface InsuranceOrderListOutputPageOutput {
@@ -1217,6 +1244,8 @@
    condition?: string;
    /** 增减员查询 */
    onJobFlag?: string;
    /** 投保方式查询 月保/年保 */
    insuranceType?: string;
    importChannel?: string;
  }
@@ -1383,6 +1412,12 @@
    phoneNumber: string;
    /** 渠道 */
    channel?: string;
    /** 是否理赔提醒 */
    sendClaimMessage?: boolean;
    /** 是否保单到期提醒 */
    sendBillExpireMessage?: boolean;
    /** 是否短信提醒 */
    isSendMessage?: boolean;
    /** 角色 */
    roleNames?: string[];
  }
@@ -1520,6 +1555,12 @@
    channel?: string;
    /** 用户端Id */
    clientId?: string;
    /** 是否理赔提醒 */
    sendClaimMessage?: boolean;
    /** 是否保单到期提醒 */
    sendBillExpireMessage?: boolean;
    /** 是否短信提醒 */
    isSendMessage?: boolean;
    /** 角色 */
    roleNames?: string[];
  }
@@ -1538,6 +1579,12 @@
    channel?: string;
    /** 用户端Id */
    clientId?: string;
    /** 是否理赔提醒 */
    sendClaimMessage?: boolean;
    /** 是否保单到期提醒 */
    sendBillExpireMessage?: boolean;
    /** 是否短信提醒 */
    isSendMessage?: boolean;
    /** 角色 */
    roleNames?: string[];
  }
src/views/Home/BatchChange.vue
New file
@@ -0,0 +1,228 @@
<template>
  <LoadingLayout :loading="state.loading">
    <AppScrollContainer>
      <ChunkCell title="1">
        <template #title>
          <el-text>{{ `保单号:${'958585860689'}` }}</el-text>
          <el-text>{{ `投保人:${'人力无忧'}` }}</el-text>
        </template>
        <ProForm :model="state.form" ref="formRef" label-width="120px">
          <ProFormCol>
            <ProFormColItem :span="8">
              <ProFormItemV2
                label="期望生效日期:"
                prop="time"
                :check-rules="[{ message: '请选择日期' }]"
              >
                <ProFormDatePicker
                  v-model="state.form.time"
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                ></ProFormDatePicker>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="" prop="url" label-width="0">
                <ProFormUpload
                  v-model:file-url="state.form.url"
                  :limit="1"
                  :limitFileSize="10"
                  accept="xlsx,xls"
                  :showTip="false"
                >
                  <template #default>
                    <el-button type="primary">加减人</el-button>
                    <el-button link type="primary" @click.stop="handleTemplateDownload"
                      >下载模板</el-button
                    >
                  </template>
                </ProFormUpload>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="" prop="url" label-width="0">
                <ProFormUpload
                  v-model:file-url="state.form.url"
                  :limit="1"
                  :limitFileSize="10"
                  accept="xlsx,xls"
                  :showTip="false"
                >
                  <template #default>
                    <el-button type="primary">替换人</el-button>
                    <el-button link type="primary" @click.stop="handleTemplateDownload"
                      >下载模板</el-button
                    >
                  </template>
                </ProFormUpload>
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
        </ProForm>
      </ChunkCell>
      <ChunkCell title="批改人员详情">
        <template #titleRight>
          <el-button type="primary" @click="handleClear">清空数据</el-button>
        </template>
        <ProTableV2
          v-bind="proTableProps"
          :columns="column"
          :show-operation-column="false"
          :auto-height="false"
          ref="proTable"
          :tableProps="{
            maxHeight: '400px',
          }"
        >
        </ProTableV2>
        <div class="chuck-add-or-edit-actions">
          <el-button class="chuck-add-or-edit-actions" type="primary" @click="handleSubmit"
            >提交</el-button
          >
        </div>
      </ChunkCell>
    </AppScrollContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import {
  LoadingLayout,
  AppScrollContainer,
  ProForm,
  ProFormItemV2,
  ChunkCell,
  ProFormText,
  ProTableQueryFilterBar,
  QueryFilterItem,
  SearchInput,
  ProFormCol,
  ProFormColItem,
  ProFormDatePicker,
  ProFormInputNumber,
  useTable,
  ProTableV2,
  ProFormRadio,
  FieldSelect,
  defineOperationBtns,
  useFormDialog,
  ProFormUpload,
  UploadUserFile,
} from '@bole-core/components';
import * as insuranceOrderServices from '@/services/api/InsuranceOrder';
import { OrderInputType } from '@bole-core/core';
defineOptions({
  name: 'BatchChange',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'name',
    name: '批改类型',
  },
  {
    id: '2',
    enCode: 'name',
    name: '姓名',
  },
  {
    id: '3',
    enCode: 'name',
    name: '身份证号',
  },
  {
    id: '4',
    enCode: 'idNumber',
    name: '雇员工种',
  },
  {
    id: '5',
    enCode: 'idNumber',
    name: '性别',
  },
  {
    id: '6',
    enCode: 'idNumber',
    name: '年龄',
  },
  {
    id: '7',
    enCode: 'idNumber',
    name: '出生日期',
  },
  {
    id: '8',
    enCode: 'idNumber',
    name: '手机号码',
  },
];
const route = useRoute();
const id = route.params.id as string;
const BaseState = {
  loading: true,
  form: {
    time: '',
    url: [] as UploadUserFile[],
  },
};
const state = reactive({ ...BaseState });
const {
  getDataSource: getBatchRefundInfoDetail,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.QueryInsuranceOrderPageInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        condition: extraParamState.keyWord,
        // insurePolicyOperateHistoryId: id,
      };
      let res = await insuranceOrderServices.getInsuranceOrderPage(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      keyWord: '',
      orderInput: [{ property: 'id', order: OrderInputType.Asc }],
    },
    columnsRenderProps: {},
  }
);
function handleClear() {}
function handleSubmit() {}
function handleTemplateDownload() {}
onMounted(async () => {
  await getBatchRefundInfoDetail();
  state.loading = false;
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
.chuck-add-or-edit-actions {
  //   margin-bottom: 20px;
}
</style>
src/views/Home/Home.vue
@@ -37,7 +37,7 @@
            <SearchInput
              v-model="extraParamState.keyword"
              style="width: 260px"
              placeholder="姓名/身份证/单位/保单号等"
              placeholder="单位/保单号/参保机构"
              @on-click-search="getList"
            >
            </SearchInput>
@@ -53,39 +53,22 @@
            >模板下载</el-button
          >
          <BlFileUpload
            :limitFileSize="10"
            accept="xls,xlsx"
            :showTip="false"
            :show-file-list="false"
            :on-success="handleUploadSuccess"
          <el-button @click="handleUpload()" icon="Upload" type="primary" style="margin-right: 10px"
            >导入</el-button
          >
            <template #default>
              <el-button icon="Plus" type="primary">导入</el-button>
            </template>
          </BlFileUpload>
          <el-button
            @click="handleEnterpriseBatchRefund()"
            type="primary"
            style="margin-right: 10px"
            >批量减员</el-button
          <el-button @click="downloadInsureOrder()" type="primary" icon="Download" link
            >导出保单列表</el-button
          >
          <el-button
            @click="handleExport()"
            icon="Download"
            type="primary"
            style="margin-left: 10px"
            >导出</el-button
          <el-button @click="downloadInsurePerson()" icon="Download" type="primary" link
            >导出在保人员</el-button
          >
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2
        v-bind="proTableProps"
        :columns="HomeColumns"
        :columns="columns"
        :operationBtns="operationBtns"
        :show-column-check="true"
        :column-selectable="columnSelectable"
        ref="proTable"
        :table-props="{
          rowStyle: handleRowStyle,
@@ -94,11 +77,8 @@
      >
      </ProTableV2>
    </AppContainer>
    <UploadMaterialDialog
      v-bind="dialogProps"
      @onAddUpdateMaterial="getList(paginationState.pageIndex)"
    />
    <BatchDownsizingDialog v-bind="dialogBatchDownsizingProps" />
    <UploadInsurePersonDialog v-bind="dialogProps" />
    <UploadStampFileDialog v-bind="dialogStampFileProps" />
  </LoadingLayout>
</template>
@@ -121,9 +101,9 @@
} from '@bole-core/components';
import * as insuranceOrderServices from '@/services/api/InsuranceOrder';
import { Message, OrderInputType, downloadFileByUrl } from '@bole-core/core';
import { HomeColumns } from './constants';
import UploadMaterialDialog from './components/UploadMaterialDialog.vue';
import BatchDownsizingDialog from './components/BatchDownsizingDialog.vue';
import { columns } from './constants';
import UploadInsurePersonDialog from './components/UploadInsurePersonDialog.vue';
import UploadStampFileDialog from './components/UploadStampFileDialog.vue';
import { toThousand, format, downloadFile, setOSSLink } from '@/utils';
import { omit } from 'lodash';
import { ModelValueType } from 'element-plus';
@@ -154,11 +134,40 @@
      hide: (row: API.InsuranceOrderListOutput) => !row.orderBillFile,
    },
  },
  {
    data: {
      enCode: 'batchBtn',
      name: '批改',
    },
    emits: {
      onClick: (role) => handleBatch(role),
    },
    // extraProps: {
    //   hide: (row: API.InsuranceOrderListOutput) => !row.orderBillFile,
    // },
  },
  {
    data: {
      enCode: 'uploadStampFileBtn',
      name: '上传盖章文件',
    },
    emits: {
      onClick: (role) => handleUploadStampFile(role),
    },
    extraProps: {
      hide: (row: API.InsuranceOrderListOutput) => !row.orderBillFile,
    },
  },
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
    emits: {
      onClick: (role) => handleDetail(role),
    },
  },
]).filter(Boolean);
const columnSelectable = (row: API.InsuranceOrderListOutput) => {
  return row.onJobFlag === '增员';
};
const BaseState = {
  loading: true,
@@ -236,60 +245,36 @@
  return params;
}
const queryClient = useQueryClient();
async function handleUploadSuccess(response: UploadUserFile) {
  try {
    let res = await insuranceOrderServices.importInsuranceOrderData(response.url, {
      getResponse: true,
      responseType: 'blob',
    });
    if (res?.data?.size) {
      await Message.tipMessage('存在错误数据,是否导出?');
      downloadFile(res.data, `错误人员名单`, 'xlsx');
      // XLSXUtils.exportToXLSX({
      //   workbookDataList: res,
      //   fileName: '错误人员名单',
      //   workbookHeaderMap: {
      //     ...omit(Object.fromEntries(HomeColumns.map((x) => [x.enCode, x.name])), [
      //       'channel',
      //       'salesmanName',
      //       'createTime',
      //     ]),
      //     erroMsg: '备注',
      //   },
      // });
    }
    queryClient.invalidateQueries({
      queryKey: ['insuranceOrderServices/getInsuranceOrderListByOrderRelevance'],
    });
    getList();
  } catch (error) {}
}
const { dialogProps, handleAdd } = useFormDialog({
const { dialogProps, handleAdd, editForm } = useFormDialog({
  onConfirm: uploadInsurePerson,
  defaultFormParams: {
    id: '',
    materialName: '',
    orderNo: '',
    url: [] as UploadUserFile[],
  },
});
function openDialog(row: API.InsuranceOrderListOutput) {
function handleUpload() {
  handleAdd({
    id: row.id,
    orderNo: '',
    url: [] as UploadUserFile[],
  });
}
const router = useRouter();
function goDetail(row: API.InsuranceOrderListOutput) {
  router.push({
    name: 'InsuranceClaimDetail',
    params: {
      id: row.id,
    },
  });
async function uploadInsurePerson() {
  try {
    let params = {
      orderNo: editForm.orderNo,
      url: editForm.url?.[0]?.path,
    };
    // let res = await insuranceOrderServices.uploadStampFile(params);
    // if (res) {
    //   Message.successMessage('上传成功');
    //   getList(paginationState.pageIndex);
    // }
  } catch (error) {}
}
const router = useRouter();
async function handleExport() {
  try {
@@ -323,72 +308,59 @@
  }
}
const proTable = ref<InstanceType<typeof ProTableV2>>();
function handleEnterpriseBatchRefund() {
  if (proTableProps.value.tableData.length) {
    const res: API.InsuranceOrderListOutput[] = proTable.value.innerTableRef.getSelectionRows();
    if (res.length > 0) {
      const orderNos = _.uniq(res.map((x) => x.orderNo));
      if (orderNos.length > 1) {
        Message.errorMessage('存在不同的保单号,无法批量减员');
        return;
      }
      handleBatchDownsizing(res);
    } else {
      Message.errorMessage('请先勾选减员人员');
    }
  } else {
    Message.errorMessage('暂无数据');
  }
}
const {
  dialogProps: dialogBatchDownsizingProps,
  handleAdd: handleBatchDownsizingAdd,
  editForm: batchDownsizingForm,
  dialogProps: dialogStampFileProps,
  handleEdit: handleStampFileEdit,
  editForm: stampFileForm,
} = useFormDialog({
  onConfirm: downsizingInsuranceOrderData,
  onConfirm: uploadStampFile,
  defaultFormParams: {
    orderNo: '',
    checkOrderNo: '',
    id: '',
    url: [] as UploadUserFile[],
    downsizingInsuranceList: [] as string[],
  },
});
function handleBatchDownsizing(res: API.InsuranceOrderListOutput[]) {
  handleBatchDownsizingAdd({
    checkOrderNo: res[0]?.orderNo,
    downsizingInsuranceList: res.map((x) => x.id),
function handleUploadStampFile(row: API.InsuranceOrderListOutput) {
  handleStampFileEdit({
    id: row.id,
    url: [] as UploadUserFile[],
  });
}
async function downsizingInsuranceOrderData() {
async function uploadStampFile() {
  try {
    let params: API.DownsizingInsuranceOrderData = {
      orderNo: batchDownsizingForm.checkOrderNo,
      downsizingInsuranceList: batchDownsizingForm.downsizingInsuranceList,
      url: batchDownsizingForm.url?.[0]?.path ?? '',
    let params = {
      id: stampFileForm.id,
      url: stampFileForm.url?.[0]?.path,
    };
    let res = await insuranceOrderServices.downsizingInsuranceOrderDataCheck(params);
    if (res) {
      let downRes = await insuranceOrderServices.downsizingInsuranceOrderData(params, {
        getResponse: true,
        responseType: 'blob',
      });
      if (downRes?.data?.size) {
        await Message.tipMessage('存在错误数据,是否导出?');
        downloadFile(downRes.data, `错误人员名单`, 'xlsx');
      }
      queryClient.invalidateQueries({
        queryKey: ['insuranceOrderServices/getInsuranceOrderListByOrderRelevance'],
      });
      getList(paginationState.pageIndex);
    }
    // let res = await insuranceOrderServices.uploadStampFile(params);
    // if (res) {
    //   Message.successMessage('上传成功');
    //   getList(paginationState.pageIndex);
    // }
  } catch (error) {}
}
function handleDownloadOrderNo(row: API.InsuranceOrderListOutput) {
  downloadFileByUrl(setOSSLink(row.orderBillFile));
}
function handleDetail(row: API.InsuranceOrderListOutput) {
  router.push({
    name: 'InsuranceOrderDetail',
    params: {
      id: row.id,
    },
  });
}
function handleBatch(row: API.InsuranceOrderListOutput) {
  router.push({
    name: 'BatchChange',
    params: {
      id: row.id,
    },
  });
}
function downloadInsureOrder() {}
function downloadInsurePerson() {}
</script>
src/views/Home/InsuranceOrderDetail.vue
New file
@@ -0,0 +1,38 @@
<template>
  <LoadingLayout>
    <AppScrollContainer>
      <ProTabs v-model="state.tabType" hasBorder>
        <ProTabPane lazy label="保单信息" :name="InsureOrderTabType.InsureOrderInfo">
          <InsureOrderInfoView />
        </ProTabPane>
        <ProTabPane lazy label="批改记录" :name="InsureOrderTabType.BatchOrder">
          <BatchChangeRecordView />
        </ProTabPane>
      </ProTabs>
    </AppScrollContainer>
  </LoadingLayout>
</template>
<script setup lang="ts">
import { AppScrollContainer, ProTabs, ProTabPane } from '@bole-core/components';
import InsureOrderInfoView from './components/InsureOrderInfoView.vue';
import BatchChangeRecordView from './components/BatchChangeRecordView.vue';
defineOptions({
  name: 'InsuranceOrderDetail',
});
enum InsureOrderTabType {
  InsureOrderInfo = 1,
  BatchOrder = 2,
}
const state = reactive({
  activeIndex: 1,
  tabType: InsureOrderTabType.InsureOrderInfo,
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/views/Home/components/BatchChangeRecordDetailDialog.vue
New file
@@ -0,0 +1,151 @@
<template>
  <ProDialog title="批改信息" v-model="innerVisible" width="1200px" destroy-on-close>
    <ProDialogTableWrapper :height="400">
      <ProTableV2
        :table-data="proTableProps.tableData"
        :columns="column"
        :show-operation-column="false"
      >
      </ProTableV2>
    </ProDialogTableWrapper>
  </ProDialog>
</template>
<script setup lang="ts">
import { ProDialog, ProTableV2, ProDialogTableWrapper, useTable } from '@bole-core/components';
import * as insuranceOrderServices from '@/services/api/InsuranceOrder';
import { OrderInputType } from '@bole-core/core';
defineOptions({
  name: 'BatchChangeRecordDetailDialog',
});
type Props = {
  modelValue: boolean;
  form?: {
    id: string;
  };
};
const props = withDefaults(defineProps<Props>(), {
  modelValue: false,
});
const emit = defineEmits<{
  (e: 'update:modelValue', value: boolean): void;
  (e: 'onCancel'): void;
}>();
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'name',
    name: '批改类型',
    width: 120,
  },
  {
    id: '2',
    enCode: 'name',
    name: '姓名',
    width: 120,
  },
  {
    id: '3',
    enCode: 'name',
    name: '身份证号',
    width: 120,
  },
  {
    id: '4',
    enCode: 'name',
    name: '雇员工种',
    width: 120,
  },
  {
    id: '5',
    enCode: 'name',
    name: '性别',
    width: 120,
  },
  {
    id: '6',
    enCode: 'name',
    name: '年龄',
    width: 120,
  },
  {
    id: '7',
    enCode: 'name',
    name: '出生日期',
    width: 120,
  },
  {
    id: '8',
    enCode: 'name',
    name: '电话号码',
    width: 120,
  },
  {
    id: '9',
    enCode: 'name',
    name: '修改内容',
    width: 120,
  },
];
const innerVisible = computed({
  get() {
    return props.modelValue;
  },
  set(val) {
    emit('update:modelValue', val);
  },
});
watch(
  () => props.modelValue,
  (val) => {
    if (val) {
      getBatchRefundInfoDetail();
    }
  },
  {
    immediate: true,
  }
);
const {
  getDataSource: getBatchRefundInfoDetail,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.QueryInsuranceOrderPageInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        condition: extraParamState.keyWord,
        // insurePolicyOperateHistoryId: id,
      };
      let res = await insuranceOrderServices.getInsuranceOrderPage(params);
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      keyWord: '',
      orderInput: [{ property: 'id', order: OrderInputType.Asc }],
    },
    columnsRenderProps: {},
  }
);
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/views/Home/components/BatchChangeRecordView.vue
New file
@@ -0,0 +1,156 @@
<template>
  <AppContainer>
    <ProTableV2
      v-bind="proTableProps"
      :columns="column"
      :operationBtns="operationBtns"
      :autoHeight="false"
      :tableProps="{
        maxHeight: '400px',
      }"
    >
    </ProTableV2>
    <BatchChangeRecordDetailDialog v-bind="dialogProps"></BatchChangeRecordDetailDialog>
  </AppContainer>
</template>
<script setup lang="ts">
import {
  AppContainer,
  useTable,
  ProTableV2,
  defineOperationBtns,
  useFormDialog,
} from '@bole-core/components';
import * as insuranceOrderServices from '@/services/api/InsuranceOrder';
import { OrderInputType } from '@bole-core/core';
import BatchChangeRecordDetailDialog from './BatchChangeRecordDetailDialog.vue';
defineOptions({
  name: 'BatchChangeRecordView',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'name',
    name: '批单号',
  },
  {
    id: '2',
    enCode: 'name',
    name: '批改类型',
  },
  {
    id: '3',
    enCode: 'name',
    name: '申请日期',
  },
  {
    id: '4',
    enCode: 'idNumber',
    name: '批改生效日期',
  },
  {
    id: '5',
    enCode: 'idNumber',
    name: '在保人数',
  },
  {
    id: '6',
    enCode: 'idNumber',
    name: '原在保人数',
  },
  {
    id: '7',
    enCode: 'idNumber',
    name: '新增',
  },
  {
    id: '8',
    enCode: 'idNumber',
    name: '减少',
  },
  {
    id: '9',
    enCode: 'idNumber',
    name: '批单状态',
  },
];
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'detailBtn',
      name: '详情',
    },
    emits: {
      onClick: (role) => handleDetail(role),
    },
    // extraProps: {
    //   hide: (row: API.InsuranceOrderListOutput) => !row.orderBillFile,
    // },
  },
]);
const route = useRoute();
const id = route.params.id as string;
const BaseState = {
  loading: true,
};
const state = reactive({ ...BaseState });
const {
  getDataSource: getBatchRefundInfoDetail,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.QueryInsuranceOrderPageInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        condition: extraParamState.keyWord,
        // insurePolicyOperateHistoryId: id,
      };
      let res = await insuranceOrderServices.getInsuranceOrderPage(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      keyWord: '',
      orderInput: [{ property: 'id', order: OrderInputType.Asc }],
    },
    columnsRenderProps: {},
  }
);
const { dialogProps, handleEdit } = useFormDialog({
  defaultFormParams: {
    id: '',
  },
});
function handleDetail(row: API.InsuranceOrderListOutput) {
  handleEdit({
    id: row.id,
  });
}
onMounted(() => {
  getBatchRefundInfoDetail();
});
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/views/Home/components/ChangePersonInfoDialog.vue
New file
@@ -0,0 +1,107 @@
<template>
  <ProDialog
    title="修改信息"
    v-model="innerVisible"
    destroy-on-close
    draggable
    bodyNoPaddingBottom
    @close="onDialogClose"
    width="700px"
  >
    <el-text type="danger"
      >*身份证号与保险人姓名不能同时变更,只能修改其中一项,且仅能修改一次</el-text
    >
    <ProForm :model="innerForm" ref="dialogForm" label-width="100px" style="margin-top: 20px">
      <ProFormItemV2 label="姓名:" prop="name" :check-rules="[{ message: '请输入姓名' }]">
        <ProFormText
          placeholder="请输入姓名"
          v-model.trim="innerForm.name"
          :maxlength="30"
        ></ProFormText>
      </ProFormItemV2>
      <ProFormItemV2 label="身份证号:" prop="name" :check-rules="[{ message: '请输入身份证号' }]">
        <ProFormText
          placeholder="请输入身份证号"
          v-model.trim="innerForm.name"
          :maxlength="30"
        ></ProFormText>
      </ProFormItemV2>
      <ProFormItemV2 label="手机号:" prop="name" :check-rules="[{ message: '请输入手机号' }]">
        <ProFormText
          placeholder="请输入手机号"
          v-model.trim="innerForm.name"
          :maxlength="30"
        ></ProFormText>
      </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 { ProDialog, ProForm, ProFormItemV2, ProFormText } from '@bole-core/components';
import { FormInstance } from 'element-plus';
defineOptions({
  name: 'ChangePersonInfoDialog',
});
type Props = {
  modelValue: boolean;
  form?: {
    name: string;
  };
};
const props = withDefaults(defineProps<Props>(), {
  modelValue: false,
});
const emit = defineEmits<{
  (e: 'update:modelValue', value: boolean): void;
  (e: 'update:form', value: Props['form']): void;
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
const innerVisible = computed({
  get() {
    return props.modelValue;
  },
  set(val) {
    emit('update:modelValue', val);
  },
});
const innerForm = computed({
  get() {
    return props.form;
  },
  set(val) {
    emit('update:form', val);
  },
});
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/Home/components/InsureOrderInfoView.vue
New file
@@ -0,0 +1,328 @@
<template>
  <AppScrollContainer>
    <ChunkCell title="">
      <ProForm :model="detail" ref="formRef" label-width="120px" :is-read="true">
        <ProFormCol>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="保单号:" prop="orderNo">
              <ProFormText v-model.trim="detail.orderNo" />
            </ProFormItemV2>
          </ProFormColItem>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="生效状态:" prop="insuranceTypeCode">
              <ProFormRadio v-model="detail.insuranceType" :value-enum="insuranceTypeText" />
            </ProFormItemV2>
          </ProFormColItem>
        </ProFormCol>
        <ProFormCol>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="保险起期:" prop="applyTime">
              <ProFormDatePicker v-model.trim="detail.createTime" format="YYYY-MM-DD HH:mm" />
            </ProFormItemV2>
          </ProFormColItem>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="保险止期:" prop="insuranceTypeCode">
              <ProFormDatePicker v-model.trim="detail.createTime" format="YYYY-MM-DD HH:mm" />
            </ProFormItemV2>
          </ProFormColItem>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="投保方式:" prop="insureWay">
              <ProFormRadio v-model="detail.insuranceType" :value-enum="insuranceTypeText" />
            </ProFormItemV2>
          </ProFormColItem>
        </ProFormCol>
        <ProFormCol>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="参保机构:" prop="applyTime">
              <ProFormText v-model.trim="detail.orderNo" />
            </ProFormItemV2>
          </ProFormColItem>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="投保方案:" prop="applyTime">
              <ProFormText v-model.trim="detail.orderNo" />
            </ProFormItemV2>
          </ProFormColItem>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="投保人数:" prop="numberOfFailed">
              <ProFormInputNumber v-model.trim="detail.incDecAmount" unit="人" />
            </ProFormItemV2>
          </ProFormColItem>
        </ProFormCol>
        <ProFormCol>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="投保人:" prop="companyName">
              <ProFormText v-model.trim="detail.orderNo" />
            </ProFormItemV2>
          </ProFormColItem>
          <ProFormColItem :span="8">
            <ProFormItemV2 label="被保人:" prop="insuranceTypeCode">
              <ProFormText v-model.trim="detail.orderNo" />
            </ProFormItemV2>
          </ProFormColItem>
        </ProFormCol>
      </ProForm>
    </ChunkCell>
    <ChunkCell title="人员信息">
      <template #titleRight>
        <el-button type="primary" @click="handleBatchChange">批改申请</el-button>
      </template>
      <ProTableQueryFilterBar @on-reset="reset">
        <template #query>
          <QueryFilterItem>
            <SearchInput
              v-model="extraParamState.keyWord"
              style="width: 300px"
              placeholder="人员姓名/身份证号/手机号"
              @on-click-search="getBatchRefundInfoDetail"
            >
            </SearchInput>
          </QueryFilterItem>
        </template>
        <template #btn>
          <el-button @click="handleTemplateDownload()" icon="Download" type="primary"
            >模板下载</el-button
          >
          <el-button @click="handleImport()" icon="Download" type="primary">导入</el-button>
          <el-button @click="handleClear()" icon="Download" type="primary">清空数据</el-button>
          <el-button @click="handleDownloadPerson()" icon="Download" type="primary"
            >人员清单下载</el-button
          >
          <el-button @click="handleDownloadOrder()" icon="Download" type="primary"
            >保单下载</el-button
          >
        </template>
      </ProTableQueryFilterBar>
      <ProTableV2
        v-bind="proTableProps"
        :columns="column"
        :operationBtns="operationBtns"
        :auto-height="false"
        ref="proTable"
        :tableProps="{
          maxHeight: '400px',
        }"
      >
      </ProTableV2>
    </ChunkCell>
    <ChangePersonInfoDialog v-bind="dialogProps"></ChangePersonInfoDialog>
  </AppScrollContainer>
</template>
<script setup lang="ts">
import {
  LoadingLayout,
  AppScrollContainer,
  ProForm,
  ProFormItemV2,
  ChunkCell,
  ProFormText,
  ProTableQueryFilterBar,
  QueryFilterItem,
  SearchInput,
  ProFormCol,
  ProFormColItem,
  ProFormDatePicker,
  ProFormInputNumber,
  useTable,
  ProTableV2,
  ProFormRadio,
  FieldSelect,
  defineOperationBtns,
  useFormDialog,
} from '@bole-core/components';
import { insuranceTypeText } from '@/constants';
import ChangePersonInfoDialog from './ChangePersonInfoDialog.vue';
import * as insuranceOrderServices from '@/services/api/InsuranceOrder';
import { useQuery, useQueryClient } from '@tanstack/vue-query';
import { OrderInputType } from '@bole-core/core';
defineOptions({
  name: 'InsureOrderInfoView',
});
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'name',
    name: '姓名',
  },
  {
    id: '2',
    enCode: 'name',
    name: '性别',
  },
  {
    id: '3',
    enCode: 'name',
    name: '证件类型',
  },
  {
    id: '4',
    enCode: 'idNumber',
    name: '证件号码',
  },
  {
    id: '5',
    enCode: 'idNumber',
    name: '雇员工种',
  },
  {
    id: '6',
    enCode: 'idNumber',
    name: '用工单位',
  },
  {
    id: '7',
    enCode: 'idNumber',
    name: '用工地点',
  },
  {
    id: '8',
    enCode: 'idNumber',
    name: '年龄',
  },
  {
    id: '9',
    enCode: 'idNumber',
    name: '出生日期',
  },
  {
    id: '10',
    enCode: 'idNumber',
    name: '手机号码',
  },
  {
    id: '11',
    enCode: 'idNumber',
    name: '理赔',
  },
];
const operationBtns = defineOperationBtns([
  {
    data: {
      enCode: 'changeInfoBtn',
      name: '修改信息',
    },
    emits: {
      onClick: (role) => handleChangeInfo(role),
    },
    extraProps: {
      hide: (row: API.InsuranceOrderListOutput) => !row.orderBillFile,
    },
  },
  {
    data: {
      enCode: 'insureClaimDetailBtn',
      name: '理赔详情',
    },
    emits: {
      onClick: (role) => handleInsureClaimDetail(),
    },
    extraProps: {
      hide: (row: API.InsuranceOrderListOutput) => !row.orderBillFile,
    },
  },
]);
const route = useRoute();
const router = useRouter();
const id = route.params.id as string;
const BaseState = {
  loading: true,
};
const state = reactive({ ...BaseState });
const { data: detail, isLoading } = useQuery({
  queryKey: ['insuranceOrderServices/getInsuranceOrderDetail', id],
  queryFn: async () => {
    return await insuranceOrderServices.getInsuranceOrderDetail(
      { id: id },
      {
        showLoading: false,
      }
    );
  },
  placeholderData: () => ({} as API.InsuranceOrderListOutput),
  enabled: !!id,
});
const queryClient = useQueryClient();
onMounted(async () => {
  await queryClient.ensureQueryData({
    queryKey: ['insuranceOrderServices/getInsuranceOrderDetail', id],
  });
  getBatchRefundInfoDetail();
});
const {
  getDataSource: getBatchRefundInfoDetail,
  proTableProps,
  paginationState,
  extraParamState,
  reset,
} = useTable(
  async ({ pageIndex, pageSize }, extraParamState) => {
    try {
      let params: API.QueryInsuranceOrderPageInput = {
        pageModel: {
          rows: pageSize,
          page: pageIndex,
          orderInput: extraParamState.orderInput,
        },
        condition: extraParamState.keyWord,
        // insurePolicyOperateHistoryId: id,
      };
      let res = await insuranceOrderServices.getInsuranceOrderPage(params, {
        showLoading: !state.loading,
      });
      return res;
    } catch (error) {}
  },
  {
    defaultExtraParams: {
      keyWord: '',
      orderInput: [{ property: 'id', order: OrderInputType.Asc }],
    },
    columnsRenderProps: {},
  }
);
function handleTemplateDownload() {}
function handleClear() {}
function handleImport() {}
function handleDownloadPerson() {}
function handleDownloadOrder() {}
function handleBatchChange() {
  router.push({
    name: 'BatchChange',
    params: {
      id: id,
    },
  });
}
const { dialogProps, handleEdit, editForm } = useFormDialog({
  onConfirm: changeInfo,
  defaultFormParams: {
    name: '',
  },
});
function handleChangeInfo(row: API.InsuranceOrderListOutput) {
  handleEdit({
    name: row.name,
  });
}
async function changeInfo() {}
function handleInsureClaimDetail() {}
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
</style>
src/views/Home/components/UploadInsurePersonDialog.vue
New file
@@ -0,0 +1,112 @@
<template>
  <ProDialog
    title="上传投保人员清单"
    v-model="innerVisible"
    destroy-on-close
    draggable
    bodyNoPaddingBottom
    @close="onDialogClose"
  >
    <ProForm :model="innerForm" ref="dialogForm" label-width="120px">
      <ProFormItemV2
        label="批次号:"
        prop="materialName"
        :check-rules="[{ message: '请输入批次号' }]"
      >
        <ProFormText
          placeholder="请输入批次号"
          v-model.trim="innerForm.orderNo"
          :maxlength="30"
        ></ProFormText>
      </ProFormItemV2>
      <ProFormItemV2
        label="上传文件:"
        prop="url"
        :check-rules="[{ message: '请上传文件', type: 'upload' }]"
      >
        <ProFormUpload
          v-model:file-url="innerForm.url"
          :limit="1"
          :limitFileSize="10"
          accept="xlsx,xls"
        ></ProFormUpload>
      </ProFormItemV2>
    </ProForm>
    <template #footer>
      <span class="dialog-footer">
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </ProDialog>
</template>
<script setup lang="ts">
import {
  ProDialog,
  UploadUserFile,
  ProForm,
  ProFormItemV2,
  ProFormText,
  ProFormUpload,
} from '@bole-core/components';
import { FormInstance } from 'element-plus';
defineOptions({
  name: 'UploadInsurePersonDialog',
});
type Props = {
  modelValue: boolean;
  form?: {
    orderNo: string;
    url: UploadUserFile[];
  };
};
const props = withDefaults(defineProps<Props>(), {
  modelValue: false,
});
const emit = defineEmits<{
  (e: 'update:modelValue', value: boolean): void;
  (e: 'update:form', value: Props['form']): void;
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
const innerVisible = computed({
  get() {
    return props.modelValue;
  },
  set(val) {
    emit('update:modelValue', val);
  },
});
const innerForm = computed({
  get() {
    return props.form;
  },
  set(val) {
    emit('update:form', val);
  },
});
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/Home/components/UploadStampFileDialog.vue
New file
@@ -0,0 +1,95 @@
<template>
  <ProDialog
    title="上传盖章文件"
    v-model="innerVisible"
    destroy-on-close
    draggable
    bodyNoPaddingBottom
    @close="onDialogClose"
  >
    <ProForm :model="innerForm" ref="dialogForm" label-width="120px">
      <ProFormItemV2
        label="上传文件:"
        prop="url"
        :check-rules="[{ message: '请上传文件', type: 'upload' }]"
      >
        <ProFormUpload v-model:file-url="innerForm.url" accept="pdf,jpg,jpeg,png"></ProFormUpload>
      </ProFormItemV2>
    </ProForm>
    <template #footer>
      <span class="dialog-footer">
        <el-button type="primary" @click="handleConfirm">确 定</el-button>
      </span>
    </template>
  </ProDialog>
</template>
<script setup lang="ts">
import {
  ProDialog,
  UploadUserFile,
  ProForm,
  ProFormItemV2,
  ProFormUpload,
} from '@bole-core/components';
import { FormInstance } from 'element-plus';
defineOptions({
  name: 'UploadStampFileDialog',
});
type Props = {
  modelValue: boolean;
  form?: {
    id: string;
    url: UploadUserFile[];
  };
};
const props = withDefaults(defineProps<Props>(), {
  modelValue: false,
});
const emit = defineEmits<{
  (e: 'update:modelValue', value: boolean): void;
  (e: 'update:form', value: Props['form']): void;
  (e: 'onConfirm'): void;
  (e: 'onCancel'): void;
}>();
const innerVisible = computed({
  get() {
    return props.modelValue;
  },
  set(val) {
    emit('update:modelValue', val);
  },
});
const innerForm = computed({
  get() {
    return props.form;
  },
  set(val) {
    emit('update:form', val);
  },
});
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/Home/constants/index.ts
@@ -1,6 +1,6 @@
import { defineColumns } from '@bole-core/components';
export const HomeColumns = defineColumns([
export const columns = defineColumns([
  {
    id: '1',
    enCode: 'channel',
@@ -8,112 +8,93 @@
    width: 160,
  },
  {
    id: '2',
    enCode: 'channel',
    name: '批次号',
    width: 160,
  },
  {
    id: '3',
    enCode: 'name',
    name: '姓名',
    width: 160,
  },
  {
    id: '4',
    enCode: 'idNumber',
    name: '身份证号',
    width: 200,
  },
  {
    id: '5',
    enCode: 'workType',
    name: '雇员工种',
    width: 160,
  },
  {
    id: '6',
    enCode: 'laborContractEnterprise',
    name: '劳动合同单位',
    width: 160,
  },
  {
    id: '7',
    enCode: 'workEnterprise',
    name: '实际工作单位',
    width: 160,
  },
  {
    id: '8',
    enCode: 'workAddress',
    name: '用工地点',
    width: 160,
  },
  {
    id: '9',
    enCode: 'insuranceBeginTime',
    name: '保险起期',
    width: 160,
  },
  {
    id: '10',
    enCode: 'insuranceEndTime',
    name: '保险止期',
    width: 160,
  },
  {
    id: '11',
    enCode: 'insuredInstitution',
    name: '参保机构',
    width: 160,
  },
  {
    id: '12',
    enCode: 'insuranceScheme',
    name: '投保方案',
    width: 160,
  },
  {
    id: '13',
    enCode: 'insuranceType',
    name: '投保方式',
    width: 160,
  },
  {
    id: '14',
    enCode: 'orderNo',
    name: '保单号',
    width: 160,
  },
  {
    id: '4',
    enCode: 'orderNo',
    name: '投保人',
    width: 160,
  },
  {
    id: '5',
    enCode: 'orderNo',
    name: '被保人',
    width: 160,
  },
  {
    id: '6',
    enCode: 'insuranceBeginTime',
    name: '保险起期',
    width: 160,
  },
  {
    id: '7',
    enCode: 'insuranceEndTime',
    name: '保险止期',
    width: 160,
  },
  {
    id: '8',
    enCode: 'insuredInstitution',
    name: '参保机构',
    width: 160,
  },
  {
    id: '9',
    enCode: 'insuranceScheme',
    name: '投保方案',
    width: 160,
  },
  {
    id: '10',
    enCode: 'insuranceType',
    name: '投保方式',
    width: 160,
  },
  {
    id: '11',
    enCode: 'insuranceType',
    name: '投保人数',
    width: 160,
  },
  {
    id: '12',
    enCode: 'insuranceType',
    name: '总保额(元)',
    width: 200,
  },
  {
    id: '13',
    enCode: 'insuranceType',
    name: '总保费(元)',
    width: 160,
  },
  {
    id: '14',
    enCode: 'createTime',
    name: '最近导入日期',
    width: 160,
  },
  {
    id: '15',
    enCode: 'onJobFlag',
    name: '在职标识',
    enCode: 'insuranceType',
    name: '投保状态',
    width: 160,
  },
  {
    id: '16',
    enCode: 'gender',
    name: '性别',
    width: 160,
  },
  {
    id: '17',
    enCode: 'age',
    name: '年龄',
    width: 160,
  },
  {
    id: '20',
    enCode: 'premiumAmount',
    name: '保费',
    width: 160,
  },
  {
    id: '21',
    enCode: 'incDecAmount',
    name: '增减费用',
    width: 160,
  },
  {
    id: '20',
    enCode: 'createTime',
    name: '导入日期',
    enCode: 'insuranceType',
    name: '理赔数量',
    width: 160,
  },
]).filter(Boolean);