From c55c548308e6a1adef6670f8acf1ee5f57e77da6 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期六, 28 六月 2025 15:46:25 +0800
Subject: [PATCH] feat: v2.2

---
 src/constants/insuranceClaim.ts                   |   24 +++
 src/views/Home/constants/index.ts                 |   70 ++++++++
 src/services/api/typings.d.ts                     |   42 +++++
 src/router/index.ts                               |   36 ++++
 src/views/Home/InsurePayDetail.vue                |   62 +++++++
 src/views/Home/components/InsureOrderInfoView.vue |   14 +
 src/views/Home/InsurancePolicyStampFiles.vue      |   58 +++++++
 src/hooks/insuranceClaim.ts                       |   21 ++
 src/views/Home/Home.vue                           |   72 ++++++++
 src/services/api/InsuranceOrder.ts                |   15 +
 src/views/Home/InsureDownloadInvoice.vue          |   58 +++++++
 11 files changed, 470 insertions(+), 2 deletions(-)

diff --git a/src/constants/insuranceClaim.ts b/src/constants/insuranceClaim.ts
index a5d90ae..f694a89 100644
--- a/src/constants/insuranceClaim.ts
+++ b/src/constants/insuranceClaim.ts
@@ -106,3 +106,27 @@
   /**鐢熺厧淇� */
   SJB = 'A05C1397S00',
 }
+
+export enum InsurancePolicyPayStatusEnum {
+  /**寰呮敮浠� */
+  WaitPay = 1,
+  /**宸叉敮浠� */
+  CompletePay = 2,
+}
+
+export const InsurancePolicyPayStatusEnumText = {
+  [InsurancePolicyPayStatusEnum.WaitPay]: '寰呮敮浠�',
+  [InsurancePolicyPayStatusEnum.CompletePay]: '宸叉敮浠�',
+};
+
+export enum InsurancePolicyListPayStatusEnum {
+  /**寰呮敮浠� */
+  WaitPay = 1,
+  /**宸叉敮浠� */
+  CompletePay = 2,
+}
+
+export const InsurancePolicyListPayStatusEnumText = {
+  [InsurancePolicyListPayStatusEnum.WaitPay]: '寰呮敮浠�',
+  [InsurancePolicyListPayStatusEnum.CompletePay]: '宸叉敮浠�',
+};
diff --git a/src/hooks/insuranceClaim.ts b/src/hooks/insuranceClaim.ts
index 1f0aaef..836852b 100644
--- a/src/hooks/insuranceClaim.ts
+++ b/src/hooks/insuranceClaim.ts
@@ -29,3 +29,24 @@
     refetch,
   };
 }
+
+type UseInsurancePolicyPayOptions = {
+  id: MaybeRef<string>;
+};
+
+export function useInsurancePolicyPay({ id }: UseInsurancePolicyPayOptions) {
+  const { data: insurancePolicyPayList, isLoading } = useQuery({
+    queryKey: ['insuranceOrderServices/getInsurancePolicyPay', id],
+    queryFn: async () => {
+      return await insuranceOrderServices.getInsurancePolicyPay({
+        id: unref(id),
+      });
+    },
+    placeholderData: () => [] as API.InsurancePolicyPayDto[],
+  });
+
+  return {
+    insurancePolicyPayList,
+    isLoading,
+  };
+}
diff --git a/src/router/index.ts b/src/router/index.ts
index 6f35405..f283d1a 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -109,6 +109,42 @@
         },
       },
       {
+        path: '/InsurancePolicyStampFiles/:id',
+        name: 'InsurancePolicyStampFiles',
+        hidden: true,
+        component: () => import('@/views/Home/InsurancePolicyStampFiles.vue'),
+        meta: {
+          rank: 10003,
+          title: '淇濆崟涓嬭浇',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+      {
+        path: '/InsureDownloadInvoice/:id',
+        name: 'InsureDownloadInvoice',
+        hidden: true,
+        component: () => import('@/views/Home/InsureDownloadInvoice.vue'),
+        meta: {
+          rank: 10004,
+          title: '鍙戠エ涓嬭浇',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+      {
+        path: '/InsurePayDetail/:id',
+        name: 'InsurePayDetail',
+        hidden: true,
+        component: () => import('@/views/Home/InsurePayDetail.vue'),
+        meta: {
+          rank: 10005,
+          title: '鏀粯璇︽儏',
+          // rootMenu: true,
+          icon: 'home',
+        },
+      },
+      {
         path: '/BatchChange/:id',
         name: 'BatchChange',
         hidden: true,
diff --git a/src/services/api/InsuranceOrder.ts b/src/services/api/InsuranceOrder.ts
index f9dd132..9fcaae5 100644
--- a/src/services/api/InsuranceOrder.ts
+++ b/src/services/api/InsuranceOrder.ts
@@ -274,6 +274,21 @@
   });
 }
 
+/** 鑾峰彇淇濆崟鏀粯淇℃伅 GET /api/InsuranceOrder/GetInsurancePolicyPay */
+export async function getInsurancePolicyPay(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetInsurancePolicyPayParams,
+  options?: API.RequestConfig
+) {
+  return request<API.InsurancePolicyPayDto[]>('/api/InsuranceOrder/GetInsurancePolicyPay', {
+    method: 'GET',
+    params: {
+      ...params,
+    },
+    ...(options || {}),
+  });
+}
+
 /** 鑾峰彇鐩栫珷鏂囦欢 GET /api/InsuranceOrder/GetInsurancePolicyStampFiles */
 export async function getInsurancePolicyStampFiles(
   // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index d901aec..b9fa5c0 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -274,6 +274,10 @@
     id?: string;
   }
 
+  interface APIgetInsurancePolicyPayParams {
+    id?: string;
+  }
+
   interface APIgetInsurancePolicyStampFilesParams {
     id?: string;
   }
@@ -925,6 +929,9 @@
     productIdNumber?: string;
     /** 鏄惁璧扮嚎涓婃祦绋� */
     productOnline?: boolean;
+    payStatus?: InsurancePolicyListPayStatusEnum;
+    /** 浠绘剰鍒嗘壒鏀粯瀹屾垚 */
+    anyPayComplete?: boolean;
   }
 
   interface GetInsurancePageOutputPageOutput {
@@ -1517,6 +1524,41 @@
 
   type InsurancePolicyAuditStatusEnum = 10 | 20 | -10;
 
+  type InsurancePolicyListPayStatusEnum = 1 | 2;
+
+  interface InsurancePolicyPayDto {
+    id?: string;
+    /** 璁㈠崟鍙� */
+    channelOrderNo?: string;
+    /** 鎶曚繚鍗曞彿 */
+    proposalNo?: string;
+    /** 鏀粯鐭摼 */
+    payUrl?: string;
+    /** 鏀粯娴佹按鍙� */
+    payRegistrationNo?: string;
+    /** 淇濊垂閲戦 */
+    sumSignPremium?: number;
+    status?: InsurancePolicyPayStatusEnum;
+    /** 淇濆崟鍙� */
+    policyNo?: string;
+    /** 鐢靛瓙淇濆崟閾炬帴 */
+    policyUrl?: string;
+    /** 鐢靛瓙淇濆崟閾炬帴 */
+    policyOssUrl?: string;
+    /** 瀹屾垚鏃堕棿 */
+    completionTime?: string;
+    /** 鍙戠エ鍙风爜 */
+    invoiceSerialNo?: string;
+    /** 鍙戠エ浠风◣鍚堣 */
+    invoicePlanFee?: number;
+    /** 鍙戠エ涓嬭浇鍦板潃 */
+    invoiceDownloadUrl?: string;
+    /** 鍙戠エ涓嬭浇鍦板潃 */
+    invoiceDownloadOssUrl?: string;
+  }
+
+  type InsurancePolicyPayStatusEnum = 1 | 2;
+
   type InsurancePolicyStatusEnum = 10 | 20 | 30;
 
   interface InsureBatchBillDetailDto {
diff --git a/src/views/Home/Home.vue b/src/views/Home/Home.vue
index b78a7ca..81a68ce 100644
--- a/src/views/Home/Home.vue
+++ b/src/views/Home/Home.vue
@@ -139,6 +139,8 @@
   InsurancePolicyAuditStatusEnumText,
   InsurancePolicyAuditStatusEnum,
   InsurancePolicyProductIdNumberEnum,
+  InsurancePolicyListPayStatusEnum,
+  InsurancePolicyListPayStatusEnumText,
 } from '@/constants';
 import dayjs from 'dayjs';
 import _ from 'lodash';
@@ -193,9 +195,47 @@
       onClick: (role) => handleDownloadInsureFile(role),
     },
     extraProps: {
-      hide: (row: API.GetInsurancePageOutput) => !row.insureBillUrl,
+      hide: (row: API.GetInsurancePageOutput) => row.productOnline || !row.insureBillUrl,
     },
   },
+  {
+    data: {
+      enCode: 'payBtn',
+      name: '鏀粯',
+    },
+    emits: {
+      onClick: (role) => handlePay(role),
+    },
+    extraProps: {
+      hide: (row: API.GetInsurancePageOutput) =>
+        row.payStatus != InsurancePolicyListPayStatusEnum.WaitPay,
+    },
+  },
+  {
+    data: {
+      enCode: 'stampFilesBtn',
+      name: '淇濆崟涓嬭浇',
+    },
+    emits: {
+      onClick: (role) => handleGoStampFiles(role),
+    },
+    extraProps: {
+      hide: (row: API.GetInsurancePageOutput) => !(row.productOnline && row.anyPayComplete),
+    },
+  },
+  {
+    data: {
+      enCode: 'downloadInvoiceBtn',
+      name: '鍙戠エ涓嬭浇',
+    },
+    emits: {
+      onClick: (role) => handleGoDownloadInvoice(role),
+    },
+    extraProps: {
+      hide: (row: API.GetInsurancePageOutput) => !(row.productOnline && row.anyPayComplete),
+    },
+  },
+
   // {
   //   data: {
   //     enCode: 'standarEndoBtn',
@@ -259,6 +299,7 @@
         formatter: (row: API.GetInsurancePageOutput) =>
           row.amount == null ? '' : toThousand(row.amount),
       },
+      payStatus: { type: 'enum', valueEnum: InsurancePolicyListPayStatusEnumText },
     },
   }
 );
@@ -488,4 +529,33 @@
     // }
   } catch (error) {}
 }
+
+async function handleGoStampFiles(row: API.GetInsurancePageOutput) {
+  try {
+    router.push({
+      name: 'InsurancePolicyStampFiles',
+      params: {
+        id: row.id,
+      },
+    });
+  } catch (error) {}
+}
+
+function handlePay(row: API.GetInsurancePageOutput) {
+  router.push({
+    name: 'InsurePayDetail',
+    params: {
+      id: row.id,
+    },
+  });
+}
+
+function handleGoDownloadInvoice(row: API.GetInsurancePageOutput) {
+  router.push({
+    name: 'InsureDownloadInvoice',
+    params: {
+      id: row.id,
+    },
+  });
+}
 </script>
diff --git a/src/views/Home/InsurancePolicyStampFiles.vue b/src/views/Home/InsurancePolicyStampFiles.vue
new file mode 100644
index 0000000..c0aa1e1
--- /dev/null
+++ b/src/views/Home/InsurancePolicyStampFiles.vue
@@ -0,0 +1,58 @@
+<template>
+  <LoadingLayout :loading="isLoading">
+    <AppContainer>
+      <ProTableV2
+        :columns="InsurancePolicyStampFilesColumns"
+        :operationBtns="operationBtns"
+        :tableData="insurancePolicyPayList"
+        :columnRenderMap="InsurancePolicyPayRenderProps"
+      >
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  OperationBtnType,
+  ProTableV2,
+  LoadingLayout,
+  AppContainer,
+  useTable,
+  ProTableV2Props,
+  defineOperationBtns,
+} from '@bole-core/components';
+import { useAccess, useInsurancePolicyPay } from '@/hooks';
+import { paginateList, downloadFileByUrl, setOSSLink, downloadFile } from '@/utils';
+import { InsurancePolicyStampFilesColumns } from './constants';
+
+defineOptions({
+  name: 'InsurancePolicyStampFiles',
+});
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'downloadBtn',
+      name: '涓嬭浇',
+    },
+    emits: { onClick: (role) => handleDownload(role) },
+    extraProps: {
+      hide: (row: API.InsurancePolicyPayDto) => !row.policyOssUrl,
+    },
+  },
+]);
+
+const route = useRoute();
+const id = route.params.id as string;
+
+const { insurancePolicyPayList, isLoading } = useInsurancePolicyPay({ id: id });
+
+const InsurancePolicyPayRenderProps: ProTableV2Props['columnRenderMap'] = {
+  sumSignPremium: { type: 'money' },
+};
+
+function handleDownload(row: API.InsurancePolicyPayDto) {
+  downloadFileByUrl(setOSSLink(row.policyOssUrl), `淇濆崟_${row.channelOrderNo}`);
+}
+</script>
diff --git a/src/views/Home/InsureDownloadInvoice.vue b/src/views/Home/InsureDownloadInvoice.vue
new file mode 100644
index 0000000..b639765
--- /dev/null
+++ b/src/views/Home/InsureDownloadInvoice.vue
@@ -0,0 +1,58 @@
+<template>
+  <LoadingLayout :loading="isLoading">
+    <AppContainer>
+      <ProTableV2
+        :columns="InsureDownloadInvoiceColumns"
+        :operationBtns="operationBtns"
+        :tableData="insurancePolicyPayList"
+        :columnRenderMap="InsurancePolicyPayRenderProps"
+      >
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  OperationBtnType,
+  ProTableV2,
+  LoadingLayout,
+  AppContainer,
+  useTable,
+  ProTableV2Props,
+  defineOperationBtns,
+} from '@bole-core/components';
+import { useAccess, useInsurancePolicyPay } from '@/hooks';
+import { downloadFileByUrl, setOSSLink } from '@/utils';
+import { InsureDownloadInvoiceColumns } from './constants';
+
+defineOptions({
+  name: 'InsureDownloadInvoice',
+});
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'downloadBtn',
+      name: '涓嬭浇',
+    },
+    emits: { onClick: (role) => handleDownload(role) },
+    extraProps: {
+      hide: (row: API.InsurancePolicyPayDto) => !row.invoiceDownloadOssUrl,
+    },
+  },
+]);
+
+const route = useRoute();
+const id = route.params.id as string;
+
+const { insurancePolicyPayList, isLoading } = useInsurancePolicyPay({ id: id });
+
+const InsurancePolicyPayRenderProps: ProTableV2Props['columnRenderMap'] = {
+  invoicePlanFee: { type: 'money' },
+};
+
+function handleDownload(row: API.InsurancePolicyPayDto) {
+  downloadFileByUrl(setOSSLink(row.invoiceDownloadOssUrl));
+}
+</script>
diff --git a/src/views/Home/InsurePayDetail.vue b/src/views/Home/InsurePayDetail.vue
new file mode 100644
index 0000000..9fe65dd
--- /dev/null
+++ b/src/views/Home/InsurePayDetail.vue
@@ -0,0 +1,62 @@
+<template>
+  <LoadingLayout :loading="isLoading">
+    <AppContainer>
+      <ProTableV2
+        :columns="InsurePayDetailColumns"
+        :operationBtns="operationBtns"
+        :showPagination="false"
+        :tableData="insurancePolicyPayList"
+        :columnRenderMap="InsurancePolicyPayRenderProps"
+      >
+      </ProTableV2>
+    </AppContainer>
+  </LoadingLayout>
+</template>
+
+<script setup lang="ts">
+import {
+  OperationBtnType,
+  ProTableV2,
+  LoadingLayout,
+  AppContainer,
+  useTable,
+  ProTableV2Props,
+  defineOperationBtns,
+} from '@bole-core/components';
+import { useAccess, useInsurancePolicyPay } from '@/hooks';
+import * as insuranceOrderServices from '@/services/api/InsuranceOrder';
+import { InsurancePolicyPayStatusEnumText, InsurancePolicyPayStatusEnum } from '@/constants';
+import { useQuery } from '@tanstack/vue-query';
+import { InsurePayDetailColumns } from './constants';
+
+defineOptions({
+  name: 'InsurePayDetail',
+});
+
+const operationBtns = defineOperationBtns([
+  {
+    data: {
+      enCode: 'payBtn',
+      name: '鏀粯',
+    },
+    emits: { onClick: (role) => handlePay(role) },
+    extraProps: {
+      hide: (row: API.InsurancePolicyPayDto) => row.status !== InsurancePolicyPayStatusEnum.WaitPay,
+    },
+  },
+]);
+
+const route = useRoute();
+const id = route.params.id as string;
+
+const { insurancePolicyPayList, isLoading } = useInsurancePolicyPay({ id: id });
+
+const InsurancePolicyPayRenderProps: ProTableV2Props['columnRenderMap'] = {
+  sumSignPremium: { type: 'money' },
+  status: { type: 'enum', valueEnum: InsurancePolicyPayStatusEnumText },
+};
+
+function handlePay(row: API.InsurancePolicyPayDto) {
+  window.open(row.payUrl, '_blank');
+}
+</script>
diff --git a/src/views/Home/components/InsureOrderInfoView.vue b/src/views/Home/components/InsureOrderInfoView.vue
index b05a03e..6451e8b 100644
--- a/src/views/Home/components/InsureOrderInfoView.vue
+++ b/src/views/Home/components/InsureOrderInfoView.vue
@@ -101,7 +101,10 @@
             </template>
             <template v-else>
               <el-button @click="handleDownloadPerson()" type="primary">涓嬭浇浜哄憳娓呭崟</el-button>
-              <el-button @click="handleDownloadOrder()" type="primary">涓嬭浇淇濆崟</el-button>
+              <el-button v-if="detail.productOnline" @click="handleGoStampFiles()" type="primary"
+                >涓嬭浇淇濆崟</el-button
+              >
+              <el-button v-else @click="handleDownloadOrder()" type="primary">涓嬭浇淇濆崟</el-button>
             </template>
           </template>
         </ProTableQueryFilterBar>
@@ -397,6 +400,15 @@
   downloadFileByUrl(setOSSLink(detail.value?.insureBillUrl));
 }
 
+function handleGoStampFiles() {
+  router.push({
+    name: 'InsurancePolicyStampFiles',
+    params: {
+      id: id,
+    },
+  });
+}
+
 function handleBatchChange() {
   if (
     dayjs(detail.value?.effectEndTime).isBefore(dayjs()) ||
diff --git a/src/views/Home/constants/index.ts b/src/views/Home/constants/index.ts
index 86c9edb..9582a45 100644
--- a/src/views/Home/constants/index.ts
+++ b/src/views/Home/constants/index.ts
@@ -86,6 +86,12 @@
     width: 160,
   },
   {
+    id: '141',
+    enCode: 'payStatus',
+    name: '鏀粯鐘舵��',
+    width: 160,
+  },
+  {
     id: '15',
     enCode: 'status',
     name: '鎶曚繚鐘舵��',
@@ -98,3 +104,67 @@
     width: 160,
   },
 ]).filter(Boolean);
+
+export const InsurancePolicyStampFilesColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'channelOrderNo',
+    name: '璁㈠崟鍙�',
+  },
+  {
+    id: '2',
+    enCode: 'proposalNo',
+    name: '鎶曚繚鍗曞彿',
+  },
+  {
+    id: '3',
+    enCode: 'sumSignPremium',
+    name: '淇濊垂閲戦',
+  },
+]);
+
+export const InsureDownloadInvoiceColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'channelOrderNo',
+    name: '璁㈠崟鍙�',
+  },
+  {
+    id: '2',
+    enCode: 'proposalNo',
+    name: '鎶曚繚鍗曞彿',
+  },
+  {
+    id: '3',
+    enCode: 'invoiceSerialNo',
+    name: '鍙戠エ鍙风爜',
+  },
+  {
+    id: '4',
+    enCode: 'invoicePlanFee',
+    name: '浠风◣鍚堣',
+  },
+]);
+
+export const InsurePayDetailColumns = defineColumns([
+  {
+    id: '1',
+    enCode: 'channelOrderNo',
+    name: '璁㈠崟鍙�',
+  },
+  {
+    id: '2',
+    enCode: 'proposalNo',
+    name: '鎶曚繚鍗曞彿',
+  },
+  {
+    id: '3',
+    enCode: 'sumSignPremium',
+    name: '淇濊垂閲戦',
+  },
+  {
+    id: '4',
+    enCode: 'status',
+    name: '鏀粯鐘舵��',
+  },
+]);

--
Gitblit v1.9.1