From 2e18c1477942ea6df0592807051e78bd192a75b2 Mon Sep 17 00:00:00 2001
From: zhengyiming <540361168@qq.com>
Date: 星期四, 21 八月 2025 15:11:28 +0800
Subject: [PATCH] fix: 签约

---
 types/global.d.ts                                 |    3 
 src/views/AgreementManage/AgreementManageList.vue |   13 +
 .eslintrc-auto-import.json                        |    2 
 src/services/api/typings.d.ts                     |  199 ++++++++++++++++++++++++++--
 src/services/api/index.ts                         |    8 
 src/utils/common/pdf.ts                           |   77 +++++++++++
 index.html                                        |    1 
 src/services/api/electronSign.ts                  |   35 +++++
 src/utils/common/index.ts                         |    1 
 auto-imports.d.ts                                 |    7 
 src/constants/electronSign.ts                     |    6 
 src/constants/apiEnum.ts                          |   12 +
 src/services/api/ocrUtils.ts                      |   43 +++++-
 13 files changed, 379 insertions(+), 28 deletions(-)

diff --git a/.eslintrc-auto-import.json b/.eslintrc-auto-import.json
index 6e203f6..af838e5 100644
--- a/.eslintrc-auto-import.json
+++ b/.eslintrc-auto-import.json
@@ -35,6 +35,7 @@
     "EnumPersonalFreeTime": true,
     "EnumPersonalJobSeekingStatus": true,
     "EnumPersonalRealMethod": true,
+    "EnumPersonalUserRealStatus": true,
     "EnumRealAccess": true,
     "EnumResourceController": true,
     "EnumResourceMethod": true,
@@ -114,6 +115,7 @@
     "SubModuleTitle": true,
     "SubModuleType": true,
     "TempFolderPath": true,
+    "TemplateEditDataItem": true,
     "ThemeColorItem": true,
     "ThemeColorName": true,
     "ThemeColors": true,
diff --git a/auto-imports.d.ts b/auto-imports.d.ts
index fbab021..982efca 100644
--- a/auto-imports.d.ts
+++ b/auto-imports.d.ts
@@ -39,6 +39,7 @@
   const EnumPersonalFreeTime: typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']
   const EnumPersonalJobSeekingStatus: typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']
   const EnumPersonalRealMethod: typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']
+  const EnumPersonalUserRealStatus: typeof import('./src/constants/apiEnum')['EnumPersonalUserRealStatus']
   const EnumRealAccess: typeof import('./src/constants/apiEnum')['EnumRealAccess']
   const EnumResourceController: typeof import('./src/constants/apiEnum')['EnumResourceController']
   const EnumResourceMethod: typeof import('./src/constants/apiEnum')['EnumResourceMethod']
@@ -220,7 +221,7 @@
   export type { Component, Slot, Slots, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue'
   import('vue')
   // @ts-ignore
-  export type { EnumBillingMethod, EnumClientType, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumEnterpriseRealMethod, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, EnumBillingMethod, EnumClientType, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumEnterpriseRealMethod, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton } from './src/constants/apiEnum'
+  export type { EnumBillingMethod, EnumClientType, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumEnterpriseRealMethod, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton, EnumBillingMethod, EnumClientType, EnumContractTemplateStatus, EnumContractTemplateValueRecorder, EnumContractTemplateValueType, EnumDataSource, EnumDbAuditOperate, EnumElectronSignAccess, EnumEnterpriseRealMethod, EnumMenuType, EnumMenuVisitLevel, EnumOcrAccess, EnumPagedListOrder, EnumPayAccess, EnumPersonalFreeTime, EnumPersonalJobSeekingStatus, EnumPersonalRealMethod, EnumPersonalUserRealStatus, EnumRealAccess, EnumResourceController, EnumResourceMethod, EnumRoleWebApiDataPower, EnumSettlementCycle, EnumSmsAccess, EnumTaskCheckReceiveStatus, EnumTaskRecommendStatus, EnumTaskReleaseStatus, EnumTaskSettlementStatus, EnumTaskStatus, EnumTaskUserArrangeStatus, EnumTaskUserHireStatus, EnumTaskUserSignContractStatus, EnumTaskUserSubmitCheckReceiveStatus, EnumUserGender, EnumUserRealMethod, EnumUserStatus, EnumUserType, GetPersonalApplyTaskInfosQueryStatus, GetPersonalHireTaskInfosQueryStatus, GetTaskInfoQueryResultApplyButton, GetTaskInfoQueryResultHireButton } from './src/constants/apiEnum'
   import('./src/constants/apiEnum')
   // @ts-ignore
   export type { CategoryCode, IdentityCodeEnum, EducationCodeEnum, CertificateTypeCodeEnum, WelfareCodeEnum } from './src/constants/dic'
@@ -228,6 +229,9 @@
   // @ts-ignore
   export type { EditorType, EditorType } from './src/constants/editor'
   import('./src/constants/editor')
+  // @ts-ignore
+  export type { TemplateEditDataItem } from './src/constants/electronSign'
+  import('./src/constants/electronSign')
   // @ts-ignore
   export type { AreaType, AreaType } from './src/constants/enum'
   import('./src/constants/enum')
@@ -281,6 +285,7 @@
     readonly EnumPersonalFreeTime: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalFreeTime']>
     readonly EnumPersonalJobSeekingStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalJobSeekingStatus']>
     readonly EnumPersonalRealMethod: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalRealMethod']>
+    readonly EnumPersonalUserRealStatus: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumPersonalUserRealStatus']>
     readonly EnumRealAccess: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumRealAccess']>
     readonly EnumResourceController: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumResourceController']>
     readonly EnumResourceMethod: UnwrapRef<typeof import('./src/constants/apiEnum')['EnumResourceMethod']>
diff --git a/index.html b/index.html
index e19dc37..cb5e9d0 100644
--- a/index.html
+++ b/index.html
@@ -9,6 +9,7 @@
     <meta name="referrer" content="no-referrer" />
     <title><%- title %></title>
     <link rel="stylesheet" href="<%- subMenuIconCssPath %>" />
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.min.js"></script>
     <script>
       window.process = {};
     </script>
diff --git a/src/constants/apiEnum.ts b/src/constants/apiEnum.ts
index b91d90e..687a584 100644
--- a/src/constants/apiEnum.ts
+++ b/src/constants/apiEnum.ts
@@ -159,6 +159,18 @@
   Face = 30,
 }
 
+/** 涓汉鐢ㄦ埛瀹炲悕鐘舵�� */
+export enum EnumPersonalUserRealStatus {
+  /**鏈疄鍚� */
+  UnReal = 0,
+  /**鏍¢獙涓� */
+  Checking = 10,
+  /**瀹炲悕澶辫触 */
+  Fail = 99,
+  /**宸插疄鍚� */
+  Real = 100,
+}
+
 /** 瀹炲悕閫氶亾 */
 export enum EnumRealAccess {
   /**涓婁笂绛� */
diff --git a/src/constants/electronSign.ts b/src/constants/electronSign.ts
index 54174d4..4577c54 100644
--- a/src/constants/electronSign.ts
+++ b/src/constants/electronSign.ts
@@ -2,3 +2,9 @@
   [EnumContractTemplateStatus.Wait]: '寰呭埗鐗�',
   [EnumContractTemplateStatus.Completed]: '宸插埗鐗�',
 };
+
+export type TemplateEditDataItem = {
+  path: string;
+  width: number;
+  height: number;
+};
diff --git a/src/services/api/electronSign.ts b/src/services/api/electronSign.ts
index b649bcb..7e0325b 100644
--- a/src/services/api/electronSign.ts
+++ b/src/services/api/electronSign.ts
@@ -86,6 +86,26 @@
   );
 }
 
+/** 鏌ヨ涓汉瀹炲悕缁撴灉 GET /api/user/electronSign/getPersonalUserRealResult */
+export async function getPersonalUserRealResult(
+  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
+  params: API.APIgetPersonalUserRealResultParams,
+  options?: API.RequestConfig
+) {
+  return request<API.GetPersonalUserRealResultQueryResult>(
+    '/api/user/electronSign/getPersonalUserRealResult',
+    {
+      method: 'GET',
+      params: {
+        ...params,
+        request: undefined,
+        ...params['request'],
+      },
+      ...(options || {}),
+    }
+  );
+}
+
 /** 涓汉浜鸿劯瀹炲悕璁よ瘉 POST /api/user/electronSign/personalUserFaceReal */
 export async function personalUserFaceReal(
   body: API.PersonalUserFaceRealCommand,
@@ -131,6 +151,21 @@
   });
 }
 
+/** 鍚堝悓鍒剁増 POST /api/user/electronSign/saveContractTemplateValues */
+export async function saveContractTemplateValues(
+  body: API.SaveContractTemplateValuesCommand,
+  options?: API.RequestConfig
+) {
+  return request<string>('/api/user/electronSign/saveContractTemplateValues', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
 /** 鍙戦�佷釜浜轰笁瑕佺礌瀹炲悕鐭俊 POST /api/user/electronSign/sendPersonalUserIdentity3RealSms */
 export async function sendPersonalUserIdentity3RealSms(
   body: API.SendPersonalUserIdentity3RealSmsCommand,
diff --git a/src/services/api/index.ts b/src/services/api/index.ts
index 39390a8..2973753 100644
--- a/src/services/api/index.ts
+++ b/src/services/api/index.ts
@@ -6,15 +6,15 @@
 import * as user from './user';
 import * as role from './role';
 import * as enterprise from './enterprise';
+import * as electronSign from './electronSign';
 import * as resource from './resource';
 import * as task from './task';
-import * as ocrUtils from './ocrUtils';
 import * as dictionary from './dictionary';
 import * as userResume from './userResume';
 import * as auth from './auth';
 import * as taskCheckReceive from './taskCheckReceive';
-import * as electronSign from './electronSign';
 import * as taskUser from './taskUser';
+import * as ocrUtils from './ocrUtils';
 import * as menu from './menu';
 import * as logRecords from './logRecords';
 import * as fileUtils from './fileUtils';
@@ -23,15 +23,15 @@
   user,
   role,
   enterprise,
+  electronSign,
   resource,
   task,
-  ocrUtils,
   dictionary,
   userResume,
   auth,
   taskCheckReceive,
-  electronSign,
   taskUser,
+  ocrUtils,
   menu,
   logRecords,
   fileUtils,
diff --git a/src/services/api/ocrUtils.ts b/src/services/api/ocrUtils.ts
index 4601bae..75d1669 100644
--- a/src/services/api/ocrUtils.ts
+++ b/src/services/api/ocrUtils.ts
@@ -2,17 +2,44 @@
 // @ts-ignore
 import { request } from '@/utils/request';
 
-/** 鏂囧瓧璇嗗埆钀ヤ笟鎵х収 GET /api/common/ocrUtils/getLicenseOcr */
-export async function getLicenseOcr(
-  // 鍙犲姞鐢熸垚鐨凱aram绫诲瀷 (闈瀊ody鍙傛暟swagger榛樿娌℃湁鐢熸垚瀵硅薄)
-  params: API.APIgetLicenseOcrParams,
+/** 鏂囧瓧璇嗗埆韬唤璇佽儗闈� POST /api/common/ocrUtils/getIdentityBackOcr */
+export async function getIdentityBackOcr(
+  body: API.GetIdentityBackOcrCommand,
   options?: API.RequestConfig
 ) {
-  return request<API.GetLicenseOcrCommandResult>('/api/common/ocrUtils/getLicenseOcr', {
-    method: 'GET',
-    params: {
-      ...params,
+  return request<API.GetIdentityBackOcrCommandResult>('/api/common/ocrUtils/getIdentityBackOcr', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
     },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏂囧瓧璇嗗埆韬唤璇佹闈� POST /api/common/ocrUtils/getIdentityFrontOcr */
+export async function getIdentityFrontOcr(
+  body: API.GetIdentityFrontOcrCommand,
+  options?: API.RequestConfig
+) {
+  return request<API.GetIdentityFrontOcrCommandResult>('/api/common/ocrUtils/getIdentityFrontOcr', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
+    ...(options || {}),
+  });
+}
+
+/** 鏂囧瓧璇嗗埆钀ヤ笟鎵х収 POST /api/common/ocrUtils/getLicenseOcr */
+export async function getLicenseOcr(body: API.GetLicenseOcrCommand, options?: API.RequestConfig) {
+  return request<API.GetLicenseOcrCommandResult>('/api/common/ocrUtils/getLicenseOcr', {
+    method: 'POST',
+    headers: {
+      'Content-Type': 'application/json-patch+json',
+    },
+    data: body,
     ...(options || {}),
   });
 }
diff --git a/src/services/api/typings.d.ts b/src/services/api/typings.d.ts
index 04356b2..9b8595f 100644
--- a/src/services/api/typings.d.ts
+++ b/src/services/api/typings.d.ts
@@ -98,17 +98,6 @@
     url?: string;
   }
 
-  interface APIgetLicenseOcrParams {
-    /** 閫氶亾 */
-    access?: EnumOcrAccess;
-    /** 鍦烘櫙 */
-    scene?: string;
-    /** 閾炬帴鍦板潃 */
-    url?: string;
-    /** 鏄惁涓轰簯瀛樺偍鐩稿鍦板潃 */
-    isOssUrl?: boolean;
-  }
-
   interface APIgetMenuParams {
     /** Id */
     id?: string;
@@ -128,6 +117,11 @@
   interface APIgetPersonalLoginInfoParams {
     /** 鏌ヨ涓汉鐢ㄦ埛鐧诲綍淇℃伅 */
     request?: GetPersonalLoginInfoQuery;
+  }
+
+  interface APIgetPersonalUserRealResultParams {
+    /** 鏌ヨ涓汉瀹炲悕缁撴灉 */
+    request?: GetPersonalUserRealResultQuery;
   }
 
   interface APIgetResourceFieldsParams {
@@ -242,6 +236,28 @@
     address?: string;
     /** 缁忚惀鑼冨洿 */
     mainBusiness?: string;
+  }
+
+  interface BaiduOcrIdentityBackResultModel {
+    /** 澶辨晥鏃ユ湡 */
+    expiryDate?: string;
+    /** 绛惧彂鏈哄叧 */
+    issueAuthority?: string;
+    /** 绛惧彂鏃ユ湡 */
+    issueDate?: string;
+  }
+
+  interface BaiduOcrIdentityFrontResultModel {
+    name?: string;
+    /** 韬唤璇佸彿 */
+    identity?: string;
+    gender?: EnumUserGender;
+    /** 鐢熸棩 */
+    birthday?: string;
+    /** 姘戞棌 */
+    nation?: string;
+    /** 浣忓潃 */
+    address?: string;
   }
 
   interface BindWxmpUserInfoCommand {
@@ -485,6 +501,17 @@
     Identity4 = 20,
     /**鍒疯劯璁よ瘉 */
     Face = 30,
+  }
+
+  enum EnumPersonalUserRealStatus {
+    /**鏈疄鍚� */
+    UnReal = 0,
+    /**鏍¢獙涓� */
+    Checking = 10,
+    /**瀹炲悕澶辫触 */
+    Fail = 99,
+    /**宸插疄鍚� */
+    Real = 100,
   }
 
   enum EnumRealAccess {
@@ -1026,6 +1053,42 @@
     timestamp?: number;
   }
 
+  interface FriendlyResultGetIdentityBackOcrCommandResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: GetIdentityBackOcrCommandResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
+  interface FriendlyResultGetIdentityFrontOcrCommandResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: GetIdentityFrontOcrCommandResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
   interface FriendlyResultGetLicenseOcrCommandResult {
     /** 璺熻釜Id */
     traceId?: string;
@@ -1160,6 +1223,24 @@
     /** 閿欒鐮� */
     errorCode?: string;
     data?: GetPersonalUserInfosQueryResult;
+    /** 鎵ц鎴愬姛 */
+    success?: boolean;
+    /** 閿欒淇℃伅 */
+    msg?: any;
+    /** 闄勫姞鏁版嵁 */
+    extras?: any;
+    /** 鏃堕棿鎴� */
+    timestamp?: number;
+  }
+
+  interface FriendlyResultGetPersonalUserRealResultQueryResult {
+    /** 璺熻釜Id */
+    traceId?: string;
+    /** 鐘舵�佺爜 */
+    code?: number;
+    /** 閿欒鐮� */
+    errorCode?: string;
+    data?: GetPersonalUserRealResultQueryResult;
     /** 鎵ц鎴愬姛 */
     success?: boolean;
     /** 閿欒淇℃伅 */
@@ -2103,6 +2184,10 @@
     name?: string;
     /** 妯℃澘 */
     file?: string;
+    /** 鍒剁増妯℃澘鐓х墖 */
+    templateEditData?: string;
+    /** 鍒剁増鍙橀噺JSON */
+    templateJsonData?: string;
     /** 涓氬姟缂栫爜 */
     code?: string;
     access?: EnumElectronSignAccess;
@@ -2582,6 +2667,48 @@
     createdTime?: string;
   }
 
+  interface GetIdentityBackOcrCommand {
+    access?: EnumOcrAccess;
+    /** 鍦烘櫙 */
+    scene?: string;
+    /** 閾炬帴鍦板潃 */
+    url?: string;
+    /** 鏄惁涓轰簯瀛樺偍鐩稿鍦板潃 */
+    isOssUrl?: boolean;
+  }
+
+  interface GetIdentityBackOcrCommandResult {
+    /** 鍦板潃 */
+    url?: string;
+    model?: BaiduOcrIdentityBackResultModel;
+  }
+
+  interface GetIdentityFrontOcrCommand {
+    access?: EnumOcrAccess;
+    /** 鍦烘櫙 */
+    scene?: string;
+    /** 閾炬帴鍦板潃 */
+    url?: string;
+    /** 鏄惁涓轰簯瀛樺偍鐩稿鍦板潃 */
+    isOssUrl?: boolean;
+  }
+
+  interface GetIdentityFrontOcrCommandResult {
+    /** 鍦板潃 */
+    url?: string;
+    model?: BaiduOcrIdentityFrontResultModel;
+  }
+
+  interface GetLicenseOcrCommand {
+    access?: EnumOcrAccess;
+    /** 鍦烘櫙 */
+    scene?: string;
+    /** 閾炬帴鍦板潃 */
+    url?: string;
+    /** 鏄惁涓轰簯瀛樺偍鐩稿鍦板潃 */
+    isOssUrl?: boolean;
+  }
+
   interface GetLicenseOcrCommandResult {
     /** 鍦板潃 */
     url?: string;
@@ -2989,6 +3116,41 @@
     hireTime?: string;
     /** 鏈�杩戠绾︽椂闂� */
     signContractTime?: string;
+  }
+
+  type GetPersonalUserRealResultQuery = Record<string, any>;
+
+  interface GetPersonalUserRealResultQueryResult {
+    /** 鏄惁瀹炲悕 */
+    isReal?: boolean;
+    /** 瀹炲悕鏃堕棿 */
+    realTime?: string;
+    realMethod?: EnumUserRealMethod;
+    /** 濮撳悕 */
+    name?: string;
+    /** 鎵嬫満鍙� */
+    phoneNumber?: string;
+    /** 韬唤璇佸彿 */
+    identity?: string;
+    /** 韬唤璇佷汉鍍忛潰 */
+    identityImg?: string;
+    /** 韬唤璇佸浗寰介潰 */
+    identityBackImg?: string;
+    gender?: EnumUserGender;
+    /** 鐢熸棩 */
+    birthday?: string;
+    /** 骞撮緞 */
+    age?: number;
+    /** 閾惰鍗″彿 */
+    bankCard?: string;
+    /** 閾惰鍗$収鐗� */
+    bankCardImg?: string;
+    realAccess?: EnumRealAccess;
+    realStatus?: EnumPersonalUserRealStatus;
+    /** 瀹炲悕澶辫触娑堟伅 */
+    realFailMessage?: string;
+    /** 浜鸿劯瀹炲悕璁よ瘉鍦板潃 */
+    faceRealUrl?: string;
   }
 
   interface GetResourceFieldsQueryResultItem {
@@ -3850,18 +4012,27 @@
     name: string;
     /** 妯℃澘 */
     file: string;
+    /** 鍒剁増妯℃澘鐓х墖 */
+    templateEditData?: string;
     /** 涓氬姟缂栫爜 */
     code?: string;
     access?: EnumElectronSignAccess;
     /** 妯℃澘Id */
     templateId?: string;
-    /** 鍙橀噺 */
-    values?: SaveContractTemplateCommandValue[];
     /** Id */
     id?: string;
   }
 
-  interface SaveContractTemplateCommandValue {
+  interface SaveContractTemplateValuesCommand {
+    /** 妯℃澘Id */
+    id: string;
+    /** 鍒剁増鍙橀噺JSON */
+    templateJsonData?: string;
+    /** 鍙橀噺 */
+    values: SaveContractTemplateValuesCommandItem[];
+  }
+
+  interface SaveContractTemplateValuesCommandItem {
     /** Id */
     id?: string;
     type?: EnumContractTemplateValueType;
diff --git a/src/utils/common/index.ts b/src/utils/common/index.ts
index b03c034..481d8d9 100644
--- a/src/utils/common/index.ts
+++ b/src/utils/common/index.ts
@@ -15,3 +15,4 @@
 export * from './categoryUtils';
 export * from './encrypt';
 export * from './deepClone';
+export * from './pdf';
diff --git a/src/utils/common/pdf.ts b/src/utils/common/pdf.ts
new file mode 100644
index 0000000..671cfc3
--- /dev/null
+++ b/src/utils/common/pdf.ts
@@ -0,0 +1,77 @@
+import { BoleOss, Message } from '@bole-core/core';
+import { RichEditorUtils } from '@bole-core/components';
+import { OssManager } from '../oss';
+import { ElLoading } from 'element-plus';
+
+pdfjsLib.GlobalWorkerOptions.workerSrc =
+  'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.11.338/pdf.worker.js';
+
+export async function resolvePdfByUrl(url: string) {
+  let pdf = await pdfjsLib.getDocument(url).promise;
+
+  return pdf;
+}
+
+export type ConvertPdfToImageItem = BoleOss.PutObjectResult & {
+  width: number;
+  height: number;
+};
+
+export async function convertPdfToImage(pdfUrl: string) {
+  let loadingInstance: ReturnType<typeof ElLoading.service>;
+  try {
+    loadingInstance = ElLoading.service({
+      fullscreen: true,
+      lock: false,
+      background: 'transparent',
+    });
+    const pdf = await resolvePdfByUrl(pdfUrl);
+    let tasks: Promise<ConvertPdfToImageItem>[] = [];
+    for (let i = 0; i < pdf.numPages; i++) {
+      const page = await pdf.getPage(i + 1);
+      const viewport = page.getViewport({ scale: 1 });
+      tasks.push(
+        new Promise(async (resolve, reject) => {
+          try {
+            let base64 = await generateBase64ByPage(page);
+            let file = RichEditorUtils.base64ToFile(base64);
+            let res = await OssManager.asyncUpload({
+              file: file,
+            });
+            resolve({
+              ...res,
+              width: viewport.width,
+              height: viewport.height,
+            });
+          } catch (error) {
+            reject(error);
+          }
+        })
+      );
+    }
+    return Promise.all(tasks);
+  } catch (error) {
+    Message.errorMessage(error);
+    throw new Error(error);
+  } finally {
+    if (loadingInstance) {
+      loadingInstance.close();
+    }
+  }
+}
+
+async function generateBase64ByPage(page) {
+  const viewport = page.getViewport({ scale: 1 });
+  let canvas = document.createElement('canvas');
+  const context = canvas.getContext('2d');
+  canvas.height = viewport.height;
+  canvas.width = viewport.width;
+  const renderContext = {
+    canvasContext: context,
+    viewport: viewport,
+  };
+  await page.render(renderContext).promise;
+  let base64 = canvas.toDataURL('image/png');
+  canvas = null;
+  return base64;
+}
diff --git a/src/views/AgreementManage/AgreementManageList.vue b/src/views/AgreementManage/AgreementManageList.vue
index 30c260f..4ad2f3b 100644
--- a/src/views/AgreementManage/AgreementManageList.vue
+++ b/src/views/AgreementManage/AgreementManageList.vue
@@ -79,7 +79,7 @@
 } from '@bole-core/components';
 import { AgreementbManageColumns } from './constants';
 import { EnumContractTemplateStatus, EnumContractTemplateStatusText } from '@/constants';
-import { downloadFileByUrl, format, setOSSLink } from '@/utils';
+import { convertPdfToImage, downloadFileByUrl, format, setOSSLink } from '@/utils';
 import { ModelValueType } from 'element-plus';
 import * as electronSignServices from '@/services/api/electronSign';
 import TemplateAddDialog from './components/TemplateAddDialog.vue';
@@ -198,9 +198,20 @@
 
 async function handleAddOrEdit() {
   try {
+    let pdfToImage = await convertPdfToImage(editForm.url?.[0].url);
     let params: API.SaveContractTemplateCommand = {
       name: editForm.name,
       file: editForm.url[0]?.path ?? '',
+      templateEditData: JSON.stringify(
+        pdfToImage.map(
+          (x) =>
+            ({
+              path: x.path,
+              width: x.width,
+              height: x.height,
+            } as TemplateEditDataItem)
+        )
+      ),
     };
     let res = await electronSignServices.saveContractTemplate(params);
     if (res) {
diff --git a/types/global.d.ts b/types/global.d.ts
index 4a7ea86..cf9f33c 100644
--- a/types/global.d.ts
+++ b/types/global.d.ts
@@ -15,6 +15,9 @@
     };
     lastBuildTime: string;
   };
+
+  const pdfjsLib: any;
+
   interface Window {
     webkitCancelAnimationFrame: (handle: number) => void;
     mozCancelAnimationFrame: (handle: number) => void;

--
Gitblit v1.9.1