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