zhengyiming
1 天以前 f6748abe2ad85f0600f905f22f92f53e603b885d
src/views/Home/components/InsureOrderInfoView.vue
@@ -1,12 +1,21 @@
<template>
  <LoadingLayout :loading="state.loading">
    <AppScrollContainer>
    <AppContainer>
      <ChunkCell title="">
        <ProForm :model="detail" ref="formRef" label-width="120px" :is-read="true">
          <ProFormCol>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="保单号:" prop="insureBillNo">
                <ProFormText v-model.trim="detail.insureBillNo" />
                <div class="pro-from-item-read-content-wrapper" v-if="!!detail.insureBillNo">
                  {{ detail.insureBillNo }}
                  <el-button
                    type="primary"
                    link
                    @click="handleGoStampFiles(id)"
                    v-if="detail.productOnline && detail.anyPayComplete"
                    >详情</el-button
                  >
                </div>
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8">
@@ -35,17 +44,35 @@
          <ProFormCol>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="参保机构:" prop="insuranceOrg">
                <ProFormRadio v-model="detail.insuranceOrg" :value-enum="InsuredInstitutionEnum" />
                <!-- <ProFormRadio v-model="detail.insuranceOrg" :value-enum="InsuredInstitutionEnum" /> -->
                <ProFormText v-model.trim="detail.insuranceOrg" />
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="投保方案:" prop="insuranceScheme">
                <ProFormRadio v-model="detail.insuranceScheme" :value-enum="InsuranceSchemeEnum" />
                <!-- <ProFormRadio v-model="detail.insuranceScheme" :value-enum="InsuranceSchemeEnum" /> -->
                <ProFormText v-model.trim="detail.insuranceScheme" />
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="投保人数:" prop="insureCount">
                <ProFormInputNumber v-model.trim="detail.insureCount" unit="人" />
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
          <ProFormCol v-if="detail.productOnline">
            <ProFormColItem :span="8">
              <ProFormItemV2 label="总保费:" prop="amount">
                <ProFormInputNumber v-model="detail.amount" unit="元" formatValue="money" />
              </ProFormItemV2>
            </ProFormColItem>
            <ProFormColItem :span="8">
              <ProFormItemV2 label="总保额:" prop="sumInsured">
                <ProFormInputNumber
                  v-model.trim="detail.sumInsured"
                  unit="元"
                  formatValue="money"
                />
              </ProFormItemV2>
            </ProFormColItem>
          </ProFormCol>
@@ -63,8 +90,11 @@
          </ProFormCol>
        </ProForm>
      </ChunkCell>
      <ChunkCell title="人员信息">
        <template #titleRight v-if="detail.status !== InsurancePolicyStatusEnum.WaitEffect">
      <ChunkCell title="人员信息" class="full-table-chunk">
        <template
          #titleRight
          v-if="detail.status !== InsurancePolicyStatusEnum.WaitEffect && !detail.productOnline"
        >
          <el-button type="primary" @click="handleBatchChange">批改申请</el-button>
        </template>
        <ProTableQueryFilterBar @on-reset="reset">
@@ -80,42 +110,65 @@
            </QueryFilterItem>
          </template>
          <template #btn>
            <template v-if="detail.status === InsurancePolicyStatusEnum.WaitEffect">
              <el-button @click="handleTemplateDownload()" link type="primary">模板下载</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 v-if="detail.productOnline">
              <el-button
                v-if="detail.auditStatus === InsurancePolicyAuditStatusEnum.Pass"
                @click="handleSupplySubmit()"
                type="primary"
                >补提</el-button
              >
                <template #default>
                  <el-button icon="Plus" type="primary">导入</el-button>
                </template>
              </BlFileUpload>
              <el-button @click="handleClear()" type="primary">清空数据</el-button>
              <template v-if="detail.status !== InsurancePolicyStatusEnum.WaitEffect">
                <el-button @click="handleExport(InsuranceDetailStatusEnum.Effecting)" type="primary"
                  >导出在保人员</el-button
                >
                <el-button @click="handleExport(InsuranceDetailStatusEnum.Fail)" type="primary"
                  >导出错误人员</el-button
                >
                <el-button @click="handleGoStampFiles(id)" type="primary">下载保单</el-button>
                <el-button @click="handleGoDownloadInvoice(id)" type="primary">下载发票</el-button>
              </template>
            </template>
            <template v-else>
              <el-button @click="handleDownloadPerson()" type="primary">下载人员清单</el-button>
              <el-button @click="handleDownloadOrder()" type="primary">下载保单</el-button>
              <template v-if="detail.status === InsurancePolicyStatusEnum.WaitEffect">
                <el-button @click="handleTemplateDownload()" link type="primary"
                  >模板下载</el-button
                >
                <BlFileUpload
                  v-if="detail.auditStatus !== InsurancePolicyAuditStatusEnum.Pass"
                  :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 icon="Plus" type="primary">导入</el-button>
                  </template>
                </BlFileUpload>
                <el-button @click="handleClear()" type="primary">清空数据</el-button>
              </template>
              <template v-else>
                <el-button @click="handleExport(null)" type="primary">下载人员清单</el-button>
                <el-button @click="handleDownloadOrder()" type="primary">下载保单</el-button>
              </template>
            </template>
          </template>
        </ProTableQueryFilterBar>
        <ProTableV2
          v-bind="proTableProps"
          :columns="column"
          :operationBtns="operationBtns"
          :auto-height="false"
          ref="proTable"
          :tableProps="{
            maxHeight: '400px',
          }"
        >
        </ProTableV2>
        <div class="full-table-chunk-table">
          <ProTableV2
            v-bind="proTableProps"
            :columns="column"
            :operationBtns="operationBtns"
            ref="proTable"
          >
          </ProTableV2>
        </div>
      </ChunkCell>
      <ChangePersonInfoDialog v-bind="dialogProps"></ChangePersonInfoDialog>
    </AppScrollContainer>
      <InsureClaimDetailDialog v-bind="dialogInsureClaimProps"></InsureClaimDetailDialog>
      <UploadInsurePersonDialog v-bind="dialogSupplyProps" isSupply />
    </AppContainer>
  </LoadingLayout>
</template>
@@ -141,20 +194,31 @@
  useFormDialog,
  BlFileUpload,
  UploadUserFile,
  XLSXUtils,
} from '@bole-core/components';
import {
  InsuranceOrderTempPath,
  insuranceTypeText,
  InsuredInstitutionEnum,
  InsuranceSchemeEnum,
  InsurancePolicyStatusEnum,
  InsurancePolicyStatusEnumText,
  InsurancePolicyAuditStatusEnum,
  InsuranceDetailStatusEnumText,
  InsuranceDetailStatusEnum,
} from '@/constants';
import ChangePersonInfoDialog from './ChangePersonInfoDialog.vue';
import InsureClaimDetailDialog from './InsureClaimDetailDialog.vue';
import * as insuranceOrderServices from '@/services/api/InsuranceOrder';
import * as insuranceClaimServices from '@/services/api/InsuranceClaim';
import { useQuery, useQueryClient } from '@tanstack/vue-query';
import { downloadFile, downloadFileByUrl, Message, OrderInputType } from '@bole-core/core';
import { setOSSLink } from '@/utils';
import dayjs from 'dayjs';
import {
  useInsureActions,
  useInsureProductSchemeAllList,
  useUserInsureProductSetting,
} from '@/hooks';
import UploadInsurePersonDialog from './UploadInsurePersonDialog.vue';
defineOptions({
  name: 'InsureOrderInfoView',
@@ -190,6 +254,16 @@
    name: '雇员工种',
  },
  {
    id: '51',
    enCode: 'occupationType',
    name: '职业类型',
  },
  {
    id: '52',
    enCode: 'occupationCode',
    name: '职业码值',
  },
  {
    id: '6',
    enCode: 'userEmploer',
    name: '用工单位',
@@ -218,8 +292,26 @@
    width: 140,
  },
  {
    id: '101',
    enCode: 'payOrder',
    name: '批次号',
    width: 140,
  },
  {
    id: '102',
    enCode: 'status',
    name: '投保状态',
    width: 140,
  },
  {
    id: '103',
    enCode: 'auditRemark',
    name: '备注',
    width: 140,
  },
  {
    id: '11',
    enCode: 'serialNumber',
    enCode: 'claimCount',
    name: '理赔',
    width: 100,
  },
@@ -236,7 +328,9 @@
    },
    extraProps: {
      hide: (row: API.GetInsuranceStaffPageTemplate) =>
        detail.value?.status !== InsurancePolicyStatusEnum.WaitEffect,
        detail.value?.productOnline ||
        detail.value?.status !== InsurancePolicyStatusEnum.WaitEffect ||
        detail.value?.auditStatus === InsurancePolicyAuditStatusEnum.Pass,
    },
  },
  {
@@ -245,11 +339,11 @@
      name: '理赔详情',
    },
    emits: {
      onClick: (role) => handleInsureClaimDetail(role),
      onClick: (role) => handleDetail(role),
    },
    extraProps: {
      hide: (row: API.GetInsuranceStaffPageTemplate) =>
        !(row.serialNumber && detail.value?.status !== InsurancePolicyStatusEnum.WaitEffect),
        !(row.claimCount && detail.value?.status !== InsurancePolicyStatusEnum.WaitEffect),
    },
  },
]);
@@ -308,6 +402,7 @@
      let res = await insuranceOrderServices.getInsuranceStaffList(params, {
        showLoading: !state.loading,
      });
      console.log('res: ', res);
      return res;
    } catch (error) {}
  },
@@ -316,7 +411,12 @@
      keyWord: '',
      orderInput: [{ property: 'id', order: OrderInputType.Asc }],
    },
    columnsRenderProps: {},
    columnsRenderProps: {
      status: {
        type: 'enum',
        valueEnum: InsuranceDetailStatusEnumText,
      },
    },
  }
);
@@ -325,6 +425,10 @@
}
async function handleClear() {
  try {
    if (paginationState.total === 0) {
      Message.warnMessage('没有需要清空的数据~');
      return;
    }
    await Message.tipMessage('是否清空人员信息');
    let res = await insuranceOrderServices.clearInsuranceStaffData({
      id: id,
@@ -337,48 +441,57 @@
}
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');
    // }
    // queryClient.invalidateQueries({
    //   queryKey: ['insuranceOrderServices/getInsuranceStaffList'],
    // });
    // getInsuranceStaffList();
    let res = await insuranceOrderServices.importInsDetailStaffToList({
      id: id,
      url: response.url,
    });
    if (res?.length > 0) {
      await Message.tipMessage('存在错误数据,是否导出?');
      XLSXUtils.exportToXLSX({
        workbookDataList: res,
        fileName: '错误人员名单',
        workbookHeaderMap: {
          name: '雇员姓名',
          sex: '性别',
          certType: '证件类型',
          certNo: '证件号码',
          jobName: '雇员工种',
          useEmploer: '用工单位',
          address: '用工地点',
          note: '备注',
        },
      });
    }
    queryClient.invalidateQueries({
      queryKey: ['insuranceOrderServices/getInsuranceStaffList'],
    });
    getInsuranceStaffList();
  } catch (error) {}
}
async function handleDownloadPerson() {
  try {
    if (paginationState.total === 0) {
      Message.warnMessage('没有数据可以导出哦~');
      return;
    }
    let res = await insuranceOrderServices.getInsuranceStaffListExport(
      { id: id },
      {
        responseType: 'blob',
        getResponse: true,
      }
    );
    if (res) {
      downloadFile(res.data, `人员清单`, 'xlsx');
    }
  } catch (error) {}
}
function handleDownloadOrder() {
  downloadFileByUrl(setOSSLink(detail.value?.insureBillUrl));
}
const { handleGoDownloadInvoice, handleGoStampFiles } = useInsureActions();
function handleBatchChange() {
  if (
    dayjs(detail.value?.effectEndTime).isBefore(dayjs()) ||
    dayjs(detail.value?.effectEndTime).isSame(dayjs(), 'day')
  ) {
    Message.errorMessage('保险今天到期,无法批改');
    return;
  }
  router.push({
    name: 'BatchChange',
    params: {
      id: id,
    },
    query: {
      insurerName: detail.value?.insurerName ?? '',
      insureBillNo: detail.value?.insureBillNo ?? '',
      effectEndTime: detail.value?.effectEndTime ?? '',
    },
  });
}
@@ -421,19 +534,153 @@
  } catch (error) {}
}
function handleInsureClaimDetail(row: API.GetInsuranceStaffPageTemplate) {
  router.push({
    name: 'InsuranceClaimDetail',
    params: {
const { dialogProps: dialogInsureClaimProps, handleEdit: handleInsureClaimEdit } = useFormDialog({
  defaultFormParams: {
    id: '',
    routeId: '',
    staffList: [] as API.InsuranceClaimDetailOutput[],
  },
});
async function getInsuranceClaimDetailList(id: string) {
  try {
    return await insuranceClaimServices.getInsuranceClaimDetailList({ id: id });
  } catch (error) {}
}
async function handleDetail(row: API.GetInsuranceStaffPageTemplate) {
  try {
    const res = await getInsuranceClaimDetailList(row.id);
    handleInsureClaimEdit({
      id: row.id,
    },
    query: {
      fromRoute: 'InsuranceOrderDetail',
    },
      staffList: res,
      routeId: id,
    });
  } catch (error) {}
}
async function handleExport(status: InsuranceDetailStatusEnum) {
  try {
    if (paginationState.total === 0) {
      Message.warnMessage('没有数据可以导出哦~');
      return;
    }
    let res = await insuranceOrderServices.getInsuranceStaffListExport(
      { insurancePolicyId: id, status: status },
      {
        responseType: 'blob',
        getResponse: true,
      }
    );
    if (res) {
      downloadFile(res.data, `人员清单`, 'xlsx');
    }
  } catch (error) {}
}
const { getInsureProductIdByIdNumber } = useUserInsureProductSetting();
const { getInsureProductSchemeByCode } = useInsureProductSchemeAllList({
  insureProductId: computed(() => getInsureProductIdByIdNumber(detail.value.productIdNumber)),
});
function handleSupplySubmit() {
  handleSupplyAdd({
    serialNum: detail.value.serialNum,
    productIdNumber: detail.value.productIdNumber,
    productSchemeIdNumber: getInsureProductSchemeByCode(detail.value.productSchemeCode)?.idNumber,
    effectStartTime: detail.value.effectStartTime,
  });
}
const {
  dialogProps: dialogSupplyProps,
  handleAdd: handleSupplyAdd,
  editForm: supplyForm,
  dialogState: dialogSupplyState,
} = useFormDialog({
  onConfirm: supplySubmit,
  defaultFormParams: {
    serialNum: '',
    url: [] as UploadUserFile[],
    productIdNumber: '',
    productSchemeIdNumber: '',
    effectStartTime: dayjs().add(1, 'day').format('YYYY-MM-DD'),
  },
  closeAfterConfirm: false,
});
async function supplySubmit() {
  try {
    let params: API.FillInsStaffToListFrontInput = {
      insurancePolicyId: id,
      url: supplyForm.url?.[0]?.path,
    };
    let res = await insuranceOrderServices.fillInsStaffToList(params, {
      timeout: 60 * 1000 * 10,
    });
    if (res) {
      // await Message.tipMessage('存在错误数据,是否导出?');
      try {
        if (res.errorList.length > 0) {
          await Message.tipMessage(
            `总投保人数${res.importAllCount}人,投保成功${res.successCount}人,投保失败${res.errorList.length}人是否导出投保失败人员清单?`,
            {
              confirmButtonText: '导出',
            }
          );
          XLSXUtils.exportToXLSX({
            workbookDataList: res.errorList,
            fileName: '错误人员名单',
            workbookHeaderMap: {
              name: '雇员姓名',
              sex: '性别',
              certType: '证件类型',
              certNo: '证件号码',
              jobName: '雇员工种',
              useEmploer: '用工单位',
              address: '用工地点',
              note: '备注',
            },
          });
        } else {
          await Message.tipMessage(
            `总投保人数${res.importAllCount}人,投保成功${res.successCount}人`,
            {
              showCancelButton: false,
            }
          );
        }
      } catch (error) {}
      dialogSupplyState.dialogVisible = false;
      getInsuranceStaffList(paginationState.pageIndex);
    }
  } catch (error) {}
}
</script>
<style lang="scss" scoped>
@use '@/style/common.scss' as *;
.full-table-chunk {
  display: flex;
  min-height: 0;
  flex: 1;
  flex-direction: column;
  :deep() {
    .chunk-cell-content {
      display: flex;
      flex-direction: column;
      flex: 1;
      min-height: 0;
    }
  }
  .full-table-chunk-table {
    display: flex;
    flex-direction: column;
    flex: 1;
    min-height: 0;
  }
}
</style>