Commit b3469c6b authored by R10's avatar R10

Merge branch 'release_gdghg' of ssh://gitlab.gsstcloud.com:10022/poc/poc-api into release_gdghg

# Conflicts:
#	src/test/java/cn/com/poc/utils/FileUtilsTest.java
parents 38199d26 0513442d
#
# There is insufficient memory for the Java Runtime Environment to continue.
# Native memory allocation (mmap) failed to map 532676608 bytes for G1 virtual space
# Possible reasons:
# The system is out of physical RAM or swap space
# The process is running with CompressedOops enabled, and the Java Heap may be blocking the growth of the native heap
# Possible solutions:
# Reduce memory load on the system
# Increase physical memory or swap space
# Check if swap backing store is full
# Decrease Java heap size (-Xmx/-Xms)
# Decrease number of Java threads
# Decrease Java thread stack sizes (-Xss)
# Set larger code cache with -XX:ReservedCodeCacheSize=
# JVM is running with Zero Based Compressed Oops mode in which the Java heap is
# placed in the first 32GB address space. The Java Heap base address is the
# maximum limit for the native heap growth. Please use -XX:HeapBaseMinAddress
# to set the Java Heap base and to place the Java Heap above 32GB virtual address.
# This output file may be truncated or incomplete.
#
# Out of Memory Error (os_windows.cpp:3825), pid=433132, tid=435800
#
# JRE version: (17.0.9+7) (build )
# Java VM: OpenJDK 64-Bit Server VM (17.0.9+7-b1087.11, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, windows-amd64)
# No core dump will be written. Minidumps are not enabled by default on client versions of Windows
#
--------------- S U M M A R Y ------------
Command Line: git4idea.http.GitAskPassApp Username for 'https://gitlab.gsstcloud.com':
Host: 13th Gen Intel(R) Core(TM) i5-13500H, 16 cores, 31G, Windows 11 , 64 bit Build 22621 (10.0.22621.3958)
Time: Tue Nov 5 15:02:22 2024 Windows 11 , 64 bit Build 22621 (10.0.22621.3958) elapsed time: 0.010628 seconds (0d 0h 0m 0s)
--------------- T H R E A D ---------------
Current thread (0x00000215b5d1c970): JavaThread "Unknown thread" [_thread_in_vm, id=435800, stack(0x0000008254700000,0x0000008254800000)]
Stack: [0x0000008254700000,0x0000008254800000]
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code)
V [jvm.dll+0x688349]
V [jvm.dll+0x841bfa]
V [jvm.dll+0x84383e]
V [jvm.dll+0x843ea3]
V [jvm.dll+0x24bdef]
V [jvm.dll+0x6850f9]
V [jvm.dll+0x67988a]
V [jvm.dll+0x30cbfb]
V [jvm.dll+0x3140a6]
V [jvm.dll+0x363ede]
V [jvm.dll+0x36410f]
V [jvm.dll+0x2e29c8]
V [jvm.dll+0x2e3934]
V [jvm.dll+0x812771]
V [jvm.dll+0x371d41]
V [jvm.dll+0x7f12bc]
V [jvm.dll+0x3f59cf]
V [jvm.dll+0x3f7601]
C [jli.dll+0x528f]
C [ucrtbase.dll+0x29333]
C [KERNEL32.DLL+0x1257d]
C [ntdll.dll+0x5af08]
--------------- P R O C E S S ---------------
Threads class SMR info:
_java_thread_list=0x00007ffb2ed9df18, length=0, elements={
}
Java Threads: ( => current thread )
Other Threads:
0x00000215b5d87aa0 GCTaskThread "GC Thread#0" [stack: 0x0000008254800000,0x0000008254900000] [id=284372]
0x00000215dbb90b00 ConcurrentGCThread "G1 Main Marker" [stack: 0x0000008254900000,0x0000008254a00000] [id=442788]
0x00000215b5d992b0 ConcurrentGCThread "G1 Conc#0" [stack: 0x0000008254a00000,0x0000008254b00000] [id=427808]
[error occurred during error reporting (printing all threads), id 0xc0000005, EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x00007ffb2e553597]
VM state: not at safepoint (not fully initialized)
VM Mutex/Monitor currently owned by a thread: ([mutex/lock_event])
[0x00000215b5d15aa0] Heap_lock - owner thread: 0x00000215b5d1c970
Heap address: 0x0000000604400000, size: 8124 MB, Compressed Oops mode: Zero based, Oop shift amount: 3
CDS archive(s) mapped at: [0x0000000000000000-0x0000000000000000-0x0000000000000000), size 0, SharedBaseAddress: 0x0000000800000000, ArchiveRelocationMode: 1.
Narrow klass base: 0x0000000000000000, Narrow klass shift: 0, Narrow klass range: 0x0
GC Precious Log:
<Empty>
Heap:
garbage-first heap total 0K, used 0K [0x0000000604400000, 0x0000000800000000)
region size 4096K, 0 young (0K), 0 survivors (0K)
Metaspace used 0K, committed 0K, reserved 0K
class space used 0K, committed 0K, reserved 0K
Heap Regions: E=young(eden), S=young(survivor), O=old, HS=humongous(starts), HC=humongous(continues), CS=collection set, F=free, OA=open archive, CA=closed archive, TAMS=top-at-mark-start (previous, next)
Card table byte_map: [0x00000215c9ce0000,0x00000215cacc0000] _byte_map_base: 0x00000215c6cbe000
Marking Bits (Prev, Next): (CMBitMap*) 0x00000215dbb90200, (CMBitMap*) 0x00000215dbb90240
Prev Bits: [0x00000215cbca0000, 0x00000215d3b90000)
Next Bits: [0x00000215d3b90000, 0x00000215dba80000)
GC Heap History (0 events):
No events
Dll operation events (1 events):
Event: 0.005 Loaded shared library D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\java.dll
Deoptimization events (0 events):
No events
Classes unloaded (0 events):
No events
Classes redefined (0 events):
No events
Internal exceptions (0 events):
No events
VM Operations (0 events):
No events
Events (0 events):
No events
Dynamic libraries:
0x00007ff6af7c0000 - 0x00007ff6af7ca000 D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\java.exe
0x00007ffbc1f30000 - 0x00007ffbc2147000 C:\Windows\SYSTEM32\ntdll.dll
0x00007ffbc07a0000 - 0x00007ffbc0864000 C:\Windows\System32\KERNEL32.DLL
0x00007ffbbf760000 - 0x00007ffbbfb17000 C:\Windows\System32\KERNELBASE.dll
0x00007ffbb6de0000 - 0x00007ffbb6e77000 C:\Windows\SYSTEM32\apphelp.dll
0x00007ffbbf390000 - 0x00007ffbbf4a1000 C:\Windows\System32\ucrtbase.dll
0x00007ffb9b030000 - 0x00007ffb9b04b000 D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\VCRUNTIME140.dll
0x00007ffba8dc0000 - 0x00007ffba8dd7000 D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\jli.dll
0x00007ffbbfc60000 - 0x00007ffbbfe0f000 C:\Windows\System32\USER32.dll
0x00007ffbbf4b0000 - 0x00007ffbbf4d6000 C:\Windows\System32\win32u.dll
0x00007ffbc16d0000 - 0x00007ffbc16f9000 C:\Windows\System32\GDI32.dll
0x00007ffb958f0000 - 0x00007ffb95b83000 C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.3672_none_2713b9d173822955\COMCTL32.dll
0x00007ffbbf240000 - 0x00007ffbbf358000 C:\Windows\System32\gdi32full.dll
0x00007ffbc0270000 - 0x00007ffbc0317000 C:\Windows\System32\msvcrt.dll
0x00007ffbbf550000 - 0x00007ffbbf5ea000 C:\Windows\System32\msvcp_win.dll
0x00007ffbc0420000 - 0x00007ffbc0451000 C:\Windows\System32\IMM32.DLL
0x00007ffba8de0000 - 0x00007ffba8dec000 D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\vcruntime140_1.dll
0x00007ffb91e40000 - 0x00007ffb91ecd000 D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\msvcp140.dll
0x00007ffb2e260000 - 0x00007ffb2eee2000 D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\server\jvm.dll
0x00007ffbc1820000 - 0x00007ffbc18d2000 C:\Windows\System32\ADVAPI32.dll
0x00007ffbc0870000 - 0x00007ffbc0918000 C:\Windows\System32\sechost.dll
0x00007ffbbf360000 - 0x00007ffbbf388000 C:\Windows\System32\bcrypt.dll
0x00007ffbc1700000 - 0x00007ffbc1814000 C:\Windows\System32\RPCRT4.dll
0x00007ffba9950000 - 0x00007ffba9959000 C:\Windows\SYSTEM32\WSOCK32.dll
0x00007ffbb4150000 - 0x00007ffbb4184000 C:\Windows\SYSTEM32\WINMM.dll
0x00007ffbc1e50000 - 0x00007ffbc1ec1000 C:\Windows\System32\WS2_32.dll
0x00007ffba7840000 - 0x00007ffba784a000 C:\Windows\SYSTEM32\VERSION.dll
0x00007ffbbe0b0000 - 0x00007ffbbe0fd000 C:\Windows\SYSTEM32\POWRPROF.dll
0x00007ffbbe090000 - 0x00007ffbbe0a3000 C:\Windows\SYSTEM32\UMPDC.dll
0x00007ffbbe340000 - 0x00007ffbbe358000 C:\Windows\SYSTEM32\kernel.appcore.dll
0x00007ffba9560000 - 0x00007ffba956a000 D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\jimage.dll
0x00007ffbbc7b0000 - 0x00007ffbbc9e2000 C:\Windows\SYSTEM32\DBGHELP.DLL
0x00007ffbc1ac0000 - 0x00007ffbc1e4e000 C:\Windows\System32\combase.dll
0x00007ffbc0660000 - 0x00007ffbc0737000 C:\Windows\System32\OLEAUT32.dll
0x00007ffb91ed0000 - 0x00007ffb91f02000 C:\Windows\SYSTEM32\dbgcore.DLL
0x00007ffbbfbe0000 - 0x00007ffbbfc5b000 C:\Windows\System32\bcryptPrimitives.dll
0x00007ffb9a6b0000 - 0x00007ffb9a6d5000 D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\java.dll
dbghelp: loaded successfully - version: 4.0.5 - missing functions: none
symbol engine: initialized successfully - sym options: 0x614 - pdb path: .;D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin;C:\Windows\SYSTEM32;C:\Windows\WinSxS\amd64_microsoft.windows.common-controls_6595b64144ccf1df_6.0.22621.3672_none_2713b9d173822955;D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\jbr\bin\server
VM Arguments:
java_command: git4idea.http.GitAskPassApp Username for 'https://gitlab.gsstcloud.com':
java_class_path (initial): D:/Program Files/JetBrains/IntelliJ IDEA 2023.3.3/plugins/vcs-git/lib/git4idea-rt.jar;D:/Program Files/JetBrains/IntelliJ IDEA 2023.3.3/lib/externalProcess-rt.jar
Launcher Type: SUN_STANDARD
[Global flags]
intx CICompilerCount = 12 {product} {ergonomic}
uint ConcGCThreads = 3 {product} {ergonomic}
uint G1ConcRefinementThreads = 13 {product} {ergonomic}
size_t G1HeapRegionSize = 4194304 {product} {ergonomic}
uintx GCDrainStackTargetSize = 64 {product} {ergonomic}
size_t InitialHeapSize = 532676608 {product} {ergonomic}
size_t MarkStackSize = 4194304 {product} {ergonomic}
size_t MaxHeapSize = 8518631424 {product} {ergonomic}
size_t MinHeapDeltaBytes = 4194304 {product} {ergonomic}
size_t MinHeapSize = 8388608 {product} {ergonomic}
uintx NonNMethodCodeHeapSize = 7602480 {pd product} {ergonomic}
uintx NonProfiledCodeHeapSize = 122027880 {pd product} {ergonomic}
uintx ProfiledCodeHeapSize = 122027880 {pd product} {ergonomic}
uintx ReservedCodeCacheSize = 251658240 {pd product} {ergonomic}
bool SegmentedCodeCache = true {product} {ergonomic}
size_t SoftMaxHeapSize = 8518631424 {manageable} {ergonomic}
bool UseCompressedClassPointers = true {product lp64_product} {ergonomic}
bool UseCompressedOops = true {product lp64_product} {ergonomic}
bool UseG1GC = true {product} {ergonomic}
bool UseLargePagesIndividualAllocation = false {pd product} {ergonomic}
Logging:
Log output configuration:
#0: stdout all=warning uptime,level,tags
#1: stderr all=off uptime,level,tags
Environment Variables:
JAVA_HOME=D:\Program Files\Java\jdk1.8.0_144
PATH=D:\Program Files\Git\mingw64\libexec\git-core;D:\Program Files\Git\mingw64\libexec\git-core;D:\Program Files\Git\mingw64\bin;D:\Program Files\Git\usr\bin;C:\Users\52747\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;D:\Program Files\Java\jdk1.8.0_144\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0;C:\Windows\System32\OpenSSH;D:\Program Files (x86)\NetSarang\Xshell 7;D:\Program Files\Git\cmd;D:\Program Files (x86)\NetSarang\Xftp 7;C:\Program Files\dotnet;D:\java-lib;D:\java-lib;C:\Users\52747\AppData\Local\Programs\Python\Python312;C:\Users\52747\AppData\Local\Programs\Python\Python312\Scripts;C:\Users\52747\AppData\Local\Programs\Python\Python39\Scripts;C:\Users\52747\AppData\Local\Programs\Python\Python39;C:\Users\52747\AppData\Local\Programs\Python\Launcher;C:\Users\52747\AppData\Local\Microsoft\WindowsApps;D:\Program Files\Microsoft VS Code\bin;D:\Program Files\JetBrains\IntelliJ IDEA 2023.3.3\bin;D:\Program Files (x86)\Tencent\QQGameTempest\Hall.58319
USERNAME=52747
DISPLAY=:0.0
LC_ALL=en_US.UTF-8
TERM=xterm-256color
TMPDIR=C:\Users\52747\AppData\Local\Temp
OS=Windows_NT
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 186 Stepping 2, GenuineIntel
TMP=C:\Users\52747\AppData\Local\Temp
TEMP=C:\Users\52747\AppData\Local\Temp
Periodic native trim disabled
JNI global refs:
JNI global refs: 0, weak refs: 0
JNI global refs memory usage: 0, weak refs: 0
OOME stack traces (most recent first):
Classloader memory used:
--------------- S Y S T E M ---------------
OS:
Windows 11 , 64 bit Build 22621 (10.0.22621.3958)
OS uptime: 15 days 5:02 hours
Hyper-V role detected
CPU: total 16 (initial active 16) (8 cores per cpu, 2 threads per core) family 6 model 186 stepping 2 microcode 0x4114, cx8, cmov, fxsr, ht, mmx, 3dnowpref, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, lzcnt, tsc, tscinvbit, avx, avx2, aes, erms, clmul, bmi1, bmi2, adx, sha, fma, vzeroupper, clflush, clflushopt, clwb, hv
Processor Information for processor 0
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 1
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 2
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 3
Max Mhz: 2600, Current Mhz: 1024, Mhz Limit: 2600
Processor Information for processor 4
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 5
Max Mhz: 2600, Current Mhz: 1024, Mhz Limit: 2600
Processor Information for processor 6
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 7
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 8
Max Mhz: 2600, Current Mhz: 1368, Mhz Limit: 2600
Processor Information for processor 9
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 10
Max Mhz: 2600, Current Mhz: 1368, Mhz Limit: 2600
Processor Information for processor 11
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 12
Max Mhz: 2600, Current Mhz: 2600, Mhz Limit: 2600
Processor Information for processor 13
Max Mhz: 2600, Current Mhz: 1368, Mhz Limit: 2600
Processor Information for processor 14
Max Mhz: 2600, Current Mhz: 1368, Mhz Limit: 2600
Processor Information for processor 15
Max Mhz: 2600, Current Mhz: 1368, Mhz Limit: 2600
Memory: 4k page, system-wide physical 32492M (858M free)
TotalPageFile size 58092M (AvailPageFile size 565M)
current process WorkingSet (physical memory assigned to process): 12M, peak: 12M
current process commit charge ("private bytes"): 71M, peak: 579M
vm_info: OpenJDK 64-Bit Server VM (17.0.9+7-b1087.11) for windows-amd64 JRE (17.0.9+7-b1087.11), built on 2024-01-05 by "builduser" with MS VC++ 16.10 / 16.11 (VS2019)
END.
@startuml
'https://plantuml.com/sequence-diagram
autonumber
participant User
participant FrontEnd
participant BackEnd
participant Pay
User -> FrontEnd: 充值权益
FrontEnd -> BackEnd: 获取支付权益套餐信息
note right of BackEnd: 套餐名、价格、等级【专业版、旗舰版】
BackEnd -> FrontEnd: 返回权益套餐信息
note right of FrontEnd: 每次切换支付宝或微信都需要重新创建订单
FrontEnd -> BackEnd: 创建支付订单
BackEnd -> FrontEnd: 返回支付订单号
FrontEnd -> BackEnd: 获取支付二维码\n(传入渠道码、支付订单号)
BackEnd -> Pay: 获取渠道支付二维码
Pay -> BackEnd: 返回二维码URL
BackEnd -> FrontEnd: 返回二维码URL
FrontEnd -> BackEnd: 轮询订单状态
User -> FrontEnd: 扫码支付
Pay --> BackEnd: 支付成功回调
BackEnd -> BackEnd: 修改订单状态、更新用户权益
FrontEnd -> BackEnd: 获取订单状态
BackEnd -> FrontEnd: 支付成功
@enduml
\ No newline at end of file
......@@ -25,6 +25,21 @@
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.18.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.18.3</version>
</dependency>
</dependencies>
</dependencyManagement>
......@@ -322,6 +337,12 @@
<version>0.10.328</version>
</dependency>
<dependency>
<groupId>com.baidubce</groupId>
<artifactId>appbuilder</artifactId>
<version>1.1.0</version>
</dependency>
<dependency>
<groupId>io.github.furstenheim</groupId>
<artifactId>copy_down</artifactId>
......@@ -365,6 +386,28 @@
<version>1.12</version>
</dependency>
<!-- Dify Client -->
<dependency>
<groupId>cn.com.gsst</groupId>
<artifactId>dify_client</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.18.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.18.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.18.3</version>
</dependency>
</dependencies>
......
......@@ -14,12 +14,12 @@ public class RecommendQuestionScheduler {
private AgentApplicationExposeService agentApplicationExposeService;
/**
* 每日凌晨
* 每10分钟生成
*
* @throws Exception
*/
@Scheduled(cron = "0 0 0 * * ?")
public void knowledgeInfoStatusUpdateScheduler() throws Exception {
@Scheduled(cron = "0 10 * * * ?")
public void knowledgeInfoStatusUpdateScheduler() {
agentApplicationExposeService.createRecommendQuestion();
}
}
......@@ -33,6 +33,8 @@ import cn.com.poc.thirdparty.resource.demand.ai.entity.function.FunctionCallResu
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.poc.thirdparty.resource.demand.ai.function.AbstractFunctionResult;
import cn.com.poc.thirdparty.resource.demand.ai.function.chart_data_convert.ChartData;
import cn.com.poc.thirdparty.resource.demand.ai.function.chart_data_convert.ChartDataConvertFunction;
import cn.com.poc.thirdparty.resource.demand.ai.function.echart.EChartGenerateFunction;
import cn.com.poc.thirdparty.service.ChainService;
import cn.com.poc.thirdparty.service.LLMService;
......@@ -106,6 +108,9 @@ public class AiBiServiceImpl implements AiBiService {
@Resource
private EChartGenerateFunction eChartGenerateFunction;
@Resource
private ChartDataConvertFunction chartDataConvertFunction;
@Resource
private BizAgentApplicationGcConfigService bizAgentApplicationGcConfigService;
......@@ -281,13 +286,11 @@ public class AiBiServiceImpl implements AiBiService {
result.setKnowledgeContentResult(null);
sseUtil.send(JsonUtils.serialize(result));
JSONObject echartJSONObject = new JSONObject();
echartJSONObject.put("sql", dbChainResult.getSql());
echartJSONObject.put("sql_result", dbChainResult.getSqlResult());
echartJSONObject.put("question", input);
AbstractFunctionResult<String> functionResult = eChartGenerateFunction.doFunction(echartJSONObject.toJSONString(), null, null, null);
String eChartOption = functionResult.getFunctionResult();
functionRecord = outputECharts(eChartOption, sseUtil, functionRecord);
JSONObject chartJSONObject = new JSONObject();
chartJSONObject.put("data", JsonUtils.serialize(dbChainResult));
chartJSONObject.put("question", input);
AbstractFunctionResult<ChartData> functionResult = chartDataConvertFunction.doFunction(chartJSONObject.toJSONString(), null, null, null);
functionRecord = outputChartData(functionResult.getPromptContent(), sseUtil, functionRecord);
}
} else if (StringUtils.isNotBlank(fileUrl)) {
CSVChainResponse csvChainResponse = new CSVChainResponse();
......@@ -306,13 +309,12 @@ public class AiBiServiceImpl implements AiBiService {
result.setCsvChainResult(csvChainResult);
sseUtil.send(JsonUtils.serialize(result));
if (StringUtils.isNotBlank(csvChainResult.getResult())) {
JSONObject echartJSONObject = new JSONObject();
echartJSONObject.put("sql", StringUtils.EMPTY);
echartJSONObject.put("sql_result", csvChainResult.getResult());
echartJSONObject.put("question", input);
AbstractFunctionResult<String> functionResult = eChartGenerateFunction.doFunction(echartJSONObject.toJSONString(), null, null, null);
String eChartOption = functionResult.getFunctionResult();
functionRecord = outputECharts(eChartOption, sseUtil, functionRecord);
JSONObject chartJSONObject = new JSONObject();
chartJSONObject.put("data", csvChainResult.getResult());
chartJSONObject.put("question", input);
AbstractFunctionResult<ChartData> functionResult = chartDataConvertFunction.doFunction(chartJSONObject.toJSONString(), null, null, null);
functionRecord = outputChartData(functionResult.getPromptContent(), sseUtil, functionRecord);
}
}
}
......@@ -381,6 +383,30 @@ public class AiBiServiceImpl implements AiBiService {
return functionRecord;
}
private String outputChartData(String chartData, SSEUtil sseUtil, String functionRecord) throws IOException {
if (chartData != null && StringUtils.isNotBlank(chartData)) {
JSONObject jsonObject = JSONObject.parseObject(chartData);
if (jsonObject.containsKey("skip") && !jsonObject.getBoolean("skip")) {
ToolFunction toolFunction = new ToolFunction();
toolFunction.setName("chart_data_generate");
toolFunction.setResult(chartData);
toolFunction.setDisplayFormat("json");
toolFunction.setArguments(null);
LargeModelDemandResult result = new LargeModelDemandResult();
result.setCode("0");
result.setFunction(toolFunction);
result.setDbChainResult(null);
result.setKnowledgeContentResult(null);
String toolFunctionJson = JsonUtils.serialize(result);
sseUtil.send(toolFunctionJson);
functionRecord = toolFunctionJson;
}
}
return functionRecord;
}
private List<Message> buildMessage(Long userId, String dialoguesId, String prompt, String input, List<DBChainResult> dbChainResults, CSVChainResult csvChainResult) throws Exception {
List<Message> messages = new ArrayList<>();
String databaseResult = StringUtils.EMPTY, csvResult = StringUtils.EMPTY;
......
......@@ -2,8 +2,8 @@ package cn.com.poc.ai_dialogues.aggregate;
import cn.com.poc.ai_dialogues.constant.AiDialoguesTypeEnum;
import cn.com.poc.ai_dialogues.dto.AiDialoguesRecordDto;
import cn.com.poc.ai_dialogues.entity.AiDialoguesOptions;
import cn.com.poc.expose.dto.DialoguesContextDto;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
......@@ -82,6 +82,15 @@ public interface AiDialoguesService {
*
* @param type 对话类型
*/
List<String> guessYouAsk(String type) throws Exception;
List<String> guessYouAsk(String type);
/**
* 对话
*
* @param dialoguesId 对话id
* @param input 对话内容
* @param options 对话配置
*/
String call(String dialoguesId, String input, Long userId, AiDialoguesOptions options) throws Exception;
}
package cn.com.poc.ai_dialogues.aggregate.impl;
import cn.com.poc.agent_application.aggregate.AgentApplicationService;
import cn.com.poc.agent_application.constant.AgentApplicationDialoguesRecordConstants;
import cn.com.poc.agent_application.entity.BizAgentApplicationDialoguesRecordEntity;
import cn.com.poc.agent_application.entity.BizAgentApplicationGcConfigEntity;
import cn.com.poc.agent_application.query.AgentApplicationDialoguesRecordQueryItem;
import cn.com.poc.agent_application.service.BizAgentApplicationDialoguesRecordService;
import cn.com.poc.agent_application.service.BizAgentApplicationGcConfigService;
import cn.com.poc.ai_dialogues.aggregate.AiDialoguesService;
import cn.com.poc.ai_dialogues.constant.AiDialoguesTypeEnum;
import cn.com.poc.ai_dialogues.constant.DialoguesPlatformEnum;
import cn.com.poc.ai_dialogues.dto.AiDialoguesRecordDto;
import cn.com.poc.ai_dialogues.entity.AiDialoguesOptions;
import cn.com.poc.ai_dialogues.entity.BizAiDialogues3rdRelationEntity;
import cn.com.poc.ai_dialogues.entity.BizAiDialoguesEntity;
import cn.com.poc.ai_dialogues.entity.BizAiDialoguesGuessYouAskEntity;
import cn.com.poc.ai_dialogues.entity.BizAiDialoguesProblemAssociationEntity;
import cn.com.poc.ai_dialogues.query.AiDialoguesQueryCondition;
import cn.com.poc.ai_dialogues.query.AiDialoguesQueryItem;
import cn.com.poc.ai_dialogues.service.BizAiDialogues3rdRelationService;
import cn.com.poc.ai_dialogues.service.BizAiDialoguesGuessYouAskService;
import cn.com.poc.ai_dialogues.service.BizAiDialoguesProblemAssociationService;
import cn.com.poc.ai_dialogues.service.BizAiDialoguesService;
import cn.com.poc.appbuilder.aggregation.AppBuilderService;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationModel;
import cn.com.poc.appbuilder.service.BizAppbuilderConversationService;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.constant.XLangConstant;
import cn.com.poc.common.service.BizFileUploadRecordService;
import cn.com.poc.common.service.RedisService;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.SSEUtil;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.expose.aggregate.AgentApplicationExposeService;
import cn.com.poc.expose.dto.DialoguesContextDto;
import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
......@@ -30,8 +40,13 @@ import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDema
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.poc.thirdparty.service.LLMService;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.frame.service.FmxParamConfigService;
import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientIterator;
import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientResult;
import com.baidubce.appbuilder.model.appbuilderclient.Event;
import com.fasterxml.jackson.core.type.TypeReference;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
......@@ -56,9 +71,6 @@ public class AiDialoguesServiceImpl implements AiDialoguesService {
@Resource
private BizFileUploadRecordService bizFileUploadRecordService;
@Resource
private BizAiDialoguesGuessYouAskService bizAiDialoguesGuessYouAskService;
@Resource
private BizAgentApplicationDialoguesRecordService bizAgentApplicationDialoguesRecordService;
......@@ -74,13 +86,45 @@ public class AiDialoguesServiceImpl implements AiDialoguesService {
@Resource
private RedisService redisService;
@Resource
private AppBuilderService appBuilderService;
@Resource
private FmxParamConfigService fmxParamConfigService;
@Resource
private BizAiDialogues3rdRelationService bizAiDialogues3rdRelationService;
@Resource
private BizAppbuilderConversationService bizAppbuilderConversationService;
@Override
public String create(AiDialoguesTypeEnum type, Long userId) throws Exception {
return bizAiDialoguesService.create(type.getType(), userId);
return this.create(type, null, userId);
}
@Override
public String create(AiDialoguesTypeEnum type, String fileUrl, Long userId) throws Exception {
if (type.getType().equals(AiDialoguesTypeEnum.CAR_INSURANCE.getType())) {
String appid = fmxParamConfigService.getParam("car_insurance_appid");
String relationId = appBuilderService.conversation(appid);
if (StringUtils.isBlank(relationId)) {
throw new BusinessException("创建对话失败");
}
String dialoguesId = bizAiDialoguesService.create(type.getType(), fileUrl, userId);
BizAiDialogues3rdRelationEntity bizAiDialogues3rdRelationEntity = new BizAiDialogues3rdRelationEntity();
bizAiDialogues3rdRelationEntity.setDialoguesId(dialoguesId);
bizAiDialogues3rdRelationEntity.setPlatform(DialoguesPlatformEnum.AppBuilder.getPlatform());
bizAiDialogues3rdRelationEntity.setRelationId(relationId);
bizAiDialogues3rdRelationService.save(bizAiDialogues3rdRelationEntity);
BizAppbuilderConversationModel bizAppbuilderConversationModel = new BizAppbuilderConversationModel();
bizAppbuilderConversationModel.setAppId(appid);
bizAppbuilderConversationModel.setConversationId(relationId);
bizAppbuilderConversationService.save(bizAppbuilderConversationModel);
return dialoguesId;
}
return bizAiDialoguesService.create(type.getType(), fileUrl, userId);
}
......@@ -234,17 +278,20 @@ public class AiDialoguesServiceImpl implements AiDialoguesService {
}
}
@Resource
private AgentApplicationExposeService agentApplicationExposeService;
@Override
public List<String> guessYouAsk(String type) throws Exception {
public List<String> guessYouAsk(String type) {
//
String redisKey = "AGENT_APPLICATION_RECOMMEND_QUESTIONS:" + XLangConstant.ZH_CN;
long size = redisService.lGetListSize(redisKey);
if (size < 8) {
redisService.del(redisKey);
return Collections.emptyList();
if (!redisService.hasKey(redisKey) || redisService.lGetListSize(redisKey) < 8) {
agentApplicationExposeService.createRecommendQuestion();
}
long size = redisService.lGetListSize(redisKey);
List<Object> lastRecomendIdSet = null;
Set<Long> indexSet = new HashSet<>(8);
SecureRandom secureRandom = new SecureRandom();
......@@ -265,4 +312,100 @@ public class AiDialoguesServiceImpl implements AiDialoguesService {
return result;
}
@Override
public String call(String dialoguesId, String input, Long userId, AiDialoguesOptions options) throws Exception {
Assert.notBlank(dialoguesId);
Assert.notBlank(input);
BizAiDialoguesEntity bizAiDialoguesEntity = new BizAiDialoguesEntity();
bizAiDialoguesEntity.setDialoguesId(dialoguesId);
bizAiDialoguesEntity.setMemberId(userId);
bizAiDialoguesEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAiDialoguesEntity> bizAiDialoguesEntities = bizAiDialoguesService.findByExample(bizAiDialoguesEntity, null);
if (CollectionUtils.isEmpty(bizAiDialoguesEntities)) {
throw new BusinessException("对话ID不存在");
}
BizAiDialoguesEntity aiDialoguesEntity = bizAiDialoguesEntities.get(0);
//更新标题
if (org.apache.commons.lang3.StringUtils.isBlank(aiDialoguesEntity.getTitle())) { // 标题
aiDialoguesEntity.setTitle(input.substring(0, Math.min(input.length(), 150)));
aiDialoguesEntity = bizAiDialoguesService.update(aiDialoguesEntity);
}
String dialoguesType = aiDialoguesEntity.getDialoguesType();
SSEUtil sseUtil = new SSEUtil();
ToolFunction toolFunction = new ToolFunction();
StringBuilder contentBuilder = new StringBuilder();
StringBuilder reasoningContentBuilder = new StringBuilder();
long inputTimeStamp = System.currentTimeMillis();
try {
if (dialoguesType.equals(AiDialoguesTypeEnum.CAR_INSURANCE.getType())) {//AppBuilder
BizAiDialogues3rdRelationEntity bizAiDialogues3rdRelationEntity = new BizAiDialogues3rdRelationEntity();
bizAiDialogues3rdRelationEntity.setDialoguesId(dialoguesId);
bizAiDialogues3rdRelationEntity.setPlatform(DialoguesPlatformEnum.AppBuilder.getPlatform());
bizAiDialogues3rdRelationEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAiDialogues3rdRelationEntity> relationEntities = bizAiDialogues3rdRelationService.findByExample(bizAiDialogues3rdRelationEntity, null);
if (CollectionUtils.isEmpty(relationEntities)) {
throw new BusinessException("获取会话配置异常");
}
AppBuilderClientIterator iterator = appBuilderService.communication(relationEntities.get(0).getRelationId(), input, null, true);
while (iterator.hasNext()) {
AppBuilderClientResult res = iterator.next();
LargeModelDemandResult largeModelDemandResult = new LargeModelDemandResult();
largeModelDemandResult.setCode("0");
if (ArrayUtils.isNotEmpty(res.getEvents())) {
Event event = res.getEvents()[0];
String eventType = event.getEventType();
if ("chatflow".equals(eventType)) {
Map<String, Object> detail = event.getDetail();
if (detail.containsKey("message")) {
String mess = detail.get("message").toString();
largeModelDemandResult.setMessage(mess);
contentBuilder.append(mess);
}
}
} else if (StringUtils.isNotEmpty(res.getAnswer())) {
largeModelDemandResult.setMessage(res.getAnswer());
contentBuilder.append(res.getAnswer());
}
sseUtil.send(JsonUtils.serialize(largeModelDemandResult));
}
}
} catch (Exception e) {
logger.error(e.getMessage());
sseUtil.completeByError(e.getMessage());
} finally {
sseUtil.send("[DONE]");
sseUtil.complete();
//保存对话记录
//用户输入记录
BizAgentApplicationDialoguesRecordEntity inputRecord = new BizAgentApplicationDialoguesRecordEntity();
inputRecord.setAgentId(null);
inputRecord.setMemberId(userId);
inputRecord.setContent(input);
inputRecord.setDialogsId(dialoguesId);
inputRecord.setRole(AgentApplicationDialoguesRecordConstants.ROLE.USER);
inputRecord.setTimestamp(inputTimeStamp);
bizAgentApplicationDialoguesRecordService.save(inputRecord);
//AI输出记录
BizAgentApplicationDialoguesRecordEntity outputRecord = new BizAgentApplicationDialoguesRecordEntity();
outputRecord.setRole(AgentApplicationDialoguesRecordConstants.ROLE.ASSISTANT);
outputRecord.setAgentId(null);
outputRecord.setDialogsId(dialoguesId);
outputRecord.setMemberId(userId);
if (toolFunction != null) {
outputRecord.setFunction(JsonUtils.serialize(toolFunction));
}
outputRecord.setTimestamp(System.currentTimeMillis());
outputRecord.setContent(contentBuilder.toString());
outputRecord.setReasoningContent(reasoningContentBuilder.toString());
bizAgentApplicationDialoguesRecordService.save(outputRecord);
}
return contentBuilder.toString();
}
}
......@@ -30,6 +30,8 @@ public enum AiDialoguesTypeEnum {
LEGISLATIVE_DOCUMENT_WRITING("legislative_document_writing","立案调查"),
CAR_INSURANCE("car_insurance","车辆保险"),
;
private final String type;
......
package cn.com.poc.ai_dialogues.constant;
/**
* @author alex.yao
* @date 2025/9/10
*/
public enum DialoguesPlatformEnum {
AppBuilder("appbuilder"),
ModelLink("modelLink"),
Dify("dify"),
Custom("custom"),
;
private String platform;
DialoguesPlatformEnum(String platform) {
this.platform = platform;
}
public String getPlatform() {
return platform;
}
}
package cn.com.poc.ai_dialogues.convert;
import cn.com.poc.ai_dialogues.model.BizAiDialogues3rdRelationModel;
import cn.com.poc.ai_dialogues.entity.BizAiDialogues3rdRelationEntity;
import cn.com.poc.ai_dialogues.dto.BizAiDialogues3rdRelationDto;
public class BizAiDialogues3rdRelationConvert {
public static BizAiDialogues3rdRelationEntity modelToEntity(BizAiDialogues3rdRelationModel model){
BizAiDialogues3rdRelationEntity entity = new BizAiDialogues3rdRelationEntity();
entity.setId(model.getId());
entity.setDialoguesId(model.getDialoguesId());
entity.setPlatform(model.getPlatform());
entity.setRelationId(model.getRelationId());
entity.setIsDeleted(model.getIsDeleted());
entity.setCreator(model.getCreator());
entity.setCreatedTime(model.getCreatedTime());
entity.setModifier(model.getModifier());
entity.setModifiedTime(model.getModifiedTime());
entity.setSysVersion(model.getSysVersion());
return entity;
}
public static BizAiDialogues3rdRelationModel entityToModel(BizAiDialogues3rdRelationEntity entity){
BizAiDialogues3rdRelationModel model = new BizAiDialogues3rdRelationModel();
model.setId(entity.getId());
model.setDialoguesId(entity.getDialoguesId());
model.setPlatform(entity.getPlatform());
model.setRelationId(entity.getRelationId());
model.setIsDeleted(entity.getIsDeleted());
model.setCreator(entity.getCreator());
model.setCreatedTime(entity.getCreatedTime());
model.setModifier(entity.getModifier());
model.setModifiedTime(entity.getModifiedTime());
model.setSysVersion(entity.getSysVersion());
return model;
}
public static BizAiDialogues3rdRelationDto entityToDto(BizAiDialogues3rdRelationEntity entity){
BizAiDialogues3rdRelationDto dto = new BizAiDialogues3rdRelationDto();
dto.setId(entity.getId());
dto.setDialoguesId(entity.getDialoguesId());
dto.setPlatform(entity.getPlatform());
dto.setRelationId(entity.getRelationId());
dto.setIsDeleted(entity.getIsDeleted());
dto.setCreator(entity.getCreator());
dto.setCreatedTime(entity.getCreatedTime());
dto.setModifier(entity.getModifier());
dto.setModifiedTime(entity.getModifiedTime());
dto.setSysVersion(entity.getSysVersion());
return dto;
}
public static BizAiDialogues3rdRelationEntity dtoToEntity(BizAiDialogues3rdRelationDto dto){
BizAiDialogues3rdRelationEntity entity = new BizAiDialogues3rdRelationEntity();
entity.setId(dto.getId());
entity.setDialoguesId(dto.getDialoguesId());
entity.setPlatform(dto.getPlatform());
entity.setRelationId(dto.getRelationId());
entity.setIsDeleted(dto.getIsDeleted());
entity.setCreator(dto.getCreator());
entity.setCreatedTime(dto.getCreatedTime());
entity.setModifier(dto.getModifier());
entity.setModifiedTime(dto.getModifiedTime());
entity.setSysVersion(dto.getSysVersion());
return entity;
}
}
\ No newline at end of file
package cn.com.poc.ai_dialogues.dto;
import cn.com.poc.ai_dialogues.entity.AiDialoguesOptions;
/**
* @author alex.yao
* @date 2025/9/10
*/
public class AiDialoguesCallDto {
private String dialoguesId;
private String input;
private AiDialoguesOptions options;
public String getDialoguesId() {
return dialoguesId;
}
public void setDialoguesId(String dialoguesId) {
this.dialoguesId = dialoguesId;
}
public String getInput() {
return input;
}
public void setInput(String input) {
this.input = input;
}
public AiDialoguesOptions getOptions() {
return options;
}
public void setOptions(AiDialoguesOptions options) {
this.options = options;
}
}
package cn.com.poc.ai_dialogues.dto;
public class BizAiDialogues3rdRelationDto {
private static final long serialVersionUID = 1L;
/** id
*主键
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** dialogues_id
*会话id
*/
private java.lang.String dialoguesId;
public java.lang.String getDialoguesId(){
return this.dialoguesId;
}
public void setDialoguesId(java.lang.String dialoguesId){
this.dialoguesId = dialoguesId;
}
/** platform
*关联平台
*/
private java.lang.String platform;
public java.lang.String getPlatform(){
return this.platform;
}
public void setPlatform(java.lang.String platform){
this.platform = platform;
}
/** relation_id
*关联平台 对话id
*/
private java.lang.String relationId;
public java.lang.String getRelationId(){
return this.relationId;
}
public void setRelationId(java.lang.String relationId){
this.relationId = relationId;
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.ai_dialogues.entity;
import cn.com.poc.agent_application.entity.KnowledgeSuperclassProblemConfig;
import cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Tool;
import cn.com.poc.thirdparty.resource.demand.ai.entity.function.FunctionCallResult;
import java.util.List;
/**
* @author alex.yao
* @date 2025/9/9
*/
public class AiDialoguesOptions {
Integer[] knowledgeIds;
Integer[] databaseIds;
Integer communicationTurn;
Float topP;
Float temperature;
List<Tool> tools;
FunctionCallResult functionCallResult;
boolean stream;
Double score;
Integer topK;
KnowledgeSearchTypeEnum knowledgeSearchType;
KnowledgeSuperclassProblemConfig superclassProblemConfig;
public Integer[] getKnowledgeIds() {
return knowledgeIds;
}
public void setKnowledgeIds(Integer[] knowledgeIds) {
this.knowledgeIds = knowledgeIds;
}
public Integer[] getDatabaseIds() {
return databaseIds;
}
public void setDatabaseIds(Integer[] databaseIds) {
this.databaseIds = databaseIds;
}
public Integer getCommunicationTurn() {
return communicationTurn;
}
public void setCommunicationTurn(Integer communicationTurn) {
this.communicationTurn = communicationTurn;
}
public Float getTopP() {
return topP;
}
public void setTopP(Float topP) {
this.topP = topP;
}
public Float getTemperature() {
return temperature;
}
public void setTemperature(Float temperature) {
this.temperature = temperature;
}
public List<Tool> getTools() {
return tools;
}
public void setTools(List<Tool> tools) {
this.tools = tools;
}
public FunctionCallResult getFunctionCallResult() {
return functionCallResult;
}
public void setFunctionCallResult(FunctionCallResult functionCallResult) {
this.functionCallResult = functionCallResult;
}
public boolean isStream() {
return stream;
}
public void setStream(boolean stream) {
this.stream = stream;
}
public Double getScore() {
return score;
}
public void setScore(Double score) {
this.score = score;
}
public Integer getTopK() {
return topK;
}
public void setTopK(Integer topK) {
this.topK = topK;
}
public KnowledgeSearchTypeEnum getKnowledgeSearchType() {
return knowledgeSearchType;
}
public void setKnowledgeSearchType(KnowledgeSearchTypeEnum knowledgeSearchType) {
this.knowledgeSearchType = knowledgeSearchType;
}
public KnowledgeSuperclassProblemConfig getSuperclassProblemConfig() {
return superclassProblemConfig;
}
public void setSuperclassProblemConfig(KnowledgeSuperclassProblemConfig superclassProblemConfig) {
this.superclassProblemConfig = superclassProblemConfig;
}
}
package cn.com.poc.ai_dialogues.entity;
public class BizAiDialogues3rdRelationEntity {
private static final long serialVersionUID = 1L;
/** id
*主键
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** dialogues_id
*会话id
*/
private java.lang.String dialoguesId;
public java.lang.String getDialoguesId(){
return this.dialoguesId;
}
public void setDialoguesId(java.lang.String dialoguesId){
this.dialoguesId = dialoguesId;
}
/** platform
*关联平台
*/
private java.lang.String platform;
public java.lang.String getPlatform(){
return this.platform;
}
public void setPlatform(java.lang.String platform){
this.platform = platform;
}
/** relation_id
*关联平台 对话id
*/
private java.lang.String relationId;
public java.lang.String getRelationId(){
return this.relationId;
}
public void setRelationId(java.lang.String relationId){
this.relationId = relationId;
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.ai_dialogues.model;
import java.io.Serializable;
import cn.com.yict.framemax.data.model.BaseModelClass;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Version;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
/**
* Model class for biz_ai_dialogues_3rd_relation
* AI对话-第三方关联
*/
@Entity
@Table(name = "biz_ai_dialogues_3rd_relation")
@DynamicInsert
@DynamicUpdate
public class BizAiDialogues3rdRelationModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*主键
*/
private java.lang.Long id;
@Column(name = "id",length = 19)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
super.addValidField("id");
}
/** dialogues_id
*会话id
*/
private java.lang.String dialoguesId;
@Column(name = "dialogues_id",length = 120)
public java.lang.String getDialoguesId(){
return this.dialoguesId;
}
public void setDialoguesId(java.lang.String dialoguesId){
this.dialoguesId = dialoguesId;
super.addValidField("dialoguesId");
}
/** platform
*关联平台
*/
private java.lang.String platform;
@Column(name = "platform",length = 100)
public java.lang.String getPlatform(){
return this.platform;
}
public void setPlatform(java.lang.String platform){
this.platform = platform;
super.addValidField("platform");
}
/** relation_id
*关联平台 对话id
*/
private java.lang.String relationId;
@Column(name = "relation_id",length = 150)
public java.lang.String getRelationId(){
return this.relationId;
}
public void setRelationId(java.lang.String relationId){
this.relationId = relationId;
super.addValidField("relationId");
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
@Column(name = "is_deleted",length = 1)
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
super.addValidField("isDeleted");
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
@Column(name = "CREATOR",length = 225)
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
super.addValidField("creator");
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME",length = 19)
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
@Column(name = "MODIFIER",length = 225)
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
super.addValidField("modifier");
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME",length = 19)
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
@Column(name = "SYS_VERSION",length = 10)
@Version
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
package cn.com.poc.ai_dialogues.repository;
import cn.com.yict.framemax.data.repository.Repository;
import cn.com.poc.ai_dialogues.model.BizAiDialogues3rdRelationModel;
public interface BizAiDialogues3rdRelationRepository extends Repository<BizAiDialogues3rdRelationModel,java.lang.Long> {
}
\ No newline at end of file
package cn.com.poc.ai_dialogues.rest;
import cn.com.poc.ai_dialogues.dto.AiDialoguesCallDto;
import cn.com.poc.ai_dialogues.dto.AiDialoguesRecordDto;
import cn.com.poc.ai_dialogues.dto.BatchDelAiDialoguesDto;
import cn.com.poc.expose.dto.DialoguesContextDto;
......@@ -67,4 +68,10 @@ public interface AiDialoguesRest extends BaseRest {
*/
List<String> guessYouAsk(@RequestParam(required = false) String type) throws Exception;
/**
* AI对话
*
* @param aiDialoguesCallDto
*/
void call(@RequestBody AiDialoguesCallDto aiDialoguesCallDto) throws Exception;
}
......@@ -2,6 +2,7 @@ package cn.com.poc.ai_dialogues.rest.impl;
import cn.com.poc.ai_dialogues.aggregate.AiDialoguesService;
import cn.com.poc.ai_dialogues.constant.AiDialoguesTypeEnum;
import cn.com.poc.ai_dialogues.dto.AiDialoguesCallDto;
import cn.com.poc.ai_dialogues.dto.AiDialoguesRecordDto;
import cn.com.poc.ai_dialogues.dto.BatchDelAiDialoguesDto;
import cn.com.poc.ai_dialogues.rest.AiDialoguesRest;
......@@ -52,7 +53,7 @@ public class AiDialoguesRestImpl implements AiDialoguesRest {
List<AiDialoguesTypeEnum> typeEnumList = new ArrayList<>();
for (String type : typeList) {
typeEnumList.add( AiDialoguesTypeEnum.getByType(type));
typeEnumList.add(AiDialoguesTypeEnum.getByType(type));
}
return aiDialoguesService.getList(typeEnumList, userBaseEntity.getUserId());
......@@ -93,4 +94,13 @@ public class AiDialoguesRestImpl implements AiDialoguesRest {
public List<String> guessYouAsk(String type) throws Exception {
return aiDialoguesService.guessYouAsk(type);
}
@Override
public void call(AiDialoguesCallDto aiDialoguesCallDto) throws Exception {
Assert.notNull(aiDialoguesCallDto);
Assert.notBlank(aiDialoguesCallDto.getDialoguesId());
Assert.notBlank(aiDialoguesCallDto.getInput());
UserBaseEntity currentUser = BlContext.getCurrentUser();
aiDialoguesService.call(aiDialoguesCallDto.getDialoguesId(), aiDialoguesCallDto.getInput(), currentUser.getUserId(), aiDialoguesCallDto.getOptions());
}
}
\ No newline at end of file
package cn.com.poc.ai_dialogues.service;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.poc.ai_dialogues.entity.BizAiDialogues3rdRelationEntity;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.List;
public interface BizAiDialogues3rdRelationService extends BaseService {
BizAiDialogues3rdRelationEntity get(java.lang.Long id) throws Exception;
List<BizAiDialogues3rdRelationEntity> findByExample(BizAiDialogues3rdRelationEntity example,PagingInfo pagingInfo) throws Exception;
BizAiDialogues3rdRelationEntity save(BizAiDialogues3rdRelationEntity entity) throws Exception;
BizAiDialogues3rdRelationEntity update(BizAiDialogues3rdRelationEntity entity) throws Exception;
void deletedById(java.lang.Long id) throws Exception;
}
\ No newline at end of file
package cn.com.poc.ai_dialogues.service.impl;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.poc.ai_dialogues.service.BizAiDialogues3rdRelationService;
import cn.com.poc.ai_dialogues.model.BizAiDialogues3rdRelationModel;
import cn.com.poc.ai_dialogues.entity.BizAiDialogues3rdRelationEntity;
import cn.com.poc.ai_dialogues.convert.BizAiDialogues3rdRelationConvert;
import cn.com.poc.ai_dialogues.repository.BizAiDialogues3rdRelationRepository;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.util.Assert;
@Service
public class BizAiDialogues3rdRelationServiceImpl extends BaseServiceImpl
implements BizAiDialogues3rdRelationService {
@Resource
private BizAiDialogues3rdRelationRepository repository;
public BizAiDialogues3rdRelationEntity get(java.lang.Long id) throws Exception{
Assert.notNull(id);
BizAiDialogues3rdRelationModel model = this.repository.get(id);
if (model == null){
return null;
}
if ("Y".equals(model.getIsDeleted())){
return null;
}
return BizAiDialogues3rdRelationConvert.modelToEntity(model);
}
public List<BizAiDialogues3rdRelationEntity> findByExample(BizAiDialogues3rdRelationEntity example,PagingInfo pagingInfo) throws Exception{
List<BizAiDialogues3rdRelationEntity> result = new ArrayList<BizAiDialogues3rdRelationEntity>();
BizAiDialogues3rdRelationModel model = new BizAiDialogues3rdRelationModel();
if (example != null){
model = BizAiDialogues3rdRelationConvert.entityToModel(example);
}
model.setIsDeleted("N");
List<BizAiDialogues3rdRelationModel> models = this.repository.findByExample(model,pagingInfo);
if (CollectionUtils.isNotEmpty(models)) {
result = models.stream().map(BizAiDialogues3rdRelationConvert::modelToEntity).collect(Collectors.toList());
}
return result;
}
public BizAiDialogues3rdRelationEntity save(BizAiDialogues3rdRelationEntity entity) throws Exception{
Assert.notNull(entity);
entity.setId(null);
entity.setIsDeleted("N");
BizAiDialogues3rdRelationModel model = BizAiDialogues3rdRelationConvert.entityToModel(entity);
BizAiDialogues3rdRelationModel saveModel = this.repository.save(model);
return BizAiDialogues3rdRelationConvert.modelToEntity(saveModel);
}
public BizAiDialogues3rdRelationEntity update(BizAiDialogues3rdRelationEntity entity) throws Exception{
Assert.notNull(entity);
Assert.notNull(entity.getId(),"update pk can not be null");
BizAiDialogues3rdRelationModel model = this.repository.get(entity.getId());
if (entity.getDialoguesId() != null){
model.setDialoguesId(entity.getDialoguesId());
}
if (entity.getPlatform() != null){
model.setPlatform(entity.getPlatform());
}
if (entity.getRelationId() != null){
model.setRelationId(entity.getRelationId());
}
if (entity.getIsDeleted() != null){
model.setIsDeleted(entity.getIsDeleted());
}
if (entity.getCreator() != null){
model.setCreator(entity.getCreator());
}
if (entity.getCreatedTime() != null){
model.setCreatedTime(entity.getCreatedTime());
}
if (entity.getModifier() != null){
model.setModifier(entity.getModifier());
}
if (entity.getModifiedTime() != null){
model.setModifiedTime(entity.getModifiedTime());
}
if (entity.getSysVersion() != null){
model.setSysVersion(entity.getSysVersion());
}
BizAiDialogues3rdRelationModel saveModel = this.repository.save(model);
return BizAiDialogues3rdRelationConvert.modelToEntity(saveModel);
}
public void deletedById(java.lang.Long id) throws Exception{
Assert.notNull(id);
BizAiDialogues3rdRelationModel model = this.repository.get(id);
if (model != null){
if ("N".equals(model.getIsDeleted())){
model.setIsDeleted("Y");
this.repository.save(model);
}
}
}
}
\ No newline at end of file
package cn.com.poc.appbuilder.aggregation;
import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientIterator;
import org.springframework.retry.annotation.Retryable;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface AppBuilderService {
/**
* 新建对话-【有效期7天】
*
* @param appId 应用的ID - app_id
* @return 返回新建对话的ID - conversation_id
*/
@Retryable(maxAttempts = 2)
String conversation(String appId);
/**
* 文件上传
*
* @param appId 应用的ID - app_id
* @param conversationId 对话的ID - conversation_id
* @param file 文件
* @return 返回文件ID - file_id
*/
@Retryable(maxAttempts = 2)
String upload(String appId, String conversationId, MultipartFile file);
/**
* 获取用户对话列表-【未过期】
*
* @return 返回用户对话列表 - conversation_id
*/
List<String> getCurrentUserConversationIds();
/**
* 大模型对话
*
* @param conversationId 对话的ID - conversation_id
* @param query 查询语句
* @param fileIds 文件ID列表 - file_id
* @param stream true: 流式返回,false: 一次性返回
*/
AppBuilderClientIterator communication(String conversationId, String query, List<String> fileIds, Boolean stream) throws Exception;
}
package cn.com.poc.appbuilder.aggregation.impl;
import cn.com.poc.appbuilder.aggregation.AppBuilderService;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationModel;
import cn.com.poc.appbuilder.service.BizAppbuilderConversationService;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.service.RedisService;
import cn.com.poc.common.utils.BlContext;
import cn.com.poc.support.security.oauth.entity.UserBaseEntity;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.frame.service.FmxParamConfigService;
import cn.hutool.core.io.FileUtil;
import com.baidubce.appbuilder.console.appbuilderclient.AppBuilderClient;
import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientIterator;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import java.io.File;
import java.io.FileOutputStream;
import java.util.*;
@Service
public class AppBuilderServiceImpl implements AppBuilderService {
@Resource
private FmxParamConfigService fmxParamConfigService;
@Resource
private RedisService redisService;
@Resource
private BizAppbuilderConversationService bizAppbuilderConversationService;
private final String APPBUILDER_CONVERSATION_PREFIX = "APPBUILDER_CONVERSATION_";
@Override
public String conversation(String appId) {
AppBuilderClient builder = getClient(appId);
String conversationId = null;
UserBaseEntity currentMember = null;
try {
// 获取用户信息
currentMember = BlContext.getCurrentUserNotException();
conversationId = builder.createConversation();
// 新建对话
} catch (Exception e) {
throw new BusinessException(e.getLocalizedMessage());
}
return conversationId;
}
@Override
public String upload(String appId, String conversationId, MultipartFile file) {
// UserBaseEntity currentMember = null;
try {
// currentMember = BlContext.getCurrentUserNotException();
// Integer memberId = Math.toIntExact(currentMember.getUserId());
String key = APPBUILDER_CONVERSATION_PREFIX + ":" + conversationId;
//判断会话有没有过期
Map<Object, Object> hmget = redisService.hmget(key);
if (hmget == null) {
throw new BusinessException("会话已过期");
}
//获取fileId
AppBuilderClient builder = getClient(appId);
// 上传临时文件
// 获取文件名
UUID uuid = UUID.randomUUID();
File tempFile = null;
String suffix = "." + FileUtil.getSuffix(file.getOriginalFilename()).toString();
//创建临时文件
tempFile = File.createTempFile(uuid.toString(), suffix);
FileOutputStream fos = new FileOutputStream(tempFile);
try {
// 写入数据到临时文件
byte[] bytes = file.getBytes();
fos.write(bytes);
} catch (Exception e) {
throw new BusinessException("写入临时文件失败");
} finally {
//关闭临时文件
fos.flush();
fos.close();
}
String fileId = null;
fileId = builder.uploadLocalFile(conversationId, tempFile.getAbsolutePath());
//删除临时文件
tempFile.delete();
//更新redis,把fileId存入redis中
Map<String, Object> map = new HashMap<>();
map.put("app_id", appId);
map.put("file_id", fileId);
redisService.hmset(key, map, redisService.getExpire(key));
return fileId;
} catch (Exception e) {
throw new BusinessException("抛出异常");
}
}
@Override
public List<String> getCurrentUserConversationIds() {
UserBaseEntity currentMember = null;
try {
currentMember = BlContext.getCurrentUserNotException();
} catch (Exception e) {
throw new BusinessException("获取用户信息失败");
}
Integer memberId = Math.toIntExact(currentMember.getUserId());
String key = APPBUILDER_CONVERSATION_PREFIX + memberId;
//模糊查询获取键的集合
Map<String, Map<String, Object>> hmDimMultiGet = redisService.hmDimMultiGet(key);
List<String> conversationIds = new ArrayList<>();
for (String outerKey : hmDimMultiGet.keySet()) {
// Split the outerKey using ":" as delimiter
String[] parts = outerKey.split(":");
if (parts.length == 2) {
// parts[0] will be "APPBUILDER_CONVERSATION_memberId"
// parts[1] will be the actual conversation_id
String conversationId = parts[1];
conversationIds.add(conversationId);
}
}
return conversationIds;
}
@Override
public AppBuilderClientIterator communication(String conversationId, String query, List<String> fileIds, Boolean stream) throws Exception {
BizAppbuilderConversationModel model = new BizAppbuilderConversationModel();
model.setConversationId(conversationId);
model.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizAppbuilderConversationModel> models = bizAppbuilderConversationService.findByExample(model, null);
if(CollectionUtils.isEmpty(fileIds)){
fileIds = new ArrayList<String>();
}
return getClient(models.get(0).getAppId()).run(query, conversationId, fileIds.toArray(new String[fileIds.size()]), stream);
}
private AppBuilderClient getClient(String appId) {
String token = fmxParamConfigService.getParam("baidu.appbuilder.token");
return new AppBuilderClient(appId, token);
}
}
package cn.com.poc.appbuilder.api;
import cn.com.poc.appbuilder.api.base.AppBuilderBaseApi;
import cn.com.poc.appbuilder.api.entity.AppBuilderDescribeListRequest;
import cn.com.poc.appbuilder.api.entity.AppBuilderDescribeRequest;
import cn.com.poc.appbuilder.api.entity.BaiduAppBuilderDescribeAppListResult;
import cn.com.poc.common.utils.http.LocalHttpClient;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.frame.service.FmxParamConfigService;
import com.alibaba.fastjson.JSON;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.StringEntity;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.nio.charset.StandardCharsets;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 11:57
*/
@Component
public class BaiduAppBuilderApi implements AppBuilderBaseApi {
@Resource
private FmxParamConfigService paramConfigService;
/**
* 查询用户应用详情
*/
public String getDescribeApp(AppBuilderDescribeRequest appBuilderDescribeRequest) {
String token = paramConfigService.getParam(TOKEN_SITE);
HttpUriRequest httpUriRequest = RequestBuilder.post()
.setUri(AppBuilderBaseApi.APP_DESCRIBE_URL)
.addHeader(AppBuilderBaseApi.jsonHeader)
.addHeader(HEADER_AUTHORIZATION, "Bearer "+token)
.setEntity(new StringEntity(JSON.toJSONString(appBuilderDescribeRequest), StandardCharsets.UTF_8))
.build();
return LocalHttpClient.executeJsonResult(httpUriRequest, String.class);
// if (result == null) {
// throw new BusinessException("获取用户应用详情失败");
// }
// if (result.getCode() != null) {
// throw new BusinessException("获取用户应用详情异常:" + result.getCode() + ":" + result.getMessage());
// }
// return result;
}
/**
* 查询用户应用列表
*/
public BaiduAppBuilderDescribeAppListResult getDescribeAppList(AppBuilderDescribeListRequest appBuilderDescribeListRequest) {
String token = paramConfigService.getParam(TOKEN_SITE);
HttpUriRequest httpUriRequest = RequestBuilder.post()
.setHeader(AppBuilderBaseApi.jsonHeader)
.setUri(AppBuilderBaseApi.APP_DESCRIBE_LIST_URL)
.setHeader(HEADER_AUTHORIZATION, "Bearer "+token)
.setEntity(new StringEntity(JSON.toJSONString(appBuilderDescribeListRequest), StandardCharsets.UTF_8))
.build();
BaiduAppBuilderDescribeAppListResult result = LocalHttpClient.executeJsonResult(httpUriRequest, BaiduAppBuilderDescribeAppListResult.class);
if (result == null) {
throw new BusinessException("获取用户应用列表失败");
}
if (result.getCode() != null) {
throw new BusinessException("获取用户应用详情异常:" + result.getCode() + ":" + result.getMessage());
}
return result;
}
}
package cn.com.poc.appbuilder.api.base;
import org.apache.http.Header;
import org.apache.http.HttpHeaders;
import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicHeader;
public interface AppBuilderBaseApi {
/**
* 查询用户应用详情
*/
String APP_DESCRIBE_URL = "https://qianfan.baidubce.com/v2/app?Action=DescribeApp";
/**
* 查询用户应用列表
*/
String APP_DESCRIBE_LIST_URL = "https://qianfan.baidubce.com/v2/app?Action=DescribeApps";
/**
* 请求头令牌
*/
String HEADER_AUTHORIZATION = "Authorization";
/**
* token地址
*/
String TOKEN_SITE = "baidu.appbuilder.token";
Header jsonHeader = new BasicHeader(HttpHeaders.CONTENT_TYPE, ContentType.APPLICATION_JSON.toString());
}
package cn.com.poc.appbuilder.api.entity;
import java.io.Serializable;
/**
* @author Jennie 查询用户下状态为已发布的应用列表请求体
* @create 2022-08-10 11:21
*/
public class AppBuilderDescribeListRequest implements Serializable {
/**
* 起始位置
* **/
private String marker;
/**
* 数据大小,默认10,最大值100
* **/
private Integer maxKeys;
public AppBuilderDescribeListRequest() {
}
public AppBuilderDescribeListRequest(String marker, Integer maxKeys) {
this.marker = marker;
this.maxKeys = maxKeys;
}
public String getMarker() {
return marker;
}
public void setMarker(String marker) {
this.marker = marker;
}
public Integer getMaxKeys() {
return maxKeys;
}
public void setMaxKeys(Integer maxKeys) {
this.maxKeys = maxKeys;
}
}
package cn.com.poc.appbuilder.api.entity;
import java.io.Serializable;
/**
* @author Jennie 查询用户下状态为已发布的应用详情请求体
* @create 2022-08-10 11:21
*/
public class AppBuilderDescribeRequest implements Serializable {
/**
* 应用id
* **/
private String id;
public AppBuilderDescribeRequest() {
}
public AppBuilderDescribeRequest(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
package cn.com.poc.appbuilder.api.entity;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 11:57
*/
public class BaiduAppBuilderCommonErrorResult {
/**
* 错误码
*/
private Integer code;
/**
* 错误描述
*/
private String message;
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
import java.util.List;
/**
* @Author: Jennie
* @Description: 千帆AppBuilder 查询用户应用详情响应实体
* @Date: 2024/8/7 12:00
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class BaiduAppBuilderDescribeAppListResult extends BaiduAppBuilderCommonErrorResult implements Serializable {
/**
* 请求的id
*/
private String requestId;
/**
* 起始位置
*/
private String marker;
/**
* true表示后面还有数据,false表示已经是最后一页
*/
private boolean isTruncated;
/**
* nextMarker下次查询的起始位置
*/
private String nextMarker;
/**
* 本次查询包含的最大结果集数量
*/
private int maxKeys;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public String getMarker() {
return marker;
}
public void setMarker(String marker) {
this.marker = marker;
}
public boolean isTruncated() {
return isTruncated;
}
public void setTruncated(boolean truncated) {
isTruncated = truncated;
}
public String getNextMarker() {
return nextMarker;
}
public void setNextMarker(String nextMarker) {
this.nextMarker = nextMarker;
}
public int getMaxKeys() {
return maxKeys;
}
public void setMaxKeys(int maxKeys) {
this.maxKeys = maxKeys;
}
public List<Object> getData() {
return data;
}
public void setData(List<Object> data) {
this.data = data;
}
/**
* 应用对象列表
*/
private List<Object> data;
}
package cn.com.poc.appbuilder.api.entity;
import java.io.Serializable;
import java.util.List;
/**
* @Author: Jennie
* @Description: 千帆AppBuilder 查询用户应用详情响应实体
* @Date: 2024/8/7 12:00
*/
//@JsonInclude(JsonInclude.Include.NON_NULL)
//@JsonIgnoreProperties(ignoreUnknown = true)
public class BaiduAppBuilderDescribeAppResult extends BaiduAppBuilderCommonErrorResult implements Serializable {
/**
* 请求的id
*/
private String requestId;
/**
* 应用id
*/
private String id;
/**
* 应用名称
*/
private String name;
/**
* 应用描述
*/
private String description;
/**
* 用户指令
*/
private String instruction;
/**
* 开场白
*/
private String prologue;
/**
* 推荐问题
*/
private List<String> exampleQueries;
//
// /**
// * 追问
// */
// private Map<String, FollowUpQuery> followUpQueries;
//
// /**
// * 引用组件列表
// */
// private List<Component> components;
//
// /**
// * 知识库配置
// */
// private KnowledgeBaseConfig knowledgeBaseConfig;
//
// /**
// * 模型配置
// */
// private ModelConfig modelConfig;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getInstruction() {
return instruction;
}
public void setInstruction(String instruction) {
this.instruction = instruction;
}
public String getPrologue() {
return prologue;
}
public void setPrologue(String prologue) {
this.prologue = prologue;
}
public List<String> getExampleQueries() {
return exampleQueries;
}
public void setExampleQueries(List<String> exampleQueries) {
this.exampleQueries = exampleQueries;
}
//
// public Map<String, FollowUpQuery> getFollowUpQueries() {
// return followUpQueries;
// }
//
// public void setFollowUpQueries(Map<String, FollowUpQuery> followUpQueries) {
// this.followUpQueries = followUpQueries;
// }
//
// public List<Component> getComponents() {
// return components;
// }
//
// public void setComponents(List<Component> components) {
// this.components = components;
// }
//
// public KnowledgeBaseConfig getKnowledgeBaseConfig() {
// return knowledgeBaseConfig;
// }
//
// public void setKnowledgeBaseConfig(KnowledgeBaseConfig knowledgeBaseConfig) {
// this.knowledgeBaseConfig = knowledgeBaseConfig;
// }
//
// public ModelConfig getModelConfig() {
// return modelConfig;
// }
//
// public void setModelConfig(ModelConfig modelConfig) {
// this.modelConfig = modelConfig;
// }
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ChatConfig implements Serializable {
/**
* 模型id
*/
private String modelId;
/**
* 模型名称
*/
private String model;
/**
* 历史对话参考轮数
*/
private int historyChatRounds;
/**
* rag模型配置
*/
private RagModelConfig config;
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getHistoryChatRounds() {
return historyChatRounds;
}
public void setHistoryChatRounds(int historyChatRounds) {
this.historyChatRounds = historyChatRounds;
}
public RagModelConfig getConfig() {
return config;
}
public void setConfig(RagModelConfig config) {
this.config = config;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class Component implements Serializable {
/**
* 组件名称
*/
private String name;
/**
* 组件描述
*/
private String description;
/**
* 组件自定义描述
*/
private String customDesc;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getCustomDesc() {
return customDesc;
}
public void setCustomDesc(String customDesc) {
this.customDesc = customDesc;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class FollowUpQuery implements Serializable {
/**
* 追问类型 (default | custom)
*/
private String type;
/**
* 追问问题生成prompt
*/
private String prompt;
/**
* 追问问题生成轮数
*/
private String round;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getPrompt() {
return prompt;
}
public void setPrompt(String prompt) {
this.prompt = prompt;
}
public String getRound() {
return round;
}
public void setRound(String round) {
this.round = round;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class KnowledgeBase implements Serializable {
/**
* 知识库id
*/
private String id;
/**
* 知识库名称
*/
private String name;
/**
* 知识库描述
*/
private String description;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
import java.util.List;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class KnowledgeBaseConfig implements Serializable {
/**
* 知识库列表
*/
private List<KnowledgeBase> knowledgeBases;
/**
* 检索配置
*/
private RetrievalConfig retrieval;
public List<KnowledgeBase> getKnowledgeBases() {
return knowledgeBases;
}
public void setKnowledgeBases(List<KnowledgeBase> knowledgeBases) {
this.knowledgeBases = knowledgeBases;
}
public RetrievalConfig getRetrieval() {
return retrieval;
}
public void setRetrieval(RetrievalConfig retrieval) {
this.retrieval = retrieval;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class ModelConfig implements Serializable {
/**
* 思考模型配置
*/
private PlanConfig plan;
/**
* 模型配置
*/
private ChatConfig chat;
public PlanConfig getPlan() {
return plan;
}
public void setPlan(PlanConfig plan) {
this.plan = plan;
}
public ChatConfig getChat() {
return chat;
}
public void setChat(ChatConfig chat) {
this.chat = chat;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class PlanConfig implements Serializable {
/**
* 模型id
*
*
*/
private String modelId;
/**
* 模型名称
*
*
*/
private String model;
/**
* 最大思考轮数
*
*
*/
private int maxRounds;
/**
* rag模型配置
*
*
*/
private RagModelConfig config;
public String getModelId() {
return modelId;
}
public void setModelId(String modelId) {
this.modelId = modelId;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getMaxRounds() {
return maxRounds;
}
public void setMaxRounds(int maxRounds) {
this.maxRounds = maxRounds;
}
public RagModelConfig getConfig() {
return config;
}
public void setConfig(RagModelConfig config) {
this.config = config;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class RagModelConfig implements Serializable {
private float temperature;
private float topP;
public float getTemperature() {
return temperature;
}
public void setTemperature(float temperature) {
this.temperature = temperature;
}
public float getTopP() {
return topP;
}
public void setTopP(float topP) {
this.topP = topP;
}
}
package cn.com.poc.appbuilder.api.entity;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import java.io.Serializable;
/**
* @Author: Jennie
* @Description:
* @Date: 2024/8/7 12:11
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
public class RetrievalConfig implements Serializable {
/**
* 是否开启百度搜索
*/
private boolean enableWebSearch;
/**
* 排序策略(Combined | RagFirst | WebSearchFirst), enableWebSearch 等于true时生效
*/
private String order;
/**
* 检索策略(Advanced | Fulltext | Semantic)
*/
private String strategy;
/**
* 召回数量
*/
private int topK;
/**
* 阈值
*/
private float threshold;
public boolean isEnableWebSearch() {
return enableWebSearch;
}
public void setEnableWebSearch(boolean enableWebSearch) {
this.enableWebSearch = enableWebSearch;
}
public String getOrder() {
return order;
}
public void setOrder(String order) {
this.order = order;
}
public String getStrategy() {
return strategy;
}
public void setStrategy(String strategy) {
this.strategy = strategy;
}
public int getTopK() {
return topK;
}
public void setTopK(int topK) {
this.topK = topK;
}
public float getThreshold() {
return threshold;
}
public void setThreshold(float threshold) {
this.threshold = threshold;
}
}
package cn.com.poc.appbuilder.dto;
import java.io.Serializable;
import java.util.List;
public class AppBuilderCommunicationDto extends AppBuilderTTSConfigDto implements Serializable {
/**
* 对话ID
*/
private String conversationId;
/**
* 对话内容
*/
private String query;
/**
* 文档ID列表
*/
private List<String> fileIds;
/**
* 为true时则流式返回,为false时则一次性返回所有内容
*/
private Boolean stream;
public String getConversationId() {
return conversationId;
}
public void setConversationId(String conversationId) {
this.conversationId = conversationId;
}
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
public List<String> getFileIds() {
return fileIds;
}
public void setFileIds(List<String> fileIds) {
this.fileIds = fileIds;
}
public Boolean getStream() {
return stream;
}
public void setStream(Boolean stream) {
this.stream = stream;
}
@Override
public String toString() {
return "AppBuilderCommunicationDto{" +
"conversationId='" + conversationId + '\'' +
", query='" + query + '\'' +
", fileIds=" + fileIds +
", stream=" + stream +
'}';
}
}
package cn.com.poc.appbuilder.dto;
public class AppBuilderTTSConfigDto {
private Double speed;//速度
private Integer volume;//音量
private Integer voiceType;
public Double getSpeed() {
return speed;
}
public void setSpeed(Double speed) {
this.speed = speed;
}
public Integer getVolume() {
return volume;
}
public void setVolume(Integer volume) {
this.volume = volume;
}
public Integer getVoiceType() {
return voiceType;
}
public void setVoiceType(Integer voiceType) {
this.voiceType = voiceType;
}
}
package cn.com.poc.appbuilder.model;
import cn.com.yict.framemax.data.model.BaseModelClass;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.io.Serializable;
/**
* Model class for biz_appbuilder_conversation
* appbuilder 对话
*/
@Entity
@Table(name = "biz_appbuilder_conversation")
@DynamicInsert
@DynamicUpdate
public class BizAppbuilderConversationModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*
*/
private Integer id;
@Column(name = "id",length = 10)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId(){
return this.id;
}
public void setId(Integer id){
this.id = id;
super.addValidField("id");
}
/** appId
*
*/
private String appId;
@Column(name = "appId",length = 200)
public String getAppId(){
return this.appId;
}
public void setAppId(String appId){
this.appId = appId;
super.addValidField("appId");
}
/** conversationId
*
*/
private String conversationId;
@Column(name = "conversationId",length = 200)
public String getConversationId(){
return this.conversationId;
}
public void setConversationId(String conversationId){
this.conversationId = conversationId;
super.addValidField("conversationId");
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private String isDeleted;
@Column(name = "is_deleted",length = 1)
public String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(String isDeleted){
this.isDeleted = isDeleted;
super.addValidField("isDeleted");
}
/** CREATOR
*创建人
*/
private String creator;
@Column(name = "CREATOR",length = 225)
public String getCreator(){
return this.creator;
}
public void setCreator(String creator){
this.creator = creator;
super.addValidField("creator");
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME",length = 19)
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/** MODIFIER
*修改人
*/
private String modifier;
@Column(name = "MODIFIER",length = 225)
public String getModifier(){
return this.modifier;
}
public void setModifier(String modifier){
this.modifier = modifier;
super.addValidField("modifier");
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME",length = 19)
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/** SYS_VERSION
*乐观锁,版本号
*/
private Integer sysVersion;
@Column(name = "SYS_VERSION",length = 10)
@Version
public Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(Integer sysVersion){
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
package cn.com.poc.appbuilder.model;
import cn.com.yict.framemax.data.model.BaseModelClass;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.*;
import java.io.Serializable;
/**
* Model class for biz_appbuilder_conversation_record
*
*/
@Entity
@Table(name = "biz_appbuilder_conversation_record")
@DynamicInsert
@DynamicUpdate
public class BizAppbuilderConversationRecordModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*
*/
private Integer id;
@Column(name = "id",length = 10)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public Integer getId(){
return this.id;
}
public void setId(Integer id){
this.id = id;
super.addValidField("id");
}
/** conversationId
*
*/
private String conversationId;
@Column(name = "conversationId",length = 200)
public String getConversationId(){
return this.conversationId;
}
public void setConversationId(String conversationId){
this.conversationId = conversationId;
super.addValidField("conversationId");
}
/** response
*
*/
private String response;
@Column(name = "response",length = 1073741824)
public String getResponse(){
return this.response;
}
public void setResponse(String response){
this.response = response;
super.addValidField("response");
}
/** result
*
*/
private String result;
@Column(name = "result",length = 2147483647)
public String getResult(){
return this.result;
}
public void setResult(String result){
this.result = result;
super.addValidField("result");
}
/** CREATOR
*创建人
*/
private String creator;
@Column(name = "CREATOR",length = 225)
public String getCreator(){
return this.creator;
}
public void setCreator(String creator){
this.creator = creator;
super.addValidField("creator");
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME",length = 19)
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/** MODIFIER
*修改人
*/
private String modifier;
@Column(name = "MODIFIER",length = 225)
public String getModifier(){
return this.modifier;
}
public void setModifier(String modifier){
this.modifier = modifier;
super.addValidField("modifier");
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME",length = 19)
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/** SYS_VERSION
*乐观锁,版本号
*/
private Integer sysVersion;
@Column(name = "SYS_VERSION",length = 10)
@Version
public Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(Integer sysVersion){
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
package cn.com.poc.appbuilder.model;
import cn.com.yict.framemax.data.model.BaseModelClass;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.io.Serializable;
/**
* Model class for biz_appbuilder_info
* 应用匹配
*/
@Entity
@Table(name = "biz_appbuilder_info")
@DynamicInsert
@DynamicUpdate
public class BizAppbuilderInfoModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** appId
*
*/
private Integer appId;
@Column(name = "appId",length = 20)
@Id
public Integer getAppId(){
return this.appId;
}
public void setAppId(Integer appId){
this.appId = appId;
super.addValidField("appId");
}
/** id
*
*/
private String id;
@Column(name = "id",length = 100)
public String getId(){
return this.id;
}
public void setId(String id){
this.id = id;
super.addValidField("id");
}
/** requestId
*
*/
private String requestId;
@Column(name = "requestId",length = 100)
public String getRequestId(){
return this.requestId;
}
public void setRequestId(String requestId){
this.requestId = requestId;
super.addValidField("requestId");
}
/** name
*
*/
private String name;
@Column(name = "name",length = 100)
public String getName(){
return this.name;
}
public void setName(String name){
this.name = name;
super.addValidField("name");
}
/** description
*
*/
private String description;
@Column(name = "description",length = 2147483647)
public String getDescription(){
return this.description;
}
public void setDescription(String description){
this.description = description;
super.addValidField("description");
}
/** instruction
*
*/
private String instruction;
@Column(name = "instruction",length = 2147483647)
public String getInstruction(){
return this.instruction;
}
public void setInstruction(String instruction){
this.instruction = instruction;
super.addValidField("instruction");
}
/** prologue
*
*/
private String prologue;
@Column(name = "prologue",length = 2147483647)
public String getPrologue(){
return this.prologue;
}
public void setPrologue(String prologue){
this.prologue = prologue;
super.addValidField("prologue");
}
/** exampleQueries
*
*/
private String exampleQueries;
@Column(name = "exampleQueries",length = 1073741824)
public String getExampleQueries(){
return this.exampleQueries;
}
public void setExampleQueries(String exampleQueries){
this.exampleQueries = exampleQueries;
super.addValidField("exampleQueries");
}
}
\ No newline at end of file
package cn.com.poc.appbuilder.repository;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationRecordModel;
import cn.com.yict.framemax.data.repository.Repository;
public interface BizAppbuilderConversationRecordRepository extends Repository<BizAppbuilderConversationRecordModel, Integer> {
}
\ No newline at end of file
package cn.com.poc.appbuilder.repository;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationModel;
import cn.com.yict.framemax.data.repository.Repository;
public interface BizAppbuilderConversationRepository extends Repository<BizAppbuilderConversationModel, Integer> {
}
\ No newline at end of file
package cn.com.poc.appbuilder.repository;
import cn.com.poc.appbuilder.model.BizAppbuilderInfoModel;
import cn.com.yict.framemax.data.repository.Repository;
public interface BizAppbuilderInfoRepository extends Repository<BizAppbuilderInfoModel, Integer> {
}
\ No newline at end of file
package cn.com.poc.appbuilder.rest;
import cn.com.poc.appbuilder.api.entity.BaiduAppBuilderDescribeAppListResult;
import cn.com.poc.appbuilder.api.entity.BaiduAppBuilderDescribeAppResult;
import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission;
import org.springframework.web.bind.annotation.RequestParam;
@Permission(Access.Anonymous)
public interface AppBuilderDescribeAppRest extends BaseRest {
/**
* 查询用户应用详情
*
* @param appId 应用的ID - app_id
* @return 返回用户应用详情
*/
BaiduAppBuilderDescribeAppResult getDescribeApp(@RequestParam String appId) throws Exception;
/**
* 查询用户应用详情
*
* @param marker 起始位置
* @param maxKeys 数据大小,默认10,最大值100
* @return 返回用户应用列表
*/
BaiduAppBuilderDescribeAppListResult getDescribeAppList(@RequestParam String marker, @RequestParam Integer maxKeys) throws Exception;
}
package cn.com.poc.appbuilder.rest;
import cn.com.poc.appbuilder.dto.AppBuilderCommunicationDto;
import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
@Permission(Access.Safety)
public interface AppBuilderRest extends BaseRest {
/**
* 新建对话-【有效期7天】
*
* @param appId 应用的ID - app_id
* @return 返回新建对话的ID - conversation_id
*/
String conversation(@RequestParam String appId) throws Exception;
/**
* 文件上传
*
* @param appId 应用的ID - app_id
* @param conversationId 对话的ID - conversation_id
* @param file 文件
* @return 返回文件ID - file_id
*/
String upload(@RequestParam String appId, @RequestParam String conversationId, @RequestParam MultipartFile file) throws Exception;
/**
* 获取用户对话列表-【未过期】
*
* @return 返回用户对话列表 - conversation_id
*/
List<String> getCurrentUserConversationIds() throws Exception;
/**
* 大模型对话
*
* @param dto
* @param httpServletResponse
*/
void communication(@RequestBody AppBuilderCommunicationDto dto, HttpServletResponse httpServletResponse) throws IOException;
}
package cn.com.poc.appbuilder.rest.impl;
import cn.com.poc.appbuilder.api.BaiduAppBuilderApi;
import cn.com.poc.appbuilder.api.entity.AppBuilderDescribeListRequest;
import cn.com.poc.appbuilder.api.entity.AppBuilderDescribeRequest;
import cn.com.poc.appbuilder.api.entity.BaiduAppBuilderDescribeAppListResult;
import cn.com.poc.appbuilder.api.entity.BaiduAppBuilderDescribeAppResult;
import cn.com.poc.appbuilder.model.BizAppbuilderInfoModel;
import cn.com.poc.appbuilder.rest.AppBuilderDescribeAppRest;
import cn.com.poc.appbuilder.service.BizAppbuilderInfoService;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.yict.framemax.core.utils.BeanUtils;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import org.apache.commons.collections.CollectionUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
@Component
public class AppBuilderDescribeAppRestImpl implements AppBuilderDescribeAppRest {
@Resource
private BaiduAppBuilderApi baiduAppBuilderApi;
@Resource
private BizAppbuilderInfoService bizAppbuilderInfoService;
@Override
public BaiduAppBuilderDescribeAppResult getDescribeApp(String appId) throws Exception {
Assert.notNull(appId, "参数不能为空");
BaiduAppBuilderDescribeAppResult baiduAppBuilderDescribeAppResult = new BaiduAppBuilderDescribeAppResult();
BizAppbuilderInfoModel model = new BizAppbuilderInfoModel();
model.setId(appId);
List<BizAppbuilderInfoModel> models = bizAppbuilderInfoService.findByExample(model, null);
if (CollectionUtils.isEmpty(models)) {
AppBuilderDescribeRequest appBuilderDescribeRequest = new AppBuilderDescribeRequest(appId);
String str = baiduAppBuilderApi.getDescribeApp(appBuilderDescribeRequest);
baiduAppBuilderDescribeAppResult = JSONObject.parseObject(str, BaiduAppBuilderDescribeAppResult.class);
} else {
BeanUtils.copy(models.get(0), baiduAppBuilderDescribeAppResult);
String exampleQueries = models.get(0).getExampleQueries();
List<String> queriesList = (List<String>) JsonUtils.deSerialize(exampleQueries, new TypeReference<List<String>>() {
}.getType());
baiduAppBuilderDescribeAppResult.setExampleQueries(queriesList);
}
return baiduAppBuilderDescribeAppResult;
}
@Override
public BaiduAppBuilderDescribeAppListResult getDescribeAppList(String marker, Integer maxKeys) throws Exception {
Assert.notNull(marker, "参数不能为空");
Assert.notNull(maxKeys, "参数不能为空");
AppBuilderDescribeListRequest appBuilderDescribeListRequest = new AppBuilderDescribeListRequest(marker, maxKeys);
return baiduAppBuilderApi.getDescribeAppList(appBuilderDescribeListRequest);
}
}
package cn.com.poc.appbuilder.rest.impl;
import cn.com.poc.appbuilder.aggregation.AppBuilderService;
import cn.com.poc.appbuilder.dto.AppBuilderCommunicationDto;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationModel;
import cn.com.poc.appbuilder.rest.AppBuilderRest;
import cn.com.poc.appbuilder.service.BizAppbuilderConversationService;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.SSEUtil;
import cn.com.poc.common.utils.StringUtils;
import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientIterator;
import com.baidubce.appbuilder.model.appbuilderclient.AppBuilderClientResult;
import com.baidubce.appbuilder.model.appbuilderclient.Event;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
@Component
public class AppBuilderRestImpl implements AppBuilderRest {
private final Logger logger = LoggerFactory.getLogger(AppBuilderRest.class);
@Resource
private AppBuilderService appBuilderService;
@Resource
private BizAppbuilderConversationService bizAppbuilderConversationService;
@Override
public String conversation(String appId) throws Exception {
Assert.notNull(appId, "参数不能为空");
String conversationId = appBuilderService.conversation(appId);
//持久化
BizAppbuilderConversationModel model = new BizAppbuilderConversationModel();
model.setAppId(appId);
model.setConversationId(conversationId);
bizAppbuilderConversationService.save(model);
return conversationId;
}
@Override
public String upload(String appId, String conversationId, MultipartFile file) throws Exception {
Assert.notNull(appId, "参数不能为空");
Assert.notNull(conversationId, "参数不能为空");
return appBuilderService.upload(appId, conversationId, file);
}
@Override
public List<String> getCurrentUserConversationIds() {
return appBuilderService.getCurrentUserConversationIds();
}
@Override
public void communication(AppBuilderCommunicationDto dto, HttpServletResponse httpServletResponse) throws IOException {
Assert.notNull(dto, "参数不能为空");
Assert.notBlank(dto.getQuery(), "对话内容不能为空");
Assert.notBlank(dto.getConversationId(), "对话ID不能为空");
SSEUtil sseUtil = new SSEUtil();
StringBuilder stringBuilder = new StringBuilder();
try {
String conversationId = dto.getConversationId();
String query = dto.getQuery();
List<String> fileIds = CollectionUtils.isEmpty(dto.getFileIds()) ? new ArrayList<String>(0) : dto.getFileIds();
AppBuilderClientIterator iterator = appBuilderService.communication(conversationId, query, fileIds, dto.getStream());
while (iterator.hasNext()) {
AppBuilderClientResult res = iterator.next();
sseUtil.send(JsonUtils.serialize(res));
if (ArrayUtils.isNotEmpty(res.getEvents())) {
Event event = res.getEvents()[0];
String eventType = event.getEventType();
if ("chatflow".equals(eventType)) {
Map<String, Object> detail = event.getDetail();
if (detail.containsKey("message")) {
String mess = detail.get("message").toString();
stringBuilder.append(mess);
}
}
} else if (StringUtils.isNotEmpty(res.getAnswer())) {
stringBuilder.append(res.getAnswer());
}
}
} catch (Exception e) {
logger.error("appBuilder#communication对话失败,错误信息:{},入参:{}", e.getLocalizedMessage(), dto);
sseUtil.completeByError("对话失败: " + e.getMessage());
}finally {
}
}
}
package cn.com.poc.appbuilder.service;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationRecordModel;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizAppbuilderConversationRecordService extends BaseService {
BizAppbuilderConversationRecordModel get(Integer id) throws Exception;
List<BizAppbuilderConversationRecordModel> findByExample(BizAppbuilderConversationRecordModel example,PagingInfo pagingInfo) throws Exception;
void delete(BizAppbuilderConversationRecordModel model) throws Exception;
void deleteById(Integer id) throws Exception;
void deleteAll(Collection<Integer> ids) throws Exception;
BizAppbuilderConversationRecordModel save(BizAppbuilderConversationRecordModel model) throws Exception;
Collection<BizAppbuilderConversationRecordModel> saveAll(Collection<BizAppbuilderConversationRecordModel> models) throws Exception;
}
\ No newline at end of file
package cn.com.poc.appbuilder.service;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationModel;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizAppbuilderConversationService extends BaseService {
BizAppbuilderConversationModel get(Integer id) throws Exception;
List<BizAppbuilderConversationModel> findByExample(BizAppbuilderConversationModel example, PagingInfo pagingInfo) throws Exception;
void delete(BizAppbuilderConversationModel model) throws Exception;
void deleteById(Integer id) throws Exception;
void deleteAll(Collection<Integer> ids) throws Exception;
BizAppbuilderConversationModel save(BizAppbuilderConversationModel model) throws Exception;
Collection<BizAppbuilderConversationModel> saveAll(Collection<BizAppbuilderConversationModel> models) throws Exception;
}
\ No newline at end of file
package cn.com.poc.appbuilder.service;
import cn.com.poc.appbuilder.model.BizAppbuilderInfoModel;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.List;
public interface BizAppbuilderInfoService extends BaseService {
BizAppbuilderInfoModel get(Integer id) throws Exception;
List<BizAppbuilderInfoModel> findByExample(BizAppbuilderInfoModel example,PagingInfo pagingInfo) throws Exception;
}
\ No newline at end of file
package cn.com.poc.appbuilder.service.impl;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationRecordModel;
import cn.com.poc.appbuilder.repository.BizAppbuilderConversationRecordRepository;
import cn.com.poc.appbuilder.service.BizAppbuilderConversationRecordService;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
@Service
public class BizAppbuilderConversationRecordServiceImpl extends BaseServiceImpl
implements BizAppbuilderConversationRecordService {
@Resource
private BizAppbuilderConversationRecordRepository repository;
public BizAppbuilderConversationRecordModel get(Integer id) throws Exception{
return this.repository.get(id);
}
public List<BizAppbuilderConversationRecordModel> findByExample(BizAppbuilderConversationRecordModel example,PagingInfo pagingInfo) throws Exception{
if(example == null){
example = new BizAppbuilderConversationRecordModel();
}
return this.repository.findByExample(example,pagingInfo);
}
public void delete(BizAppbuilderConversationRecordModel model) throws Exception{
this.repository.remove(model);
}
public void deleteById(Integer id) throws Exception{
this.repository.removeByPk(id);
}
public void deleteAll(Collection<Integer> ids) throws Exception{
this.repository.removeAllByPk(ids);
}
public BizAppbuilderConversationRecordModel save(BizAppbuilderConversationRecordModel model) throws Exception{
return this.repository.save(model);
}
public Collection<BizAppbuilderConversationRecordModel> saveAll(Collection<BizAppbuilderConversationRecordModel> models) throws Exception{
return this.repository.saveAll(models);
}
}
\ No newline at end of file
package cn.com.poc.appbuilder.service.impl;
import cn.com.poc.appbuilder.model.BizAppbuilderConversationModel;
import cn.com.poc.appbuilder.repository.BizAppbuilderConversationRepository;
import cn.com.poc.appbuilder.service.BizAppbuilderConversationService;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Collection;
import java.util.List;
@Service
public class BizAppbuilderConversationServiceImpl extends BaseServiceImpl
implements BizAppbuilderConversationService {
@Resource
private BizAppbuilderConversationRepository repository;
public BizAppbuilderConversationModel get(Integer id) throws Exception{
return this.repository.get(id);
}
public List<BizAppbuilderConversationModel> findByExample(BizAppbuilderConversationModel example, PagingInfo pagingInfo) throws Exception{
if(example == null){
example = new BizAppbuilderConversationModel();
}
return this.repository.findByExample(example,pagingInfo);
}
public void delete(BizAppbuilderConversationModel model) throws Exception{
this.repository.remove(model);
}
public void deleteById(Integer id) throws Exception{
this.repository.removeByPk(id);
}
public void deleteAll(Collection<Integer> ids) throws Exception{
this.repository.removeAllByPk(ids);
}
public BizAppbuilderConversationModel save(BizAppbuilderConversationModel model) throws Exception{
return this.repository.save(model);
}
public Collection<BizAppbuilderConversationModel> saveAll(Collection<BizAppbuilderConversationModel> models) throws Exception{
return this.repository.saveAll(models);
}
}
\ No newline at end of file
package cn.com.poc.appbuilder.service.impl;
import cn.com.poc.appbuilder.model.BizAppbuilderInfoModel;
import cn.com.poc.appbuilder.repository.BizAppbuilderInfoRepository;
import cn.com.poc.appbuilder.service.BizAppbuilderInfoService;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author 52747
*/
@Service
public class BizAppbuilderInfoServiceImpl extends BaseServiceImpl
implements BizAppbuilderInfoService {
@Resource
private BizAppbuilderInfoRepository repository;
@Override
public BizAppbuilderInfoModel get(Integer id) throws Exception {
return this.repository.get(id);
}
@Override
public List<BizAppbuilderInfoModel> findByExample(BizAppbuilderInfoModel example, PagingInfo pagingInfo) throws Exception {
if (example == null) {
example = new BizAppbuilderInfoModel();
}
return this.repository.findByExample(example, pagingInfo);
}
}
\ No newline at end of file
......@@ -244,7 +244,7 @@ public class DocumentLoad {
textStripper.setSortByPosition(true);
stringBuilder.append(textStripper.getText(doc));
doc.close();
return stringBuilder.toString();
return stringBuilder.toString().replaceAll("�", StringUtils.EMPTY);
}
......
......@@ -395,7 +395,7 @@ public class AgentApplicationExposeServiceImpl implements AgentApplicationExpose
Message[] messages = new Message[]{message};
LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setModel("ERNIE-4.0-8K");
largeModelResponse.setModel("deepseek-v3");
largeModelResponse.setMessages(messages);
LargeModelDemandResult largeModelDemandResult = llmService.chat(largeModelResponse);
......@@ -424,7 +424,7 @@ public class AgentApplicationExposeServiceImpl implements AgentApplicationExpose
Message[] messages = new Message[]{message};
LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setModel("ERNIE-4.0-8K");
largeModelResponse.setModel("deepseek-v3");
largeModelResponse.setMessages(messages);
LargeModelDemandResult largeModelDemandResult = llmService.chat(largeModelResponse);
......
package cn.com.poc.human_resources.aggregate;
import cn.com.gsst.dify_client.exception.DifyApiException;
import cn.com.poc.human_resources.entity.BizHumanResourcePositionEntity;
import cn.com.poc.human_resources.entity.BizHumanResourceResumeEntity;
import cn.com.poc.human_resources.entity.HumanResourcePositionBaseInfo;
import cn.com.poc.human_resources.entity.position.BaseInfo;
import cn.com.poc.human_resources.entity.position.Job;
import cn.com.poc.human_resources.entity.position.Por;
import cn.com.poc.human_resources.entity.resume.Resume;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.io.IOException;
import java.util.List;
/**
* 人力资源Agent服务
*
* @author alex.yao
* @date 2025/9/28
*/
public interface HumanResourceService {
/**
* 上传简历
*
* @param fileURL 文件地址
* @param positionId 岗位ID
* @param userId 用户id
* @return
*/
Resume uploadResume(String fileURL, Long positionId, Long userId) throws Exception;
/**
* 职位配置-对话助手
*
* @param demand 需求
* @param type 对话类型 all- 一键生成 chat-对话
* @param fileInfos 职位画像字段
* @param jobInformation 职位信息
* @param question 问题
* @param dialoguesId 对话ID
* @param userId 用户id
*/
void positionAssistant(String demand,
String type,
String fileInfos,
String jobInformation,
String question,
String dialoguesId,
Long userId)
throws DifyApiException, IOException, InterruptedException;
/**
* 职位配置-保存/更新
*
* @param baseInfo 基础信息
* @param job 职位详情
* @param por 职位画像
* @param id 职位id[更新必填]
* @param memberId 用户id
*/
BizHumanResourcePositionEntity saveOrUpdatePosition(BaseInfo baseInfo, Job job, Por por, Long id, Long memberId) throws Exception;
/**
* 查询职位列表
*
* @param userId
* @param pagingInfo
*/
List<HumanResourcePositionBaseInfo> listPositions(Long userId, PagingInfo pagingInfo) throws Exception;
/**
* 查询职位详情
*
* @param positionId 职位id
*/
BizHumanResourcePositionEntity getPositionDetail(Long userId, Long positionId) throws Exception;
/**
* 删除职位[批量]
*
* @param userId 用户id
* @param positionIds 职位ID
*/
void deletePositions(Long userId, Long... positionIds) throws Exception;
// ------------------------- 简历 -------------------------- //
/**
* 保存简历信息
*
* @param userId
* @param fileURL
* @param positionId
* @param resume
* @throws Exception
*/
BizHumanResourceResumeEntity saveResume(Long userId, String fileURL, Long positionId, Resume resume) throws Exception;
/**
* 更新简历信息
*
* @param id
* @param userId
* @param fileURL
* @param positionId
* @param resume
* @return
* @throws Exception
*/
BizHumanResourceResumeEntity updateResume(Long id, Long userId, String fileURL, Long positionId, Resume resume) throws Exception;
/**
* 查询简历列表
*
* @param userId
* @param positionId
* @param pagingInfo
*/
List<BizHumanResourceResumeEntity> listResumes(Long userId, Long positionId, PagingInfo pagingInfo) throws Exception;
/**
* 查询简历详情
*
* @param userId
* @param resumeId
* @return
* @throws Exception
*/
BizHumanResourceResumeEntity getResumeDetail(Long userId, Long resumeId) throws Exception;
/**
* 删除简历[批量]
*
* @param resumeIds
* @throws Exception
*/
void deleteResumes(Long userId, Long... resumeIds) throws Exception;
}
package cn.com.poc.human_resources.aggregate.impl;
import cn.com.gsst.dify_client.DifyChatClient;
import cn.com.gsst.dify_client.DifyClientFactory;
import cn.com.gsst.dify_client.callback.ChatStreamCallback;
import cn.com.gsst.dify_client.enums.FileTransferMethod;
import cn.com.gsst.dify_client.enums.FileType;
import cn.com.gsst.dify_client.enums.ResponseMode;
import cn.com.gsst.dify_client.event.MessageEndEvent;
import cn.com.gsst.dify_client.event.MessageEvent;
import cn.com.gsst.dify_client.exception.DifyApiException;
import cn.com.gsst.dify_client.model.chat.ChatMessage;
import cn.com.gsst.dify_client.model.chat.ChatMessageResponse;
import cn.com.gsst.dify_client.model.file.FileInfo;
import cn.com.poc.common.constant.CommonConstant;
import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.SSEUtil;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.human_resources.aggregate.HumanResourceService;
import cn.com.poc.human_resources.convert.BizHumanResourceResumeConvert;
import cn.com.poc.human_resources.entity.BizHumanResourcePositionEntity;
import cn.com.poc.human_resources.entity.BizHumanResourceResumeEntity;
import cn.com.poc.human_resources.entity.HumanResourcePositionBaseInfo;
import cn.com.poc.human_resources.entity.position.BaseInfo;
import cn.com.poc.human_resources.entity.position.Job;
import cn.com.poc.human_resources.entity.position.Por;
import cn.com.poc.human_resources.entity.resume.Resume;
import cn.com.poc.human_resources.query.PositionListQueryCondition;
import cn.com.poc.human_resources.query.PositionListQueryItem;
import cn.com.poc.human_resources.service.BizHumanResourcePositionService;
import cn.com.poc.human_resources.service.BizHumanResourceResumeService;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.collections4.MapUtils;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Service;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.*;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @author alex.yao
* @date 2025/9/28
*/
@Service
public class HumanResourceServiceImpl implements HumanResourceService {
private String DIFY_BASE_URL = "https://dify.gsstcloud.com/v1";
@Resource
private BizHumanResourcePositionService bizHumanResourcePositionService;
@Resource
private BizHumanResourceResumeService bizHumanResourceResumeService;
@Override
@Retryable(value = Exception.class, maxAttempts = 2, backoff = @Backoff(delay = 1000, multiplier = 2))
public Resume uploadResume(String fileURL, Long positionId, Long userId) throws Exception {
BizHumanResourcePositionEntity bizHumanResourcePositionEntity = bizHumanResourcePositionService.get(positionId);
if (bizHumanResourcePositionEntity == null) {
throw new BusinessException("该岗位信息不存在");
}
Map<String, Object> inputs = new LinkedHashMap<>();
inputs.put("position", JsonUtils.serialize(bizHumanResourcePositionEntity));
List<FileInfo> files = new ArrayList<>();
files.add(FileInfo.builder()
.type(FileType.DOCUMENT)
.transferMethod(FileTransferMethod.REMOTE_URL)
.url(fileURL)
.build());
// 创建聊天客户端
DifyChatClient chatClient = DifyClientFactory.createChatClient(DIFY_BASE_URL, "app-1MRun3ecfLOzFS96xcWYCOOX");
// 创建聊天消息
ChatMessage message = ChatMessage.builder()
.query("run")
.user(userId.toString())
.files(files)
.inputs(inputs)
.responseMode(ResponseMode.BLOCKING)
.build();
// 发送消息并获取响应
ChatMessageResponse response = chatClient.sendChatMessage(message);
if (response == null || StringUtils.isBlank(response.getAnswer())) {
throw new BusinessException("提取简历失败");
}
Resume resume = JsonUtils.deSerialize(response.getAnswer(), Resume.class);
if (resume == null) {
throw new BusinessException("提取简历异常");
}
this.saveResume(userId, fileURL, positionId, resume);
return resume;
}
@Override
public void positionAssistant(String demand, String type, String fileInfos, String jobInformation, String question, String dialoguesId, Long userId) throws DifyApiException, IOException, InterruptedException {
// 创建聊天客户端
DifyChatClient chatClient = DifyClientFactory.createChatClient(DIFY_BASE_URL, "app-YmVPoXmTh7ejERFbip3ADCYN");
Map<String, Object> inputs = new LinkedHashMap<>();
inputs.put("type", type);
if (StringUtils.isNotBlank(demand)) {
inputs.put("demand", demand);
}
if (StringUtils.isNotBlank(jobInformation)) {
inputs.put("jobInfomations", jobInformation);
}
if (StringUtils.isNotBlank(fileInfos)) {
inputs.put("fileinfos", fileInfos);
}
// 创建聊天消息
ChatMessage message = ChatMessage.builder()
.query(StringUtils.isBlank(question) ? "run" : question)
.user(userId.toString())
.inputs(inputs)
.conversationId(StringUtils.isNotBlank(dialoguesId) ? dialoguesId : StringUtils.EMPTY)
.responseMode(ResponseMode.STREAMING)
.build();
CountDownLatch countDownLatch = new CountDownLatch(1);
ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletResponse response = servletRequestAttributes.getResponse();
// 发送消息并获取响应
chatClient.sendChatMessageStream(message, new ChatStreamCallback() {
SSEUtil sseUtil = new SSEUtil(response);
@Override
public void onMessage(MessageEvent event) {
try {
if (StringUtils.isNotEmpty(event.getAnswer())) {
LargeModelDemandResult largeModelDemandResult = new LargeModelDemandResult();
largeModelDemandResult.setCode("0");
largeModelDemandResult.setMessage(event.getAnswer());
sseUtil.send(JsonUtils.serialize(event.getAnswer()));
}
} catch (IOException e) {
sseUtil.completeByError(e.getMessage());
throw new RuntimeException(e);
}
}
@Override
public void onMessageEnd(MessageEndEvent event) {
try {
sseUtil.send("[DONE]");
} catch (IOException e) {
sseUtil.completeByError(e.getMessage());
throw new RuntimeException(e);
} finally {
sseUtil.complete();
countDownLatch.countDown();
}
}
});
countDownLatch.await(60, TimeUnit.SECONDS);
}
@Override
public BizHumanResourcePositionEntity saveOrUpdatePosition(BaseInfo baseInfo, Job job, Por por, Long id, Long memberId) throws Exception {
BizHumanResourcePositionEntity bizHumanResourcePositionEntity = new BizHumanResourcePositionEntity();
bizHumanResourcePositionEntity.setId(id);
bizHumanResourcePositionEntity.setJobTitle(baseInfo.getJobTitle());
bizHumanResourcePositionEntity.setDepartment(baseInfo.getDepartment());
bizHumanResourcePositionEntity.setWorkLocation(baseInfo.getWorkLocation());
bizHumanResourcePositionEntity.setJobNature(baseInfo.getJobNature());
bizHumanResourcePositionEntity.setNumberOfRecruits(baseInfo.getNumberOfRecruits());
bizHumanResourcePositionEntity.setWorkExperience(baseInfo.getWorkExperience());
bizHumanResourcePositionEntity.setEducationalRe(baseInfo.getEducationalRe());
bizHumanResourcePositionEntity.setSalaryRange(baseInfo.getSalaryRange());
bizHumanResourcePositionEntity.setJobRequirements(job.getJobRequirements());
bizHumanResourcePositionEntity.setJobDuties(job.getJobDuties());
bizHumanResourcePositionEntity.setEssential(MapUtils.isNotEmpty(por.getEssential()) ? JsonUtils.serialize(por.getEssential()) : null);
bizHumanResourcePositionEntity.setBonusPoints(MapUtils.isNotEmpty(por.getBonusPoints()) ? JsonUtils.serialize(por.getBonusPoints()) : null);
bizHumanResourcePositionEntity.setExclusion(MapUtils.isNotEmpty(por.getExclusion()) ? JsonUtils.serialize(por.getExclusion()) : null);
bizHumanResourcePositionEntity.setMemberId(memberId);
return id != null ? bizHumanResourcePositionService.update(bizHumanResourcePositionEntity) : bizHumanResourcePositionService.save(bizHumanResourcePositionEntity);
}
@Override
public List<HumanResourcePositionBaseInfo> listPositions(Long userId, PagingInfo pagingInfo) throws Exception {
PositionListQueryCondition condition = new PositionListQueryCondition();
condition.setMemberId(userId);
List<PositionListQueryItem> positionListQueryItems = bizHumanResourcePositionService.positionListQuery(condition, pagingInfo);
List<HumanResourcePositionBaseInfo> result = new ArrayList<>();
if (CollectionUtils.isNotEmpty(positionListQueryItems)) {
result = positionListQueryItems.stream().map(item -> {
HumanResourcePositionBaseInfo baseInfo = new HumanResourcePositionBaseInfo();
baseInfo.setId(item.getId());
baseInfo.setJobTitle(item.getJobTitle());
baseInfo.setWorkLocation(item.getWorkLocation());
baseInfo.setJobNature(item.getJobNature());
baseInfo.setWorkExperience(item.getWorkExperience());
baseInfo.setResumeCount(item.getResumeCount());
return baseInfo;
}).collect(Collectors.toList());
}
return result;
}
@Override
public BizHumanResourcePositionEntity getPositionDetail(Long userId, Long positionId) throws Exception {
BizHumanResourcePositionEntity bizHumanResourcePositionEntity = new BizHumanResourcePositionEntity();
bizHumanResourcePositionEntity.setId(positionId);
bizHumanResourcePositionEntity.setMemberId(userId);
bizHumanResourcePositionEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizHumanResourcePositionEntity> entities = bizHumanResourcePositionService.findByExample(bizHumanResourcePositionEntity, null);
if (CollectionUtils.isEmpty(entities)) {
return null;
}
return entities.get(0);
}
@Override
public void deletePositions(Long userId, Long... positionIds) throws Exception {
if (userId == null) {
throw new BusinessException("用户未登录");
}
if (positionIds == null || positionIds.length == 0) {
return;
}
String lock = "deletePositions" + userId;
synchronized (lock.intern()) {
for (Long positionId : positionIds) {
bizHumanResourcePositionService.deletedById(positionId);
}
}
}
@Override
public BizHumanResourceResumeEntity saveResume(Long userId, String fileURL, Long positionId, Resume resume) throws Exception {
BizHumanResourceResumeEntity bizHumanResourceResumeEntity = BizHumanResourceResumeConvert.resumeToEntity(resume);
bizHumanResourceResumeEntity.setMemberId(userId);
bizHumanResourceResumeEntity.setPosition(positionId);
bizHumanResourceResumeEntity.setFileUrl(fileURL);
return bizHumanResourceResumeService.save(bizHumanResourceResumeEntity);
}
@Override
public BizHumanResourceResumeEntity updateResume(Long id, Long userId, String fileURL, Long positionId, Resume resume) throws Exception {
BizHumanResourceResumeEntity bizHumanResourceResumeEntity = BizHumanResourceResumeConvert.resumeToEntity(resume);
bizHumanResourceResumeEntity.setId(id);
bizHumanResourceResumeEntity.setMemberId(userId);
bizHumanResourceResumeEntity.setPosition(positionId);
bizHumanResourceResumeEntity.setFileUrl(fileURL);
return bizHumanResourceResumeService.update(bizHumanResourceResumeEntity);
}
@Override
public List<BizHumanResourceResumeEntity> listResumes(Long userId, Long positionId, PagingInfo pagingInfo) throws Exception {
BizHumanResourceResumeEntity bizHumanResourceResumeEntity = new BizHumanResourceResumeEntity();
bizHumanResourceResumeEntity.setMemberId(userId);
bizHumanResourceResumeEntity.setPosition(positionId);
bizHumanResourceResumeEntity.setIsDeleted(CommonConstant.IsDeleted.N);
return bizHumanResourceResumeService.findByExample(bizHumanResourceResumeEntity, pagingInfo).stream()
.sorted(Comparator.comparing(BizHumanResourceResumeEntity::getCreatedTime).reversed())
.collect(Collectors.toList());
}
@Override
public BizHumanResourceResumeEntity getResumeDetail(Long userId, Long resumeId) throws Exception {
BizHumanResourceResumeEntity bizHumanResourceResumeEntity = new BizHumanResourceResumeEntity();
bizHumanResourceResumeEntity.setId(resumeId);
bizHumanResourceResumeEntity.setMemberId(userId);
bizHumanResourceResumeEntity.setIsDeleted(CommonConstant.IsDeleted.N);
List<BizHumanResourceResumeEntity> entities = bizHumanResourceResumeService.findByExample(bizHumanResourceResumeEntity, null);
if (CollectionUtils.isEmpty(entities)) {
return null;
}
return entities.get(0);
}
@Override
public void deleteResumes(Long userId, Long... resumeIds) throws Exception {
if (userId == null) {
throw new BusinessException("用户未登录");
}
if (resumeIds == null || resumeIds.length == 0) {
return;
}
String lock = "deleteResumeLock" + userId;
synchronized (lock.intern()) {
for (Long resumeId : resumeIds) {
bizHumanResourceResumeService.deletedById(resumeId);
}
}
}
}
package cn.com.poc.human_resources.convert;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.human_resources.dto.BizHumanResourcePositionDto;
import cn.com.poc.human_resources.dto.HumanResourcePositionDto;
import cn.com.poc.human_resources.entity.BizHumanResourcePositionEntity;
import cn.com.poc.human_resources.entity.position.BaseInfo;
import cn.com.poc.human_resources.entity.position.Job;
import cn.com.poc.human_resources.entity.position.Por;
import cn.com.poc.human_resources.model.BizHumanResourcePositionModel;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.type.TypeReference;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.baidubce.services.bcc.model.deployset.DeploySetAction.list;
public class BizHumanResourcePositionConvert {
public static BizHumanResourcePositionEntity modelToEntity(BizHumanResourcePositionModel model) {
BizHumanResourcePositionEntity entity = new BizHumanResourcePositionEntity();
entity.setId(model.getId());
entity.setJobTitle(model.getJobTitle());
entity.setDepartment(model.getDepartment());
entity.setWorkLocation(model.getWorkLocation());
entity.setJobNature(model.getJobNature());
entity.setNumberOfRecruits(model.getNumberOfRecruits());
entity.setWorkExperience(model.getWorkExperience());
entity.setEducationalRe(model.getEducationalRe());
entity.setSalaryRange(model.getSalaryRange());
entity.setJobRequirements(model.getJobRequirements());
entity.setJobDuties(model.getJobDuties());
entity.setEssential(model.getEssential());
entity.setBonusPoints(model.getBonusPoints());
entity.setExclusion(model.getExclusion());
entity.setMemberId(model.getMemberId());
entity.setIsDeleted(model.getIsDeleted());
entity.setCreator(model.getCreator());
entity.setCreatedTime(model.getCreatedTime());
entity.setModifier(model.getModifier());
entity.setModifiedTime(model.getModifiedTime());
entity.setSysVersion(model.getSysVersion());
return entity;
}
public static BizHumanResourcePositionModel entityToModel(BizHumanResourcePositionEntity entity) {
BizHumanResourcePositionModel model = new BizHumanResourcePositionModel();
model.setId(entity.getId());
model.setJobTitle(entity.getJobTitle());
model.setDepartment(entity.getDepartment());
model.setWorkLocation(entity.getWorkLocation());
model.setJobNature(entity.getJobNature());
model.setNumberOfRecruits(entity.getNumberOfRecruits());
model.setWorkExperience(entity.getWorkExperience());
model.setEducationalRe(entity.getEducationalRe());
model.setSalaryRange(entity.getSalaryRange());
model.setJobRequirements(entity.getJobRequirements());
model.setJobDuties(entity.getJobDuties());
model.setEssential(entity.getEssential());
model.setBonusPoints(entity.getBonusPoints());
model.setExclusion(entity.getExclusion());
model.setMemberId(entity.getMemberId());
model.setIsDeleted(entity.getIsDeleted());
model.setCreator(entity.getCreator());
model.setCreatedTime(entity.getCreatedTime());
model.setModifier(entity.getModifier());
model.setModifiedTime(entity.getModifiedTime());
model.setSysVersion(entity.getSysVersion());
return model;
}
public static BizHumanResourcePositionDto entityToDto(BizHumanResourcePositionEntity entity) {
BizHumanResourcePositionDto dto = new BizHumanResourcePositionDto();
dto.setId(entity.getId());
dto.setJobTitle(entity.getJobTitle());
dto.setDepartment(entity.getDepartment());
dto.setWorkLocation(entity.getWorkLocation());
dto.setJobNature(entity.getJobNature());
dto.setNumberOfRecruits(entity.getNumberOfRecruits());
dto.setWorkExperience(entity.getWorkExperience());
dto.setEducationalRe(entity.getEducationalRe());
dto.setSalaryRange(entity.getSalaryRange());
dto.setJobRequirements(entity.getJobRequirements());
dto.setJobDuties(entity.getJobDuties());
dto.setEssential(entity.getEssential());
dto.setBonusPoints(entity.getBonusPoints());
dto.setExclusion(entity.getExclusion());
return dto;
}
public static BizHumanResourcePositionEntity dtoToEntity(BizHumanResourcePositionDto dto) {
BizHumanResourcePositionEntity entity = new BizHumanResourcePositionEntity();
entity.setId(dto.getId());
entity.setJobTitle(dto.getJobTitle());
entity.setDepartment(dto.getDepartment());
entity.setWorkLocation(dto.getWorkLocation());
entity.setJobNature(dto.getJobNature());
entity.setNumberOfRecruits(dto.getNumberOfRecruits());
entity.setWorkExperience(dto.getWorkExperience());
entity.setEducationalRe(dto.getEducationalRe());
entity.setSalaryRange(dto.getSalaryRange());
entity.setJobRequirements(dto.getJobRequirements());
entity.setJobDuties(dto.getJobDuties());
entity.setEssential(dto.getEssential());
entity.setBonusPoints(dto.getBonusPoints());
entity.setExclusion(dto.getExclusion());
return entity;
}
public static HumanResourcePositionDto entityToHumanResourcePositionDto(BizHumanResourcePositionEntity positionEntity) {
HumanResourcePositionDto resourcePositionDto = new HumanResourcePositionDto();
BaseInfo baseInfo = new BaseInfo();
baseInfo.setJobTitle(positionEntity.getJobTitle());
baseInfo.setDepartment(positionEntity.getDepartment());
baseInfo.setWorkLocation(positionEntity.getWorkLocation());
baseInfo.setJobNature(positionEntity.getJobNature());
baseInfo.setNumberOfRecruits(positionEntity.getNumberOfRecruits());
baseInfo.setWorkExperience(positionEntity.getWorkExperience());
baseInfo.setEducationalRe(positionEntity.getEducationalRe());
baseInfo.setSalaryRange(positionEntity.getSalaryRange());
resourcePositionDto.setBaseInfo(baseInfo);
Job job = new Job();
job.setJobDuties(positionEntity.getJobDuties());
job.setJobRequirements(positionEntity.getJobRequirements());
resourcePositionDto.setJob(job);
Por por = new Por();
if (StringUtils.isNotBlank(positionEntity.getEssential())) {
JSONObject jsonObject = JSONObject.parseObject(positionEntity.getEssential());
Map<String, String> map = new HashMap<>();
for (String key : jsonObject.keySet()) {
map.put(key, jsonObject.getString(key));
}
por.setEssential(map);
}
if (StringUtils.isNotBlank(positionEntity.getBonusPoints())) {
JSONObject jsonObject = JSONObject.parseObject(positionEntity.getBonusPoints());
Map<String, String> map = new HashMap<>();
for (String key : jsonObject.keySet()) {
map.put(key, jsonObject.getString(key));
}
por.setBonusPoints(map);
}
if (StringUtils.isNotBlank(positionEntity.getExclusion())) {
JSONObject jsonObject = JSONObject.parseObject(positionEntity.getExclusion());
Map<String, String> map = new HashMap<>();
for (String key : jsonObject.keySet()) {
map.put(key, jsonObject.getString(key));
}
por.setExclusion(map);
}
resourcePositionDto.setPor(por);
return resourcePositionDto;
}
}
\ No newline at end of file
package cn.com.poc.human_resources.convert;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.human_resources.dto.BizHumanResourceResumeDto;
import cn.com.poc.human_resources.dto.ResumeDto;
import cn.com.poc.human_resources.entity.BizHumanResourceResumeEntity;
import cn.com.poc.human_resources.entity.resume.Info;
import cn.com.poc.human_resources.entity.resume.Resume;
import cn.com.poc.human_resources.entity.resume.Tag;
import cn.com.poc.human_resources.model.BizHumanResourceResumeModel;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.type.TypeReference;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.stream.Collectors;
public class BizHumanResourceResumeConvert {
public static BizHumanResourceResumeEntity modelToEntity(BizHumanResourceResumeModel model) {
BizHumanResourceResumeEntity entity = new BizHumanResourceResumeEntity();
entity.setId(model.getId());
entity.setName(model.getName());
entity.setCurrentPosition(model.getCurrentPosition());
entity.setPosition(model.getPosition());
entity.setFileUrl(model.getFileUrl());
entity.setCoreSkills(model.getCoreSkills());
entity.setEducationBackground(model.getEducationBackground());
entity.setEducationExperience(model.getEducationExperience());
entity.setGenderAndAge(model.getGenderAndAge());
entity.setOccupationalHistory(model.getOccupationalHistory());
entity.setOther(model.getOther());
entity.setWorkExperience(model.getWorkExperience());
entity.setWorkLocation(model.getWorkLocation());
entity.setLabel(model.getLabel());
entity.setEvaluate(model.getEvaluate());
entity.setMatchedDegree(model.getMatchedDegree());
entity.setMemberId(model.getMemberId());
entity.setIsDeleted(model.getIsDeleted());
entity.setCreator(model.getCreator());
entity.setCreatedTime(model.getCreatedTime());
entity.setModifier(model.getModifier());
entity.setModifiedTime(model.getModifiedTime());
entity.setSysVersion(model.getSysVersion());
return entity;
}
public static BizHumanResourceResumeModel entityToModel(BizHumanResourceResumeEntity entity) {
BizHumanResourceResumeModel model = new BizHumanResourceResumeModel();
model.setId(entity.getId());
model.setName(entity.getName());
model.setCurrentPosition(entity.getCurrentPosition());
model.setPosition(entity.getPosition());
model.setFileUrl(entity.getFileUrl());
model.setCoreSkills(entity.getCoreSkills());
model.setEducationBackground(entity.getEducationBackground());
model.setEducationExperience(entity.getEducationExperience());
model.setGenderAndAge(entity.getGenderAndAge());
model.setOccupationalHistory(entity.getOccupationalHistory());
model.setOther(entity.getOther());
model.setWorkExperience(entity.getWorkExperience());
model.setWorkLocation(entity.getWorkLocation());
model.setLabel(entity.getLabel());
model.setEvaluate(entity.getEvaluate());
model.setMatchedDegree(entity.getMatchedDegree());
model.setMemberId(entity.getMemberId());
model.setIsDeleted(entity.getIsDeleted());
model.setCreator(entity.getCreator());
model.setCreatedTime(entity.getCreatedTime());
model.setModifier(entity.getModifier());
model.setModifiedTime(entity.getModifiedTime());
model.setSysVersion(entity.getSysVersion());
return model;
}
public static BizHumanResourceResumeDto entityToDto(BizHumanResourceResumeEntity entity) {
BizHumanResourceResumeDto dto = new BizHumanResourceResumeDto();
dto.setId(entity.getId());
dto.setName(entity.getName());
dto.setCurrentPosition(entity.getCurrentPosition());
dto.setPosition(entity.getPosition());
dto.setFileUrl(entity.getFileUrl());
dto.setCoreSkills(entity.getCoreSkills());
dto.setEducationBackground(entity.getEducationBackground());
dto.setEducationExperience(entity.getEducationExperience());
dto.setGenderAndAge(entity.getGenderAndAge());
dto.setOccupationalHistory(entity.getOccupationalHistory());
dto.setOther(entity.getOther());
dto.setWorkExperience(entity.getWorkExperience());
dto.setWorkLocation(entity.getWorkLocation());
dto.setLabel(entity.getLabel());
dto.setEvaluate(entity.getEvaluate());
dto.setMatchedDegree(entity.getMatchedDegree());
dto.setMemberId(entity.getMemberId());
dto.setIsDeleted(entity.getIsDeleted());
dto.setCreator(entity.getCreator());
dto.setCreatedTime(entity.getCreatedTime());
dto.setModifier(entity.getModifier());
dto.setModifiedTime(entity.getModifiedTime());
dto.setSysVersion(entity.getSysVersion());
return dto;
}
public static BizHumanResourceResumeEntity dtoToEntity(BizHumanResourceResumeDto dto) {
BizHumanResourceResumeEntity entity = new BizHumanResourceResumeEntity();
entity.setId(dto.getId());
entity.setName(dto.getName());
entity.setCurrentPosition(dto.getCurrentPosition());
entity.setPosition(dto.getPosition());
entity.setFileUrl(dto.getFileUrl());
entity.setCoreSkills(dto.getCoreSkills());
entity.setEducationBackground(dto.getEducationBackground());
entity.setEducationExperience(dto.getEducationExperience());
entity.setGenderAndAge(dto.getGenderAndAge());
entity.setOccupationalHistory(dto.getOccupationalHistory());
entity.setOther(dto.getOther());
entity.setWorkExperience(dto.getWorkExperience());
entity.setWorkLocation(dto.getWorkLocation());
entity.setLabel(dto.getLabel());
entity.setEvaluate(dto.getEvaluate());
entity.setMatchedDegree(dto.getMatchedDegree());
entity.setMemberId(dto.getMemberId());
entity.setIsDeleted(dto.getIsDeleted());
entity.setCreator(dto.getCreator());
entity.setCreatedTime(dto.getCreatedTime());
entity.setModifier(dto.getModifier());
entity.setModifiedTime(dto.getModifiedTime());
entity.setSysVersion(dto.getSysVersion());
return entity;
}
public static ResumeDto entityToResumeDto(BizHumanResourceResumeEntity entity) {
ResumeDto dto = new ResumeDto();
dto.setId(entity.getId());
dto.setPositionId(entity.getPosition());
dto.setFileUrl(entity.getFileUrl());
Info info = new Info();
info.setName(entity.getName());
info.setCoreSkills(JsonUtils.deSerialize(entity.getCoreSkills(), new TypeReference<List<String>>() {
}.getType()));
info.setEducationBackground(JsonUtils.deSerialize(entity.getEducationBackground(), String.class));
if (StringUtils.isNotBlank(entity.getEducationExperience())) {
JSONObject jsonObject = JSONObject.parseObject(entity.getEducationExperience());
LinkedHashMap<String, String> map = new LinkedHashMap<>();
for (String key : jsonObject.keySet()) {
String value = jsonObject.getString(key);
map.put(key, value);
}
info.setEducationExperience(map);
}
info.setGenderAndAge(JsonUtils.deSerialize(entity.getGenderAndAge(), String.class));
if (StringUtils.isNotBlank(entity.getOccupationalHistory())) {
JSONObject jsonObject = JSONObject.parseObject(entity.getOccupationalHistory());
LinkedHashMap<String, List<String>> map = new LinkedHashMap<>();
for (String key : jsonObject.keySet()) {
JSONArray jsonArray = jsonObject.getJSONArray(key);
ArrayList<String> list = new ArrayList<>(jsonArray.size());
for (int i = 0; i < jsonArray.size(); i++) {
list.add(jsonArray.getString(i));
}
map.put(key, list);
}
info.setOccupationalHistory(map);
}
info.setCurrentPosition(entity.getCurrentPosition());
info.setOther(JsonUtils.deSerialize(entity.getOther(), new TypeReference<List<String>>() {
}.getType()));
info.setWorkExperience(JsonUtils.deSerialize(entity.getWorkExperience(), String.class));
info.setWorkLocation(JsonUtils.deSerialize(entity.getWorkLocation(), String.class));
dto.setInfo(info);
Tag tag = new Tag();
tag.setEvaluate(JsonUtils.deSerialize(entity.getEvaluate(), String.class));
tag.setLabel(JsonUtils.deSerialize(entity.getLabel(), new TypeReference<List<String>>() {
}.getType()));
tag.setMatchedDegree(entity.getMatchedDegree());
dto.setTag(tag);
return dto;
}
public static BizHumanResourceResumeEntity resumeToEntity(Resume resume) {
BizHumanResourceResumeEntity bizHumanResourceResumeEntity = new BizHumanResourceResumeEntity();
//info
bizHumanResourceResumeEntity.setName(resume.getInfo().getName());
bizHumanResourceResumeEntity.setCurrentPosition(resume.getInfo().getCurrentPosition());
bizHumanResourceResumeEntity.setCoreSkills(JsonUtils.serialize(resume.getInfo().getCoreSkills()));
bizHumanResourceResumeEntity.setEducationBackground(JsonUtils.serialize(resume.getInfo().getEducationBackground()));
bizHumanResourceResumeEntity.setEducationExperience(JsonUtils.serialize(resume.getInfo().getEducationExperience()));
bizHumanResourceResumeEntity.setGenderAndAge(JsonUtils.serialize(resume.getInfo().getGenderAndAge()));
bizHumanResourceResumeEntity.setOccupationalHistory(JsonUtils.serialize(resume.getInfo().getOccupationalHistory()));
bizHumanResourceResumeEntity.setOther(JsonUtils.serialize(resume.getInfo().getOther()));
bizHumanResourceResumeEntity.setWorkExperience(JsonUtils.serialize(resume.getInfo().getWorkExperience()));
bizHumanResourceResumeEntity.setWorkLocation(JsonUtils.serialize(resume.getInfo().getWorkLocation()));
// tag
bizHumanResourceResumeEntity.setLabel(JsonUtils.serialize(resume.getTag().getLabel()));
bizHumanResourceResumeEntity.setEvaluate(JsonUtils.serialize(resume.getTag().getEvaluate()));
bizHumanResourceResumeEntity.setMatchedDegree(Long.valueOf(resume.getTag().getMatchedDegree()));
return bizHumanResourceResumeEntity;
}
}
\ No newline at end of file
package cn.com.poc.human_resources.dto;
public class BizHumanResourcePositionDto {
private static final long serialVersionUID = 1L;
/**
* id
* 主键
*/
private java.lang.Long id;
public java.lang.Long getId() {
return this.id;
}
public void setId(java.lang.Long id) {
this.id = id;
}
/**
* job_title
* 职位名称
*/
private java.lang.String jobTitle;
public java.lang.String getJobTitle() {
return this.jobTitle;
}
public void setJobTitle(java.lang.String jobTitle) {
this.jobTitle = jobTitle;
}
/**
* department
* 所属部门
*/
private java.lang.String department;
public java.lang.String getDepartment() {
return this.department;
}
public void setDepartment(java.lang.String department) {
this.department = department;
}
/**
* work_location
* 工作地址
*/
private java.lang.String workLocation;
public java.lang.String getWorkLocation() {
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation) {
this.workLocation = workLocation;
}
/**
* job_nature
* 工作性质
*/
private java.lang.String jobNature;
public java.lang.String getJobNature() {
return this.jobNature;
}
public void setJobNature(java.lang.String jobNature) {
this.jobNature = jobNature;
}
/**
* number_recruits
* 招聘人数
*/
private java.lang.Integer numberOfRecruits;
public java.lang.Integer getNumberOfRecruits() {
return this.numberOfRecruits;
}
public void setNumberOfRecruits(java.lang.Integer numberOfRecruits) {
this.numberOfRecruits = numberOfRecruits;
}
/**
* work_experience
* 工作经验
*/
private java.lang.String workExperience;
public java.lang.String getWorkExperience() {
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience) {
this.workExperience = workExperience;
}
/**
* educational_re
* 学历要求
*/
private java.lang.String educationalRe;
public java.lang.String getEducationalRe() {
return this.educationalRe;
}
public void setEducationalRe(java.lang.String educationalRe) {
this.educationalRe = educationalRe;
}
/**
* salary_range
* 薪资要求
*/
private java.lang.String salaryRange;
public java.lang.String getSalaryRange() {
return this.salaryRange;
}
public void setSalaryRange(java.lang.String salaryRange) {
this.salaryRange = salaryRange;
}
/**
* job_requirements
* 任职资格
*/
private java.lang.String jobRequirements;
public java.lang.String getJobRequirements() {
return this.jobRequirements;
}
public void setJobRequirements(java.lang.String jobRequirements) {
this.jobRequirements = jobRequirements;
}
/**
* job_duties
* 职位描述
*/
private java.lang.String jobDuties;
public java.lang.String getJobDuties() {
return this.jobDuties;
}
public void setJobDuties(java.lang.String jobDuties) {
this.jobDuties = jobDuties;
}
/**
* essential
* 职位画像-必备项
*/
private java.lang.String essential;
public java.lang.String getEssential() {
return this.essential;
}
public void setEssential(java.lang.String essential) {
this.essential = essential;
}
/**
* bonusPoints
* 职位画像-加分项
*/
private java.lang.String bonusPoints;
public java.lang.String getBonusPoints() {
return this.bonusPoints;
}
public void setBonusPoints(java.lang.String bonusPoints) {
this.bonusPoints = bonusPoints;
}
/**
* exclusion
* 职位画像-排除项
*/
private java.lang.String exclusion;
public java.lang.String getExclusion() {
return this.exclusion;
}
public void setExclusion(java.lang.String exclusion) {
this.exclusion = exclusion;
}
}
\ No newline at end of file
package cn.com.poc.human_resources.dto;
public class BizHumanResourceResumeDto {
private static final long serialVersionUID = 1L;
/**
* id
* 主键id
*/
private java.lang.Long id;
public java.lang.Long getId() {
return this.id;
}
public void setId(java.lang.Long id) {
this.id = id;
}
/**
* position
* 职位ID
*/
private java.lang.Long position;
public java.lang.Long getPosition() {
return this.position;
}
public void setPosition(java.lang.Long position) {
this.position = position;
}
/**
* name
* 姓名
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 简历文件地址
*/
private String fileUrl;
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
/**
* 当前职位
*/
private String currentPosition;
public String getCurrentPosition() {
return currentPosition;
}
public void setCurrentPosition(String currentPosition) {
this.currentPosition = currentPosition;
}
/**
* core_skills
* 核心技能
*/
private java.lang.String coreSkills;
public java.lang.String getCoreSkills() {
return this.coreSkills;
}
public void setCoreSkills(java.lang.String coreSkills) {
this.coreSkills = coreSkills;
}
/**
* education_background
* 教育背景
*/
private java.lang.String educationBackground;
public java.lang.String getEducationBackground() {
return this.educationBackground;
}
public void setEducationBackground(java.lang.String educationBackground) {
this.educationBackground = educationBackground;
}
/**
* education_experience
* 教育经历
*/
private java.lang.String educationExperience;
public java.lang.String getEducationExperience() {
return this.educationExperience;
}
public void setEducationExperience(java.lang.String educationExperience) {
this.educationExperience = educationExperience;
}
/**
* gender_and_age
* 性别-年龄
*/
private java.lang.String genderAndAge;
public java.lang.String getGenderAndAge() {
return this.genderAndAge;
}
public void setGenderAndAge(java.lang.String genderAndAge) {
this.genderAndAge = genderAndAge;
}
/**
* occupational_history
* 工作经历
*/
private java.lang.String occupationalHistory;
public java.lang.String getOccupationalHistory() {
return this.occupationalHistory;
}
public void setOccupationalHistory(java.lang.String occupationalHistory) {
this.occupationalHistory = occupationalHistory;
}
/**
* other
* 技能证书、项目经验等补充内容
*/
private java.lang.String other;
public java.lang.String getOther() {
return this.other;
}
public void setOther(java.lang.String other) {
this.other = other;
}
/**
* work_experience
* 工作经验
*/
private java.lang.String workExperience;
public java.lang.String getWorkExperience() {
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience) {
this.workExperience = workExperience;
}
/**
* work_location
* 工作地址
*/
private java.lang.String workLocation;
public java.lang.String getWorkLocation() {
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation) {
this.workLocation = workLocation;
}
/**
* label
* 标签
*/
private java.lang.String label;
public java.lang.String getLabel() {
return this.label;
}
public void setLabel(java.lang.String label) {
this.label = label;
}
/**
* evaluate
* AI综合评价
*/
private java.lang.String evaluate;
public java.lang.String getEvaluate() {
return this.evaluate;
}
public void setEvaluate(java.lang.String evaluate) {
this.evaluate = evaluate;
}
/**
* matched_degree
* 匹配分
*/
private java.lang.Long matchedDegree;
public java.lang.Long getMatchedDegree() {
return this.matchedDegree;
}
public void setMatchedDegree(java.lang.Long matchedDegree) {
this.matchedDegree = matchedDegree;
}
/**
* member_id
* 上传人ID
*/
private java.lang.Long memberId;
public java.lang.Long getMemberId() {
return this.memberId;
}
public void setMemberId(java.lang.Long memberId) {
this.memberId = memberId;
}
/**
* is_deleted
* 是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted() {
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted) {
this.isDeleted = isDeleted;
}
/**
* CREATOR
* 创建人
*/
private java.lang.String creator;
public java.lang.String getCreator() {
return this.creator;
}
public void setCreator(java.lang.String creator) {
this.creator = creator;
}
/**
* CREATED_TIME
* 创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime() {
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime) {
this.createdTime = createdTime;
}
/**
* MODIFIER
* 修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier() {
return this.modifier;
}
public void setModifier(java.lang.String modifier) {
this.modifier = modifier;
}
/**
* MODIFIED_TIME
* 修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime() {
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime) {
this.modifiedTime = modifiedTime;
}
/**
* SYS_VERSION
* 乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion() {
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion) {
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.human_resources.dto;
import cn.com.poc.human_resources.entity.HumanResourcePositionBaseInfo;
/**
* @author alex.yao
* @date 2025/10/10
*/
public class HumanResourcePositionBaseInfoDto extends HumanResourcePositionBaseInfo {
}
package cn.com.poc.human_resources.dto;
import cn.com.poc.human_resources.entity.position.BaseInfo;
import cn.com.poc.human_resources.entity.position.Job;
import cn.com.poc.human_resources.entity.position.Por;
/**
* @author alex.yao
* @date 2025/9/30
*/
public class HumanResourcePositionDto {
private Long id;
private BaseInfo baseInfo;
private Job job;
private Por por;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public BaseInfo getBaseInfo() {
return baseInfo;
}
public void setBaseInfo(BaseInfo baseInfo) {
this.baseInfo = baseInfo;
}
public Job getJob() {
return job;
}
public void setJob(Job job) {
this.job = job;
}
public Por getPor() {
return por;
}
public void setPor(Por por) {
this.por = por;
}
}
package cn.com.poc.human_resources.dto;
/**
* @author alex.yao
* @date 2025/9/29
*/
public class PositionAssistantDto {
private String demand;
private String type;
private String fileInfos;
private String jobInformation;
private String question;
private String dialoguesId;
public String getDemand() {
return demand;
}
public void setDemand(String demand) {
this.demand = demand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getFileInfos() {
return fileInfos;
}
public void setFileInfos(String fileInfos) {
this.fileInfos = fileInfos;
}
public String getJobInformation() {
return jobInformation;
}
public void setJobInformation(String jobInformation) {
this.jobInformation = jobInformation;
}
public String getQuestion() {
return question;
}
public void setQuestion(String question) {
this.question = question;
}
public String getDialoguesId() {
return dialoguesId;
}
public void setDialoguesId(String dialoguesId) {
this.dialoguesId = dialoguesId;
}
}
package cn.com.poc.human_resources.dto;
import cn.com.poc.human_resources.entity.resume.Resume;
/**
* @author alex.yao
* @date 2025/10/9
*/
public class ResumeDto extends Resume {
private Long id;
private Long positionId;
private String fileUrl;
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getPositionId() {
return positionId;
}
public void setPositionId(Long positionId) {
this.positionId = positionId;
}
}
package cn.com.poc.human_resources.dto;
import cn.com.poc.human_resources.entity.resume.Resume;
/**
* @author alex.yao
* @date 2025/10/9
*/
public class SaveResumeDto {
private Long id;
private String fileURL;
private Resume resume;
private Long positionId;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getPositionId() {
return positionId;
}
public void setPositionId(Long positionId) {
this.positionId = positionId;
}
public String getFileURL() {
return fileURL;
}
public void setFileURL(String fileURL) {
this.fileURL = fileURL;
}
public Resume getResume() {
return resume;
}
public void setResume(Resume resume) {
this.resume = resume;
}
}
package cn.com.poc.human_resources.dto;
/**
* @author alex.yao
* @date 2025/9/28
*/
public class UploadResumeDto {
private String fileURL;
private Long positionId;
public String getFileURL() {
return fileURL;
}
public void setFileURL(String fileURL) {
this.fileURL = fileURL;
}
public Long getPositionId() {
return positionId;
}
public void setPositionId(Long positionId) {
this.positionId = positionId;
}
}
package cn.com.poc.human_resources.entity;
import javax.persistence.Column;
public class BizHumanResourcePositionEntity {
private static final long serialVersionUID = 1L;
/** id
*主键
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** job_title
*职位名称
*/
private java.lang.String jobTitle;
public java.lang.String getJobTitle(){
return this.jobTitle;
}
public void setJobTitle(java.lang.String jobTitle){
this.jobTitle = jobTitle;
}
/** department
*所属部门
*/
private java.lang.String department;
public java.lang.String getDepartment(){
return this.department;
}
public void setDepartment(java.lang.String department){
this.department = department;
}
/** work_location
*工作地址
*/
private java.lang.String workLocation;
public java.lang.String getWorkLocation(){
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation){
this.workLocation = workLocation;
}
/** job_nature
*工作性质
*/
private java.lang.String jobNature;
public java.lang.String getJobNature(){
return this.jobNature;
}
public void setJobNature(java.lang.String jobNature){
this.jobNature = jobNature;
}
/** number_recruits
*招聘人数
*/
private java.lang.Integer numberOfRecruits;
public java.lang.Integer getNumberOfRecruits(){
return this.numberOfRecruits;
}
public void setNumberOfRecruits(java.lang.Integer numberOfRecruits){
this.numberOfRecruits = numberOfRecruits;
}
/** work_experience
*工作经验
*/
private java.lang.String workExperience;
public java.lang.String getWorkExperience(){
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience){
this.workExperience = workExperience;
}
/** educational_re
*学历要求
*/
private java.lang.String educationalRe;
public java.lang.String getEducationalRe(){
return this.educationalRe;
}
public void setEducationalRe(java.lang.String educationalRe){
this.educationalRe = educationalRe;
}
/** salary_range
*薪资要求
*/
private java.lang.String salaryRange;
public java.lang.String getSalaryRange(){
return this.salaryRange;
}
public void setSalaryRange(java.lang.String salaryRange){
this.salaryRange = salaryRange;
}
/** job_requirements
*任职资格
*/
private java.lang.String jobRequirements;
public java.lang.String getJobRequirements(){
return this.jobRequirements;
}
public void setJobRequirements(java.lang.String jobRequirements){
this.jobRequirements = jobRequirements;
}
/** job_duties
*职位描述
*/
private java.lang.String jobDuties;
public java.lang.String getJobDuties(){
return this.jobDuties;
}
public void setJobDuties(java.lang.String jobDuties){
this.jobDuties = jobDuties;
}
/** essential
*职位画像-必备项
*/
private java.lang.String essential;
public java.lang.String getEssential(){
return this.essential;
}
public void setEssential(java.lang.String essential){
this.essential = essential;
}
/** bonusPoints
*职位画像-加分项
*/
private java.lang.String bonusPoints;
public java.lang.String getBonusPoints(){
return this.bonusPoints;
}
public void setBonusPoints(java.lang.String bonusPoints){
this.bonusPoints = bonusPoints;
}
/** exclusion
*职位画像-排除项
*/
private java.lang.String exclusion;
public java.lang.String getExclusion(){
return this.exclusion;
}
public void setExclusion(java.lang.String exclusion){
this.exclusion = exclusion;
}
/** member_id
*创建人ID
*/
private java.lang.Long memberId;
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.human_resources.entity;
import javax.persistence.Column;
public class BizHumanResourceResumeEntity {
private static final long serialVersionUID = 1L;
/** id
*主键id
*/
private java.lang.Long id;
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** position
*职位ID
*/
private java.lang.Long position;
public java.lang.Long getPosition(){
return this.position;
}
public void setPosition(java.lang.Long position){
this.position = position;
}
/**
* name
* 姓名
*/
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
/**
* 简历文件地址
*/
private String fileUrl;
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
}
/**
* 当前职位
*/
private String currentPosition;
public String getCurrentPosition() {
return currentPosition;
}
public void setCurrentPosition(String currentPosition) {
this.currentPosition = currentPosition;
}
/** core_skills
*核心技能
*/
private java.lang.String coreSkills;
public java.lang.String getCoreSkills(){
return this.coreSkills;
}
public void setCoreSkills(java.lang.String coreSkills){
this.coreSkills = coreSkills;
}
/** education_background
*教育背景
*/
private java.lang.String educationBackground;
public java.lang.String getEducationBackground(){
return this.educationBackground;
}
public void setEducationBackground(java.lang.String educationBackground){
this.educationBackground = educationBackground;
}
/** education_experience
*教育经历
*/
private java.lang.String educationExperience;
public java.lang.String getEducationExperience(){
return this.educationExperience;
}
public void setEducationExperience(java.lang.String educationExperience){
this.educationExperience = educationExperience;
}
/** gender_and_age
*性别-年龄
*/
private java.lang.String genderAndAge;
public java.lang.String getGenderAndAge(){
return this.genderAndAge;
}
public void setGenderAndAge(java.lang.String genderAndAge){
this.genderAndAge = genderAndAge;
}
/** occupational_history
*工作经历
*/
private java.lang.String occupationalHistory;
public java.lang.String getOccupationalHistory(){
return this.occupationalHistory;
}
public void setOccupationalHistory(java.lang.String occupationalHistory){
this.occupationalHistory = occupationalHistory;
}
/** other
*技能证书、项目经验等补充内容
*/
private java.lang.String other;
public java.lang.String getOther(){
return this.other;
}
public void setOther(java.lang.String other){
this.other = other;
}
/** work_experience
*工作经验
*/
private java.lang.String workExperience;
public java.lang.String getWorkExperience(){
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience){
this.workExperience = workExperience;
}
/** work_location
*工作地址
*/
private java.lang.String workLocation;
public java.lang.String getWorkLocation(){
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation){
this.workLocation = workLocation;
}
/** label
*标签
*/
private java.lang.String label;
public java.lang.String getLabel(){
return this.label;
}
public void setLabel(java.lang.String label){
this.label = label;
}
/** evaluate
*AI综合评价
*/
private java.lang.String evaluate;
public java.lang.String getEvaluate(){
return this.evaluate;
}
public void setEvaluate(java.lang.String evaluate){
this.evaluate = evaluate;
}
/** matched_degree
*匹配分
*/
private java.lang.Long matchedDegree;
public java.lang.Long getMatchedDegree(){
return this.matchedDegree;
}
public void setMatchedDegree(java.lang.Long matchedDegree){
this.matchedDegree = matchedDegree;
}
/** member_id
*上传人ID
*/
private java.lang.Long memberId;
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
}
}
\ No newline at end of file
package cn.com.poc.human_resources.entity;
/**
* @author alex.yao
* @date 2025/10/10
*/
public class HumanResourcePositionBaseInfo {
private Long id;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
/**
* job_title
* 职位名称
*/
private java.lang.String jobTitle;
public java.lang.String getJobTitle() {
return this.jobTitle;
}
public void setJobTitle(java.lang.String jobTitle) {
this.jobTitle = jobTitle;
}
/**
* work_location
* 工作地址
*/
private java.lang.String workLocation;
public java.lang.String getWorkLocation() {
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation) {
this.workLocation = workLocation;
}
/**
* job_nature
* 工作性质
*/
private java.lang.String jobNature;
public java.lang.String getJobNature() {
return this.jobNature;
}
public void setJobNature(java.lang.String jobNature) {
this.jobNature = jobNature;
}
/**
* work_experience
* 工作经验
*/
private java.lang.String workExperience;
public java.lang.String getWorkExperience() {
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience) {
this.workExperience = workExperience;
}
/**
* 简历数量
*/
private Long resumeCount;
public Long getResumeCount() {
return resumeCount;
}
public void setResumeCount(Long resumeCount) {
this.resumeCount = resumeCount;
}
}
package cn.com.poc.human_resources.entity.position;
/**
* @author alex.yao
* @date 2025/9/30
*/
public class BaseInfo {
/** job_title
*职位名称
*/
private java.lang.String jobTitle;
public java.lang.String getJobTitle(){
return this.jobTitle;
}
public void setJobTitle(java.lang.String jobTitle){
this.jobTitle = jobTitle;
}
/** department
*所属部门
*/
private java.lang.String department;
public java.lang.String getDepartment(){
return this.department;
}
public void setDepartment(java.lang.String department){
this.department = department;
}
/** work_location
*工作地址
*/
private java.lang.String workLocation;
public java.lang.String getWorkLocation(){
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation){
this.workLocation = workLocation;
}
/** job_nature
*工作性质
*/
private java.lang.String jobNature;
public java.lang.String getJobNature(){
return this.jobNature;
}
public void setJobNature(java.lang.String jobNature){
this.jobNature = jobNature;
}
/** number_recruits
*招聘人数
*/
private java.lang.Integer numberOfRecruits;
public java.lang.Integer getNumberOfRecruits(){
return this.numberOfRecruits;
}
public void setNumberOfRecruits(java.lang.Integer numberOfRecruits){
this.numberOfRecruits = numberOfRecruits;
}
/** work_experience
*工作经验
*/
private java.lang.String workExperience;
public java.lang.String getWorkExperience(){
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience){
this.workExperience = workExperience;
}
/** educational_re
*学历要求
*/
private java.lang.String educationalRe;
public java.lang.String getEducationalRe(){
return this.educationalRe;
}
public void setEducationalRe(java.lang.String educationalRe){
this.educationalRe = educationalRe;
}
/** salary_range
*薪资要求
*/
private java.lang.String salaryRange;
public java.lang.String getSalaryRange(){
return this.salaryRange;
}
public void setSalaryRange(java.lang.String salaryRange){
this.salaryRange = salaryRange;
}
}
package cn.com.poc.human_resources.entity.position;
/**
* @author alex.yao
* @date 2025/9/30
*/
public class Job {
/**
* 职位描述
*/
private String jobDuties;
/**
* 任职资格
*/
private String jobRequirements;
public String getJobDuties() {
return jobDuties;
}
public void setJobDuties(String jobDuties) {
this.jobDuties = jobDuties;
}
public String getJobRequirements() {
return jobRequirements;
}
public void setJobRequirements(String jobRequirements) {
this.jobRequirements = jobRequirements;
}
}
package cn.com.poc.human_resources.entity.position;
import java.util.Map;
/**
* @author alex.yao
* @date 2025/9/30
*/
public class Por {
/**
* 必备项
*/
private Map<String, String> essential;
/**
* 加分项
*/
private Map<String, String> bonusPoints;
/**
* 排除项
*/
private Map<String, String> exclusion;
public Map<String, String> getEssential() {
return essential;
}
public void setEssential(Map<String, String> essential) {
this.essential = essential;
}
public Map<String, String> getBonusPoints() {
return bonusPoints;
}
public void setBonusPoints(Map<String, String> bonusPoints) {
this.bonusPoints = bonusPoints;
}
public Map<String, String> getExclusion() {
return exclusion;
}
public void setExclusion(Map<String, String> exclusion) {
this.exclusion = exclusion;
}
}
package cn.com.poc.human_resources.entity.resume;
import java.util.List;
import java.util.Map;
public class Info {
private String name;
private String currentPosition;
private List<String> coreSkills;
private String educationBackground;
private Map<String, String> educationExperience;
private String genderAndAge;
private Map<String, List<String>> occupationalHistory;
private List<String> other;
private String workExperience;
private String workLocation;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCurrentPosition() {
return currentPosition;
}
public void setCurrentPosition(String currentPosition) {
this.currentPosition = currentPosition;
}
public List<String> getCoreSkills() {
return coreSkills;
}
public void setCoreSkills(List<String> coreSkills) {
this.coreSkills = coreSkills;
}
public String getEducationBackground() {
return educationBackground;
}
public void setEducationBackground(String educationBackground) {
this.educationBackground = educationBackground;
}
public Map<String, String> getEducationExperience() {
return educationExperience;
}
public void setEducationExperience(Map<String, String> educationExperience) {
this.educationExperience = educationExperience;
}
public String getGenderAndAge() {
return genderAndAge;
}
public void setGenderAndAge(String genderAndAge) {
this.genderAndAge = genderAndAge;
}
public Map<String, List<String>> getOccupationalHistory() {
return occupationalHistory;
}
public void setOccupationalHistory(Map<String, List<String>> occupationalHistory) {
this.occupationalHistory = occupationalHistory;
}
public List<String> getOther() {
return other;
}
public void setOther(List<String> other) {
this.other = other;
}
public String getWorkExperience() {
return workExperience;
}
public void setWorkExperience(String workExperience) {
this.workExperience = workExperience;
}
public String getWorkLocation() {
return workLocation;
}
public void setWorkLocation(String workLocation) {
this.workLocation = workLocation;
}
}
package cn.com.poc.human_resources.entity.resume;
public class Resume {
private Info info;
private Tag tag;
public Info getInfo() {
return info;
}
public void setInfo(Info info) {
this.info = info;
}
public Tag getTag() {
return tag;
}
public void setTag(Tag tag) {
this.tag = tag;
}
}
package cn.com.poc.human_resources.entity.resume;
import java.util.List;
public class Tag {
private String evaluate;
private List<String> label;
private Long matchedDegree;
public String getEvaluate() {
return evaluate;
}
public void setEvaluate(String evaluate) {
this.evaluate = evaluate;
}
public List<String> getLabel() {
return label;
}
public void setLabel(List<String> label) {
this.label = label;
}
public Long getMatchedDegree() {
return matchedDegree;
}
public void setMatchedDegree(Long matchedDegree) {
this.matchedDegree = matchedDegree;
}
}
package cn.com.poc.human_resources.model;
import java.io.Serializable;
import cn.com.yict.framemax.data.model.BaseModelClass;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Version;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
/**
* Model class for biz_human_resource_position
* 人力资源职位信息表
*/
@Entity
@Table(name = "biz_human_resource_position")
@DynamicInsert
@DynamicUpdate
public class BizHumanResourcePositionModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/** id
*主键
*/
private java.lang.Long id;
@Column(name = "id",length = 19)
@Id @GeneratedValue(strategy = GenerationType.AUTO)
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
super.addValidField("id");
}
/** job_title
*职位名称
*/
private java.lang.String jobTitle;
@Column(name = "job_title",length = 100)
public java.lang.String getJobTitle(){
return this.jobTitle;
}
public void setJobTitle(java.lang.String jobTitle){
this.jobTitle = jobTitle;
super.addValidField("jobTitle");
}
/** department
*所属部门
*/
private java.lang.String department;
@Column(name = "department",length = 100)
public java.lang.String getDepartment(){
return this.department;
}
public void setDepartment(java.lang.String department){
this.department = department;
super.addValidField("department");
}
/** work_location
*工作地址
*/
private java.lang.String workLocation;
@Column(name = "work_location",length = 100)
public java.lang.String getWorkLocation(){
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation){
this.workLocation = workLocation;
super.addValidField("workLocation");
}
/** job_nature
*工作性质
*/
private java.lang.String jobNature;
@Column(name = "job_nature",length = 100)
public java.lang.String getJobNature(){
return this.jobNature;
}
public void setJobNature(java.lang.String jobNature){
this.jobNature = jobNature;
super.addValidField("jobNature");
}
/** number_of_recruits
*招聘人数
*/
private java.lang.Integer numberOfRecruits;
@Column(name = "number_of_recruits",length = 10)
public java.lang.Integer getNumberOfRecruits(){
return this.numberOfRecruits;
}
public void setNumberOfRecruits(java.lang.Integer numberOfRecruits){
this.numberOfRecruits = numberOfRecruits;
super.addValidField("numberOfRecruits");
}
/** work_experience
*工作经验
*/
private java.lang.String workExperience;
@Column(name = "work_experience",length = 100)
public java.lang.String getWorkExperience(){
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience){
this.workExperience = workExperience;
super.addValidField("workExperience");
}
/** educational_re
*学历要求
*/
private java.lang.String educationalRe;
@Column(name = "educational_re",length = 100)
public java.lang.String getEducationalRe(){
return this.educationalRe;
}
public void setEducationalRe(java.lang.String educationalRe){
this.educationalRe = educationalRe;
super.addValidField("educationalRe");
}
/** salary_range
*薪资要求
*/
private java.lang.String salaryRange;
@Column(name = "salary_range",length = 100)
public java.lang.String getSalaryRange(){
return this.salaryRange;
}
public void setSalaryRange(java.lang.String salaryRange){
this.salaryRange = salaryRange;
super.addValidField("salaryRange");
}
/** job_requirements
*任职资格
*/
private java.lang.String jobRequirements;
@Column(name = "job_requirements",length = 2147483647)
public java.lang.String getJobRequirements(){
return this.jobRequirements;
}
public void setJobRequirements(java.lang.String jobRequirements){
this.jobRequirements = jobRequirements;
super.addValidField("jobRequirements");
}
/** job_duties
*职位描述
*/
private java.lang.String jobDuties;
@Column(name = "job_duties",length = 2147483647)
public java.lang.String getJobDuties(){
return this.jobDuties;
}
public void setJobDuties(java.lang.String jobDuties){
this.jobDuties = jobDuties;
super.addValidField("jobDuties");
}
/** essential
*职位画像-必备项
*/
private java.lang.String essential;
@Column(name = "essential",length = 1073741824)
public java.lang.String getEssential(){
return this.essential;
}
public void setEssential(java.lang.String essential){
this.essential = essential;
super.addValidField("essential");
}
/** bonusPoints
*职位画像-加分项
*/
private java.lang.String bonusPoints;
@Column(name = "bonusPoints",length = 1073741824)
public java.lang.String getBonusPoints(){
return this.bonusPoints;
}
public void setBonusPoints(java.lang.String bonusPoints){
this.bonusPoints = bonusPoints;
super.addValidField("bonusPoints");
}
/** exclusion
*职位画像-排除项
*/
private java.lang.String exclusion;
@Column(name = "exclusion",length = 1073741824)
public java.lang.String getExclusion(){
return this.exclusion;
}
public void setExclusion(java.lang.String exclusion){
this.exclusion = exclusion;
super.addValidField("exclusion");
}
/** member_id
*创建人ID
*/
private java.lang.Long memberId;
@Column(name = "member_id",length = 19)
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
super.addValidField("memberId");
}
/** is_deleted
*是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
@Column(name = "is_deleted",length = 1)
public java.lang.String getIsDeleted(){
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted){
this.isDeleted = isDeleted;
super.addValidField("isDeleted");
}
/** CREATOR
*创建人
*/
private java.lang.String creator;
@Column(name = "CREATOR",length = 225)
public java.lang.String getCreator(){
return this.creator;
}
public void setCreator(java.lang.String creator){
this.creator = creator;
super.addValidField("creator");
}
/** CREATED_TIME
*创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME",length = 19)
public java.util.Date getCreatedTime(){
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime){
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/** MODIFIER
*修改人
*/
private java.lang.String modifier;
@Column(name = "MODIFIER",length = 225)
public java.lang.String getModifier(){
return this.modifier;
}
public void setModifier(java.lang.String modifier){
this.modifier = modifier;
super.addValidField("modifier");
}
/** MODIFIED_TIME
*修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME",length = 19)
public java.util.Date getModifiedTime(){
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime){
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/** SYS_VERSION
*乐观锁,版本号
*/
private java.lang.Integer sysVersion;
@Column(name = "SYS_VERSION",length = 10)
@Version
public java.lang.Integer getSysVersion(){
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion){
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
package cn.com.poc.human_resources.model;
import java.io.Serializable;
import cn.com.yict.framemax.data.model.BaseModelClass;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Id;
import org.hibernate.annotations.DynamicInsert;
import org.hibernate.annotations.DynamicUpdate;
import javax.persistence.Version;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
/**
* Model class for biz_human_resource_resume
* 人力资源-简历信息
*/
@Entity
@Table(name = "biz_human_resource_resume")
@DynamicInsert
@DynamicUpdate
public class BizHumanResourceResumeModel extends BaseModelClass implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
* 主键id
*/
private java.lang.Long id;
@Column(name = "id", length = 19)
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public java.lang.Long getId() {
return this.id;
}
public void setId(java.lang.Long id) {
this.id = id;
super.addValidField("id");
}
/**
* name
* 姓名
*/
private String name;
@Column(name = "name", length = 100)
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
super.addValidField("name");
}
/**
* position
* 职位ID
*/
private java.lang.Long position;
@Column(name = "position", length = 19)
public java.lang.Long getPosition() {
return this.position;
}
public void setPosition(java.lang.Long position) {
this.position = position;
super.addValidField("position");
}
/**
* 当前职位
*/
private String currentPosition;
@Column(name = "current_position", length = 100)
public String getCurrentPosition() {
return currentPosition;
}
public void setCurrentPosition(String currentPosition) {
this.currentPosition = currentPosition;
super.addValidField("currentPosition");
}
/**
* 简历文件地址
*/
private String fileUrl;
@Column(name = "file_url", length = 200)
public String getFileUrl() {
return fileUrl;
}
public void setFileUrl(String fileUrl) {
this.fileUrl = fileUrl;
super.addValidField("fileUrl");
}
/**
* core_skills
* 核心技能
*/
private java.lang.String coreSkills;
@Column(name = "core_skills", length = 1073741824)
public java.lang.String getCoreSkills() {
return this.coreSkills;
}
public void setCoreSkills(java.lang.String coreSkills) {
this.coreSkills = coreSkills;
super.addValidField("coreSkills");
}
/**
* education_background
* 教育背景
*/
private java.lang.String educationBackground;
@Column(name = "education_background", length = 100)
public java.lang.String getEducationBackground() {
return this.educationBackground;
}
public void setEducationBackground(java.lang.String educationBackground) {
this.educationBackground = educationBackground;
super.addValidField("educationBackground");
}
/**
* education_experience
* 教育经历
*/
private java.lang.String educationExperience;
@Column(name = "education_experience", length = 1073741824)
public java.lang.String getEducationExperience() {
return this.educationExperience;
}
public void setEducationExperience(java.lang.String educationExperience) {
this.educationExperience = educationExperience;
super.addValidField("educationExperience");
}
/**
* gender_and_age
* 性别-年龄
*/
private java.lang.String genderAndAge;
@Column(name = "gender_and_age", length = 100)
public java.lang.String getGenderAndAge() {
return this.genderAndAge;
}
public void setGenderAndAge(java.lang.String genderAndAge) {
this.genderAndAge = genderAndAge;
super.addValidField("genderAndAge");
}
/**
* occupational_history
* 工作经历
*/
private java.lang.String occupationalHistory;
@Column(name = "occupational_history", length = 1073741824)
public java.lang.String getOccupationalHistory() {
return this.occupationalHistory;
}
public void setOccupationalHistory(java.lang.String occupationalHistory) {
this.occupationalHistory = occupationalHistory;
super.addValidField("occupationalHistory");
}
/**
* other
* 技能证书、项目经验等补充内容
*/
private java.lang.String other;
@Column(name = "other", length = 1073741824)
public java.lang.String getOther() {
return this.other;
}
public void setOther(java.lang.String other) {
this.other = other;
super.addValidField("other");
}
/**
* work_experience
* 工作经验
*/
private java.lang.String workExperience;
@Column(name = "work_experience", length = 100)
public java.lang.String getWorkExperience() {
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience) {
this.workExperience = workExperience;
super.addValidField("workExperience");
}
/**
* work_location
* 工作地址
*/
private java.lang.String workLocation;
@Column(name = "work_location", length = 100)
public java.lang.String getWorkLocation() {
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation) {
this.workLocation = workLocation;
super.addValidField("workLocation");
}
/**
* label
* 标签
*/
private java.lang.String label;
@Column(name = "label", length = 1073741824)
public java.lang.String getLabel() {
return this.label;
}
public void setLabel(java.lang.String label) {
this.label = label;
super.addValidField("label");
}
/**
* evaluate
* AI综合评价
*/
private java.lang.String evaluate;
@Column(name = "evaluate", length = 2147483647)
public java.lang.String getEvaluate() {
return this.evaluate;
}
public void setEvaluate(java.lang.String evaluate) {
this.evaluate = evaluate;
super.addValidField("evaluate");
}
/**
* matched_degree
* 匹配分
*/
private java.lang.Long matchedDegree;
@Column(name = "matched_degree", length = 22)
public java.lang.Long getMatchedDegree() {
return this.matchedDegree;
}
public void setMatchedDegree(java.lang.Long matchedDegree) {
this.matchedDegree = matchedDegree;
super.addValidField("matchedDegree");
}
/**
* member_id
* 上传人ID
*/
private java.lang.Long memberId;
@Column(name = "member_id", length = 19)
public java.lang.Long getMemberId() {
return this.memberId;
}
public void setMemberId(java.lang.Long memberId) {
this.memberId = memberId;
super.addValidField("memberId");
}
/**
* is_deleted
* 是否删除 1、Y 是 2、N 否
*/
private java.lang.String isDeleted;
@Column(name = "is_deleted", length = 1)
public java.lang.String getIsDeleted() {
return this.isDeleted;
}
public void setIsDeleted(java.lang.String isDeleted) {
this.isDeleted = isDeleted;
super.addValidField("isDeleted");
}
/**
* CREATOR
* 创建人
*/
private java.lang.String creator;
@Column(name = "CREATOR", length = 225)
public java.lang.String getCreator() {
return this.creator;
}
public void setCreator(java.lang.String creator) {
this.creator = creator;
super.addValidField("creator");
}
/**
* CREATED_TIME
* 创建时间
*/
private java.util.Date createdTime;
@Column(name = "CREATED_TIME", length = 19)
public java.util.Date getCreatedTime() {
return this.createdTime;
}
public void setCreatedTime(java.util.Date createdTime) {
this.createdTime = createdTime;
super.addValidField("createdTime");
}
/**
* MODIFIER
* 修改人
*/
private java.lang.String modifier;
@Column(name = "MODIFIER", length = 225)
public java.lang.String getModifier() {
return this.modifier;
}
public void setModifier(java.lang.String modifier) {
this.modifier = modifier;
super.addValidField("modifier");
}
/**
* MODIFIED_TIME
* 修改时间
*/
private java.util.Date modifiedTime;
@Column(name = "MODIFIED_TIME", length = 19)
public java.util.Date getModifiedTime() {
return this.modifiedTime;
}
public void setModifiedTime(java.util.Date modifiedTime) {
this.modifiedTime = modifiedTime;
super.addValidField("modifiedTime");
}
/**
* SYS_VERSION
* 乐观锁,版本号
*/
private java.lang.Integer sysVersion;
@Column(name = "SYS_VERSION", length = 10)
@Version
public java.lang.Integer getSysVersion() {
return this.sysVersion;
}
public void setSysVersion(java.lang.Integer sysVersion) {
this.sysVersion = sysVersion;
super.addValidField("sysVersion");
}
}
\ No newline at end of file
select
bhrp.id,
bhrp.job_title,
bhrp.work_location,
bhrp.job_nature,
bhrp.work_experience,
bhrp.member_id,
count(bhrr.id) as resume_count
from
biz_human_resource_position bhrp
left join biz_human_resource_resume bhrr on bhrr.`position` = bhrp.id and bhrr.is_deleted ='N'
where
bhrp.is_deleted = 'N'
<< and bhrp.member_id = :memberId >>
GROUP BY
bhrp.id
order by bhrp.CREATED_TIME desc
\ No newline at end of file
package cn.com.poc.human_resources.query;
import java.io.Serializable;
/**
* Query Condition class for PositionListQuery
*/
public class PositionListQueryCondition implements Serializable{
private static final long serialVersionUID = 1L;
private java.lang.Long memberId;
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
}
}
\ No newline at end of file
package cn.com.poc.human_resources.query;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import cn.com.yict.framemax.data.model.BaseItemClass;
/**
* Query Item class for PositionListQuery
*/
@Entity
public class PositionListQueryItem extends BaseItemClass implements Serializable{
private static final long serialVersionUID = 1L;
/** id
*id
*/
private java.lang.Long id;
@Column(name = "id")
public java.lang.Long getId(){
return this.id;
}
public void setId(java.lang.Long id){
this.id = id;
}
/** job_title
*job_title
*/
private java.lang.String jobTitle;
@Column(name = "job_title")
public java.lang.String getJobTitle(){
return this.jobTitle;
}
public void setJobTitle(java.lang.String jobTitle){
this.jobTitle = jobTitle;
}
/** work_location
*work_location
*/
private java.lang.String workLocation;
@Column(name = "work_location")
public java.lang.String getWorkLocation(){
return this.workLocation;
}
public void setWorkLocation(java.lang.String workLocation){
this.workLocation = workLocation;
}
/** job_nature
*job_nature
*/
private java.lang.String jobNature;
@Column(name = "job_nature")
public java.lang.String getJobNature(){
return this.jobNature;
}
public void setJobNature(java.lang.String jobNature){
this.jobNature = jobNature;
}
/** work_experience
*work_experience
*/
private java.lang.String workExperience;
@Column(name = "work_experience")
public java.lang.String getWorkExperience(){
return this.workExperience;
}
public void setWorkExperience(java.lang.String workExperience){
this.workExperience = workExperience;
}
/** member_id
*member_id
*/
private java.lang.Long memberId;
@Column(name = "member_id")
public java.lang.Long getMemberId(){
return this.memberId;
}
public void setMemberId(java.lang.Long memberId){
this.memberId = memberId;
}
/** resume_count
*resume_count
*/
private java.lang.Long resumeCount;
@Column(name = "resume_count")
public java.lang.Long getResumeCount(){
return this.resumeCount;
}
public void setResumeCount(java.lang.Long resumeCount){
this.resumeCount = resumeCount;
}
}
\ No newline at end of file
package cn.com.poc.human_resources.repository;
import cn.com.yict.framemax.data.repository.Repository;
import cn.com.poc.human_resources.model.BizHumanResourcePositionModel;
public interface BizHumanResourcePositionRepository extends Repository<BizHumanResourcePositionModel,java.lang.Long> {
}
\ No newline at end of file
package cn.com.poc.human_resources.repository;
import cn.com.yict.framemax.data.repository.Repository;
import cn.com.poc.human_resources.model.BizHumanResourceResumeModel;
public interface BizHumanResourceResumeRepository extends Repository<BizHumanResourceResumeModel,java.lang.Long> {
}
\ No newline at end of file
package cn.com.poc.human_resources.rest;
import cn.com.poc.human_resources.dto.*;
import cn.com.yict.framemax.core.rest.BaseRest;
import cn.com.yict.framemax.data.model.PagingInfo;
import cn.com.yict.framemax.web.permission.Access;
import cn.com.yict.framemax.web.permission.Permission;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.List;
/**
* 人力资源Agent服务接口
*
* @author alex.yao
* @date 2025/9/28
*/
@Permission(Access.Safety)
public interface HumanResourceRest extends BaseRest {
/**
* 上传简历
*/
Object uploadResume(@RequestBody UploadResumeDto uploadResumeDto) throws Exception;
/**
* 职位助手-对话/内容生成
*
* @param positionAssistantDto
* @throws Exception
*/
void positionAssistant(@RequestBody PositionAssistantDto positionAssistantDto) throws Exception;
// ------------------------- 职位 -------------------------- //
/**
* 保存职位信息
*
* @param humanResourcePositionDto
* @throws Exception
*/
void savePosition(@RequestBody HumanResourcePositionDto humanResourcePositionDto) throws Exception;
/**
* 查询职位列表
*/
List<HumanResourcePositionBaseInfoDto> listPositions(PagingInfo pagingInfo) throws Exception;
/**
* 查询职位详情
*
* @param positionId 职位id
*/
HumanResourcePositionDto getPositionDetail(@RequestParam Long positionId) throws Exception;
/**
* 删除职位[批量]
*
* @param positionIds 职位ID
*/
void deletePositions(@RequestParam Long... positionIds) throws Exception;
// ------------------------- 简历 -------------------------- //
/**
* 保存简历信息
*
* @param saveResumeDto
* @throws Exception
*/
void saveResume(@RequestBody SaveResumeDto saveResumeDto) throws Exception;
/**
* 查询简历列表
*
* @param positionId 岗位ID
*/
List<ResumeDto> listResumes(@RequestParam Long positionId, PagingInfo pagingInfo) throws Exception;
/**
* 查询简历详情
*
* @param resumeId
* @return
* @throws Exception
*/
ResumeDto getResumeDetail(@RequestParam Long resumeId) throws Exception;
/**
* 删除简历[批量]
*
* @param resumeIds
* @throws Exception
*/
void deleteResumes(@RequestParam Long... resumeIds) throws Exception;
}
\ No newline at end of file
package cn.com.poc.human_resources.rest.impl;
import cn.com.poc.common.utils.Assert;
import cn.com.poc.common.utils.BlContext;
import cn.com.poc.human_resources.aggregate.HumanResourceService;
import cn.com.poc.human_resources.convert.BizHumanResourcePositionConvert;
import cn.com.poc.human_resources.convert.BizHumanResourceResumeConvert;
import cn.com.poc.human_resources.dto.*;
import cn.com.poc.human_resources.entity.BizHumanResourcePositionEntity;
import cn.com.poc.human_resources.entity.HumanResourcePositionBaseInfo;
import cn.com.poc.human_resources.rest.HumanResourceRest;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author alex.yao
* @date 2025/9/28
*/
@Component
public class HumanResourceRestImpl implements HumanResourceRest {
@Resource
private HumanResourceService humanResourceService;
@Override
public Object uploadResume(UploadResumeDto uploadResumeDto) throws Exception {
Assert.notBlank(uploadResumeDto.getFileURL(), "文件不能为空");
Assert.notNull(uploadResumeDto.getPositionId(), "岗位ID不能为空");
return humanResourceService.uploadResume(
uploadResumeDto.getFileURL(),
uploadResumeDto.getPositionId(),
BlContext.getCurrentUser().getUserId()
);
}
@Override
public void positionAssistant(PositionAssistantDto positionAssistantDto) throws Exception {
Assert.notBlank(positionAssistantDto.getType(), "类型不能为空");
humanResourceService.positionAssistant(
positionAssistantDto.getDemand(),
positionAssistantDto.getType(),
positionAssistantDto.getFileInfos(),
positionAssistantDto.getJobInformation(),
positionAssistantDto.getQuestion(),
positionAssistantDto.getDialoguesId(),
BlContext.getCurrentUser().getUserId()
);
}
@Override
public void savePosition(HumanResourcePositionDto humanResourcePositionDto) throws Exception {
Assert.notNull(humanResourcePositionDto.getBaseInfo(), "基础信息不能为空");
Assert.notNull(humanResourcePositionDto.getJob(), "职位详情不能为空");
//基础信息
Assert.notBlank(humanResourcePositionDto.getBaseInfo().getJobTitle(), "职位名称不能为空");
Assert.notBlank(humanResourcePositionDto.getBaseInfo().getDepartment(), "所属部门不能为空");
Assert.notBlank(humanResourcePositionDto.getBaseInfo().getWorkLocation(), "工作地址不能为空");
Assert.notBlank(humanResourcePositionDto.getBaseInfo().getJobNature(), "工作性质不能为空");
Assert.notNull(humanResourcePositionDto.getBaseInfo().getNumberOfRecruits(), "招聘人数不能为空");
Assert.notBlank(humanResourcePositionDto.getBaseInfo().getWorkExperience(), "工作经验不能为空");
Assert.notBlank(humanResourcePositionDto.getBaseInfo().getEducationalRe(), "学历要求不能为空");
Assert.notBlank(humanResourcePositionDto.getBaseInfo().getSalaryRange(), "薪资要求不能为空");
//职位详情
Assert.notBlank(humanResourcePositionDto.getJob().getJobDuties(), "职位描述不能为空");
Assert.notBlank(humanResourcePositionDto.getJob().getJobRequirements(), "任职资格不能为空");
humanResourceService.saveOrUpdatePosition(
humanResourcePositionDto.getBaseInfo(),
humanResourcePositionDto.getJob(),
humanResourcePositionDto.getPor(),
humanResourcePositionDto.getId(),
BlContext.getCurrentUser().getUserId()
);
}
@Override
public List<HumanResourcePositionBaseInfoDto> listPositions(PagingInfo pagingInfo) throws Exception {
List<HumanResourcePositionBaseInfo> humanResourcePositionBaseInfos = humanResourceService.listPositions(BlContext.getCurrentUser().getUserId(), pagingInfo);
return humanResourcePositionBaseInfos.stream()
.map(info -> {
HumanResourcePositionBaseInfoDto dto = new HumanResourcePositionBaseInfoDto();
dto.setId(info.getId());
dto.setJobTitle(info.getJobTitle());
dto.setWorkLocation(info.getWorkLocation());
dto.setJobNature(info.getJobNature());
dto.setWorkExperience(info.getWorkExperience());
dto.setResumeCount(info.getResumeCount());
return dto;
})
.collect(Collectors.toList());
}
@Override
public HumanResourcePositionDto getPositionDetail(Long positionId) throws Exception {
BizHumanResourcePositionEntity positionEntity = humanResourceService.getPositionDetail(BlContext.getCurrentUser().getUserId(), positionId);
if (positionEntity == null) {
throw new BusinessException("该岗位信息不存在");
}
HumanResourcePositionDto resourcePositionDto = BizHumanResourcePositionConvert.entityToHumanResourcePositionDto(positionEntity);
resourcePositionDto.setId(positionId);
return resourcePositionDto;
}
@Override
public void deletePositions(Long... positionIds) throws Exception {
Assert.notEmpty(positionIds, "请选择要删除的岗位");
humanResourceService.deletePositions(BlContext.getCurrentUser().getUserId(), positionIds);
}
@Override
public void saveResume(SaveResumeDto saveResumeDto) throws Exception {
Assert.notBlank(saveResumeDto.getFileURL(), "文件不能为空");
Assert.notNull(saveResumeDto.getPositionId(), "岗位id不能为空");
Assert.notNull(saveResumeDto.getResume());
Assert.notNull(saveResumeDto.getResume().getInfo(), "简历基础信息不能为空");
Assert.notNull(saveResumeDto.getResume().getTag(), "简历标签信息不能为空");
if (saveResumeDto.getId() != null) {
humanResourceService.updateResume(saveResumeDto.getId(), BlContext.getCurrentUser().getUserId(), saveResumeDto.getFileURL(), saveResumeDto.getPositionId(), saveResumeDto.getResume());
} else {
humanResourceService.saveResume(BlContext.getCurrentUser().getUserId(), saveResumeDto.getFileURL(), saveResumeDto.getPositionId(), saveResumeDto.getResume());
}
}
@Override
public List<ResumeDto> listResumes(Long positionId, PagingInfo pagingInfo) throws Exception {
return humanResourceService.listResumes(BlContext.getCurrentUser().getUserId(), positionId, pagingInfo)
.stream()
.map(BizHumanResourceResumeConvert::entityToResumeDto)
.collect(Collectors.toList());
}
@Override
public ResumeDto getResumeDetail(Long resumeId) throws Exception {
return BizHumanResourceResumeConvert.entityToResumeDto(humanResourceService.getResumeDetail(BlContext.getCurrentUser().getUserId(), resumeId));
}
@Override
public void deleteResumes(Long... resumeIds) throws Exception {
Assert.notEmpty(resumeIds, "请选择要删除的简历");
humanResourceService.deleteResumes(BlContext.getCurrentUser().getUserId(), resumeIds);
}
}
package cn.com.poc.human_resources.service;
import cn.com.poc.human_resources.query.PositionListQueryCondition;
import cn.com.poc.human_resources.query.PositionListQueryItem;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.poc.human_resources.entity.BizHumanResourcePositionEntity;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizHumanResourcePositionService extends BaseService {
BizHumanResourcePositionEntity get(java.lang.Long id) throws Exception;
List<BizHumanResourcePositionEntity> findByExample(BizHumanResourcePositionEntity example, PagingInfo pagingInfo) throws Exception;
BizHumanResourcePositionEntity save(BizHumanResourcePositionEntity entity) throws Exception;
BizHumanResourcePositionEntity update(BizHumanResourcePositionEntity entity) throws Exception;
void deletedById(java.lang.Long id) throws Exception;
List<PositionListQueryItem> positionListQuery(PositionListQueryCondition condition, PagingInfo pagingInfo);
}
\ No newline at end of file
package cn.com.poc.human_resources.service;
import cn.com.yict.framemax.core.service.BaseService;
import cn.com.poc.human_resources.entity.BizHumanResourceResumeEntity;
import cn.com.yict.framemax.data.model.PagingInfo;
import java.util.Collection;
import java.util.List;
public interface BizHumanResourceResumeService extends BaseService {
BizHumanResourceResumeEntity get(java.lang.Long id) throws Exception;
List<BizHumanResourceResumeEntity> findByExample(BizHumanResourceResumeEntity example,PagingInfo pagingInfo) throws Exception;
BizHumanResourceResumeEntity save(BizHumanResourceResumeEntity entity) throws Exception;
BizHumanResourceResumeEntity update(BizHumanResourceResumeEntity entity) throws Exception;
void deletedById(java.lang.Long id) throws Exception;
}
\ No newline at end of file
package cn.com.poc.human_resources.service.impl;
import cn.com.poc.human_resources.query.PositionListQueryCondition;
import cn.com.poc.human_resources.query.PositionListQueryItem;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.poc.human_resources.service.BizHumanResourcePositionService;
import cn.com.poc.human_resources.model.BizHumanResourcePositionModel;
import cn.com.poc.human_resources.entity.BizHumanResourcePositionEntity;
import cn.com.poc.human_resources.convert.BizHumanResourcePositionConvert;
import cn.com.poc.human_resources.repository.BizHumanResourcePositionRepository;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.util.Assert;
@Service
public class BizHumanResourcePositionServiceImpl extends BaseServiceImpl
implements BizHumanResourcePositionService {
@Resource
private BizHumanResourcePositionRepository repository;
public BizHumanResourcePositionEntity get(java.lang.Long id) throws Exception {
Assert.notNull(id);
BizHumanResourcePositionModel model = this.repository.get(id);
if (model == null) {
return null;
}
if ("Y".equals(model.getIsDeleted())) {
return null;
}
return BizHumanResourcePositionConvert.modelToEntity(model);
}
public List<BizHumanResourcePositionEntity> findByExample(BizHumanResourcePositionEntity example, PagingInfo pagingInfo) throws Exception {
List<BizHumanResourcePositionEntity> result = new ArrayList<BizHumanResourcePositionEntity>();
BizHumanResourcePositionModel model = new BizHumanResourcePositionModel();
if (example != null) {
model = BizHumanResourcePositionConvert.entityToModel(example);
}
model.setIsDeleted("N");
List<BizHumanResourcePositionModel> models = this.repository.findByExample(model, pagingInfo);
if (CollectionUtils.isNotEmpty(models)) {
result = models.stream().map(BizHumanResourcePositionConvert::modelToEntity).collect(Collectors.toList());
}
return result;
}
public BizHumanResourcePositionEntity save(BizHumanResourcePositionEntity entity) throws Exception {
Assert.notNull(entity);
entity.setId(null);
entity.setIsDeleted("N");
BizHumanResourcePositionModel model = BizHumanResourcePositionConvert.entityToModel(entity);
BizHumanResourcePositionModel saveModel = this.repository.save(model);
return BizHumanResourcePositionConvert.modelToEntity(saveModel);
}
public BizHumanResourcePositionEntity update(BizHumanResourcePositionEntity entity) throws Exception {
Assert.notNull(entity);
Assert.notNull(entity.getId(), "update pk can not be null");
BizHumanResourcePositionModel model = this.repository.get(entity.getId());
if (entity.getJobTitle() != null) {
model.setJobTitle(entity.getJobTitle());
}
if (entity.getDepartment() != null) {
model.setDepartment(entity.getDepartment());
}
if (entity.getWorkLocation() != null) {
model.setWorkLocation(entity.getWorkLocation());
}
if (entity.getJobNature() != null) {
model.setJobNature(entity.getJobNature());
}
if (entity.getNumberOfRecruits() != null) {
model.setNumberOfRecruits(entity.getNumberOfRecruits());
}
if (entity.getWorkExperience() != null) {
model.setWorkExperience(entity.getWorkExperience());
}
if (entity.getEducationalRe() != null) {
model.setEducationalRe(entity.getEducationalRe());
}
if (entity.getSalaryRange() != null) {
model.setSalaryRange(entity.getSalaryRange());
}
if (entity.getJobRequirements() != null) {
model.setJobRequirements(entity.getJobRequirements());
}
if (entity.getJobDuties() != null) {
model.setJobDuties(entity.getJobDuties());
}
if (entity.getEssential() != null) {
model.setEssential(entity.getEssential());
}
if (entity.getBonusPoints() != null) {
model.setBonusPoints(entity.getBonusPoints());
}
if (entity.getExclusion() != null) {
model.setExclusion(entity.getExclusion());
}
if (entity.getMemberId() != null) {
model.setMemberId(entity.getMemberId());
}
if (entity.getIsDeleted() != null) {
model.setIsDeleted(entity.getIsDeleted());
}
if (entity.getCreator() != null) {
model.setCreator(entity.getCreator());
}
if (entity.getCreatedTime() != null) {
model.setCreatedTime(entity.getCreatedTime());
}
if (entity.getModifier() != null) {
model.setModifier(entity.getModifier());
}
if (entity.getModifiedTime() != null) {
model.setModifiedTime(entity.getModifiedTime());
}
if (entity.getSysVersion() != null) {
model.setSysVersion(entity.getSysVersion());
}
BizHumanResourcePositionModel saveModel = this.repository.save(model);
return BizHumanResourcePositionConvert.modelToEntity(saveModel);
}
public void deletedById(java.lang.Long id) throws Exception {
Assert.notNull(id);
BizHumanResourcePositionModel model = this.repository.get(id);
if (model != null) {
if ("N".equals(model.getIsDeleted())) {
model.setIsDeleted("Y");
this.repository.save(model);
}
}
}
@Override
public List<PositionListQueryItem> positionListQuery(PositionListQueryCondition condition, PagingInfo pagingInfo) {
return this.sqlDao.query(condition, PositionListQueryItem.class, pagingInfo);
}
}
\ No newline at end of file
package cn.com.poc.human_resources.service.impl;
import cn.com.yict.framemax.core.service.impl.BaseServiceImpl;
import cn.com.poc.human_resources.service.BizHumanResourceResumeService;
import cn.com.poc.human_resources.model.BizHumanResourceResumeModel;
import cn.com.poc.human_resources.entity.BizHumanResourceResumeEntity;
import cn.com.poc.human_resources.convert.BizHumanResourceResumeConvert;
import cn.com.poc.human_resources.repository.BizHumanResourceResumeRepository;
import cn.com.yict.framemax.data.model.PagingInfo;
import org.springframework.stereotype.Service;
import org.apache.commons.collections4.CollectionUtils;
import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.List;
import javax.annotation.Resource;
import org.springframework.util.Assert;
@Service
public class BizHumanResourceResumeServiceImpl extends BaseServiceImpl
implements BizHumanResourceResumeService {
@Resource
private BizHumanResourceResumeRepository repository;
public BizHumanResourceResumeEntity get(java.lang.Long id) throws Exception {
Assert.notNull(id);
BizHumanResourceResumeModel model = this.repository.get(id);
if (model == null) {
return null;
}
if ("Y".equals(model.getIsDeleted())) {
return null;
}
return BizHumanResourceResumeConvert.modelToEntity(model);
}
public List<BizHumanResourceResumeEntity> findByExample(BizHumanResourceResumeEntity example, PagingInfo pagingInfo) throws Exception {
List<BizHumanResourceResumeEntity> result = new ArrayList<BizHumanResourceResumeEntity>();
BizHumanResourceResumeModel model = new BizHumanResourceResumeModel();
if (example != null) {
model = BizHumanResourceResumeConvert.entityToModel(example);
}
model.setIsDeleted("N");
List<BizHumanResourceResumeModel> models = this.repository.findByExample(model, pagingInfo);
if (CollectionUtils.isNotEmpty(models)) {
result = models.stream().map(BizHumanResourceResumeConvert::modelToEntity).collect(Collectors.toList());
}
return result;
}
public BizHumanResourceResumeEntity save(BizHumanResourceResumeEntity entity) throws Exception {
Assert.notNull(entity);
entity.setId(null);
entity.setIsDeleted("N");
BizHumanResourceResumeModel model = BizHumanResourceResumeConvert.entityToModel(entity);
BizHumanResourceResumeModel saveModel = this.repository.save(model);
return BizHumanResourceResumeConvert.modelToEntity(saveModel);
}
public BizHumanResourceResumeEntity update(BizHumanResourceResumeEntity entity) throws Exception {
Assert.notNull(entity);
Assert.notNull(entity.getId(), "update pk can not be null");
BizHumanResourceResumeModel model = this.repository.get(entity.getId());
if (entity.getPosition() != null) {
model.setPosition(entity.getPosition());
}
if (entity.getFileUrl() != null) {
model.setFileUrl(entity.getFileUrl());
}
if (entity.getCoreSkills() != null) {
model.setCoreSkills(entity.getCoreSkills());
}
if (entity.getEducationBackground() != null) {
model.setEducationBackground(entity.getEducationBackground());
}
if (entity.getEducationExperience() != null) {
model.setEducationExperience(entity.getEducationExperience());
}
if (entity.getGenderAndAge() != null) {
model.setGenderAndAge(entity.getGenderAndAge());
}
if (entity.getOccupationalHistory() != null) {
model.setOccupationalHistory(entity.getOccupationalHistory());
}
if (entity.getOther() != null) {
model.setOther(entity.getOther());
}
if (entity.getWorkExperience() != null) {
model.setWorkExperience(entity.getWorkExperience());
}
if (entity.getWorkLocation() != null) {
model.setWorkLocation(entity.getWorkLocation());
}
if (entity.getLabel() != null) {
model.setLabel(entity.getLabel());
}
if (entity.getEvaluate() != null) {
model.setEvaluate(entity.getEvaluate());
}
if (entity.getMatchedDegree() != null) {
model.setMatchedDegree(entity.getMatchedDegree());
}
if (entity.getMemberId() != null) {
model.setMemberId(entity.getMemberId());
}
if (entity.getIsDeleted() != null) {
model.setIsDeleted(entity.getIsDeleted());
}
if (entity.getCreator() != null) {
model.setCreator(entity.getCreator());
}
if (entity.getCreatedTime() != null) {
model.setCreatedTime(entity.getCreatedTime());
}
if (entity.getModifier() != null) {
model.setModifier(entity.getModifier());
}
if (entity.getModifiedTime() != null) {
model.setModifiedTime(entity.getModifiedTime());
}
if (entity.getSysVersion() != null) {
model.setSysVersion(entity.getSysVersion());
}
BizHumanResourceResumeModel saveModel = this.repository.save(model);
return BizHumanResourceResumeConvert.modelToEntity(saveModel);
}
public void deletedById(java.lang.Long id) throws Exception {
Assert.notNull(id);
BizHumanResourceResumeModel model = this.repository.get(id);
if (model != null) {
if ("N".equals(model.getIsDeleted())) {
model.setIsDeleted("Y");
this.repository.save(model);
}
}
}
}
\ No newline at end of file
......@@ -24,7 +24,11 @@ public class KnowledgeDefaultCache {
if (StringUtils.isNotBlank(param)) {
String[] knowledgeId = param.split(";");
if (ArrayUtils.isNotEmpty(knowledgeId)) {
return (Integer[]) Arrays.stream(knowledgeId).map(Integer::valueOf).toArray();
Integer[] res = new Integer[knowledgeId.length];
for (int i = 0; i < knowledgeId.length; i++) {
res[i] = Integer.valueOf(knowledgeId[i]);
}
return res;
}
}
return ArrayUtils.EMPTY_INTEGER_OBJECT_ARRAY;
......
select id,
knowledge_name,
knowledge_type,
knowledge_owner,
member_id,
kd_ids,
train_status,
knowledge_desc,
is_open,
is_deleted,
CREATOR,
CREATED_TIME,
MODIFIER,
MODIFIED_TIME
from biz_knowledge_info
where is_deleted = 'N'
<< and (member_id = :memberId or member_id = 1)>>
<< and (knowledge_owner = :knowledgeOwner)>>
<< and LOCATE(:query ,knowledge_name) >>
<< and train_status = :trainStatus>>
<< and knowledge_type = :knowledgeType>>
order by MODIFIED_TIME
select id,
knowledge_name,
knowledge_type,
knowledge_owner,
member_id,
kd_ids,
train_status,
knowledge_desc,
is_open,
is_deleted,
CREATOR,
CREATED_TIME,
MODIFIER,
MODIFIED_TIME
from biz_knowledge_info
where is_deleted = 'N'
<< and (member_id = :memberId or member_id = 2)>>
<< and (knowledge_owner = :knowledgeOwner)>>
<< and LOCATE(:query ,knowledge_name) >>
<< and train_status = :trainStatus>>
<< and knowledge_type = :knowledgeType>>
order by MODIFIED_TIME
......@@ -15,7 +15,7 @@ from
biz_knowledge_document bkd
left join biz_member_knowledge_relation bmkr on bkd.kd_id = bmkr.kd_id and bmkr.is_deleted = 'N'
where bkd.is_deleted = 'N'
<<and bmkr.member_id = :memberId>>
<<and ( bmkr.member_id = :memberId or bmkr.member_id = 2 ) >>
<<and bkd.document_name = :documentName>>
<<and bkd.train_status =:trainStatus>>
<<and locate(:searchDocumentName,bkd.document_name) >>
......
......@@ -14,6 +14,7 @@ import cn.com.poc.common.model.BizFileUploadRecordModel;
import cn.com.poc.common.service.BizFileUploadRecordService;
import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.ListUtils;
import cn.com.poc.common.utils.SSEUtil;
import cn.com.poc.knowledge.aggregate.KnowledgeService;
import cn.com.poc.knowledge.constant.KnowledgeConstant;
......@@ -23,12 +24,15 @@ import cn.com.poc.knowledge.service.BizKnowledgeDocumentService;
import cn.com.poc.long_document.aggregate.LongTextDialoguesService;
import cn.com.poc.long_document.domain.LongtextDialoguesResult;
import cn.com.poc.long_document.domain.MindMap;
import cn.com.poc.long_document.domain.keyword.KeyWord;
import cn.com.poc.long_document.domain.keyword.MentionFrequency;
import cn.com.poc.long_document.dto.LongTextExampleDto;
import cn.com.poc.long_document.dto.LongTextSummaryDto;
import cn.com.poc.long_document.entity.BizLongTextSummaryCacheEntity;
import cn.com.poc.long_document.model.BizLongTextExampleModel;
import cn.com.poc.long_document.service.BizLongTextExampleService;
import cn.com.poc.long_document.service.BizLongTextSummaryCacheService;
import cn.com.poc.meeting.cache.KeyWordCounter;
import cn.com.poc.thirdparty.resource.demand.ai.aggregate.DemandKnowledgeService;
import cn.com.poc.thirdparty.resource.demand.ai.constants.KnowledgeSearchTypeEnum;
import cn.com.poc.thirdparty.resource.demand.ai.constants.LLMRoleEnum;
......@@ -62,6 +66,7 @@ import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.stream.Collectors;
......@@ -240,7 +245,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
String summary = StringUtils.EMPTY;
String corePoint = StringUtils.EMPTY;
String mindMap = StringUtils.EMPTY;
String keyWord = StringUtils.EMPTY;
KeyWord keyWord = null;
boolean summaryNeedGenerate = false;
boolean corePointNeedGenerate = false;
......@@ -259,7 +264,8 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
BizLongTextSummaryCacheEntity longTextSummaryCacheEntity = bizLongTextSummaryCacheEntities.get(0);
summary = longTextSummaryCacheEntity.getSummary();
corePoint = longTextSummaryCacheEntity.getCorePoint();
keyWord = longTextSummaryCacheEntity.getKeyword();
keyWord = StringUtils.isNotBlank(longTextSummaryCacheEntity.getKeyword()) ?
JsonUtils.deSerialize(longTextSummaryCacheEntity.getKeyword(), KeyWord.class) : null;
mindMap = longTextSummaryCacheEntity.getMindmap();
}
......@@ -267,7 +273,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
summaryNeedGenerate = StringUtils.isBlank(summary);
corePointNeedGenerate = StringUtils.isBlank(corePoint);
mindMapNeedGenerate = StringUtils.isBlank(mindMap);
keyWordNeedGenerate = StringUtils.isBlank(keyWord);
keyWordNeedGenerate = ObjectUtil.isEmpty(keyWord);
String document = DocumentLoad.documentToText(file);
......@@ -306,8 +312,8 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
});
boolean finalKeyWordNeedGenerate = keyWordNeedGenerate;
String finalKeyWord = keyWord;
CompletableFuture<String> keyWordFuture = CompletableFuture.supplyAsync(() ->
KeyWord finalKeyWord = keyWord;
CompletableFuture<KeyWord> keyWordFuture = CompletableFuture.supplyAsync(() ->
finalKeyWordNeedGenerate ? createKeyWord(document) : finalKeyWord).exceptionally(throwable -> {
logger.error("生成关键词失败", throwable);
throw new BusinessException(throwable);
......@@ -329,7 +335,8 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
updateCacheEntity.setCorePoint(corePoint);
updateCacheEntity.setSummary(summary);
updateCacheEntity.setMindmap(mindMap);
updateCacheEntity.setKeyword(keyWord);
updateCacheEntity.setKeyword(ObjectUtil.isNotEmpty(keyWord) ?
JsonUtils.serialize(keyWord) : StringUtils.EMPTY);
bizLongTextSummaryCacheService.update(updateCacheEntity);
} else {
BizLongTextSummaryCacheEntity saveCache = new BizLongTextSummaryCacheEntity();
......@@ -337,29 +344,28 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
saveCache.setSummary(summary);
saveCache.setFileUrl(fileUrl);
saveCache.setMindmap(mindMap);
saveCache.setKeyword(keyWord);
saveCache.setKeyword(ObjectUtil.isNotEmpty(keyWord) ?
JsonUtils.serialize(keyWord) : StringUtils.EMPTY);
saveCache.setFileMd5(fileMD5);
saveCache.setIsDeleted(CommonConstant.IsDeleted.N);
bizLongTextSummaryCacheService.save(saveCache);
}
}
if (StringUtils.isBlank(summary)){
if (StringUtils.isBlank(summary)) {
throw new BusinessException("获取/生成摘要失败");
}
if (StringUtils.isBlank(keyWord)){
if (ObjectUtil.isEmpty(keyWord)) {
throw new BusinessException("获取/生成关键词失败");
}
if (StringUtils.isBlank(corePoint)){
if (StringUtils.isBlank(corePoint)) {
throw new BusinessException("获取/生成核心观点失败");
}
if (StringUtils.isBlank(mindMap)){
if (StringUtils.isBlank(mindMap)) {
throw new BusinessException("获取/生成思维导图失败");
}
// 返回摘要和核心观点
// 转换格式 json to list
int startKeyWord = keyWord.lastIndexOf("[");
int endKeyWord = keyWord.lastIndexOf("]");
int startMindMap = mindMap.indexOf("{");
int endMindMap = mindMap.lastIndexOf("}");
......@@ -367,8 +373,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
LongTextSummaryDto longTextSummaryDto = new LongTextSummaryDto();
longTextSummaryDto.setSummary(summary);
longTextSummaryDto.setCorePoint(corePoint);
longTextSummaryDto.setKeyword(JsonUtils.deSerialize(keyWord.substring(startKeyWord, endKeyWord + 1), new TypeReference<List<String>>() {
}.getType()));
longTextSummaryDto.setKeyword(keyWord);
longTextSummaryDto.setMindMap(JsonUtils.deSerialize(mindMap.substring(startMindMap, endMindMap + 1), MindMap.class));
return longTextSummaryDto;
}
......@@ -504,9 +509,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
result.setFunction(null);
result.setDbChainResult(null);
result.setKnowledgeContentResult(null);
if (StringUtils.isBlank(result.getMessage())) {
result.setMessage(StringUtils.EMPTY);
}
result.setMessage(result.getMessage()) ;
sseUtil.send(JsonUtils.serialize(result));
if (StringUtils.isNotEmpty(result.getMessage())) {
output.append(result.getMessage());
......@@ -699,7 +702,7 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
}
}
private String createKeyWord(String document) {
private KeyWord createKeyWord(String document) {
// 获取对话提示词
String promptCode = "CreateKeyWordPrompt";
BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode);
......@@ -750,13 +753,112 @@ public class LongTextDialoguesServiceImpl implements LongTextDialoguesService {
}
}
bufferedReader.close();
return summary.toString();
if (StringUtils.isBlank(summary.toString())) {
logger.error("------------ summary is blank , check llm config -------------");
throw new BusinessException("关键词提取失败");
}
String keywordStr = summary.toString();
int start = keywordStr.lastIndexOf("[");
int end = keywordStr.lastIndexOf("]");
List<String> keywords = JsonUtils.deSerialize(keywordStr.substring(start, end + 1), new TypeReference<List<String>>() {
}.getType());
if (CollectionUtils.isEmpty(keywords)) {
logger.error("------------ keywords is blank , check llm config -------------");
throw new BusinessException("关键词提取失败");
}
//匹配关键词在文章中句子[按标点符号切分]/计算关键词频率
Map<String, Integer> keywordCountMap = KeyWordCounter.keywordCount(document, keywords);
Map<String, List<String>> matchSentenceMap = KeyWordCounter.keywordMatchSentence(document, keywords);
List<MentionFrequency> mentionFrequencies = new ArrayList<>();
for (String keyword : keywordCountMap.keySet()) {
MentionFrequency mentionFrequency = new MentionFrequency();
mentionFrequency.setKeyword(keyword);
mentionFrequency.setSentences(matchSentenceMap.get(keyword).stream().distinct().collect(Collectors.toList()));
mentionFrequency.setFrequency(keywordCountMap.get(keyword));
mentionFrequencies.add(mentionFrequency);
}
// 相关概念
List<String> concepts = createConcepts(document);
KeyWord keyWord = new KeyWord();
keyWord.setKeyWord(new ArrayList<>(keywordCountMap.keySet()));
keyWord.setMentionFrequency(mentionFrequencies);
keyWord.setConcepts(concepts);
return keyWord;
} catch (Exception e) {
logger.error("获取关键词失败", e);
throw new BusinessException("获取关键词失败");
}
}
private List<String> createConcepts(String document) {
// 获取对话提示词
String promptCode = "CreateConceptsPrompt";
BizAgentApplicationGcConfigEntity documentDialoguePrompt = bizAgentApplicationGcConfigService.getByConfigCode(promptCode);
if (documentDialoguePrompt == null || StringUtils.isBlank(documentDialoguePrompt.getConfigSystem())) {
logger.error("获取对话提示词失败 , configCode:{}", promptCode);
throw new BusinessException("获取对话提示词失败");
}
String prompt = documentDialoguePrompt.getConfigSystem();
String largeModel = documentDialoguePrompt.getLargeModel();
prompt = prompt.replace("{document}", document);
// 配置message
List<Message> messages = new ArrayList<>();
Message systemMessage = new Message();
systemMessage.setContent(prompt);
systemMessage.setRole(LLMRoleEnum.SYSTEM.getRole());
messages.add(systemMessage);
Message questionMessage = new Message();
questionMessage.setContent("生成相关概念");
questionMessage.setRole(LLMRoleEnum.USER.getRole());
messages.add(questionMessage);
// 调用LLM
LargeModelResponse response = new LargeModelResponse();
response.setModel(largeModel);
response.setMessages(messages.toArray(new Message[0]));
response.setStream(true);
response.setUser("CreateMindMap");
try {
StringBuilder summary = new StringBuilder();
BufferedReader bufferedReader = llmService.chatChunk(response);
String res;
while ((res = bufferedReader.readLine()) != null) {
if (StringUtils.isEmpty(res)) {
continue;
}
res = res.replace("data: ", StringUtils.EMPTY);
LargeModelDemandResult result = JsonUtils.deSerialize(res, LargeModelDemandResult.class);
if (ObjectUtil.isEmpty(result) || !result.getCode().equals("0")) {
logger.error("LLM Error,code:{}", result.getCode());
throw new BusinessException("生成相关概念失败");
}
if (StringUtils.isNotBlank(result.getMessage())) {
String message = result.getMessage();
summary.append(message);
}
}
bufferedReader.close();
String result = summary.toString();
if (StringUtils.isBlank(result)) {
return ListUtils.EMPTY_LIST;
}
int startMindMap = result.indexOf("[");
int endMindMap = result.lastIndexOf("]");
return JsonUtils.deSerialize(result.substring(startMindMap, endMindMap + 1), new TypeReference<List<String>>() {
}.getType());
} catch (Exception e) {
logger.error("-----------生成相关概念失败------------", e);
return ListUtils.EMPTY_LIST;
}
}
private String createMindMap(String document) {
// 获取对话提示词
......
package cn.com.poc.long_document.domain.keyword;
/**
* @author alex.yao
* @date 2025/9/4
*/
public class Concepts {
}
package cn.com.poc.long_document.domain.keyword;
import java.util.List;
/**
* @author alex.yao
* @date 2025/9/4
*/
public class KeyWord {
/**
* 关键词云图 [10个以内]
*/
private List<String> keyWord;
/**
* 关键词提及频率 [10个以内]
*/
private List<MentionFrequency> mentionFrequency;
/**
* 相关概念 [10个以内]
*/
List<String> concepts;
public List<String> getKeyWord() {
return keyWord;
}
public void setKeyWord(List<String> keyWord) {
this.keyWord = keyWord;
}
public List<MentionFrequency> getMentionFrequency() {
return mentionFrequency;
}
public void setMentionFrequency(List<MentionFrequency> mentionFrequency) {
this.mentionFrequency = mentionFrequency;
}
public List<String> getConcepts() {
return concepts;
}
public void setConcepts(List<String> concepts) {
this.concepts = concepts;
}
}
package cn.com.poc.long_document.domain.keyword;
import java.util.List;
/**
* @author alex.yao
* @date 2025/9/4
*/
public class MentionFrequency {
/**
* 关键词
*/
private String keyword;
/**
* 关联句子
*/
private List<String> sentences;
/**
* 出现频率
*/
private Integer frequency;
public String getKeyword() {
return keyword;
}
public void setKeyword(String keyword) {
this.keyword = keyword;
}
public List<String> getSentences() {
return sentences;
}
public void setSentences(List<String> sentences) {
this.sentences = sentences;
}
public Integer getFrequency() {
return frequency;
}
public void setFrequency(Integer frequency) {
this.frequency = frequency;
}
}
package cn.com.poc.long_document.dto;
import cn.com.poc.long_document.domain.MindMap;
import cn.com.poc.long_document.domain.keyword.KeyWord;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
......@@ -18,15 +19,15 @@ public class LongTextSummaryDto {
private String corePoint;
private List<String> keyword;
private KeyWord keyword;
private MindMap mindMap;
public List<String> getKeyword() {
public KeyWord getKeyword() {
return keyword;
}
public void setKeyword(List<String> keyword) {
public void setKeyword(KeyWord keyword) {
this.keyword = keyword;
}
......
......@@ -32,12 +32,38 @@ public class KeyWordCounter {
while (matcher.find()) {
count++;
}
if (count == 0) {
continue;
}
resMap.put(keyword, count);
}
Map<String, Integer> sortedMap = getSortedMap(resMap);
return sortedMap;
}
/**
* 提取关键词与文本中匹配的句子
*
* @param content 文本
* @param keywords 关键词
*/
public static Map<String, List<String>> keywordMatchSentence(String content, List<String> keywords) {
Map<String, List<String>> result = new LinkedHashMap<>();
// 将关键词转换为正则表达式模式(注意转义特殊字符)
for (String keyword : keywords) {
String regexPattern = Pattern.quote(keyword);
String sentenceRegex = "[^,,::;;.。!?!?\\n]*" + regexPattern + "[^,,::;;.。!?!?\\n]*[,,::;;.。!?!?\\n]";
Pattern pattern = Pattern.compile(sentenceRegex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(content);
// 查找并输出匹配的句子
List<String> sentences = new ArrayList<>();
while (matcher.find()) {
sentences.add(matcher.group().trim());
}
result.put(keyword, sentences);
}
return result;
}
/**
* 缓存关键词计数
......
......@@ -220,7 +220,7 @@ public class PortalServiceImpl implements PortalService {
if (CollectionUtils.isNotEmpty(knowledgeContentResults)) {
String knowledgeContent = JsonUtils.serialize(knowledgeContentResults);
prompt = prompt.replace("${knowledgeContent}", knowledgeContent);
} else {
} else {
prompt = prompt.replace("${knowledgeContent}", StringUtils.EMPTY);
}
if (toolFunction != null) {
......
......@@ -30,17 +30,21 @@ public class PortalRestImpl implements PortalRest {
@Override
public void call(PortalDialoguesDto dto) throws Exception {
Assert.notNull(dto, "请求参数不能为空");
Assert.notBlank(dto.getDialoguesId(),"会话ID不能为空");
Assert.notBlank(dto.getInput(),"对话内容不能为空");
Assert.notBlank(dto.getDialoguesId(), "会话ID不能为空");
Assert.notBlank(dto.getInput(), "对话内容不能为空");
UserBaseEntity userBaseEntity = BlContext.getCurrentUserNotException();
if (ObjectUtil.isEmpty(userBaseEntity)) {
throw new BusinessException("用户未登录");
}
KnowledgeDefaultCache knowledgeDefaultCache = new KnowledgeDefaultCache();
Integer[] knowledgeId;
Integer[] defaultKnowledgeId = knowledgeDefaultCache.getDefaultKnowledgeId();
Integer[] knowledgeId = (Integer[]) Arrays.stream(ArrayUtils.addAll(defaultKnowledgeId, dto.getKnowledgeIds())).distinct()
.toArray();
if (ArrayUtils.isNotEmpty(dto.getKnowledgeIds())) {
knowledgeId = Arrays.stream(ArrayUtils.addAll(defaultKnowledgeId, dto.getKnowledgeIds())).distinct()
.toArray(Integer[]::new);
} else {
knowledgeId = defaultKnowledgeId;
}
PortalDialoguesCallEntity callEntity = PortalConvert.callDtoToEntity(dto);
callEntity.setKnowledgeIds(knowledgeId);
portalService.call(callEntity, userBaseEntity.getUserId());
......
......@@ -2,6 +2,7 @@ package cn.com.poc.thirdparty.resource.demand.ai.function;
import cn.com.poc.common.utils.SpringUtils;
import cn.com.poc.thirdparty.resource.demand.ai.function.calculator.CalculatorFunction;
import cn.com.poc.thirdparty.resource.demand.ai.function.chart_data_convert.ChartDataConvertFunction;
import cn.com.poc.thirdparty.resource.demand.ai.function.chart_generate.ChartGenerateFunction;
import cn.com.poc.thirdparty.resource.demand.ai.function.csv_data_analysis.CSVFunction;
import cn.com.poc.thirdparty.resource.demand.ai.function.document_reader.DocumentReaderFunction;
......@@ -61,6 +62,7 @@ public enum LargeModelFunctionEnum {
completion_of_travel_v2_form(TravelFormV2Function.class),
chart_data_generate(ChartDataConvertFunction.class),
;
private Class<? extends AbstractLargeModelFunction> function;
......
package cn.com.poc.thirdparty.resource.demand.ai.function.chart_data_convert;
import java.util.List;
/**
* @author alex.yao
* @date 2025/9/2
*/
public class ChartData {
private List<String> xData;
private List<String> yData;
private String title;
private boolean skip;
public List<String> getxData() {
return xData;
}
public void setxData(List<String> xData) {
this.xData = xData;
}
public List<String> getyData() {
return yData;
}
public void setyData(List<String> yData) {
this.yData = yData;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isSkip() {
return skip;
}
public void setSkip(boolean skip) {
this.skip = skip;
}
}
package cn.com.poc.thirdparty.resource.demand.ai.function.chart_data_convert;
import cn.com.poc.agent_application.entity.KnowledgeContentResult;
import cn.com.poc.agent_application.entity.Variable;
import cn.com.poc.common.utils.JsonUtils;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dbchain.DBChainResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.dialogue.Message;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelDemandResult;
import cn.com.poc.thirdparty.resource.demand.ai.entity.largemodel.LargeModelResponse;
import cn.com.poc.thirdparty.resource.demand.ai.function.AbstractFunctionResult;
import cn.com.poc.thirdparty.resource.demand.ai.function.AbstractLargeModelFunction;
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.FunctionLLMConfig;
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.Parameters;
import cn.com.poc.thirdparty.resource.demand.ai.function.entity.Properties;
import cn.com.poc.thirdparty.service.LLMService;
import cn.com.yict.framemax.core.exception.BusinessException;
import cn.hutool.core.collection.ListUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
* Chart数据转成
*
* @author alex.yao
* @date 2025/9/2
*/
@Component
public class ChartDataConvertFunction extends AbstractLargeModelFunction {
private final Logger logger = LoggerFactory.getLogger(ChartDataConvertFunction.class);
private final String MODEL = "deepseek-v3";
private final String PROMPT = "## 任务\n" +
"将现有数据转化成可供 EChart 使用的数据,仅需要处理X轴与Y轴。\n" +
"\n" +
"## 输出\n" +
"1. 字段 xData 用于放入x轴的数据,并且数据应为字符串类型,如 xData:[\"1月\",\"2月\",\"3月\"]\n" +
"2. 字段 yData 用于放入y轴的数据,并且数据应为字符串类型,如 yData:[\"12\",\"34\",\"47\"]\n" +
"3. 字段 title 用于存放该图表的标题\n" +
"4. 若现有数据无法生成图表,则输出 {\"skip\":true} , 表示跳过,无法生成图表数据\n" +
"\n" +
"## 例子\n" +
"{\"xData\":[\"1月\",\"2月\",\"3月\"], yData:[\"12\",\"34\",\"47\"],\"title\":\"第一季度销售额\"}\n" +
"\n" +
"## 用户问题\n" +
"{question}\n" +
"\n" +
"## 数据\n" +
"{data}";
private final String DESC = "根据用户问题和现有数据生成图表可用数据";
private final FunctionLLMConfig functionLLMConfig = new FunctionLLMConfig.FunctionLLMConfigBuilder()
.name("chart_data_generate")
.description(DESC)
.parameters(new Parameters("object")
.addProperties("data", new Properties("string", "参考数据"))
.addProperties("question", new Properties("string", "用户问题优化后的问题")))
.build();
@Resource
private LLMService llmService;
@Override
public AbstractFunctionResult<ChartData> doFunction(String content, String identifier, List<DBChainResult> dbChainResults, List<KnowledgeContentResult> knowledgeContentResults) {
AbstractFunctionResult<ChartData> result = new AbstractFunctionResult<>();
result.setFunctionResult(null);
result.setPromptContent(StringUtils.EMPTY);
if (StringUtils.isBlank(content)) {
return result;
}
JSONObject jsonObject = JSON.parseObject(content);
if (!jsonObject.containsKey("question") || !jsonObject.containsKey("data")) {
logger.warn("缺少必要参数,无法生成图表数据,content:{}", content);
return result;
}
Message systemMessage = new Message();
systemMessage.setRole("system");
systemMessage.setContent(buildPrompt(jsonObject));
Message userMessage = new Message();
userMessage.setContent("invoke");
userMessage.setRole("user");
Message[] messages = new Message[]{systemMessage, userMessage};
LargeModelResponse largeModelResponse = new LargeModelResponse();
largeModelResponse.setMessages(messages);
largeModelResponse.setModel(MODEL);
LargeModelDemandResult largeModelDemandResult = llmService.chat(largeModelResponse);
if (largeModelDemandResult == null || StringUtils.isBlank(largeModelDemandResult.getMessage())) {
logger.error("-----------------LLM 执行失败----------------");
return result;
}
String message = largeModelDemandResult.getMessage();
int startEnd = message.indexOf("{");
int endIndex = message.lastIndexOf("}");
if (startEnd == -1 || endIndex == -1) {
logger.error("---------------解析内容失败, message:{}--------------", message);
throw new BusinessException("解析内容失败");
}
ChartData chartData = JsonUtils.deSerialize(message.substring(startEnd, endIndex + 1), ChartData.class);
result.setFunctionResult(chartData);
result.setPromptContent(JsonUtils.serialize(chartData));
return result;
}
@Override
public String getDesc() {
return DESC;
}
@Override
public List<String> getLLMConfig() {
return ListUtil.toList(JsonUtils.serialize(functionLLMConfig));
}
@Override
public List<String> getLLMConfig(List<Variable> variableStructure) {
return getLLMConfig();
}
private String buildPrompt(JSONObject jsonObject) {
String data = StringUtils.EMPTY;
String question = StringUtils.EMPTY;
if (jsonObject.containsKey("data")) {
data = jsonObject.getString("data");
}
if (jsonObject.containsKey("question")) {
question = jsonObject.getString("question");
}
return PROMPT.replace("${question}", question)
.replace("{data}", data);
}
}
......@@ -311,7 +311,7 @@ public class AiWritingServiceImpl implements AiWritingService {
"2.仅使用文本方式输出内容。\n" +
"\n" +
"## 输出案例\n" +
"{”needWriting“:true,\"title\":\"论人工智能发展对生产力的影响\"}";
"{\"needWriting\":true,\"title\":\"论人工智能发展对生产力的影响\"}";
// 配置message
List<Message> messages = new ArrayList<>();
......
......@@ -36,10 +36,14 @@ public class AiWritingRestImpl implements AiWritingRest {
throw new BusinessException("用户未登录");
}
KnowledgeDefaultCache knowledgeDefaultCache = new KnowledgeDefaultCache();
Integer[] knowledgeId;
Integer[] defaultKnowledgeId = knowledgeDefaultCache.getDefaultKnowledgeId();
Integer[] knowledgeId = (Integer[]) Arrays.stream(ArrayUtils.addAll(defaultKnowledgeId, aiWritingDto.getKnowledgeIds())).distinct()
.toArray();
if (ArrayUtils.isNotEmpty(aiWritingDto.getKnowledgeIds())) {
knowledgeId = Arrays.stream(ArrayUtils.addAll(defaultKnowledgeId, aiWritingDto.getKnowledgeIds())).distinct()
.toArray(Integer[]::new);
} else {
knowledgeId = defaultKnowledgeId;
}
aiWritingService.call(aiWritingDto.getDialoguesId(), aiWritingDto.getFileUrl(),
aiWritingDto.getInput(), knowledgeId, userBaseEntity.getUserId(),
aiWritingDto.getEnableSearchEngine(), aiWritingDto.getEnableDeepThinking());
......
package cn.com.poc.dify;
import cn.com.gsst.dify_client.DifyChatClient;
import cn.com.gsst.dify_client.DifyClientFactory;
import cn.com.gsst.dify_client.callback.ChatStreamCallback;
import cn.com.gsst.dify_client.enums.ResponseMode;
import cn.com.gsst.dify_client.event.MessageEndEvent;
import cn.com.gsst.dify_client.event.MessageEvent;
import cn.com.gsst.dify_client.exception.DifyApiException;
import cn.com.gsst.dify_client.model.chat.ChatMessage;
import cn.com.gsst.dify_client.model.chat.ChatMessageResponse;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.CountDownLatch;
/**
* @author alex.yao
* @date 2025/9/15
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = SingleContextInitializer.class)
@WebAppConfiguration
public class DifyTest {
@Test
public void test_chat() throws DifyApiException, IOException {
// 创建聊天客户端
DifyChatClient chatClient = DifyClientFactory.createChatClient("http://192.168.21.174:6060/v1", "app-pv9FlrZCMfYogqzmbSxwg16s");
// 创建聊天消息
ChatMessage message = ChatMessage.builder()
.query("你好,请介绍一下自己")
.user("user-123")
.inputs(new LinkedHashMap<>())
.responseMode(ResponseMode.BLOCKING)
.build();
// 发送消息并获取响应
ChatMessageResponse response = chatClient.sendChatMessage(message);
System.out.println("回复: " + response.getAnswer());
System.out.println("会话ID: " + response.getConversationId());
System.out.println("消息ID: " + response.getMessageId());
}
@Test
public void test_chatStream() throws DifyApiException, IOException, InterruptedException {
// 创建聊天客户端
DifyChatClient chatClient = DifyClientFactory.createChatClient("https://dify.gsstcloud.com/v1", "app-YmVPoXmTh7ejERFbip3ADCYN");
Map<String,Object> inputs = new LinkedHashMap<>();
inputs.put("demand","Java实习");
inputs.put("type","chat");
inputs.put("jobInfomations","chat");
inputs.put("fileinfos","{\"baseInfo\":{\"department\":\"技术部\",\"educationalRe\":\"本科及以上\",\"jobNature\":\"全职\",\"jobTitle\":\"AI应用工程师\",\"numberOfRecruits\":5,\"salaryRange\":\"15k-20k\",\"workExperience\":\"3-5年\",\"workLocation\":\"北京\"}}");
// 创建聊天消息
ChatMessage message = ChatMessage.builder()
.query("帮我优化 职业画像")
.user("user-123")
.inputs(inputs)
.responseMode(ResponseMode.STREAMING)
.build();
CountDownLatch countDownLatch = new CountDownLatch(1);
// 发送消息并获取响应
chatClient.sendChatMessageStream(message, new ChatStreamCallback() {
@Override
public void onMessage(MessageEvent event) {
ChatStreamCallback.super.onMessage(event);
System.out.println("answer:" + event.getAnswer());
}
@Override
public void onMessageEnd(MessageEndEvent event) {
ChatStreamCallback.super.onMessageEnd(event);
countDownLatch.countDown();
System.out.println("answer:" + "[DONE]");
}
});
countDownLatch.await();
}
}
package cn.com.poc.humanResource;
import cn.com.poc.common.utils.BlContext;
import cn.com.poc.human_resources.aggregate.HumanResourceService;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import javax.annotation.Resource;
/**
* @author alex.yao
* @date 2025/9/28
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = SingleContextInitializer.class)
@WebAppConfiguration
public class HumanResourceTest {
@Resource
private HumanResourceService humanResourceService;
@Test
public void test_uploadResume() throws Exception {
String fileURL = "https://gsst-modellink-prod.gz.bcebos.com/data/20250928/1759049361707.pdf";
String postion = "java实习生";
Long userId = 0L;
System.out.println(humanResourceService.uploadResume(fileURL, 1L, userId));
}
}
......@@ -3,6 +3,7 @@ package cn.com.poc.knowledge;
import cn.com.poc.common.utils.StringUtils;
import cn.com.poc.common.utils.UUIDTool;
import cn.com.poc.knowledge.aggregate.KnowledgeService;
import cn.com.poc.knowledge.cache.KnowledgeDefaultCache;
import cn.com.yict.framemax.core.i18n.I18nMessageException;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import cn.hutool.poi.excel.ExcelReader;
......@@ -51,6 +52,12 @@ public class KnowledgeServiceTest {
MockitoAnnotations.initMocks(this);
}
@Test
public void test_default() {
KnowledgeDefaultCache knowledgeDefaultCache = new KnowledgeDefaultCache();
System.out.println(knowledgeDefaultCache.getDefaultKnowledgeId());
}
@Test
public void test_delDocument() {
......
package cn.com.poc.meeting;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = SingleContextInitializer.class)
@WebAppConfiguration
public class MeetingTest {
@Test
public void test() {
String keyword = "an example";
String text = "This is an example sentence. Another example? Yes, this is an example.";
// 将关键词转换为正则表达式模式(注意转义特殊字符)
String regexPattern = Pattern.quote(keyword);
// 构建匹配句子的正则表达式
// 匹配以任意标点符号或换行结尾的句子,包含关键词
// 支持中英文混合关键词匹配
String sentenceRegex = "[^,,::;;.。!?!?\\n]*" + regexPattern + "[^,,::;;.。!?!?\\n]*[,,::;;.。!?!?\\n]";
Pattern pattern = Pattern.compile(sentenceRegex, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(text);
// 查找并输出匹配的句子
while (matcher.find()) {
System.out.println("\"" + matcher.group().trim() + "\"");
}
}
}
//package cn.com.poc.utils;
//
//import cn.com.poc.common.utils.DocumentLoad;
//import cn.com.poc.common.utils.FileUtils;
//import cn.com.yict.framemax.core.spring.SingleContextInitializer;
//import com.aspose.words.Document;
//import com.aspose.words.HtmlSaveOptions;
//import com.aspose.words.HtmlVersion;
//import com.aspose.words.SaveFormat;
//import org.apache.pdfbox.pdmodel.PDDocument;
//import org.apache.pdfbox.text.PDFTextStripper;
//import org.junit.runner.RunWith;
//import org.junit.Test;
//import org.springframework.test.context.ContextConfiguration;
//import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
//import org.springframework.test.context.web.WebAppConfiguration;
//
//import java.io.*;
//
///**
// * @author alex.yao
// * @date 2025/6/12
// */
//@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(initializers = SingleContextInitializer.class)
//@WebAppConfiguration
//public class FileUtilsTest {
//
//
// @Test
// public void test_wordConvertPDF() throws Exception {
// String filePath = "";
// File file = FileUtils.wordConvertPDF(new File(filePath));
// System.out.println(DocumentLoad.loadPDF(file));
// }
//
// @Test
// public void test_word2html() throws Exception {
// String filePath = "C:\\Users\\52747\\Desktop\\test_motionDetailExport.docx";
// String dataDir = "C:\\Users\\52747\\Desktop\\";
// Document doc = new Document(filePath);
// HtmlSaveOptions opts = new HtmlSaveOptions(SaveFormat.HTML);
// opts.setHtmlVersion(HtmlVersion.HTML_5);
// opts.setExportImagesAsBase64(true);
// opts.setExportPageMargins(true);
// doc.save(dataDir + "TestFile.html", opts);
// }
//
// @Test
// public void test_pdf2word() {
// try {
// String pdfFile = "C:\\Users\\52747\\Documents\\dataset\\EMSD_Regulatory_Services_Handbook_LPG16.pdf";
// String wordFile = "C:\\Users\\52747\\Documents\\dataset\\EMSD_Regulatory_Services_Handbook_LPG16.doc";
//
// // 加载PDF文档
// PDDocument pdfDoc = PDDocument.load(new File(pdfFile));
// int totalPages = pdfDoc.getNumberOfPages();
//
// // 使用追加模式打开Word文件
// try (Writer writer = new OutputStreamWriter(new FileOutputStream(wordFile, true), "UTF-8")) {
// PDFTextStripper stripper = new PDFTextStripper();
// stripper.setSortByPosition(true);
// for (int i = 1; i <= totalPages; i++) {
// stripper.setStartPage(i);
// stripper.setEndPage(i);
// String pageText = stripper.getText(pdfDoc);
//
// // 追加当前页内容
// writer.write(pageText);
// writer.write("\f");
// }
// }
// pdfDoc.close();
// System.out.println("总计追加 " + totalPages + " 页到现有文件");
// } catch (IOException e) {
// System.err.println("转换失败:" + e.getMessage());
// e.printStackTrace();
// }
// }
//
//}
package cn.com.poc.utils;
import cn.com.poc.common.utils.DocumentLoad;
import cn.com.poc.common.utils.FileUtils;
import cn.com.yict.framemax.core.spring.SingleContextInitializer;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import java.io.*;
/**
* @author alex.yao
* @date 2025/6/12
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(initializers = SingleContextInitializer.class)
@WebAppConfiguration
public class FileUtilsTest {
@Test
public void test_wordConvertPDF() throws Exception {
}
@Test
public void test_pdf2word() {
try {
String pdfFile = "C:\\Users\\52747\\Documents\\dataset\\EMSD_Regulatory_Services_Handbook_LPG16.pdf";
String wordFile = "C:\\Users\\52747\\Documents\\dataset\\EMSD_Regulatory_Services_Handbook_LPG16.doc";
// 加载PDF文档
PDDocument pdfDoc = PDDocument.load(new File(pdfFile));
int totalPages = pdfDoc.getNumberOfPages();
// 使用追加模式打开Word文件
try (Writer writer = new OutputStreamWriter(new FileOutputStream(wordFile, true), "UTF-8")) {
PDFTextStripper stripper = new PDFTextStripper();
stripper.setSortByPosition(true);
for (int i = 1; i <= totalPages; i++) {
stripper.setStartPage(i);
stripper.setEndPage(i);
String pageText = stripper.getText(pdfDoc);
// 追加当前页内容
writer.write(pageText);
writer.write("\f");
}
}
pdfDoc.close();
System.out.println("总计追加 " + totalPages + " 页到现有文件");
} catch (IOException e) {
System.err.println("转换失败:" + e.getMessage());
e.printStackTrace();
}
}
@Test
public void test_pdf() {
File file = new File("C:\\Users\\52747\\Desktop\\港口基础设施维护管理信息系统建设规范JTST3302025.pdf");
String pdfResult = DocumentLoad.documentToText(file);
System.out.println(pdfResult);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment