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.
Files changed (164) hide show
  1. package/dist/cjs/components-chat-message_33.cjs.entry.js +28 -7
  2. package/dist/cjs/components-chat-message_33.cjs.entry.js.map +1 -1
  3. package/dist/cjs/{conversation-utils-BfkOMf_-.js → conversation-utils-B4jUfmtU.js} +4 -4
  4. package/dist/cjs/{conversation-utils-BfkOMf_-.js.map → conversation-utils-B4jUfmtU.js.map} +1 -1
  5. package/dist/cjs/{index-BnRvF-cO.js → index-Dghp_NL6.js} +3 -3
  6. package/dist/cjs/{index-BnRvF-cO.js.map → index-Dghp_NL6.js.map} +1 -1
  7. package/dist/cjs/index.cjs.js +1 -1
  8. package/dist/cjs/oem-htws-modal.cjs.entry.js +1 -1
  9. package/dist/cjs/oem-jd-modal.cjs.entry.js +2 -2
  10. package/dist/cjs/oem-jlpp-modal.cjs.entry.js +1 -1
  11. package/dist/cjs/oem-jlzz-modal.cjs.entry.js +23 -2
  12. package/dist/cjs/oem-jlzz-modal.cjs.entry.js.map +1 -1
  13. package/dist/cjs/oem-jlzz-modal.entry.cjs.js.map +1 -1
  14. package/dist/cjs/oem-mnct-modal.cjs.entry.js +1 -1
  15. package/dist/cjs/oem-mnms-modal.cjs.entry.js +1 -1
  16. package/dist/cjs/oem-qgqjl-modal.cjs.entry.js +3 -3
  17. package/dist/cjs/pcm-hr-chat-modal.cjs.entry.js +2 -2
  18. package/dist/cjs/pcm-jlsx-modal.cjs.entry.js +174 -6
  19. package/dist/cjs/pcm-jlsx-modal.cjs.entry.js.map +1 -1
  20. package/dist/cjs/pcm-jlsx-modal.entry.cjs.js.map +1 -1
  21. package/dist/cjs/{sentry-reporter-CAeLEFLc.js → sentry-reporter-CgJowDyu.js} +3 -3
  22. package/dist/cjs/{sentry-reporter-CAeLEFLc.js.map → sentry-reporter-CgJowDyu.js.map} +1 -1
  23. package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.css +8 -2
  24. package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.js +35 -0
  25. package/dist/collection/components/oem-jlzz-modal/oem-jlzz-modal.js.map +1 -1
  26. package/dist/collection/components/pcm-app-chat-modal/pcm-app-chat-modal.css +1 -1
  27. package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.css +14 -0
  28. package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js +173 -5
  29. package/dist/collection/components/pcm-jlsx-modal/pcm-jlsx-modal.js.map +1 -1
  30. package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.css +8 -2
  31. package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js +35 -0
  32. package/dist/collection/components/pcm-jlzz-modal/pcm-jlzz-modal.js.map +1 -1
  33. package/dist/collection/components/pcm-virtual-chat-modal/pcm-virtual-chat-modal.css +1 -1
  34. package/dist/collection/components/pcm-zsk-chat-modal/pcm-zsk-chat-modal.css +1 -1
  35. package/dist/components/components-chat-message.js +1 -1
  36. package/dist/components/components-digital-human.js +1 -1
  37. package/dist/components/components-export-records-modal.js +1 -1
  38. package/dist/components/components-mobile-input-btn.js +1 -1
  39. package/dist/components/components-mobile-upload-btn.js +1 -1
  40. package/dist/components/components-position-selector.js +1 -1
  41. package/dist/components/components-thousand-resume-wrapper.js +1 -1
  42. package/dist/components/components-upload.js +1 -1
  43. package/dist/components/components-voice-input-btn.js +1 -1
  44. package/dist/components/index.js +1 -1
  45. package/dist/components/oem-htws-modal.js +5 -5
  46. package/dist/components/oem-jd-modal.js +5 -5
  47. package/dist/components/oem-jlpp-modal.js +7 -7
  48. package/dist/components/oem-jlsx-modal.js +5 -5
  49. package/dist/components/oem-jlzz-modal.js +27 -6
  50. package/dist/components/oem-jlzz-modal.js.map +1 -1
  51. package/dist/components/oem-mnct-modal.js +7 -7
  52. package/dist/components/oem-mnms-modal.js +8 -8
  53. package/dist/components/oem-qgqjl-modal.js +9 -9
  54. package/dist/components/oem-zygh-modal.js +5 -5
  55. package/dist/components/{p-Bab9bYff.js → p-BDEiyYVl.js} +4 -4
  56. package/dist/components/{p-Bab9bYff.js.map → p-BDEiyYVl.js.map} +1 -1
  57. package/dist/components/{p-DkJ7RM7j.js → p-Bg0KKnpU.js} +3 -3
  58. package/dist/components/{p-DkJ7RM7j.js.map → p-Bg0KKnpU.js.map} +1 -1
  59. package/dist/components/{p-CR7hzwAG.js → p-BhdGTSLg.js} +6 -6
  60. package/dist/components/p-BhdGTSLg.js.map +1 -0
  61. package/dist/components/{p-CUpl5cwz.js → p-C-lvK9NX.js} +3 -3
  62. package/dist/components/{p-CUpl5cwz.js.map → p-C-lvK9NX.js.map} +1 -1
  63. package/dist/components/{p-Bn48g_o5.js → p-C7ubjB1x.js} +3 -3
  64. package/dist/components/{p-Bn48g_o5.js.map → p-C7ubjB1x.js.map} +1 -1
  65. package/dist/components/{p-Cp6_0jsj.js → p-CB7myOe_.js} +3 -3
  66. package/dist/components/{p-Cp6_0jsj.js.map → p-CB7myOe_.js.map} +1 -1
  67. package/dist/components/{p-DNPkGKCS.js → p-CEu-bFot.js} +3 -3
  68. package/dist/components/{p-DNPkGKCS.js.map → p-CEu-bFot.js.map} +1 -1
  69. package/dist/components/{p-BH3zMcBy.js → p-CPq5-i_-.js} +4 -4
  70. package/dist/components/{p-BH3zMcBy.js.map → p-CPq5-i_-.js.map} +1 -1
  71. package/dist/components/{p-Cy_hQiQs.js → p-CzFKth7J.js} +3 -3
  72. package/dist/components/{p-Cy_hQiQs.js.map → p-CzFKth7J.js.map} +1 -1
  73. package/dist/components/{p-CCTgkbh7.js → p-D4RnNrxx.js} +3 -3
  74. package/dist/components/{p-CCTgkbh7.js.map → p-D4RnNrxx.js.map} +1 -1
  75. package/dist/components/{p-DrIjQbpV.js → p-DJDJfWq9.js} +3 -3
  76. package/dist/components/{p-DrIjQbpV.js.map → p-DJDJfWq9.js.map} +1 -1
  77. package/dist/components/{p-DuRuN7gY.js → p-i4wY2JnB.js} +3 -3
  78. package/dist/components/{p-DuRuN7gY.js.map → p-i4wY2JnB.js.map} +1 -1
  79. package/dist/components/{p-BBxWf8DW.js → p-oVAdweom.js} +3 -3
  80. package/dist/components/{p-BBxWf8DW.js.map → p-oVAdweom.js.map} +1 -1
  81. package/dist/components/pcm-1zhanshi-mnms-modal.js +5 -5
  82. package/dist/components/pcm-app-chat-modal.js +1 -1
  83. package/dist/components/pcm-ats-mnms-modal.js +5 -5
  84. package/dist/components/pcm-card.js +1 -1
  85. package/dist/components/pcm-hr-chat-modal.js +2 -2
  86. package/dist/components/pcm-htws-modal.js +8 -8
  87. package/dist/components/pcm-hyzj-modal.js +5 -5
  88. package/dist/components/pcm-jd-modal.js +6 -6
  89. package/dist/components/pcm-jlpp-modal.js +8 -8
  90. package/dist/components/pcm-jlsx-modal.js +177 -9
  91. package/dist/components/pcm-jlsx-modal.js.map +1 -1
  92. package/dist/components/pcm-jlzz-modal.js +28 -7
  93. package/dist/components/pcm-jlzz-modal.js.map +1 -1
  94. package/dist/components/pcm-mnct-modal.js +7 -7
  95. package/dist/components/pcm-mnms-modal.js +8 -8
  96. package/dist/components/pcm-mnms-zp-modal.js +8 -8
  97. package/dist/components/pcm-msbg-modal.js +5 -5
  98. package/dist/components/pcm-qgqjl-modal.js +9 -9
  99. package/dist/components/pcm-virtual-chat-modal.js +1 -1
  100. package/dist/components/pcm-zsk-chat-modal.js +3 -3
  101. package/dist/components/pcm-zsk-chat-modal.js.map +1 -1
  102. package/dist/components/pcm-zygh-modal.js +7 -7
  103. package/dist/components/pcm-zygh-v2-modal.js +7 -7
  104. package/dist/esm/components-chat-message_33.entry.js +28 -7
  105. package/dist/esm/components-chat-message_33.entry.js.map +1 -1
  106. package/dist/esm/{conversation-utils-Ck8snHlu.js → conversation-utils-CLO35DHR.js} +4 -4
  107. package/dist/esm/{conversation-utils-Ck8snHlu.js.map → conversation-utils-CLO35DHR.js.map} +1 -1
  108. package/dist/esm/{index-BR_BEmyI.js → index-KVnu9w-h.js} +4 -4
  109. package/dist/esm/{index-BR_BEmyI.js.map → index-KVnu9w-h.js.map} +1 -1
  110. package/dist/esm/index.js +1 -1
  111. package/dist/esm/oem-htws-modal.entry.js +1 -1
  112. package/dist/esm/oem-jd-modal.entry.js +2 -2
  113. package/dist/esm/oem-jlpp-modal.entry.js +1 -1
  114. package/dist/esm/oem-jlzz-modal.entry.js +23 -2
  115. package/dist/esm/oem-jlzz-modal.entry.js.map +1 -1
  116. package/dist/esm/oem-mnct-modal.entry.js +1 -1
  117. package/dist/esm/oem-mnms-modal.entry.js +1 -1
  118. package/dist/esm/oem-qgqjl-modal.entry.js +3 -3
  119. package/dist/esm/pcm-hr-chat-modal.entry.js +2 -2
  120. package/dist/esm/pcm-jlsx-modal.entry.js +174 -6
  121. package/dist/esm/pcm-jlsx-modal.entry.js.map +1 -1
  122. package/dist/esm/{sentry-reporter-BZPRD4nE.js → sentry-reporter-B4aHQq-A.js} +3 -3
  123. package/dist/esm/{sentry-reporter-BZPRD4nE.js.map → sentry-reporter-B4aHQq-A.js.map} +1 -1
  124. package/dist/pcm-agents/index.esm.js +1 -1
  125. package/dist/pcm-agents/oem-jlzz-modal.entry.esm.js.map +1 -1
  126. package/dist/pcm-agents/{p-4427d0b4.entry.js → p-4d7511e0.entry.js} +2 -2
  127. package/dist/pcm-agents/{p-66459556.entry.js → p-7e8bdfa6.entry.js} +2 -2
  128. package/dist/pcm-agents/{p-7000140e.entry.js → p-8144f0d4.entry.js} +2 -2
  129. package/dist/pcm-agents/{p-4f35fe24.entry.js → p-8256890d.entry.js} +2 -2
  130. package/dist/pcm-agents/p-B4ClCdh9.js +2 -0
  131. package/dist/pcm-agents/{p-CDLRm6tb.js.map → p-B4ClCdh9.js.map} +1 -1
  132. package/dist/pcm-agents/{p-C5UfA3VN.js → p-Bktjt_YJ.js} +2 -2
  133. package/dist/pcm-agents/{p-C5UfA3VN.js.map → p-Bktjt_YJ.js.map} +1 -1
  134. package/dist/pcm-agents/{p-CC_AWE7Q.js → p-CMfzTNOk.js} +2 -2
  135. package/dist/pcm-agents/{p-CC_AWE7Q.js.map → p-CMfzTNOk.js.map} +1 -1
  136. package/dist/pcm-agents/p-aa606968.entry.js +2 -0
  137. package/dist/pcm-agents/p-aa606968.entry.js.map +1 -0
  138. package/dist/pcm-agents/p-dd6362f0.entry.js +2 -0
  139. package/dist/pcm-agents/p-dd6362f0.entry.js.map +1 -0
  140. package/dist/pcm-agents/{p-174577d5.entry.js → p-e2b9a9f2.entry.js} +2 -2
  141. package/dist/pcm-agents/{p-6419b0bb.entry.js → p-eb9b355e.entry.js} +2 -2
  142. package/dist/pcm-agents/{p-8b6019b7.entry.js → p-efb4e819.entry.js} +2 -2
  143. package/dist/pcm-agents/{p-4a767489.entry.js → p-f6683f29.entry.js} +3 -3
  144. package/dist/pcm-agents/{p-4a767489.entry.js.map → p-f6683f29.entry.js.map} +1 -1
  145. package/dist/pcm-agents/pcm-agents.esm.js +1 -1
  146. package/dist/pcm-agents/pcm-jlsx-modal.entry.esm.js.map +1 -1
  147. package/dist/types/components/oem-jlzz-modal/oem-jlzz-modal.d.ts +11 -0
  148. package/dist/types/components/pcm-jlsx-modal/pcm-jlsx-modal.d.ts +7 -2
  149. package/dist/types/components/pcm-jlzz-modal/pcm-jlzz-modal.d.ts +11 -0
  150. package/dist/types/components.d.ts +24 -2
  151. package/package.json +1 -1
  152. package/dist/components/p-CR7hzwAG.js.map +0 -1
  153. package/dist/pcm-agents/p-0abb8e18.entry.js +0 -2
  154. package/dist/pcm-agents/p-0abb8e18.entry.js.map +0 -1
  155. package/dist/pcm-agents/p-99bf652c.entry.js +0 -2
  156. package/dist/pcm-agents/p-99bf652c.entry.js.map +0 -1
  157. package/dist/pcm-agents/p-CDLRm6tb.js +0 -2
  158. /package/dist/pcm-agents/{p-4427d0b4.entry.js.map → p-4d7511e0.entry.js.map} +0 -0
  159. /package/dist/pcm-agents/{p-66459556.entry.js.map → p-7e8bdfa6.entry.js.map} +0 -0
  160. /package/dist/pcm-agents/{p-7000140e.entry.js.map → p-8144f0d4.entry.js.map} +0 -0
  161. /package/dist/pcm-agents/{p-4f35fe24.entry.js.map → p-8256890d.entry.js.map} +0 -0
  162. /package/dist/pcm-agents/{p-174577d5.entry.js.map → p-e2b9a9f2.entry.js.map} +0 -0
  163. /package/dist/pcm-agents/{p-6419b0bb.entry.js.map → p-eb9b355e.entry.js.map} +0 -0
  164. /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"]}
@@ -723,7 +723,7 @@
723
723
  /* 修改工具栏样式 */
724
724
  .input-toolbar {
725
725
  display: flex;
726
- justify-content: end;
726
+ justify-content: flex-end;
727
727
  align-items: center;
728
728
  padding: 8px 12px;
729
729
  background-color: #fff;
@@ -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
- * 自定义输入参数,传入customInputs.job_info时,会填充JD输入区域<br>
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("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, 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) => {
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\uFF0C\u4F20\u5165customInputs.job_info\u65F6\uFF0C\u4F1A\u586B\u5145JD\u8F93\u5165\u533A\u57DF<br>"
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,