zhengyiming
2025-10-16 a2d490cc8d10e7b4cedb23919f088bf67a6dc20e
fix: s
1个文件已添加
6个文件已修改
363 ■■■■■ 已修改文件
src/constants/insuranceClaim.ts 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/InsuranceOrder.ts 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/ParkBountyApply.ts 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/services/api/typings.d.ts 57 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/Home.vue 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/Home/components/DisbursementDialog.vue 184 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
vite.config.ts 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/constants/insuranceClaim.ts
@@ -207,3 +207,10 @@
  [InsuranceDetailStatusEnum.Effecting]: '已生效',
  [InsuranceDetailStatusEnum.OutTimeEffect]: '已过期',
};
export const DefaultTaiPingAccountInfo = {
  incomeCompanyName: '太平财产保险有限公司抚州中心支公司',
  incomeBankAccount: '太平财产保险有限公司抚州中心支公司',
  incomeBankCardNumber: '1511200129200156069',
  incomeBankName: '中国工商银行股份有限公司抚州赣东支行',
};
src/services/api/InsuranceOrder.ts
@@ -166,6 +166,21 @@
  });
}
/** 获取投保订单详情 POST /api/InsuranceOrder/GetInsuranceDetail */
export async function getInsuranceDetail(
  body: API.GetInsurancePageInput,
  options?: API.RequestConfig
) {
  return request<API.GetInsurancePageOutput>('/api/InsuranceOrder/GetInsuranceDetail', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 获取投保人员审核记录 GET /api/InsuranceOrder/GetInsuranceOrderAuditRecord/${param1} */
export async function getInsuranceOrderAuditRecordId(
  // 叠加生成的Param类型 (非body参数swagger默认没有生成对象)
src/services/api/ParkBountyApply.ts
@@ -17,6 +17,21 @@
  });
}
/** 奖励金-企业自身出账-审批 POST /api/ParkBountyApply/AuditParkBountyApplyTradeBySelf */
export async function auditParkBountyApplyTradeBySelf(
  body: API.AuditParkBountyTradeBySelfInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/ParkBountyApply/AuditParkBountyApplyTradeBySelf', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
/** 奖励金-出账-财务审批 POST /api/ParkBountyApply/FinanceAuditParkBountyApplyTrade */
export async function financeAuditParkBountyApplyTrade(
  body: API.AuditParkBountyTradeInput,
@@ -82,3 +97,18 @@
    ...(options || {}),
  });
}
/** 奖励金-线下投保 企业自身提出出账申请 POST /api/ParkBountyApply/ParkBountyApplyTradeBySelf */
export async function parkBountyApplyTradeBySelf(
  body: API.CreateParkBountyTradeInput,
  options?: API.RequestConfig
) {
  return request<number>('/api/ParkBountyApply/ParkBountyApplyTradeBySelf', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
    },
    data: body,
    ...(options || {}),
  });
}
src/services/api/typings.d.ts
@@ -466,6 +466,16 @@
    values?: Record<string, any>;
  }
  interface AuditParkBountyTradeBySelfInput {
    /** 出账记录Id */
    id?: string;
    selfAuditStatus?: EnumParkBountyTradeDetailAuditStatus;
    /** 审核备注 */
    selfAuditRemark?: string;
    /** 审核凭证 */
    selfAuditFileUrl?: string;
  }
  interface AuditParkBountyTradeInput {
    /** 出账记录Id */
    id?: string;
@@ -654,7 +664,6 @@
  }
  interface CreateParkBountyTradeInput {
    enterpriseId?: string;
    /** 最近出账金额 */
    tradeAmount?: number;
    /** 出账凭证 */
@@ -662,6 +671,18 @@
    /** 消费类型 */
    payRemark?: string;
    access?: ParkBountyTradeAccessEnum;
    /** 进账单位 */
    incomeCompanyName?: string;
    /** 保单号 */
    insureBillNo?: string;
    /** 收款单位名称 */
    incomeBankAccount?: string;
    /** 收款单位账号 */
    incomeBankCardNumber?: string;
    /** 开户行 */
    incomeBankName?: string;
    enterpriseId?: string;
    selfAuditStatus?: EnumParkBountyTradeDetailAuditStatus;
  }
  interface CreateTempTokenInput {
@@ -971,6 +992,8 @@
    payStatus?: InsurancePolicyListPayStatusEnum;
    /** 任意分批支付完成 */
    anyPayComplete?: boolean;
    /** 奖励金余额 */
    remianAmount?: number;
  }
  interface GetInsurancePageOutputPageOutput {
@@ -1080,8 +1103,14 @@
    transferTimeBegin?: string;
    /** 出账结束日期 */
    transferTimeEnd?: string;
    /** 申请起始日期 */
    creationTimeBegin?: string;
    /** 申请结束日期 */
    creationTimeEnd?: string;
    financeType?: FinanceTypeEnum;
    enterpriseId?: string;
    auditStatus?: EnumParkBountyTradeDetailAuditStatus;
    selfAuditStatus?: EnumParkBountyTradeDetailAuditStatus;
  }
  interface GetParkBountyTradeDetailOutput {
@@ -1107,6 +1136,8 @@
    /** 奖励金余额 */
    remianAmount?: number;
    financeType?: FinanceTypeEnum;
    /** 审核时间 */
    financeAuditTime?: string;
    auditStatus?: EnumParkBountyTradeDetailAuditStatus;
    /** 审核备注 */
    auditRemark?: string;
@@ -1114,6 +1145,25 @@
    auditTime?: string;
    /** 审核凭证 */
    payAuditFileUrl?: string;
    /** 进账单位 */
    incomeCompanyName?: string;
    /** 保单号 */
    insureBillNo?: string;
    /** 收款单位名称 */
    incomeBankAccount?: string;
    /** 收款单位账号 */
    incomeBankCardNumber?: string;
    /** 开户行 */
    incomeBankName?: string;
    selfAuditStatus?: EnumParkBountyTradeDetailAuditStatus;
    /** 企业自身出账审核备注 */
    selfAuditRemark?: string;
    /** 企业自身出账审核时间 */
    selfAuditTime?: string;
    /** 企业自身审核凭证 */
    selfAuditFileUrl?: string;
    creationTime?: string;
    bountyAmount?: number;
  }
  interface GetParkBountyTradeDetailOutputPageOutput {
@@ -1130,6 +1180,11 @@
    transferTimeBegin?: string;
    /** 出账结束日期 */
    transferTimeEnd?: string;
    /** 申请起始日期 */
    creationTimeBegin?: string;
    /** 申请结束日期 */
    creationTimeEnd?: string;
    financeType?: FinanceTypeEnum;
  }
  interface GetParkBountyTradeOutput {
src/views/Home/Home.vue
@@ -114,6 +114,7 @@
    <UploadStampFileDialog v-bind="dialogStampFileProps" />
    <InsureInstructionsDialog v-bind="dialogInstructionsProps" />
    <InsureLineModeSelectDialog v-bind="dialogLineModeSelectProps" />
    <DisbursementDialog v-bind="dialogDisbursementProps" />
  </LoadingLayout>
</template>
@@ -135,6 +136,7 @@
  useDialog,
} from '@bole-core/components';
import * as insuranceOrderServices from '@/services/api/InsuranceOrder';
import * as parkBountyApplyServices from '@/services/api/ParkBountyApply';
import { Message, OrderInputType, downloadFileByUrl } from '@bole-core/core';
import { columns, InsureLineMode } from './constants';
import UploadInsurePersonDialog from './components/UploadInsurePersonDialog.vue';
@@ -168,6 +170,7 @@
import _ from 'lodash';
import InsureInstructionsDialog from './components/InsureInstructionsDialog.vue';
import InsureLineModeSelectDialog from './components/InsureLineModeSelectDialog.vue';
import DisbursementDialog from './components/DisbursementDialog.vue';
import { useInsureProductSchemeAllList, useUserInsureProductSetting } from '@/hooks';
// import { Recorder } from '@/utils/record';
@@ -289,6 +292,18 @@
    extraProps: {
      hide: (row: API.GetInsurancePageOutput) =>
        row.auditStatus != InsurancePolicyAuditStatusEnum.WaitAdd,
    },
  },
  {
    data: {
      enCode: 'applyTradeBySelfBtn',
      name: '出账申请',
    },
    emits: {
      onClick: (role) => handleParkBountyApplyTradeBySelf(role),
    },
    extraProps: {
      hide: (row: API.GetInsurancePageOutput) => row.productOnline,
    },
  },
]).filter(Boolean);
@@ -713,4 +728,50 @@
    }
  } catch (error) {}
}
function handleParkBountyApplyTradeBySelf(row: API.GetInsurancePageOutput) {
  handleDisbursementAdd({
    remianAmount: row.remianAmount,
  });
}
const {
  dialogProps: dialogDisbursementProps,
  handleAdd: handleDisbursementAdd,
  editForm: editDisbursementForm,
} = useFormDialog({
  onConfirm: parkBountyApplyTradeBySelf,
  defaultFormParams: {
    payRemark: '',
    tradeAmount: 0,
    remianAmount: 0,
    payFileUrl: [] as UploadUserFile[],
    incomeCompanyName: '',
    insureBillNo: '',
    incomeBankAccount: '',
    incomeBankCardNumber: '',
    incomeBankName: '',
  },
});
async function parkBountyApplyTradeBySelf() {
  try {
    let params: API.CreateParkBountyTradeInput = {
      tradeAmount: editDisbursementForm.tradeAmount,
      payFileUrl: editDisbursementForm.payFileUrl.map((item) => item.url).join('|'),
      payRemark: editDisbursementForm.payRemark,
      incomeCompanyName: editDisbursementForm.incomeCompanyName,
      insureBillNo: editDisbursementForm.insureBillNo,
      incomeBankAccount: editDisbursementForm.incomeBankAccount,
      incomeBankCardNumber: editDisbursementForm.incomeBankCardNumber,
      incomeBankName: editDisbursementForm.incomeBankName,
    };
    let res = await parkBountyApplyServices.parkBountyApplyTradeBySelf(params);
    if (res) {
      Message.successMessage('操作成功');
      getList(paginationState.pageIndex);
    }
  } catch (error) {}
}
</script>
src/views/Home/components/DisbursementDialog.vue
New file
@@ -0,0 +1,184 @@
<template>
  <ProDialog
    title="消费"
    v-model="innerVisible"
    destroy-on-close
    draggable
    bodyNoPaddingBottom
    @close="onDialogClose"
    width="600px"
  >
    <ProForm :model="innerForm" ref="dialogForm" label-width="120px">
      <ProFormItemV2
        label="输入出账金额:"
        prop="tradeAmount"
        :check-rules="[{ message: '请输入出账金额', type: 'number' }]"
      >
        <ProFormInputNumber
          :max="innerForm.remianAmount"
          v-model.trim="innerForm.tradeAmount"
          :controls="false"
          :min="0"
          :precision="2"
          unit="元"
        />
      </ProFormItemV2>
      <ProFormItemV2
        label="消费类型:"
        prop="payRemark"
        :check-rules="[{ message: '请选择消费类型' }]"
      >
        <ProFormSelect
          placeholder="请选择消费类型"
          :value-enum="[
            {
              value: '保险产品购买',
              label: '保险产品购买',
            },
          ]"
          clearable
          v-model="innerForm.payRemark"
        ></ProFormSelect>
      </ProFormItemV2>
      <ProFormItemV2
        label="进账单位:"
        prop="incomeCompanyName"
        :check-rules="[{ message: '请输入进账单位' }]"
      >
        <ProFormText v-model.trim="innerForm.incomeCompanyName" placeholder="请输入进账单位">
        </ProFormText>
      </ProFormItemV2>
      <ProFormItemV2
        label="保单号:"
        prop="insureBillNo"
        :check-rules="[{ message: '请输入保单号' }]"
      >
        <ProFormText v-model.trim="innerForm.insureBillNo" placeholder="请输入保单号">
        </ProFormText>
      </ProFormItemV2>
      <ProFormItemV2
        label="收款单位名称:"
        prop="incomeBankAccount"
        :check-rules="[{ message: '请输入收款单位名称' }]"
      >
        <ProFormText v-model.trim="innerForm.incomeBankAccount" placeholder="请输入收款单位名称">
        </ProFormText>
      </ProFormItemV2>
      <ProFormItemV2
        label="收款单位账号:"
        prop="incomeBankCardNumber"
        :check-rules="[{ message: '请输入收款单位账号', type: 'bankCard' }]"
      >
        <ProFormText v-model.trim="innerForm.incomeBankCardNumber" placeholder="请输入收款单位账号">
        </ProFormText>
      </ProFormItemV2>
      <ProFormItemV2
        label="开户行:"
        prop="incomeBankName"
        :check-rules="[{ message: '请输入开户行' }]"
      >
        <ProFormText v-model.trim="innerForm.incomeBankName" placeholder="请输入开户行">
        </ProFormText>
      </ProFormItemV2>
      <ProFormItemV2
        label="上传出账凭证:"
        prop="payFileUrl"
        :check-rules="[{ message: '请上传出账凭证', type: 'upload' }]"
      >
        <ProFormUpload
          v-model:file-url="innerForm.payFileUrl"
          :limitFileSize="50"
          accept="doc,docx,pdf,xls,xlsx,jpg/jpeg,png"
        >
        </ProFormUpload>
      </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,
  UploadUserFile,
  ProForm,
  ProFormItemV2,
  ProFormSelect,
  ProFormInputNumber,
  ProFormUpload,
  ProFormText,
} from '@bole-core/components';
import { FormInstance } from 'element-plus';
defineOptions({
  name: 'DisbursementDialog',
});
type Props = {
  modelValue: boolean;
  form?: {
    tradeAmount: number;
    remianAmount: number;
    payRemark: string;
    payFileUrl: UploadUserFile[];
    incomeCompanyName: string;
    insureBillNo: string;
    incomeBankAccount: string;
    incomeBankCardNumber: string;
    incomeBankName: 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>
vite.config.ts
@@ -97,9 +97,12 @@
      __INTLIFY_PROD_DEVTOOLS__: false,
    },
    build: {
      outDir: `dist/${dayjs().format(
        'YYYY-MM-DD'
      )}/dist-jybfront-${VITE_AppType}-${mode}-${dayjs().format('YYYYMMDD')}`,
      outDir:
        mode === 'staging'
          ? `dist/dist-jybfront-${VITE_AppType}-${mode}`
          : `dist/${dayjs().format(
              'YYYY-MM-DD'
            )}/dist-jybfront-${VITE_AppType}-${mode}-${dayjs().format('YYYYMMDD')}`,
    },
    optimizeDeps: {
      include: [