wupengfei
2025-04-01 4923681d933b455972166552dfb7538cd18f5808
src/views/Home/BatchChange.vue
@@ -1,10 +1,12 @@
<template>
  <LoadingLayout :loading="state.loading">
  <LoadingLayout>
    <AppScrollContainer>
      <ChunkCell title="1">
        <template #title>
          <el-text>{{ `保单号:${'958585860689'}` }}</el-text>
          <el-text>{{ `投保人:${'人力无忧'}` }}</el-text>
          <div class="batch-change-title">
            <el-text style="margin-right: 20px">{{ `保单号:${insureBillNo ?? ''}` }}</el-text>
            <el-text>{{ `投保人:${insurerName ?? ''}` }}</el-text>
          </div>
        </template>
        <ProForm :model="state.form" ref="formRef" label-width="120px">
          <ProFormCol>
@@ -19,6 +21,7 @@
                  type="date"
                  value-format="YYYY-MM-DD"
                  placeholder="请选择日期"
                  :disabled-date="disabledDate"
                ></ProFormDatePicker>
              </ProFormItemV2>
            </ProFormColItem>
@@ -27,15 +30,17 @@
            <ProFormColItem :span="8">
              <ProFormItemV2 label="" prop="url" label-width="0">
                <ProFormUpload
                  v-model:file-url="state.form.url"
                  v-model:file-url="state.form.addOrReduceUrl"
                  :limit="1"
                  :limitFileSize="10"
                  accept="xlsx,xls"
                  accept="xlsx"
                  :showTip="false"
                  :on-success="handleUploadAddOrReduce"
                  :disabled="urlDisabled"
                >
                  <template #default>
                    <el-button type="primary">加减人</el-button>
                    <el-button link type="primary" @click.stop="handleTemplateDownload"
                    <el-button type="primary" :disabled="urlDisabled">加减人</el-button>
                    <el-button link type="primary" @click.stop="DownloadAddOrReducePersonTemplate"
                      >下载模板</el-button
                    >
                  </template>
@@ -47,15 +52,17 @@
            <ProFormColItem :span="8">
              <ProFormItemV2 label="" prop="url" label-width="0">
                <ProFormUpload
                  v-model:file-url="state.form.url"
                  v-model:file-url="state.form.replaceUrl"
                  :limit="1"
                  :limitFileSize="10"
                  accept="xlsx,xls"
                  accept="xlsx"
                  :showTip="false"
                  :on-success="handleUploadReplace"
                  :disabled="urlDisabled"
                >
                  <template #default>
                    <el-button type="primary">替换人</el-button>
                    <el-button link type="primary" @click.stop="handleTemplateDownload"
                    <el-button type="primary" :disabled="urlDisabled">替换人</el-button>
                    <el-button link type="primary" @click.stop="downloadReplacePersonTemplate"
                      >下载模板</el-button
                    >
                  </template>
@@ -81,7 +88,7 @@
        >
        </ProTableV2>
        <div class="chuck-add-or-edit-actions">
          <el-button class="chuck-add-or-edit-actions" type="primary" @click="handleSubmit"
          <el-button class="chuck-add-or-edit-actions btn" type="primary" @click="handleSubmit"
            >提交</el-button
          >
        </div>
@@ -97,25 +104,24 @@
  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';
import * as insureBatchBillServices from '@/services/api/InsureBatchBill';
import { downloadFile, downloadFileByUrl, Message, OrderInputType } from '@bole-core/core';
import { InsuranceAddOrReduceTempPath, InsuranceChangeTempPath } from '@/constants';
import { useRouteView } from '@/hooks';
import { FormInstance } from 'element-plus';
import { useQuery, useQueryClient } from '@tanstack/vue-query';
import { paginateList } from '@/utils';
import dayjs from 'dayjs';
import _ from 'lodash';
defineOptions({
  name: 'BatchChange',
@@ -124,7 +130,7 @@
const column: API.CustomModuleColumnDto[] = [
  {
    id: '1',
    enCode: 'name',
    enCode: 'changeFlag',
    name: '批改类型',
  },
  {
@@ -134,87 +140,195 @@
  },
  {
    id: '3',
    enCode: 'name',
    enCode: 'idNumber',
    name: '身份证号',
  },
  {
    id: '4',
    enCode: 'idNumber',
    enCode: 'workType',
    name: '雇员工种',
  },
  {
    id: '5',
    enCode: 'idNumber',
    enCode: 'gender',
    name: '性别',
  },
  {
    id: '6',
    enCode: 'idNumber',
    enCode: 'age',
    name: '年龄',
  },
  {
    id: '7',
    enCode: 'idNumber',
    enCode: 'birthDay',
    name: '出生日期',
  },
  {
    id: '8',
    enCode: 'idNumber',
    enCode: 'phoneNumber',
    name: '手机号码',
  },
];
const route = useRoute();
const { closeViewPush } = useRouteView();
const id = route.params.id as string;
const insurerName = route.query.insurerName as string;
const insureBillNo = route.query.insureBillNo as string;
const effectEndTime = route.query.effectEndTime as string;
const BaseState = {
  loading: true,
  form: {
    time: '',
    url: [] as UploadUserFile[],
    addOrReduceUrl: [] as UploadUserFile[],
    replaceUrl: [] as UploadUserFile[],
  },
  staffList: [] as any[],
};
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 disabledDate = computed(() => {
  return (time: Date) => {
    return dayjs(time).isBefore(dayjs(), 'day') || dayjs(time).isAfter(dayjs(effectEndTime), 'day');
  };
});
function handleClear() {}
function handleSubmit() {}
function handleTemplateDownload() {}
const urlDisabled = computed(() => {
  return state.form.addOrReduceUrl.length > 0 || state.form.replaceUrl.length > 0;
});
const { getDataSource: getList, proTableProps } = useTable(({ pageIndex, pageSize }) => {
  try {
    return Promise.resolve({
      pageModel: {
        rows: pageSize,
        page: pageIndex,
        totalCount: state.staffList.length,
      },
      data: paginateList(state.staffList, pageIndex, pageSize),
    });
  } catch (error) {}
});
async function handleUploadAddOrReduce(response: UploadUserFile) {
  try {
    let params: API.ImportBatchAddOrSubOrderInput = {
      url: response.path,
      insurePolicyId: id,
    };
    let checkRes = await insureBatchBillServices.importCheckBatchAddOrSubOrderData(params, {
      getResponse: true,
      responseType: 'blob',
    });
    if (checkRes?.data?.size) {
      Message.tipMessage('存在错误数据,是否导出?')
        .then(() => {
          downloadFile(checkRes.data, `错误人员名单`, 'xlsx');
        })
        .catch(() => {
          // getList(paginationState.pageIndex);
        });
    } else {
      let res = await insureBatchBillServices.importBatchAddOrSubOrderData(params);
      if (res?.addOrSub?.length) {
        state.staffList = res.addOrSub;
        getList();
      }
    }
  } catch (error) {}
}
async function handleUploadReplace(response: UploadUserFile) {
  try {
    let params: API.ImportBatchAddOrSubOrderInput = {
      url: response.path,
      insurePolicyId: id,
    };
    let checkRes = await insureBatchBillServices.importCheckBatchUpdateOrderData(params, {
      getResponse: true,
      responseType: 'blob',
    });
    if (checkRes?.data?.size) {
      Message.tipMessage('存在错误数据,是否导出?')
        .then(() => {
          downloadFile(checkRes.data, `错误人员名单`, 'xlsx');
        })
        .catch(() => {
          // getList(paginationState.pageIndex);
        });
    } else {
      let res = await insureBatchBillServices.importBatchUpdateOrderData(params);
      if (res?.update?.length) {
        state.staffList = res.update;
        getList();
      }
    }
  } catch (error) {}
}
function handleClear() {
  if (!state.staffList.length) {
    Message.errorMessage('没有数据可以清除哦');
    return;
  }
  state.staffList = [] as any[];
  getList();
}
const formRef = ref<FormInstance>();
function handleSubmit() {
  if (!formRef.value) return;
  formRef.value.validate((valid) => {
    if (valid) {
      addOrUpdateInsureBatchBill();
    } else {
      return;
    }
  });
}
async function addOrUpdateInsureBatchBill() {
  try {
    if (state.staffList.length === 0) {
      Message.errorMessage('请先上传人员名单');
      return;
    }
    let _addInsStaffList = _.uniqBy(state.staffList, 'idNumber');
    let params: API.InsureBatchBillInput = {
      insurancePolicyId: id,
      effectTime: state.form.time,
      addInsStaffList: _addInsStaffList.filter((x) => x.changeFlag.includes('增加')),
      updateInsStaffList: _.uniqBy(
        _addInsStaffList.filter((x) => x.changeFlag.includes('替换')),
        'orginIdNumber'
      ),
      delInsStaffList: _addInsStaffList.filter((x) => x.changeFlag.includes('删除')),
    };
    let res = await insureBatchBillServices.addOrUpdateInsureBatchBill(params);
    if (res) {
      Message.successMessage('提交成功');
      handleBack();
    }
  } catch (error) {}
}
function DownloadAddOrReducePersonTemplate() {
  downloadFileByUrl(InsuranceAddOrReduceTempPath, '加减人模板');
}
function downloadReplacePersonTemplate() {
  downloadFileByUrl(InsuranceChangeTempPath, '替换人模板');
}
function handleBack() {
  closeViewPush(route, {
    name: 'Home',
  });
}
const queryClient = useQueryClient();
onMounted(async () => {
  await getBatchRefundInfoDetail();
  await getList();
  state.loading = false;
});
</script>
@@ -223,6 +337,8 @@
@use '@/style/common.scss' as *;
.chuck-add-or-edit-actions {
  //   margin-bottom: 20px;
  &.btn {
    margin-bottom: 20px;
  }
}
</style>