b51fa42a6e18b95a012706d995df7892d0ecf95e..b6d5706fcb871bebc393e71c9402254f54eb2749
2025-07-04 zhengyiming
fix: 江佑保系统健壮性修复
b6d570 对比 | 目录
2025-07-04 zhengyiming
fix: 江佑保系统健壮性修复
babd7a 对比 | 目录
2025-07-04 zhengyiming
fix: 江佑保系统健壮性修复
d54c9c 对比 | 目录
9个文件已修改
351 ■■■■ 已修改文件
src/constants/insuranceClaim.ts 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/dic.ts 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/hooks/insuranceClaim.ts 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/InsuranceOrder.ts 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/typings.d.ts 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/Home.vue 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/InsureInstructionsDialog.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/InsureOrderInfoView.vue 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/UploadInsurePersonDialog.vue 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/insuranceClaim.ts
@@ -92,6 +92,12 @@
  Reject = -10,
  /**待审核 */
  WaitAudit = 10,
  /**待审核 强制再审后的再审状态*/
  WaitReAudit = 11,
  /**待审核 补提后的再审状态*/
  WaitFillAudit = 12,
  /**审核中 */
  Auditing = 15,
  /**通过 */
  Pass = 20,
}
@@ -99,6 +105,16 @@
export const InsurancePolicyAuditStatusEnumText = {
  [InsurancePolicyAuditStatusEnum.Reject]: '驳回',
  [InsurancePolicyAuditStatusEnum.WaitAudit]: '待审核',
  [InsurancePolicyAuditStatusEnum.WaitReAudit]: '待审核',
  [InsurancePolicyAuditStatusEnum.WaitFillAudit]: '待审核',
  [InsurancePolicyAuditStatusEnum.Auditing]: '审核中',
  [InsurancePolicyAuditStatusEnum.Pass]: '通过',
};
export const InsurancePolicyAuditStatusEnumTextForFilter = {
  [InsurancePolicyAuditStatusEnum.Reject]: '驳回',
  [InsurancePolicyAuditStatusEnum.WaitAudit]: '待审核',
  [InsurancePolicyAuditStatusEnum.Auditing]: '审核中',
  [InsurancePolicyAuditStatusEnum.Pass]: '通过',
};
src/hooks/dic.ts
@@ -36,11 +36,24 @@
    return insureProduct?.id ?? '';
  }
  const queryClient = useQueryClient();
  function ensureUserInsureProductSetting() {
    return queryClient.ensureQueryData<API.InsureProductSettingDto[]>({
      queryKey: ['dictionaryServices/getUserInsureProductSetting'],
    });
  }
  /**是否是生煎保账号 */
  const isSjbAccount = computed(() => allUserInsureProductSettingList.value.length > 0);
  return {
    allUserInsureProductSettingList,
    getInsureProductByIdNumber,
    getInsureProductIdByIdNumber,
    refetch,
    ensureUserInsureProductSetting,
    isSjbAccount,
  };
}
@@ -67,8 +80,13 @@
    staleTime: Infinity,
  });
  function getInsureProductSchemeByCode(code: string) {
    return allInsureProductSchemeList.value.find((x) => x.code === code);
  }
  return {
    allInsureProductSchemeList,
    refetch,
    getInsureProductSchemeByCode,
  };
}
src/hooks/insuranceClaim.ts
@@ -50,3 +50,34 @@
    isLoading,
  };
}
export function useInsureActions() {
  const router = useRouter();
  async function handleGoDownloadInvoice(id: string) {
    try {
      await insuranceOrderServices.getInvoiceId({ id: id });
      router.push({
        name: 'InsureDownloadInvoice',
        params: {
          id: id,
        },
      });
    } catch (error) {}
  }
  async function handleGoStampFiles(id: string) {
    try {
      router.push({
        name: 'InsurancePolicyStampFiles',
        params: {
          id: id,
        },
      });
    } catch (error) {}
  }
  return {
    handleGoDownloadInvoice,
    handleGoStampFiles,
  };
}
src/services/api/InsuranceOrder.ts
@@ -77,6 +77,20 @@
  });
}
/** 获取电子保单 POST /api/InsuranceOrder/DownloadPolicyFile/${param0} */
export async function downloadPolicyFileId(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIdownloadPolicyFileIdParams,
  options?: API.RequestConfig
) {
  const { id: param0, ...queryParams } = params;
  return request<string>(`/api/InsuranceOrder/DownloadPolicyFile/${param0}`, {
    method: 'POST',
    params: { ...queryParams },
    ...(options || {}),
  });
}
/** 批量减员保单数据 POST /api/InsuranceOrder/DownsizingInsuranceOrderData */
export async function downsizingInsuranceOrderData(
  body: API.DownsizingInsuranceOrderData,
@@ -322,17 +336,17 @@
  );
}
/** 保单详情-导入人员清单 GET /api/InsuranceOrder/GetInsuranceStaffListExport */
/** 保单详情-导出人员清单 POST /api/InsuranceOrder/GetInsuranceStaffListExport */
export async function getInsuranceStaffListExport(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIgetInsuranceStaffListExportParams,
  body: API.ExportInsuranceStaffListInput,
  options?: API.RequestConfig
) {
  return request<any>('/api/InsuranceOrder/GetInsuranceStaffListExport', {
    method: 'GET',
    params: {
      ...params,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
@@ -416,7 +430,37 @@
  body: API.InsurancePolicyAuditInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/InsuranceOrder/InsurancePolicyAudit', {
  return request<API.InsurancePolicyAuditOutput>('/api/InsuranceOrder/InsurancePolicyAudit', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 保单再审 POST /api/InsuranceOrder/InsurancePolicyAuditAgain */
export async function insurancePolicyAuditAgain(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
  params: API.APIinsurancePolicyAuditAgainParams,
  options?: API.RequestConfig
) {
  return request<any>('/api/InsuranceOrder/InsurancePolicyAuditAgain', {
    method: 'POST',
    params: {
      ...params,
    },
    ...(options || {}),
  });
}
/** 投保状态补录 POST /api/InsuranceOrder/RestorePolicyStatus */
export async function restorePolicyStatus(
  body: API.RestorePolicyInput,
  options?: API.RequestConfig
) {
  return request<boolean>('/api/InsuranceOrder/RestorePolicyStatus', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
src/services/api/typings.d.ts
@@ -192,6 +192,10 @@
    id?: string;
  }
  interface APIdownloadPolicyFileIdParams {
    id: string;
  }
  interface APIexportInsuranceBatchStaffParams {
    batchBillId?: string;
  }
@@ -282,10 +286,6 @@
    id?: string;
  }
  interface APIgetInsuranceStaffListExportParams {
    id?: string;
  }
  interface APIgetInsureBatchDetailParams {
    batchBillId?: string;
  }
@@ -364,6 +364,10 @@
  interface APIimportInsDetailStaffToListParams {
    url?: string;
    id?: string;
  }
  interface APIinsurancePolicyAuditAgainParams {
    id?: string;
  }
@@ -708,6 +712,11 @@
    configuration?: Record<string, any>;
  }
  interface ExportInsuranceStaffListInput {
    status?: InsuranceDetailStatusEnum;
    insurancePolicyId?: string;
  }
  interface ExtensionEnumDto {
    fields?: ExtensionEnumFieldDto[];
    localizationResource?: string;
@@ -926,6 +935,8 @@
    auditRemark?: string;
    /** 保险产品IdNumber */
    productIdNumber?: string;
    /** 方案代码 */
    productSchemeCode?: string;
    /** 是否走线上流程 */
    productOnline?: boolean;
    payStatus?: InsurancePolicyListPayStatusEnum;
@@ -1458,7 +1469,7 @@
    count?: number;
  }
  type InsuranceDetailStatusEnum = 10 | 12 | 14 | 20 | 30;
  type InsuranceDetailStatusEnum = 10 | 12 | 13 | 14 | 20 | 30;
  interface InsuranceOrderListOutput {
    id?: string;
@@ -1556,7 +1567,18 @@
    returnUrl?: string;
  }
  type InsurancePolicyAuditStatusEnum = 10 | 20 | -10;
  interface InsurancePolicyAuditOutput {
    /** 消息 */
    messages?: string[];
    /** 总投保人数 */
    totalCount?: number;
    /** 投保成功 */
    successCount?: number;
    /** 投保失败 */
    failCount?: number;
  }
  type InsurancePolicyAuditStatusEnum = 10 | 11 | 12 | 15 | 20 | -10;
  type InsurancePolicyListPayStatusEnum = 1 | 2;
@@ -1591,7 +1613,7 @@
    invoiceDownloadOssUrl?: string;
  }
  type InsurancePolicyPayStatusEnum = 1 | 2 | -1;
  type InsurancePolicyPayStatusEnum = 0 | 1 | 2 | -1;
  type InsurancePolicyStatusEnum = 10 | 20 | 30;
@@ -2062,6 +2084,22 @@
    password?: string;
  }
  interface RestorePolicyDto {
    /** 订单号 */
    channelOrderNo?: string;
    /** 保单号 */
    policyNo?: string;
    /** 电子保单链接 */
    policyOssUrl?: string;
  }
  interface RestorePolicyInput {
    /** 保单Id */
    insurancePolicyId?: string;
    /** 投保批次 */
    items?: RestorePolicyDto[];
  }
  interface ReturnValueApiDescriptionModel {
    type?: string;
    typeSimple?: string;
src/views/Home/Home.vue
@@ -27,7 +27,7 @@
          <QueryFilterItem>
            <FieldRadio
              v-model="extraParamState.auditStatus"
              :value-enum="InsurancePolicyAuditStatusEnumText"
              :value-enum="InsurancePolicyAuditStatusEnumTextForFilter"
              buttonStyle
              showAllBtn
              @change="getList()"
@@ -58,6 +58,7 @@
            type="primary"
            style="margin-right: 10px"
            link
            v-if="isSjbAccount"
            >职业类型对照表</el-button
          >
          <el-button @click="handleDownload()" type="primary" style="margin-right: 10px" link
@@ -153,6 +154,7 @@
  InsurancePolicyStatusEnum,
  AppType,
  InsurancePolicyAuditStatusEnumText,
  InsurancePolicyAuditStatusEnumTextForFilter,
  InsurancePolicyAuditStatusEnum,
  InsurancePolicyProductIdNumberEnum,
  InsurancePolicyListPayStatusEnum,
@@ -162,6 +164,7 @@
import dayjs from 'dayjs';
import _ from 'lodash';
import InsureInstructionsDialog from './components/InsureInstructionsDialog.vue';
import { useUserInsureProductSetting } from '@/hooks';
// import { Recorder } from '@/utils/record';
defineOptions({
@@ -437,8 +440,14 @@
  onConfirm: handleUpload,
});
const { isSjbAccount } = useUserInsureProductSetting();
function handleOpenInstructions() {
  dialogInstructionsState.dialogVisible = true;
  if (isSjbAccount.value) {
    dialogInstructionsState.dialogVisible = true;
  } else {
    handleUpload();
  }
}
async function handleUpload() {
src/views/Home/components/InsureInstructionsDialog.vue
@@ -8,6 +8,7 @@
    width="600px"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    @close="goTo(`step0`)"
  >
    <div class="insureInstructionsDialog-content">
      <!-- <img :src="IconTaipingLogo" alt="" class="logo" /> -->
@@ -97,7 +98,7 @@
const visibleFiles = ref(false);
const { isCurrent, goToNext, goToPrevious, isLast, isFirst } = useStepper(
const { isCurrent, goToNext, goToPrevious, isLast, isFirst, goTo } = useStepper(
  InsuranceTempList.map((x, index) => `step${index}`)
);
</script>
src/views/Home/components/InsureOrderInfoView.vue
@@ -11,7 +11,7 @@
                  <el-button
                    type="primary"
                    link
                    @click="handleGoStampFiles"
                    @click="handleGoStampFiles(id)"
                    v-if="detail.productOnline && detail.anyPayComplete"
                    >详情</el-button
                  >
@@ -75,7 +75,10 @@
        </ProForm>
      </ChunkCell>
      <ChunkCell title="人员信息" class="full-table-chunk">
        <template #titleRight v-if="detail.status !== InsurancePolicyStatusEnum.WaitEffect">
        <template
          #titleRight
          v-if="detail.status !== InsurancePolicyStatusEnum.WaitEffect && !detail.productOnline"
        >
          <el-button type="primary" @click="handleBatchChange">批改申请</el-button>
        </template>
        <ProTableQueryFilterBar @on-reset="reset">
@@ -91,35 +94,48 @@
            </QueryFilterItem>
          </template>
          <template #btn>
            <template v-if="detail.status === InsurancePolicyStatusEnum.WaitEffect">
              <el-button @click="handleTemplateDownload()" link type="primary">模板下载</el-button>
              <BlFileUpload
                v-if="
                  detail.auditStatus !== InsurancePolicyAuditStatusEnum.Pass &&
                  !detail.productOnline
                "
                :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>
              <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>
              <template v-if="detail.productOnline">
                <el-button v-if="detail.anyPayComplete" @click="handleGoStampFiles()" 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>
              <el-button v-else @click="handleDownloadOrder()" type="primary">下载保单</el-button>
              <template v-else>
                <el-button @click="handleExport(null)" type="primary">下载人员清单</el-button>
                <el-button @click="handleDownloadOrder()" type="primary">下载保单</el-button>
              </template>
            </template>
          </template>
        </ProTableQueryFilterBar>
@@ -135,6 +151,7 @@
      </ChunkCell>
      <ChangePersonInfoDialog v-bind="dialogProps"></ChangePersonInfoDialog>
      <InsureClaimDetailDialog v-bind="dialogInsureClaimProps"></InsureClaimDetailDialog>
      <UploadInsurePersonDialog v-bind="dialogSupplyProps" isSupply />
    </AppContainer>
  </LoadingLayout>
</template>
@@ -170,6 +187,7 @@
  InsurancePolicyStatusEnumText,
  InsurancePolicyAuditStatusEnum,
  InsuranceDetailStatusEnumText,
  InsuranceDetailStatusEnum,
} from '@/constants';
import ChangePersonInfoDialog from './ChangePersonInfoDialog.vue';
import InsureClaimDetailDialog from './InsureClaimDetailDialog.vue';
@@ -179,6 +197,12 @@
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',
@@ -428,36 +452,11 @@
  } 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));
}
function handleGoStampFiles() {
  router.push({
    name: 'InsurancePolicyStampFiles',
    params: {
      id: id,
    },
  });
}
const { handleGoDownloadInvoice, handleGoStampFiles } = useInsureActions();
function handleBatchChange() {
  if (
@@ -542,6 +541,57 @@
    });
  } 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,
} = useFormDialog({
  onConfirm: supplySubmit,
  defaultFormParams: {
    serialNum: '',
    url: [] as UploadUserFile[],
    productIdNumber: '',
    productSchemeIdNumber: '',
    effectStartTime: dayjs().add(1, 'day').format('YYYY-MM-DD'),
  },
});
// TODO 补提
async function supplySubmit() {}
</script>
<style lang="scss" scoped>
src/views/Home/components/UploadInsurePersonDialog.vue
@@ -25,6 +25,7 @@
          enum-label-key="productName"
          enum-value-key="productIdNumber"
          @change="handleProductChange"
          :disabled="isSupply"
        ></ProFormSelect>
      </ProFormItemV2>
      <ProFormItemV2
@@ -40,6 +41,7 @@
          v-model="form.productSchemeIdNumber"
          enum-label-key="name"
          enum-value-key="idNumber"
          :disabled="isSupply"
        ></ProFormSelect>
      </ProFormItemV2>
      <ProFormItemV2 label="批次号:" prop="serialNum" :check-rules="[{ message: '请输入批次号' }]">
@@ -47,6 +49,7 @@
          placeholder="请输入批次号"
          v-model.trim="innerForm.serialNum"
          :maxlength="30"
          :disabled="isSupply"
        ></ProFormText>
      </ProFormItemV2>
      <ProFormItemV2
@@ -60,6 +63,7 @@
          value-format="YYYY-MM-DD"
          placeholder="请选择起保日期"
          :disabled-date="disabledStartDate"
          :disabled="isSupply"
        ></ProFormDatePicker>
      </ProFormItemV2>
      <ProFormItemV2
@@ -118,10 +122,12 @@
    productSchemeIdNumber: string;
    effectStartTime: string;
  };
  isSupply?: boolean;
};
const props = withDefaults(defineProps<Props>(), {
  modelValue: false,
  isSupply: false,
});
const emit = defineEmits<{