pcm-agents 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components-chat-message_33.cjs.entry.js +28 -7
- package/dist/cjs/components-chat-message_33.cjs.entry.js.map +1 -1
- package/dist/cjs/{conversation-utils-BfkOMf_-.js → conversation-utils-B4jUfmtU.js} +4 -4
- package/dist/cjs/{conversation-utils-BfkOMf_-.js.map → conversation-utils-B4jUfmtU.js.map} +1 -1
- package/dist/cjs/{index-BnRvF-cO.js → index-Dghp_NL6.js} +3 -3
- package/dist/cjs/{index-BnRvF-cO.js.map → index-Dghp_NL6.js.map} +1 -1
- package/dist/cjs/index.cjs.js +1 -1
- package/dist/cjs/oem-htws-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-jd-modal.cjs.entry.js +2 -2
- package/dist/cjs/oem-jlpp-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-jlzz-modal.cjs.entry.js +23 -2
- package/dist/cjs/oem-jlzz-modal.cjs.entry.js.map +1 -1
- package/dist/cjs/oem-jlzz-modal.entry.cjs.js.map +1 -1
- package/dist/cjs/oem-mnct-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-mnms-modal.cjs.entry.js +1 -1
- package/dist/cjs/oem-qgqjl-modal.cjs.entry.js +3 -3
- package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js +2 -2
- package/dist/cjs/pcm-jlsx-modal.cjs.entry.js +174 -6
- package/dist/cjs/pcm-jlsx-modal.cjs.entry.js.map +1 -1
- package/dist/cjs/pcm-jlsx-modal.entry.cjs.js.map +1 -1
- package/dist/cjs/{sentry-reporter-CAeLEFLc.js → sentry-reporter-CgJowDyu.js} +3 -3
- package/dist/cjs/{sentry-reporter-CAeLEFLc.js.map → sentry-reporter-CgJowDyu.js.map} +1 -1
- package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.css +8 -2
- package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.js +35 -0
- package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.js.map +1 -1
- package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.css +1 -1
- package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.css +14 -0
- package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js +173 -5
- package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js.map +1 -1
- package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.css +8 -2
- package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js +35 -0
- package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js.map +1 -1
- package/dist/collection/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.css +1 -1
- package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.css +1 -1
- package/dist/components/components-chat-message.js +1 -1
- package/dist/components/components-digital-human.js +1 -1
- package/dist/components/components-export-records-modal.js +1 -1
- package/dist/components/components-mobile-input-btn.js +1 -1
- package/dist/components/components-mobile-upload-btn.js +1 -1
- package/dist/components/components-position-selector.js +1 -1
- package/dist/components/components-thousand-resume-wrapper.js +1 -1
- package/dist/components/components-upload.js +1 -1
- package/dist/components/components-voice-input-btn.js +1 -1
- package/dist/components/index.js +1 -1
- package/dist/components/oem-htws-modal.js +5 -5
- package/dist/components/oem-jd-modal.js +5 -5
- package/dist/components/oem-jlpp-modal.js +7 -7
- package/dist/components/oem-jlsx-modal.js +5 -5
- package/dist/components/oem-jlzz-modal.js +27 -6
- package/dist/components/oem-jlzz-modal.js.map +1 -1
- package/dist/components/oem-mnct-modal.js +7 -7
- package/dist/components/oem-mnms-modal.js +8 -8
- package/dist/components/oem-qgqjl-modal.js +9 -9
- package/dist/components/oem-zygh-modal.js +5 -5
- package/dist/components/{p-Bab9bYff.js → p-BDEiyYVl.js} +4 -4
- package/dist/components/{p-Bab9bYff.js.map → p-BDEiyYVl.js.map} +1 -1
- package/dist/components/{p-DkJ7RM7j.js → p-Bg0KKnpU.js} +3 -3
- package/dist/components/{p-DkJ7RM7j.js.map → p-Bg0KKnpU.js.map} +1 -1
- package/dist/components/{p-CR7hzwAG.js → p-BhdGTSLg.js} +6 -6
- package/dist/components/p-BhdGTSLg.js.map +1 -0
- package/dist/components/{p-CUpl5cwz.js → p-C-lvK9NX.js} +3 -3
- package/dist/components/{p-CUpl5cwz.js.map → p-C-lvK9NX.js.map} +1 -1
- package/dist/components/{p-Bn48g_o5.js → p-C7ubjB1x.js} +3 -3
- package/dist/components/{p-Bn48g_o5.js.map → p-C7ubjB1x.js.map} +1 -1
- package/dist/components/{p-Cp6_0jsj.js → p-CB7myOe_.js} +3 -3
- package/dist/components/{p-Cp6_0jsj.js.map → p-CB7myOe_.js.map} +1 -1
- package/dist/components/{p-DNPkGKCS.js → p-CEu-bFot.js} +3 -3
- package/dist/components/{p-DNPkGKCS.js.map → p-CEu-bFot.js.map} +1 -1
- package/dist/components/{p-BH3zMcBy.js → p-CPq5-i_-.js} +4 -4
- package/dist/components/{p-BH3zMcBy.js.map → p-CPq5-i_-.js.map} +1 -1
- package/dist/components/{p-Cy_hQiQs.js → p-CzFKth7J.js} +3 -3
- package/dist/components/{p-Cy_hQiQs.js.map → p-CzFKth7J.js.map} +1 -1
- package/dist/components/{p-CCTgkbh7.js → p-D4RnNrxx.js} +3 -3
- package/dist/components/{p-CCTgkbh7.js.map → p-D4RnNrxx.js.map} +1 -1
- package/dist/components/{p-DrIjQbpV.js → p-DJDJfWq9.js} +3 -3
- package/dist/components/{p-DrIjQbpV.js.map → p-DJDJfWq9.js.map} +1 -1
- package/dist/components/{p-DuRuN7gY.js → p-i4wY2JnB.js} +3 -3
- package/dist/components/{p-DuRuN7gY.js.map → p-i4wY2JnB.js.map} +1 -1
- package/dist/components/{p-BBxWf8DW.js → p-oVAdweom.js} +3 -3
- package/dist/components/{p-BBxWf8DW.js.map → p-oVAdweom.js.map} +1 -1
- package/dist/components/pcm-1zhanshi-mnms-modal.js +5 -5
- package/dist/components/pcm-app-chat-modal.js +1 -1
- package/dist/components/pcm-ats-mnms-modal.js +5 -5
- package/dist/components/pcm-card.js +1 -1
- package/dist/components/pcm-hr-chat-modal.js +2 -2
- package/dist/components/pcm-htws-modal.js +8 -8
- package/dist/components/pcm-hyzj-modal.js +5 -5
- package/dist/components/pcm-jd-modal.js +6 -6
- package/dist/components/pcm-jlpp-modal.js +8 -8
- package/dist/components/pcm-jlsx-modal.js +177 -9
- package/dist/components/pcm-jlsx-modal.js.map +1 -1
- package/dist/components/pcm-jlzz-modal.js +28 -7
- package/dist/components/pcm-jlzz-modal.js.map +1 -1
- package/dist/components/pcm-mnct-modal.js +7 -7
- package/dist/components/pcm-mnms-modal.js +8 -8
- package/dist/components/pcm-mnms-zp-modal.js +8 -8
- package/dist/components/pcm-msbg-modal.js +5 -5
- package/dist/components/pcm-qgqjl-modal.js +9 -9
- package/dist/components/pcm-virtual-chat-modal.js +1 -1
- package/dist/components/pcm-zsk-chat-modal.js +3 -3
- package/dist/components/pcm-zsk-chat-modal.js.map +1 -1
- package/dist/components/pcm-zygh-modal.js +7 -7
- package/dist/components/pcm-zygh-v2-modal.js +7 -7
- package/dist/esm/components-chat-message_33.entry.js +28 -7
- package/dist/esm/components-chat-message_33.entry.js.map +1 -1
- package/dist/esm/{conversation-utils-Ck8snHlu.js → conversation-utils-CLO35DHR.js} +4 -4
- package/dist/esm/{conversation-utils-Ck8snHlu.js.map → conversation-utils-CLO35DHR.js.map} +1 -1
- package/dist/esm/{index-BR_BEmyI.js → index-KVnu9w-h.js} +4 -4
- package/dist/esm/{index-BR_BEmyI.js.map → index-KVnu9w-h.js.map} +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/oem-htws-modal.entry.js +1 -1
- package/dist/esm/oem-jd-modal.entry.js +2 -2
- package/dist/esm/oem-jlpp-modal.entry.js +1 -1
- package/dist/esm/oem-jlzz-modal.entry.js +23 -2
- package/dist/esm/oem-jlzz-modal.entry.js.map +1 -1
- package/dist/esm/oem-mnct-modal.entry.js +1 -1
- package/dist/esm/oem-mnms-modal.entry.js +1 -1
- package/dist/esm/oem-qgqjl-modal.entry.js +3 -3
- package/dist/esm/pcm-hr-chat-modal.entry.js +2 -2
- package/dist/esm/pcm-jlsx-modal.entry.js +174 -6
- package/dist/esm/pcm-jlsx-modal.entry.js.map +1 -1
- package/dist/esm/{sentry-reporter-BZPRD4nE.js → sentry-reporter-B4aHQq-A.js} +3 -3
- package/dist/esm/{sentry-reporter-BZPRD4nE.js.map → sentry-reporter-B4aHQq-A.js.map} +1 -1
- package/dist/pcm-agents/index.esm.js +1 -1
- package/dist/pcm-agents/oem-jlzz-modal.entry.esm.js.map +1 -1
- package/dist/pcm-agents/{p-4427d0b4.entry.js → p-4d7511e0.entry.js} +2 -2
- package/dist/pcm-agents/{p-66459556.entry.js → p-7e8bdfa6.entry.js} +2 -2
- package/dist/pcm-agents/{p-7000140e.entry.js → p-8144f0d4.entry.js} +2 -2
- package/dist/pcm-agents/{p-4f35fe24.entry.js → p-8256890d.entry.js} +2 -2
- package/dist/pcm-agents/p-B4ClCdh9.js +2 -0
- package/dist/pcm-agents/{p-CDLRm6tb.js.map → p-B4ClCdh9.js.map} +1 -1
- package/dist/pcm-agents/{p-C5UfA3VN.js → p-Bktjt_YJ.js} +2 -2
- package/dist/pcm-agents/{p-C5UfA3VN.js.map → p-Bktjt_YJ.js.map} +1 -1
- package/dist/pcm-agents/{p-CC_AWE7Q.js → p-CMfzTNOk.js} +2 -2
- package/dist/pcm-agents/{p-CC_AWE7Q.js.map → p-CMfzTNOk.js.map} +1 -1
- package/dist/pcm-agents/p-aa606968.entry.js +2 -0
- package/dist/pcm-agents/p-aa606968.entry.js.map +1 -0
- package/dist/pcm-agents/p-dd6362f0.entry.js +2 -0
- package/dist/pcm-agents/p-dd6362f0.entry.js.map +1 -0
- package/dist/pcm-agents/{p-174577d5.entry.js → p-e2b9a9f2.entry.js} +2 -2
- package/dist/pcm-agents/{p-6419b0bb.entry.js → p-eb9b355e.entry.js} +2 -2
- package/dist/pcm-agents/{p-8b6019b7.entry.js → p-efb4e819.entry.js} +2 -2
- package/dist/pcm-agents/{p-4a767489.entry.js → p-f6683f29.entry.js} +3 -3
- package/dist/pcm-agents/{p-4a767489.entry.js.map → p-f6683f29.entry.js.map} +1 -1
- package/dist/pcm-agents/pcm-agents.esm.js +1 -1
- package/dist/pcm-agents/pcm-jlsx-modal.entry.esm.js.map +1 -1
- package/dist/types/components/oem-jlzz-modal/oem-jlzz-modal.d.ts +11 -0
- package/dist/types/components/pcm-jlsx-modal/pcm-jlsx-modal.d.ts +7 -2
- package/dist/types/components/pcm-jlzz-modal/pcm-jlzz-modal.d.ts +11 -0
- package/dist/types/components.d.ts +24 -2
- package/package.json +1 -1
- package/dist/components/p-CR7hzwAG.js.map +0 -1
- package/dist/pcm-agents/p-0abb8e18.entry.js +0 -2
- package/dist/pcm-agents/p-0abb8e18.entry.js.map +0 -1
- package/dist/pcm-agents/p-99bf652c.entry.js +0 -2
- package/dist/pcm-agents/p-99bf652c.entry.js.map +0 -1
- package/dist/pcm-agents/p-CDLRm6tb.js +0 -2
- /package/dist/pcm-agents/{p-4427d0b4.entry.js.map → p-4d7511e0.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-66459556.entry.js.map → p-7e8bdfa6.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-7000140e.entry.js.map → p-8144f0d4.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-4f35fe24.entry.js.map → p-8256890d.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-174577d5.entry.js.map → p-e2b9a9f2.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-6419b0bb.entry.js.map → p-eb9b355e.entry.js.map} +0 -0
- /package/dist/pcm-agents/{p-8b6019b7.entry.js.map → p-efb4e819.entry.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oem-jlzz-modal.js","sourceRoot":"","sources":["../../../../src/components/oem-jlzz-modal/oem-jlzz-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop, Event, EventEmitter, Watch, State, Element } from '@stencil/core';\r\nimport { FileUploadResponse, verifyApiKey, PCM_DOMAIN } from '../../utils/utils';\r\nimport { ConversationStartEventData, StreamCompleteEventData } from '../../components';\r\nimport { ErrorEventBus, ErrorEventDetail } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store';\r\nimport { configStore } from '../../../store/config.store';\r\nimport { Message } from '../../services/message.service';\r\n\r\n@Component({\r\n tag: 'oem-jlzz-modal',\r\n styleUrls: ['oem-jlzz-modal.css', '../../global/global.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class OemJlzzModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '简历制作';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token!: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 是否成功,成功展示 iframe 官网\r\n */\r\n @Prop({ mutable: true }) isSuccess: boolean = false;\r\n\r\n /**\r\n * 导出按钮的文本\r\n */\r\n @Prop() exportButtonText: string = '导出简历json数据';\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop() zIndex?: number = 1000;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n /**\r\n * 会话ID\r\n */\r\n @State() conversationId?: string;\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '根据对话生成简历';\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 上传成功事件\r\n */\r\n @Event() uploadSuccess: EventEmitter<FileUploadResponse>;\r\n\r\n /**\r\n * 流式输出完成事件\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 错误事件\r\n */\r\n @Event() someErrorEvent: EventEmitter<ErrorEventDetail>;\r\n\r\n /**\r\n * 获取简历数据事件(用户点击导出简历json数据后触发)\r\n */\r\n @Event() getResumeData: EventEmitter<any>;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'drawer';\r\n\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: FileUploadResponse | null = null;\r\n @State() showChatModal: boolean = false;\r\n @State() resumeType: 'upload' | 'chat' = 'chat';\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n @State() isSubmitting: boolean = false;\r\n @State() showIframe: boolean = false;\r\n private tokenInvalidListener: () => void;\r\n private removeErrorListener: () => void;\r\n private pcmUploadRef;\r\n /**\r\n * iframe DOM 引用\r\n */\r\n private _iframeEl?: HTMLIFrameElement;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (!newValue) {\r\n // 重置状态\r\n this.showChatModal = false;\r\n this.showIframe = false;\r\n this.isSuccess = false;\r\n this.conversationId = undefined;\r\n this.resumeType = 'chat';\r\n } else {\r\n await verifyApiKey(this.token);\r\n }\r\n }\r\n @Watch('isSuccess')\r\n handleIsSuccessChange(newValue: boolean) {\r\n if (newValue && this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n }\r\n }\r\n\r\n /**\r\n * 处理流式响应完成事件\r\n */\r\n private handleStreamComplete = (event: CustomEvent<StreamCompleteEventData>) => {\r\n this.conversationId = event.detail.conversation_id;\r\n // 当流式响应完成时,如果不是直接对话模式,则显示 iframe\r\n if (this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n this.isSuccess = true;\r\n }\r\n };\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n }\r\n\r\n // 初始化时设置 token,但不验证(验证在 @Watch('isOpen') 中处理)\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n // 添加全局错误监听\r\n this.removeErrorListener = ErrorEventBus.addErrorListener(errorDetail => {\r\n this.someErrorEvent.emit(errorDetail);\r\n });\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n }\r\n\r\n componentDidLoad() {\r\n // 监听来自 iframe 的消息\r\n window.addEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n disconnectedCallback() {\r\n // 组件销毁时移除事件监听器\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n // 移除错误监听器\r\n if (this.removeErrorListener) {\r\n this.removeErrorListener();\r\n }\r\n window.removeEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n /**\r\n * 处理 iframe 加载完成(不再直接发送 token)\r\n * 由 iframe 主动 postMessage { type: 'iframeReady' } 通知父页面后再发送 token\r\n */\r\n private handleIframeLoad = () => {\r\n console.log(this._iframeEl, 'this._iframeEl');\r\n // 不再直接发送 token,等待 iframeReady 消息\r\n };\r\n\r\n /**\r\n * 处理来自 iframe 的消息\r\n * 支持 iframe 调用父组件方法,也支持握手机制\r\n */\r\n private handleIframeMessage = (event: MessageEvent) => {\r\n // 允许本地和线上环境\r\n const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];\r\n if (!allowedOrigins.includes(event.origin)) return;\r\n const { type, value } = event.data || {};\r\n if (type === 'callParentMethod') {\r\n this.exampleMethodFromIframe(value);\r\n }\r\n // 关键:收到 iframeReady 后再发送 token\r\n if (type === 'iframeReady' && this._iframeEl?.contentWindow) {\r\n // 动态获取 targetOrigin,兼容本地和线上\r\n const targetOrigin = new URL(this._iframeEl.src).origin;\r\n // 1. 先发送 parentReady,带上父页面的 origin\r\n this._iframeEl.contentWindow.postMessage({ type: 'parentReady', origin: window.location.origin }, targetOrigin);\r\n // 2. 再发送 token\r\n this._iframeEl.contentWindow.postMessage({ type: 'setToken', token: this.token }, targetOrigin);\r\n console.log(this.exportButtonText, 'this.exportButtonText');\r\n this._iframeEl.contentWindow.postMessage(\r\n {\r\n type: 'buttonConfig',\r\n config: {\r\n hideExportButton: true,\r\n exportButtonText: this.exportButtonText,\r\n },\r\n },\r\n targetOrigin,\r\n );\r\n console.log('父组件已发送 token 给 iframe,targetOrigin:', targetOrigin);\r\n }\r\n };\r\n\r\n /**\r\n * 导出简历数据\r\n * @param value 简历数据是字符串形式\r\n */\r\n public exampleMethodFromIframe(value: string) {\r\n this.getResumeData.emit(JSON.parse(value));\r\n }\r\n\r\n private handleClose = () => {\r\n this.modalClosed.emit();\r\n };\r\n // 切换类型\r\n private changeType = (type: 'upload' | 'chat') => {\r\n this.resumeType = type;\r\n };\r\n private handleStartInterview = async () => {\r\n if (this.resumeType === 'upload' && !this.uploadedFileInfo) {\r\n Message.info('请上传简历');\r\n return;\r\n }\r\n\r\n // 判断文件是否正在上传\r\n if (this.resumeType === 'upload' && await this.pcmUploadRef?.getIsUploading?.()) {\r\n Message.info('文件上传中,请稍后');\r\n return;\r\n }\r\n\r\n this.isSubmitting = true;\r\n this.showChatModal = true;\r\n this.isSubmitting = false;\r\n };\r\n private closeResumeChat = () => {\r\n this.isSuccess = false;\r\n this.resumeType = 'upload';\r\n };\r\n render() {\r\n if (!this.isOpen) return null;\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'pc-layout': !this.isSuccess,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n // 判断是否隐藏简历上传区域\r\n const hideResumeUpload = Boolean(this.customInputs && this.customInputs.file_url);\r\n\r\n // 判断是否同时提供了file_url和job_info\r\n const hasFileAndJob = Boolean(this.customInputs?.file_url && this.customInputs?.job_info);\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && !this.showChatModal && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 上传界面 - 仅在不显示聊天模态框且没有会话ID且没有同时提供file_url和job_info时显示 */}\r\n {!this.showChatModal && !this.conversationId && !hasFileAndJob && !this.showIframe && (\r\n <div class=\"input-container\">\r\n <div class=\"resume-type-container\">\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'chat',\r\n }}\r\n onClick={() => this.changeType('chat')}\r\n >\r\n 直接开始\r\n </div>\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'upload',\r\n }}\r\n onClick={() => this.changeType('upload')}\r\n >\r\n 上传简历\r\n </div>\r\n </div>\r\n\r\n {/* 简历上传区域 - 仅在没有customInputs.file_url时显示 */}\r\n {!hideResumeUpload && this.resumeType === 'upload' && (\r\n <div class=\"resume-upload-section\">\r\n <label>上传简历</label>\r\n <components-mobile-upload-btn\r\n maxFileSize={15 * 1024 * 1024}\r\n multiple={false}\r\n uploadAreaMode={true}\r\n acceptFileSuffixList={['.txt', '.md', '.pdf', '.docx', '.doc']}\r\n uploadParams={{\r\n tags: ['resume'],\r\n }}\r\n onOk={(e) => {\r\n const result: FileUploadResponse[] = e.detail ?? [];\r\n this.uploadedFileInfo = result[0];\r\n this.uploadSuccess.emit(this.uploadedFileInfo);\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.resumeType === 'chat' && (\r\n <div class=\"jd-input-section\">\r\n <label htmlFor=\"job-description\">从头开始创建</label>\r\n <div class=\"chat-content\">\r\n <div class=\"chat-content-text\">🤖无需复杂操作,只需回答AI的几个简单问题,系统会根据你的回答自动生成内容完整、格式专业的个人简历</div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n class=\"submit-button\"\r\n disabled={\r\n (this.resumeType === 'upload' && !hideResumeUpload && !this.uploadedFileInfo) ||\r\n this.isUploading ||\r\n this.isSubmitting\r\n }\r\n onClick={this.handleStartInterview}\r\n >\r\n {this.isUploading ? '上传中...' : this.isSubmitting ? '处理中...' : this.resumeType === 'upload' ? '开始制作' : '开始对话'}\r\n </button>\r\n\r\n <div class=\"ai-disclaimer\">\r\n <p>所有内容均由AI生成仅供参考</p>\r\n <p class=\"beian-info\">\r\n <span>中央网信办生成式人工智能服务备案号</span>:\r\n <a href=\"https://www.pincaimao.com\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n Hunan-PinCaiMao-202412310003\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 聊天界面 - 在显示聊天模态框时显示 */}\r\n {this.showChatModal && (\r\n <>\r\n <div\r\n style={{\r\n display: this.resumeType === 'chat' ? 'block' : 'none',\r\n }}\r\n >\r\n <pcm-app-chat-modal\r\n isOpen={true}\r\n modalTitle={this.modalTitle}\r\n icon={this.icon}\r\n isShowHeader={this.isShowHeader}\r\n isNeedClose={this.isNeedClose}\r\n fullscreen={this.fullscreen}\r\n showWorkspaceHistory={false}\r\n botId=\"39284520284983296\"\r\n conversationId={this.conversationId}\r\n defaultQuery={this.defaultQuery}\r\n filePreviewMode={this.filePreviewMode}\r\n customInputs={{\r\n ...this.customInputs,\r\n file_url: this.resumeType === 'upload' ? this.customInputs.file_url || this.uploadedFileInfo?.cos_key : '',\r\n mode_type: this.resumeType === 'chat' ? 1 : 0,\r\n }}\r\n interviewMode=\"text\"\r\n closeResume={this.closeResumeChat}\r\n onStreamComplete={this.handleStreamComplete}\r\n ></pcm-app-chat-modal>\r\n </div>\r\n {/* 如果不是对话模式,则展示加载中。完成之后跳转 */}\r\n {this.resumeType !== 'chat' && !this.showIframe && (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p class=\"loading-text\">AI正在优化您的简历...</p>\r\n </div>\r\n )}\r\n {this.showIframe && (\r\n <>\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n {/*\r\n 1. 不再通过 URL 传递 token,避免泄露。\r\n 2. 通过 ref 获取 iframe 元素,onLoad 时 postMessage 发送 token。\r\n */}\r\n <div class=\"iframe-container\">\r\n <iframe\r\n ref={el => (this._iframeEl = el as HTMLIFrameElement)}\r\n src={`${PCM_DOMAIN}/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n // src={`http://localhost:3000/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n frameborder=\"0\"\r\n onLoad={this.handleIframeLoad}\r\n ></iframe>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"oem-jlzz-modal.js","sourceRoot":"","sources":["../../../../src/components/oem-jlzz-modal/oem-jlzz-modal.tsx"],"names":[],"mappings":"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","sourcesContent":["import { Component, h, Prop, Event, EventEmitter, Watch, State, Element } from '@stencil/core';\r\nimport { FileUploadResponse, verifyApiKey, PCM_DOMAIN } from '../../utils/utils';\r\nimport { ConversationStartEventData, StreamCompleteEventData } from '../../components';\r\nimport { ErrorEventBus, ErrorEventDetail } from '../../utils/error-event';\r\nimport { authStore } from '../../../store/auth.store';\r\nimport { configStore } from '../../../store/config.store';\r\nimport { Message } from '../../services/message.service';\r\n\r\n@Component({\r\n tag: 'oem-jlzz-modal',\r\n styleUrls: ['oem-jlzz-modal.css', '../../global/global.css', '../../global/host.css'],\r\n shadow: true,\r\n})\r\nexport class OemJlzzModal {\r\n /**\r\n * 模态框标题\r\n */\r\n @Prop() modalTitle: string = '简历制作';\r\n\r\n /**\r\n * SDK鉴权密钥\r\n */\r\n @Prop({ attribute: 'token' }) token!: string;\r\n\r\n /**\r\n * 是否显示聊天模态框\r\n */\r\n @Prop({ mutable: true }) isOpen: boolean = false;\r\n\r\n /**\r\n * 是否成功,成功展示 iframe 官网\r\n */\r\n @Prop({ mutable: true }) isSuccess: boolean = false;\r\n\r\n /**\r\n * 导出按钮的文本\r\n */\r\n @Prop() exportButtonText: string = '导出简历json数据';\r\n\r\n /**\r\n * 当点击模态框关闭时触发\r\n */\r\n @Event() modalClosed: EventEmitter<void>;\r\n\r\n /**\r\n * 应用图标URL\r\n */\r\n @Prop() icon?: string;\r\n\r\n /**\r\n * 聊天框的页面层级\r\n */\r\n @Prop() zIndex?: number = 1000;\r\n\r\n /**\r\n * 是否展示顶部标题栏\r\n */\r\n @Prop() isShowHeader: boolean = true;\r\n\r\n /**\r\n * 是否展示右上角的关闭按钮\r\n */\r\n @Prop() isNeedClose: boolean = true;\r\n\r\n /**\r\n * 会话ID\r\n */\r\n @State() conversationId?: string;\r\n\r\n /**\r\n * 默认查询文本\r\n */\r\n @Prop() defaultQuery: string = '根据对话生成简历';\r\n\r\n /**\r\n * 是否以全屏模式打开,移动端建议设置为true\r\n */\r\n @Prop() fullscreen: boolean = false;\r\n\r\n @Prop() customInputs: Record<string, any> = {};\r\n\r\n /**\r\n * 上传成功事件\r\n */\r\n @Event() uploadSuccess: EventEmitter<FileUploadResponse>;\r\n\r\n /**\r\n * 流式输出完成事件\r\n */\r\n @Event() streamComplete: EventEmitter<StreamCompleteEventData>;\r\n\r\n /**\r\n * 新会话开始的回调,只会在一轮对话开始时触发一次\r\n */\r\n @Event() conversationStart: EventEmitter<ConversationStartEventData>;\r\n\r\n /**\r\n * SDK密钥验证失败事件\r\n */\r\n @Event() tokenInvalid: EventEmitter<void>;\r\n\r\n /**\r\n * 错误事件\r\n */\r\n @Event() someErrorEvent: EventEmitter<ErrorEventDetail>;\r\n\r\n /**\r\n * 获取简历数据事件(用户点击导出简历json数据后触发)\r\n */\r\n @Event() getResumeData: EventEmitter<any>;\r\n\r\n /**\r\n * 简历下载请求事件。\r\n * 触发时机:简历制作页面 运行在微信小程序 web-view 的 SDK iframe 中,\r\n * 用户在移动端下载弹窗点击“直接下载”时触发;普通网页环境仍由 简历制作页面 自行下载,不触发此事件。\r\n * iframe 只提供下载地址和文件名,具体跳转到哪个小程序页面及如何处理下载,\r\n * 由 SDK 接入方通过 onResumeDownloadRequested 回调自行决定。\r\n */\r\n @Event() resumeDownloadRequested: EventEmitter<{\r\n url: string;\r\n fileName: string;\r\n }>;\r\n\r\n /**\r\n * 附件预览模式\r\n * 'drawer': 在右侧抽屉中预览\r\n * 'window': 在新窗口中打开\r\n */\r\n @Prop() filePreviewMode: 'drawer' | 'window' = 'drawer';\r\n\r\n @State() isUploading: boolean = false;\r\n @State() uploadedFileInfo: FileUploadResponse | null = null;\r\n @State() showChatModal: boolean = false;\r\n @State() resumeType: 'upload' | 'chat' = 'chat';\r\n\r\n // 使用 @Element 装饰器获取组件的 host 元素\r\n @Element() hostElement: HTMLElement;\r\n\r\n @State() isSubmitting: boolean = false;\r\n @State() showIframe: boolean = false;\r\n private tokenInvalidListener: () => void;\r\n private removeErrorListener: () => void;\r\n private pcmUploadRef;\r\n /**\r\n * iframe DOM 引用\r\n */\r\n private _iframeEl?: HTMLIFrameElement;\r\n\r\n @Watch('token')\r\n handleTokenChange(newToken: string) {\r\n // 当传入的 token 变化时,更新 authStore 中的 token\r\n if (newToken && newToken !== authStore.getToken()) {\r\n authStore.setToken(newToken);\r\n }\r\n }\r\n\r\n @Watch('isOpen')\r\n async handleIsOpenChange(newValue: boolean) {\r\n if (!newValue) {\r\n // 重置状态\r\n this.showChatModal = false;\r\n this.showIframe = false;\r\n this.isSuccess = false;\r\n this.conversationId = undefined;\r\n this.resumeType = 'chat';\r\n } else {\r\n await verifyApiKey(this.token);\r\n }\r\n }\r\n @Watch('isSuccess')\r\n handleIsSuccessChange(newValue: boolean) {\r\n if (newValue && this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n }\r\n }\r\n\r\n /**\r\n * 处理流式响应完成事件\r\n */\r\n private handleStreamComplete = (event: CustomEvent<StreamCompleteEventData>) => {\r\n this.conversationId = event.detail.conversation_id;\r\n // 当流式响应完成时,如果不是直接对话模式,则显示 iframe\r\n if (this.resumeType !== 'chat') {\r\n this.showIframe = true;\r\n this.isSuccess = true;\r\n }\r\n };\r\n componentWillLoad() {\r\n // 将 zIndex 存入配置缓存\r\n if (this.zIndex) {\r\n configStore.setItem('modal-zIndex', this.zIndex);\r\n }\r\n\r\n // 初始化时设置 token,但不验证(验证在 @Watch('isOpen') 中处理)\r\n if (this.token) {\r\n authStore.setToken(this.token);\r\n }\r\n\r\n // 添加全局token无效事件监听器\r\n this.tokenInvalidListener = () => {\r\n this.tokenInvalid.emit();\r\n };\r\n // 添加全局错误监听\r\n this.removeErrorListener = ErrorEventBus.addErrorListener(errorDetail => {\r\n this.someErrorEvent.emit(errorDetail);\r\n });\r\n document.addEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n }\r\n\r\n componentDidLoad() {\r\n // 监听来自 iframe 的消息\r\n window.addEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n disconnectedCallback() {\r\n // 组件销毁时移除事件监听器\r\n document.removeEventListener('pcm-token-invalid', this.tokenInvalidListener);\r\n // 移除错误监听器\r\n if (this.removeErrorListener) {\r\n this.removeErrorListener();\r\n }\r\n window.removeEventListener('message', this.handleIframeMessage);\r\n }\r\n\r\n /**\r\n * 处理 iframe 加载完成(不再直接发送 token)\r\n * 由 iframe 主动 postMessage { type: 'iframeReady' } 通知父页面后再发送 token\r\n */\r\n private handleIframeLoad = () => {\r\n console.log(this._iframeEl, 'this._iframeEl');\r\n // 不再直接发送 token,等待 iframeReady 消息\r\n };\r\n\r\n /**\r\n * 处理来自 iframe 的消息\r\n * 支持 iframe 调用父组件方法,也支持握手机制\r\n */\r\n private handleIframeMessage = (event: MessageEvent) => {\r\n // 允许本地和线上环境\r\n const allowedOrigins = ['http://localhost:3000', PCM_DOMAIN];\r\n if (!allowedOrigins.includes(event.origin)) return;\r\n // 只接受当前简历 iframe 发出的消息,避免页面内其他窗口误触发 SDK 事件。\r\n if (event.source !== this._iframeEl?.contentWindow) return;\r\n\r\n const { type, value } = event.data || {};\r\n if (type === 'callParentMethod') {\r\n this.exampleMethodFromIframe(value);\r\n }\r\n if (type === 'resumeDownloadRequested') {\r\n // SDK 仅透传下载信息,不耦合任何宿主小程序路由。\r\n if (!value?.url || !value?.fileName) return;\r\n this.resumeDownloadRequested.emit({\r\n url: value.url,\r\n fileName: value.fileName,\r\n });\r\n }\r\n // 关键:收到 iframeReady 后再发送 token\r\n if (type === 'iframeReady' && this._iframeEl?.contentWindow) {\r\n // 动态获取 targetOrigin,兼容本地和线上\r\n const targetOrigin = new URL(this._iframeEl.src).origin;\r\n // 1. 先发送 parentReady,带上父页面的 origin\r\n this._iframeEl.contentWindow.postMessage({ type: 'parentReady', origin: window.location.origin }, targetOrigin);\r\n // 2. 再发送 token\r\n this._iframeEl.contentWindow.postMessage({ type: 'setToken', token: this.token }, targetOrigin);\r\n console.log(this.exportButtonText, 'this.exportButtonText');\r\n this._iframeEl.contentWindow.postMessage(\r\n {\r\n type: 'buttonConfig',\r\n config: {\r\n hideExportButton: true,\r\n exportButtonText: this.exportButtonText,\r\n },\r\n },\r\n targetOrigin,\r\n );\r\n console.log('父组件已发送 token 给 iframe,targetOrigin:', targetOrigin);\r\n }\r\n };\r\n\r\n /**\r\n * 导出简历数据\r\n * @param value 简历数据是字符串形式\r\n */\r\n public exampleMethodFromIframe(value: string) {\r\n this.getResumeData.emit(JSON.parse(value));\r\n }\r\n\r\n private handleClose = () => {\r\n this.modalClosed.emit();\r\n };\r\n // 切换类型\r\n private changeType = (type: 'upload' | 'chat') => {\r\n this.resumeType = type;\r\n };\r\n private handleStartInterview = async () => {\r\n if (this.resumeType === 'upload' && !this.uploadedFileInfo) {\r\n Message.info('请上传简历');\r\n return;\r\n }\r\n\r\n // 判断文件是否正在上传\r\n if (this.resumeType === 'upload' && await this.pcmUploadRef?.getIsUploading?.()) {\r\n Message.info('文件上传中,请稍后');\r\n return;\r\n }\r\n\r\n this.isSubmitting = true;\r\n this.showChatModal = true;\r\n this.isSubmitting = false;\r\n };\r\n private closeResumeChat = () => {\r\n this.isSuccess = false;\r\n this.resumeType = 'upload';\r\n };\r\n render() {\r\n if (!this.isOpen) return null;\r\n const modalStyle = {\r\n zIndex: String(this.zIndex),\r\n };\r\n\r\n const containerClass = {\r\n 'modal-container': true,\r\n 'fullscreen': this.fullscreen,\r\n 'pc-layout': !this.isSuccess,\r\n };\r\n\r\n const overlayClass = {\r\n 'modal-overlay': true,\r\n 'fullscreen-overlay': this.fullscreen,\r\n };\r\n\r\n // 判断是否隐藏简历上传区域\r\n const hideResumeUpload = Boolean(this.customInputs && this.customInputs.file_url);\r\n\r\n // 判断是否同时提供了file_url和job_info\r\n const hasFileAndJob = Boolean(this.customInputs?.file_url && this.customInputs?.job_info);\r\n\r\n return (\r\n <div class={overlayClass} style={modalStyle}>\r\n <div class={containerClass}>\r\n {this.isShowHeader && !this.showChatModal && (\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n )}\r\n\r\n {/* 上传界面 - 仅在不显示聊天模态框且没有会话ID且没有同时提供file_url和job_info时显示 */}\r\n {!this.showChatModal && !this.conversationId && !hasFileAndJob && !this.showIframe && (\r\n <div class=\"input-container\">\r\n <div class=\"resume-type-container\">\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'chat',\r\n }}\r\n onClick={() => this.changeType('chat')}\r\n >\r\n 直接开始\r\n </div>\r\n <div\r\n class={{\r\n 'resume-type-item': true,\r\n 'selected': this.resumeType === 'upload',\r\n }}\r\n onClick={() => this.changeType('upload')}\r\n >\r\n 上传简历\r\n </div>\r\n </div>\r\n\r\n {/* 简历上传区域 - 仅在没有customInputs.file_url时显示 */}\r\n {!hideResumeUpload && this.resumeType === 'upload' && (\r\n <div class=\"resume-upload-section\">\r\n <label>上传简历</label>\r\n <components-mobile-upload-btn\r\n maxFileSize={15 * 1024 * 1024}\r\n multiple={false}\r\n uploadAreaMode={true}\r\n acceptFileSuffixList={['.txt', '.md', '.pdf', '.docx', '.doc']}\r\n uploadParams={{\r\n tags: ['resume'],\r\n }}\r\n onOk={(e) => {\r\n const result: FileUploadResponse[] = e.detail ?? [];\r\n this.uploadedFileInfo = result[0];\r\n this.uploadSuccess.emit(this.uploadedFileInfo);\r\n }}\r\n />\r\n </div>\r\n )}\r\n\r\n {this.resumeType === 'chat' && (\r\n <div class=\"jd-input-section\">\r\n <label htmlFor=\"job-description\">从头开始创建</label>\r\n <div class=\"chat-content\">\r\n <div class=\"chat-content-text\">🤖无需复杂操作,只需回答AI的几个简单问题,系统会根据你的回答自动生成内容完整、格式专业的个人简历</div>\r\n </div>\r\n </div>\r\n )}\r\n\r\n <button\r\n class=\"submit-button\"\r\n disabled={\r\n (this.resumeType === 'upload' && !hideResumeUpload && !this.uploadedFileInfo) ||\r\n this.isUploading ||\r\n this.isSubmitting\r\n }\r\n onClick={this.handleStartInterview}\r\n >\r\n {this.isUploading ? '上传中...' : this.isSubmitting ? '处理中...' : this.resumeType === 'upload' ? '开始制作' : '开始对话'}\r\n </button>\r\n\r\n <div class=\"ai-disclaimer\">\r\n <p>所有内容均由AI生成仅供参考</p>\r\n <p class=\"beian-info\">\r\n <span>中央网信办生成式人工智能服务备案号</span>:\r\n <a href=\"https://www.pincaimao.com\" target=\"_blank\" rel=\"noopener noreferrer\">\r\n Hunan-PinCaiMao-202412310003\r\n </a>\r\n </p>\r\n </div>\r\n </div>\r\n )}\r\n\r\n {/* 聊天界面 - 在显示聊天模态框时显示 */}\r\n {this.showChatModal && (\r\n <>\r\n <div\r\n style={{\r\n display: this.resumeType === 'chat' ? 'block' : 'none',\r\n }}\r\n >\r\n <pcm-app-chat-modal\r\n isOpen={true}\r\n modalTitle={this.modalTitle}\r\n icon={this.icon}\r\n isShowHeader={this.isShowHeader}\r\n isNeedClose={this.isNeedClose}\r\n fullscreen={this.fullscreen}\r\n showWorkspaceHistory={false}\r\n botId=\"39284520284983296\"\r\n conversationId={this.conversationId}\r\n defaultQuery={this.defaultQuery}\r\n filePreviewMode={this.filePreviewMode}\r\n customInputs={{\r\n ...this.customInputs,\r\n file_url: this.resumeType === 'upload' ? this.customInputs.file_url || this.uploadedFileInfo?.cos_key : '',\r\n mode_type: this.resumeType === 'chat' ? 1 : 0,\r\n }}\r\n interviewMode=\"text\"\r\n closeResume={this.closeResumeChat}\r\n onStreamComplete={this.handleStreamComplete}\r\n ></pcm-app-chat-modal>\r\n </div>\r\n {/* 如果不是对话模式,则展示加载中。完成之后跳转 */}\r\n {this.resumeType !== 'chat' && !this.showIframe && (\r\n <div class=\"loading-container\">\r\n <div class=\"loading-spinner\"></div>\r\n <p class=\"loading-text\">AI正在优化您的简历...</p>\r\n </div>\r\n )}\r\n {this.showIframe && (\r\n <>\r\n <div class=\"modal-header\">\r\n <div class=\"header-left\">\r\n {this.icon && <img src={this.icon} class=\"header-icon\" alt=\"应用图标\" />}\r\n <div>{this.modalTitle}</div>\r\n </div>\r\n {this.isNeedClose && (\r\n <button class=\"close-button\" onClick={this.handleClose}>\r\n <span>×</span>\r\n </button>\r\n )}\r\n </div>\r\n {/*\r\n 1. 不再通过 URL 传递 token,避免泄露。\r\n 2. 通过 ref 获取 iframe 元素,onLoad 时 postMessage 发送 token。\r\n */}\r\n <div class=\"iframe-container\">\r\n <iframe\r\n ref={el => (this._iframeEl = el as HTMLIFrameElement)}\r\n src={`${PCM_DOMAIN}/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n // src={`http://localhost:3000/myresume?conversation_id=${this.conversationId}&isSdk=true`}\r\n frameborder=\"0\"\r\n onLoad={this.handleIframeLoad}\r\n ></iframe>\r\n </div>\r\n </>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n }\r\n}\r\n"]}
|
|
@@ -31,6 +31,20 @@
|
|
|
31
31
|
overflow-y: auto;
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
+
.upload-disabled-wrapper {
|
|
35
|
+
position: relative;
|
|
36
|
+
cursor: not-allowed;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.upload-disabled-wrapper::before {
|
|
40
|
+
content: '';
|
|
41
|
+
position: absolute;
|
|
42
|
+
inset: 0;
|
|
43
|
+
background-color: rgba(255, 255, 255, 0.7);
|
|
44
|
+
cursor: not-allowed;
|
|
45
|
+
z-index: 1;
|
|
46
|
+
}
|
|
47
|
+
|
|
34
48
|
/* 步骤头部 */
|
|
35
49
|
.step-header {
|
|
36
50
|
text-align: center;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { h } from "@stencil/core";
|
|
2
|
-
import { verifyApiKey, sendHttpRequest, sendSSERequest, getCosPreviewUrl, PCM_DOMAIN } from "../../utils/utils";
|
|
2
|
+
import { verifyApiKey, sendHttpRequest, sendSSERequest, getCosPreviewUrl, PCM_DOMAIN, uploadFileByUrl } from "../../utils/utils";
|
|
3
3
|
import { showMessage } from "../../utils/message-utils";
|
|
4
4
|
import { ErrorEventBus } from "../../utils/error-event";
|
|
5
5
|
import { authStore } from "../../../store/auth.store";
|
|
@@ -45,8 +45,9 @@ export class JlsxModal {
|
|
|
45
45
|
*/
|
|
46
46
|
fullscreen = false;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
49
|
-
*
|
|
48
|
+
* 自定义输入参数<br>
|
|
49
|
+
* - job_info: 填充 JD 输入区域
|
|
50
|
+
* - file_urls: 简历文件 URL,多个以逗号分隔;创建任务后自动进入简历列表并开始筛选
|
|
50
51
|
*/
|
|
51
52
|
customInputs = {};
|
|
52
53
|
/**
|
|
@@ -324,6 +325,9 @@ export class JlsxModal {
|
|
|
324
325
|
evaluation_criteria: this.evaluationCriteria,
|
|
325
326
|
create_time: new Date().toISOString()
|
|
326
327
|
});
|
|
328
|
+
if (this.customInputs?.file_urls) {
|
|
329
|
+
await this.startAnalysisWithCustomFileUrls();
|
|
330
|
+
}
|
|
327
331
|
}
|
|
328
332
|
else {
|
|
329
333
|
throw new Error(response.message || '创建任务失败');
|
|
@@ -534,7 +538,13 @@ export class JlsxModal {
|
|
|
534
538
|
} })), h("textarea", { id: "job-description", class: "job-description-textarea", placeholder: "\u8BF7\u8F93\u5165\u804C\u4F4D\u63CF\u8FF0\uFF0C\u5305\u62EC\u804C\u8D23\u3001\u8981\u6C42\u7B49\u4FE1\u606F...", rows: 6, value: this.jobDescription, onInput: this.handleJobDescriptionChange })), h("div", { class: "criteria-input-section" }, h("div", { class: "criteria-header" }, h("label", { htmlFor: "evaluation-criteria" }, "\u8BC4\u5206\u6807\u51C6"), h("div", { class: "criteria-actions" }, h("span", { class: `total-weight ${this.getTotalWeight() !== 100 ? 'invalid' : ''}` }, "\u603B\u6743\u91CD: ", this.getTotalWeight(), "%"), h("span", null))), h("div", { class: "criteria-table-container" }, h("table", { class: "criteria-table" }, h("thead", null, h("tr", null, h("th", { style: { width: '25%' } }, "\u6807\u51C6\u540D\u79F0"), h("th", { style: { width: '15%' } }, "\u6743\u91CD(%)"), h("th", { style: { width: '50%' } }, "\u63CF\u8FF0"), h("th", { style: { width: '10%' } }, "\u64CD\u4F5C"))), h("tbody", null, this.evaluationCriteria.map((criteria, index) => (h("tr", { key: index }, h("td", null, h("input", { type: "text", class: "criteria-name-input", placeholder: "\u8BF7\u8F93\u5165\u6807\u51C6\u540D\u79F0", value: criteria.name, onInput: (e) => this.handleEvaluationCriteriaNameChange(index, e.target.value) })), h("td", null, h("input", { type: "number", class: "criteria-value-input", placeholder: "0", min: "0", max: "100", value: criteria.value, onInput: (e) => this.handleEvaluationCriteriaValueChange(index, e.target.value) })), h("td", null, h("textarea", { class: "criteria-description-input", placeholder: "\u8BF7\u8F93\u5165\u8BC4\u5206\u6807\u51C6\u63CF\u8FF0", rows: 2, value: criteria.description, onInput: (e) => this.handleEvaluationCriteriaDescriptionChange(index, e.target.value) })), h("td", null, h("button", { type: "button", class: "remove-criteria-btn", disabled: this.evaluationCriteria.length <= 1, onClick: () => this.removeEvaluationCriteria(index), title: this.evaluationCriteria.length <= 1 ? '至少需要保留一个评分标准' : '删除此标准' }, "\u00D7")))))))), h("div", { class: "add-criteria-btn-wrapper" }, h("button", { type: "button", class: "add-criteria-btn", onClick: this.addEvaluationCriteria }, "+ \u6DFB\u52A0\u6807\u51C6")), this.getTotalWeight() !== 100 && (h("p", { class: "criteria-warning" }, "\u26A0\uFE0F \u6743\u91CD\u603B\u548C\u5E94\u4E3A100%\uFF0C\u5F53\u524D\u4E3A", this.getTotalWeight(), "%"))), h("div", { class: "criteria-input-section" }, h("div", { class: "criteria-header" }, h("label", { htmlFor: "evaluation-criteria" }, "\u91CD\u8981\u6761\u4EF6\uFF08\u9009\u586B\uFF09"), h("div", null)), h("textarea", { id: "job-description", class: "job-description-textarea", placeholder: "\u5728\u6B64\u680F\u586B\u5199\u7684\u6761\u4EF6\u4E3A\u786C\u6027\u8981\u6C42\uFF0C\u4E0D\u7B26\u5408\u6761\u4EF6\u7684\u7B80\u5386\uFF0C\u5176\u6700\u7EC8\u5339\u914D\u5EA6\u5C06\u76F4\u63A5\u5224\u5B9A\u4E3A0\u5206\u3002", rows: 6, value: this.importantConditions, onInput: this.handleImportantConditionsChange })), h("button", { class: "submit-button", disabled: !this.jobDescription.trim() || this.evaluationCriteria.length === 0 || this.getTotalWeight() !== 100 || this.isSubmitting, onClick: this.handleCreateTask }, this.isSubmitting ? '创建中...' : '创建任务'), h("div", { class: "ai-disclaimer" }, h("p", null, "\u6240\u6709\u5185\u5BB9\u5747\u7531AI\u751F\u6210\u4EC5\u4F9B\u53C2\u8003"), h("p", { class: "beian-info" }, h("span", null, "\u4E2D\u592E\u7F51\u4FE1\u529E\u751F\u6210\u5F0F\u4EBA\u5DE5\u667A\u80FD\u670D\u52A1\u5907\u6848\u53F7"), "\uFF1A", h("a", { href: "https://www.pincaimao.com", target: "_blank", rel: "noopener noreferrer" }, "Hunan-PinCaiMao-202412310003")))));
|
|
535
539
|
}
|
|
536
540
|
renderTaskStep() {
|
|
537
|
-
return (h("div", { class: "task-container" }, h("div", { class: "task-info-section" }, h("div", { class: "info-cards" }, h("div", { class: "info-card" }, h("div", { class: "card-header", onClick: this.toggleJdDetail }, h("span", { class: "card-title" }, "\u804C\u4F4D\u63CF\u8FF0"), h("button", { class: "toggle-btn" }, "\u67E5\u770B")), h("div", { class: "card-preview" }, h("p", { class: "preview-text" }, this.jobDescription))), h("div", { class: "info-card" }, h("div", { class: "card-header", onClick: this.toggleCriteriaDetail }, h("span", { class: "card-title" }, "\u8BC4\u5206\u6807\u51C6\u3001\u91CD\u8981\u6761\u4EF6"), h("button", { class: "toggle-btn" }, "\u67E5\u770B")), h("div", { class: "card-preview" }, h("p", { class: "preview-text" }, this.getEvaluationCriteriaText()))))), h("div", { class: "upload-section" }, h("div", { class: "section-header" }, h("h4", null, "\u4E0A\u4F20\u7B80\u5386")), h("
|
|
541
|
+
return (h("div", { class: "task-container" }, h("div", { class: "task-info-section" }, h("div", { class: "info-cards" }, h("div", { class: "info-card" }, h("div", { class: "card-header", onClick: this.toggleJdDetail }, h("span", { class: "card-title" }, "\u804C\u4F4D\u63CF\u8FF0"), h("button", { class: "toggle-btn" }, "\u67E5\u770B")), h("div", { class: "card-preview" }, h("p", { class: "preview-text" }, this.jobDescription))), h("div", { class: "info-card" }, h("div", { class: "card-header", onClick: this.toggleCriteriaDetail }, h("span", { class: "card-title" }, "\u8BC4\u5206\u6807\u51C6\u3001\u91CD\u8981\u6761\u4EF6"), h("button", { class: "toggle-btn" }, "\u67E5\u770B")), h("div", { class: "card-preview" }, h("p", { class: "preview-text" }, this.getEvaluationCriteriaText()))))), h("div", { class: "upload-section" }, h("div", { class: "section-header" }, h("h4", null, "\u4E0A\u4F20\u7B80\u5386")), h("div", { class: this.customInputs?.file_urls ? 'upload-disabled-wrapper' : '', onClick: (event) => {
|
|
542
|
+
if (this.customInputs?.file_urls) {
|
|
543
|
+
event.stopPropagation();
|
|
544
|
+
event.preventDefault();
|
|
545
|
+
showMessage('不允许上传简历,请联系管理员', 'warning');
|
|
546
|
+
}
|
|
547
|
+
} }, h("components-upload", { ref: (el) => this.pcmUploadRef = el, multiple: true, maxFileSize: 15 * 1024 * 1024, acceptFileSuffixList: ['.pdf', '.doc', '.docx', '.txt', '.md', '.ppt', '.pptx', '.jpg', '.jpeg', '.png'], mobileUploadAble: this.mobileUploadAble, disabled: Boolean(this.customInputs?.file_urls), uploadParams: { tags: ['resume'] }, onUploadChange: this.handleUploadChange })), h("div", { class: "upload-actions" }, this.uploadedResumeRecords.some(record => record.evaluate_status !== 1 && record.evaluate_status !== 0) && (h("button", { class: "analyze-btn", onClick: this.handleStartAnalysis }, `开始分析 (${this.uploadedResumeRecords.filter(record => record.evaluate_status !== 1 && record.evaluate_status !== 0).length} 个待分析)`)))), h("div", { class: "resume-table-section" }, h("div", { class: "section-header" }, h("h4", null, "\u7B80\u5386\u5217\u8868"), h("div", { class: "section-header-side" }, this.showBatchExport && !!this.resumeRecords?.find(item => item.evaluate_status == 1) && h("div", { class: "export-actions" }, h("div", { class: "export-btn", onClick: this.exportAllPDF }, h("span", null, "\u6279\u91CF\u5BFC\u51FA\u62A5\u544A")), h("div", { class: "export-divide" }), h("div", { class: "export-btn", onClick: this.handleExportRecordsClick }, "\u5BFC\u51FA\u8BB0\u5F55")), h("button", { class: "refresh-btn", onClick: this.handleRefreshTable, disabled: this.isLoadingResumeList, title: "\u5237\u65B0\u8868\u683C" }, h("svg", { width: "16", height: "16", viewBox: "0 0 24 24", fill: "currentColor", class: this.isLoadingResumeList ? 'rotating' : '' }, h("path", { d: "M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z" }))), h("span", { class: "record-count" }, "\u5DF2\u7B5B\u9009 ", this.totalRecords, " \u6761\u8BB0\u5F55"))), h("div", { class: "table-container" }, h("table", { class: "resume-table" }, h("thead", null, h("tr", null, h("th", null, "\u7B80\u5386\u6587\u4EF6\u540D"), h("th", null, "\u4EBA\u624D\u4FE1\u606F"), h("th", { class: `sortable-header ${this.sortOrder !== 'none' ? 'active' : ''}`, onClick: this.handleSortByScore }, h("span", { class: "header-content" }, "\u8BC4\u4F30\u5206\u6570", h("span", { class: "sort-icons" }, h("svg", { class: `sort-icon ${this.sortOrder === 'asc' ? 'active' : ''}`, width: "12", height: "12", viewBox: "0 0 12 12" }, h("path", { d: "M6 3l4 4H2z", fill: "currentColor" })), h("svg", { class: `sort-icon ${this.sortOrder === 'desc' ? 'active' : ''}`, width: "12", height: "12", viewBox: "0 0 12 12" }, h("path", { d: "M6 9L2 5h8z", fill: "currentColor" }))))), h("th", null, "\u8BC4\u4F30\u8BE6\u60C5"), h("th", null, "\u72B6\u6001"), h("th", null, "\u64CD\u4F5C"))), h("tbody", null, this.isLoadingResumeList ? (h("tr", null, h("td", { colSpan: 6, class: "empty-row" }, h("div", { class: "empty-state" }, h("div", { class: "loading-spinner-small" }), h("p", null, "\u6B63\u5728\u52A0\u8F7D\u7B80\u5386\u6570\u636E..."))))) : this.resumeRecords.length === 0 ? (h("tr", null, h("td", { colSpan: 6, class: "empty-row" }, h("div", { class: "empty-state" }, h("p", null, "\u6682\u65E0\u7B80\u5386\u6570\u636E"), h("p", { class: "empty-hint" }, "\u8BF7\u4E0A\u4F20\u7B80\u5386\u5F00\u59CB\u7B5B\u9009"))))) : (this.resumeRecords.map(record => (h("tr", { key: record.id }, h("td", { class: "filename-cell" }, h("span", { class: "file-icon" }, "\uD83D\uDCDD"), h("span", { title: record.fileName }, record.fileName)), h("td", { class: "talent-info-cell", title: record.talentInfo }, record.talentInfo), h("td", { class: "score-cell" }, h("div", { class: `score-badge ${this.getScoreClass(record.score)}` }, typeof record.score === 'number' ? record.score : '--'), record.out_important_conditions === 1 && h("div", { class: "out-important-conditions" }, "\u4E0D\u6EE1\u8DB3\u91CD\u8981\u6761\u4EF6")), h("td", { class: "detail-cell", title: record.scoreDetail }, h("span", { class: "detail-content", onClick: () => this.handleViewEvaluate(record) }, record.scoreDetail)), h("td", { class: "status-cell" }, h("span", { class: `status-badge status-${this.getEvaluateStatusClass(record.evaluate_status)}` }, this.getEvaluateStatusText(record.evaluate_status))), h("td", { class: "action-cell" }, h("div", { class: "action-dropdown" }, h("button", { class: "action-btn dropdown-trigger", onClick: (e) => {
|
|
538
548
|
e.stopPropagation();
|
|
539
549
|
this.toggleDropdown(record.id);
|
|
540
550
|
} }, "\u64CD\u4F5C", h("svg", { width: "12", height: "12", viewBox: "0 0 24 24", fill: "currentColor" }, h("path", { d: "M7 10l5 5 5-5z" }))), this.activeDropdownId === record.id && (h("div", { class: "dropdown-menu" }, h("div", { class: "dropdown-item", onClick: (e) => {
|
|
@@ -684,6 +694,164 @@ export class JlsxModal {
|
|
|
684
694
|
this.isLoadingResumeList = false;
|
|
685
695
|
}
|
|
686
696
|
}
|
|
697
|
+
/**
|
|
698
|
+
* 使用 customInputs 中的 file_urls 开始分析简历。
|
|
699
|
+
*/
|
|
700
|
+
async startAnalysisWithCustomFileUrls() {
|
|
701
|
+
if (!this.currentTask) {
|
|
702
|
+
showMessage('任务信息不存在', 'error');
|
|
703
|
+
return;
|
|
704
|
+
}
|
|
705
|
+
const fileUrls = this.customInputs?.file_urls;
|
|
706
|
+
if (!fileUrls) {
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
709
|
+
const originalFileUrls = fileUrls.split(',').map(url => url.trim()).filter(Boolean);
|
|
710
|
+
if (originalFileUrls.length === 0) {
|
|
711
|
+
showMessage('没有有效的简历文件URL', 'warning');
|
|
712
|
+
return;
|
|
713
|
+
}
|
|
714
|
+
this.isAnalyzing = true;
|
|
715
|
+
this.isLoadingResumeList = true;
|
|
716
|
+
try {
|
|
717
|
+
const resumeFileUrls = [];
|
|
718
|
+
for (const url of originalFileUrls) {
|
|
719
|
+
if (url.startsWith('http://') || url.startsWith('https://')) {
|
|
720
|
+
try {
|
|
721
|
+
const fileName = url.split('/').pop() || 'resume.pdf';
|
|
722
|
+
const uploadResponse = await uploadFileByUrl({
|
|
723
|
+
url,
|
|
724
|
+
file_name: fileName
|
|
725
|
+
});
|
|
726
|
+
if (uploadResponse.success && uploadResponse.data?.cos_key) {
|
|
727
|
+
resumeFileUrls.push(uploadResponse.data.cos_key);
|
|
728
|
+
}
|
|
729
|
+
else {
|
|
730
|
+
console.error(`上传文件失败: ${url}`, uploadResponse.message);
|
|
731
|
+
showMessage(`上传文件 ${fileName} 失败: ${uploadResponse.message || '未知错误'}`, 'error');
|
|
732
|
+
}
|
|
733
|
+
}
|
|
734
|
+
catch (error) {
|
|
735
|
+
console.error(`上传文件出错: ${url}`, error);
|
|
736
|
+
showMessage(`上传文件出错: ${error instanceof Error ? error.message : '未知错误'}`, 'error');
|
|
737
|
+
}
|
|
738
|
+
}
|
|
739
|
+
else {
|
|
740
|
+
resumeFileUrls.push(url);
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
if (resumeFileUrls.length === 0) {
|
|
744
|
+
showMessage('没有有效的简历文件可以分析', 'error');
|
|
745
|
+
return;
|
|
746
|
+
}
|
|
747
|
+
if (resumeFileUrls.length < originalFileUrls.length) {
|
|
748
|
+
showMessage(`部分文件上传失败,将继续分析 ${resumeFileUrls.length}/${originalFileUrls.length} 个文件`, 'warning');
|
|
749
|
+
}
|
|
750
|
+
const clearResponse = await sendHttpRequest({
|
|
751
|
+
url: '/sdk/v1/agent/app_filter_resume/clear_repeated_resumes',
|
|
752
|
+
method: 'POST',
|
|
753
|
+
data: {
|
|
754
|
+
task_id: this.currentTask.id,
|
|
755
|
+
resume_file_urls: resumeFileUrls
|
|
756
|
+
}
|
|
757
|
+
});
|
|
758
|
+
if (!clearResponse.success) {
|
|
759
|
+
throw new Error(clearResponse.message || '简历校验失败');
|
|
760
|
+
}
|
|
761
|
+
const filteredFileUrls = clearResponse.data || [];
|
|
762
|
+
if (filteredFileUrls.length === 0) {
|
|
763
|
+
showMessage('已清除重复上传的简历,没有新的简历需要分析', 'info');
|
|
764
|
+
return;
|
|
765
|
+
}
|
|
766
|
+
const ruleString = this.evaluationCriteria
|
|
767
|
+
.map(criteria => `- ${criteria.name}(占比${criteria.value}%):${criteria.description}`)
|
|
768
|
+
.join(' \n');
|
|
769
|
+
this.resumeAnalysisStart.emit({
|
|
770
|
+
task_id: this.currentTask.id,
|
|
771
|
+
resume_count: filteredFileUrls.length,
|
|
772
|
+
resume_files: filteredFileUrls.map(url => ({
|
|
773
|
+
file_name: url.split('/').pop() || '未知文件',
|
|
774
|
+
file_url: url
|
|
775
|
+
}))
|
|
776
|
+
});
|
|
777
|
+
let analysisFailed = false;
|
|
778
|
+
await sendSSERequest({
|
|
779
|
+
url: '/sdk/v1/chat/chat-messages',
|
|
780
|
+
method: 'POST',
|
|
781
|
+
data: {
|
|
782
|
+
bot_id: this.botId,
|
|
783
|
+
response_mode: 'blocking',
|
|
784
|
+
query: '简历筛选',
|
|
785
|
+
inputs: {
|
|
786
|
+
job_info: this.jobDescription,
|
|
787
|
+
jd_id: this.currentTask.jd_id,
|
|
788
|
+
task_id: this.currentTask.id,
|
|
789
|
+
file_urls: filteredFileUrls.join(','),
|
|
790
|
+
rule: ruleString
|
|
791
|
+
}
|
|
792
|
+
},
|
|
793
|
+
onMessage: (data) => {
|
|
794
|
+
if (data.event === 'error') {
|
|
795
|
+
analysisFailed = true;
|
|
796
|
+
this.someErrorEvent.emit({
|
|
797
|
+
error: data.data,
|
|
798
|
+
message: data.data?.message || data.message || '分析失败'
|
|
799
|
+
});
|
|
800
|
+
this.internalConversationId = null;
|
|
801
|
+
return;
|
|
802
|
+
}
|
|
803
|
+
if (data && !this.internalConversationId && (data.message_id || data.conversation_id || data.id)) {
|
|
804
|
+
this.internalConversationId = data.conversation_id;
|
|
805
|
+
this.conversationStart.emit({
|
|
806
|
+
conversation_id: data.conversation_id,
|
|
807
|
+
event: data.event || 'message',
|
|
808
|
+
message_id: data.message_id,
|
|
809
|
+
id: String(this.currentTask.id)
|
|
810
|
+
});
|
|
811
|
+
}
|
|
812
|
+
},
|
|
813
|
+
onComplete: async () => {
|
|
814
|
+
if (analysisFailed) {
|
|
815
|
+
this.internalConversationId = null;
|
|
816
|
+
return;
|
|
817
|
+
}
|
|
818
|
+
await this.loadResumeList();
|
|
819
|
+
this.emitAnalysisCompleteEvent();
|
|
820
|
+
this.internalConversationId = null;
|
|
821
|
+
},
|
|
822
|
+
onError: (error) => {
|
|
823
|
+
analysisFailed = true;
|
|
824
|
+
console.error('简历分析失败:', error);
|
|
825
|
+
SentryReporter.captureError(error, {
|
|
826
|
+
action: 'startAnalysisWithCustomFileUrls',
|
|
827
|
+
component: 'pcm-jlsx-modal',
|
|
828
|
+
title: '简历分析失败'
|
|
829
|
+
});
|
|
830
|
+
this.someErrorEvent.emit({
|
|
831
|
+
error,
|
|
832
|
+
message: '简历分析失败,请重试'
|
|
833
|
+
});
|
|
834
|
+
this.internalConversationId = null;
|
|
835
|
+
}
|
|
836
|
+
});
|
|
837
|
+
}
|
|
838
|
+
catch (error) {
|
|
839
|
+
console.error('开始分析失败:', error);
|
|
840
|
+
SentryReporter.captureError(error, {
|
|
841
|
+
action: 'startAnalysisWithCustomFileUrls',
|
|
842
|
+
component: 'pcm-jlsx-modal',
|
|
843
|
+
title: '开始分析失败'
|
|
844
|
+
});
|
|
845
|
+
this.someErrorEvent.emit({
|
|
846
|
+
error,
|
|
847
|
+
message: '开始分析失败,请重试'
|
|
848
|
+
});
|
|
849
|
+
}
|
|
850
|
+
finally {
|
|
851
|
+
this.isAnalyzing = false;
|
|
852
|
+
this.isLoadingResumeList = false;
|
|
853
|
+
}
|
|
854
|
+
}
|
|
687
855
|
/**
|
|
688
856
|
* 开始分析简历
|
|
689
857
|
*/
|
|
@@ -1362,7 +1530,7 @@ export class JlsxModal {
|
|
|
1362
1530
|
"optional": false,
|
|
1363
1531
|
"docs": {
|
|
1364
1532
|
"tags": [],
|
|
1365
|
-
"text": "\u81EA\u5B9A\u4E49\u8F93\u5165\u53C2\u6570\
|
|
1533
|
+
"text": "\u81EA\u5B9A\u4E49\u8F93\u5165\u53C2\u6570<br>\r\n- job_info: \u586B\u5145 JD \u8F93\u5165\u533A\u57DF\r\n- file_urls: \u7B80\u5386\u6587\u4EF6 URL\uFF0C\u591A\u4E2A\u4EE5\u9017\u53F7\u5206\u9694\uFF1B\u521B\u5EFA\u4EFB\u52A1\u540E\u81EA\u52A8\u8FDB\u5165\u7B80\u5386\u5217\u8868\u5E76\u5F00\u59CB\u7B5B\u9009"
|
|
1366
1534
|
},
|
|
1367
1535
|
"getter": false,
|
|
1368
1536
|
"setter": false,
|