Browse Source

优化合同审核功能

ai_300
zhouhaibin 2 weeks ago
parent
commit
1663699551
  1. 67
      ruoyi-admin/src/main/resources/application-prod.yml
  2. 2
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/common/service/AbstractTaskProcessor.java
  3. 2
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/common/service/BaseTaskService.java
  4. 29
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/controller/ContractualTasksController.java
  5. 10
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ContractualTasks.java
  6. 4
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/bo/ContractualTasksBo.java
  7. 4
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/vo/ContractualTasksVo.java
  8. 9
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/IContractualTasksService.java
  9. 75
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/impl/ContractualTasksServiceImpl.java
  10. 33
      zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/utils/MyHttpUtils.java

67
ruoyi-admin/src/main/resources/application-prod.yml

@ -15,7 +15,7 @@ spring.boot.admin.client:
password: 123456
server:
# 端口号
port: 8081
port: 8082
--- # snail-job 配置
snail-job:
enabled: false
@ -29,9 +29,7 @@ snail-job:
# 详见 script/sql/snail_job.sql `sj_namespace` 表
namespace: ${spring.profiles.active}
# 随主应用端口飘逸
port: 2${server.port}
# 客户端ip指定
host:
port: 3${server.port}
--- # 数据源配置
spring:
@ -52,35 +50,35 @@ spring:
driverClassName: com.mysql.cj.jdbc.Driver
# jdbc 所有参数配置参考 https://lionli.blog.csdn.net/article/details/122018562
# rewriteBatchedStatements=true 批处理优化 大幅提升批量插入更新删除性能(对数据库有性能损耗 使用批量操作应考虑性能问题)
url: jdbc:mysql://localhost:3306/zaojia?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
url: jdbc:mysql://10.1.21.250:3306/aitesttable?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root
password: root
password: HXj-6nR|D8xy*h#!I&:(
# 从库数据源
slave:
lazy: true
type: ${spring.datasource.type}
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://116.62.210.190:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
username: root
password: Guoyan83086775
# oracle:
# type: ${spring.datasource.type}
# driverClassName: oracle.jdbc.OracleDriver
# url: jdbc:oracle:thin:@//localhost:1521/XE
# username: ROOT
# password: root
# postgres:
# type: ${spring.datasource.type}
# driverClassName: org.postgresql.Driver
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
# username: root
# password: root
# sqlserver:
# type: ${spring.datasource.type}
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
# username: SA
# password: root
# slave:
# lazy: true
# type: ${spring.datasource.type}
# driverClassName: com.mysql.cj.jdbc.Driver
# url: jdbc:mysql://116.62.210.190:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&autoReconnect=true&rewriteBatchedStatements=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
# username: root
# password: Guoyan83086775
# oracle:
# type: ${spring.datasource.type}
# driverClassName: oracle.jdbc.OracleDriver
# url: jdbc:oracle:thin:@//localhost:1521/XE
# username: ROOT
# password: root
# postgres:
# type: ${spring.datasource.type}
# driverClassName: org.postgresql.Driver
# url: jdbc:postgresql://localhost:5432/postgres?useUnicode=true&characterEncoding=utf8&useSSL=true&autoReconnect=true&reWriteBatchedInserts=true
# username: root
# password: root
# sqlserver:
# type: ${spring.datasource.type}
# driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver
# url: jdbc:sqlserver://localhost:1433;DatabaseName=tempdb;SelectMethod=cursor;encrypt=false;rewriteBatchedStatements=true
# username: SA
# password: root
hikari:
# 最大连接池数量
maxPoolSize: 20
@ -107,7 +105,7 @@ spring.data:
# 数据库索引
database: 0
# redis 密码必须配置
password: root
password: F*Nx=BZli+ZCCI-Fil+3
# 连接超时时间
timeout: 10s
# 是否开启ssl
@ -284,5 +282,6 @@ justauth:
# maxConnectNumPerRoute: 100
chat:
# 聊天机器人配置
filePath: /usr/app/tempFile
chatUrl: http://183.136.156.2:50000
filePath: /guoYanXinXi/data/software/minio/data/ruoyi/
tempfilePath: /guoYanXinXi/data/software/app/tempfile/
chatUrl: http://127.0.0.1:8081

2
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/common/service/AbstractTaskProcessor.java

@ -175,7 +175,7 @@ public abstract class AbstractTaskProcessor<T extends BaseTaskBo, E> implements
/**
* 处理具体任务项
*/
protected Boolean processTaskItems(List<String> taskNames, T taskData, FileProcessResult fileResult, String taskType) {
protected Boolean processTaskItems(List<String> taskNames, T taskData, FileProcessResult fileResult, String taskType) throws IOException {
boolean flag = false;
for (String taskName : taskNames) {
// 转换为对应的任务实体

2
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/common/service/BaseTaskService.java

@ -215,7 +215,7 @@ public abstract class BaseTaskService<T extends BaseTaskBo> {
* 处理具体任务项
*/
// protected abstract Boolean processTaskItems(List<String> taskNames, BaseTaskBo bo, FileProcessResult fileResult, String taskType);
protected Boolean processTaskItems(List<String> taskNames, T bo, FileProcessResult fileResult, String taskType) {
protected Boolean processTaskItems(List<String> taskNames, T bo, FileProcessResult fileResult, String taskType) throws IOException {
boolean flag = false;
for (String taskName : taskNames) {

29
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/controller/ContractualTasksController.java

@ -26,6 +26,7 @@ import org.dromara.productManagement.domain.vo.ContractualTasksVo;
import org.dromara.productManagement.domain.bo.ContractualTasksBo;
import org.dromara.productManagement.service.IContractualTasksService;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.productManagement.domain.StartContractReviewRequest;
/**
* 合同任务
@ -143,4 +144,32 @@ public class ContractualTasksController extends BaseController {
return R.fail("合同分析失败: " + e.getMessage());
}
}
/**
* 启动合同审查任务
*
* @param request 审查请求数据
*/
@PostMapping("/startReview")
public R<Map<String, Object>> startReview(@RequestBody StartContractReviewRequest request) {
try {
// 参数验证
if (request.getOssId() == null || request.getOssId().trim().isEmpty()) {
return R.fail("文件ID不能为空");
}
if (request.getReviewTypes() == null || request.getReviewTypes().isEmpty()) {
return R.fail("审查类型不能为空");
}
// 调用服务层启动审查
Map<String, Object> result = contractualTasksService.startContractReview(request);
return R.ok(result);
} catch (Exception e) {
e.printStackTrace();
return R.fail("启动合同审查失败: " + e.getMessage());
}
}
}

10
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/ContractualTasks.java

@ -54,10 +54,6 @@ public class ContractualTasks extends TenantEntity {
*/
private Long ossId;
/**
* 预计完成时间
*/
private Date estimatedCompletionTime;
/**
*
@ -87,7 +83,7 @@ public class ContractualTasks extends TenantEntity {
* 任务类型
*/
private String taskType;
/**
* 合同角色
*/
@ -101,7 +97,7 @@ public class ContractualTasks extends TenantEntity {
/**
* 审查重点
*/
private String focusPointsId;
private String focusPoints;
/**
* 甲方
@ -116,5 +112,5 @@ public class ContractualTasks extends TenantEntity {
/**
* 审查组件
*/
private String reviewComponents;
private String reviewData;
}

4
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/bo/ContractualTasksBo.java

@ -43,7 +43,7 @@ public class ContractualTasksBo extends BaseTaskBo {
/**
* 审查重点
*/
private String focusPointsId;
private String focusPoints;
/**
* 甲方
@ -58,7 +58,7 @@ public class ContractualTasksBo extends BaseTaskBo {
/**
* 审查组件
*/
private String reviewComponents;
private String reviewData;
// /**
// * 模型所属行业

4
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/domain/vo/ContractualTasksVo.java

@ -54,7 +54,7 @@ public class ContractualTasksVo extends BaseTaskVo implements Serializable {
* 审查重点
*/
@ExcelProperty(value = "审查重点")
private String focusPointsId;
private String focusPoints;
/**
* 甲方
@ -72,6 +72,6 @@ public class ContractualTasksVo extends BaseTaskVo implements Serializable {
* 审查组件
*/
@ExcelProperty(value = "审查组件")
private String reviewComponents;
private String reviewData;
private Long groupId;
}

9
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/IContractualTasksService.java

@ -5,6 +5,7 @@ import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.productManagement.domain.vo.ContractualTasksVo;
import org.dromara.productManagement.domain.vo.DocumentTasksVo;
import org.dromara.productManagement.domain.StartContractReviewRequest;
import java.io.IOException;
import java.util.Collection;
@ -77,4 +78,12 @@ public interface IContractualTasksService {
*/
Map<String, Object> getContractBaseInfo(String ossId);
/**
* 启动合同审查任务
*
* @param request 审查请求数据
* @return 审查结果
*/
Map<String, Object> startContractReview(StartContractReviewRequest request) throws Exception;
}

75
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/service/impl/ContractualTasksServiceImpl.java

@ -29,9 +29,11 @@ import org.springframework.stereotype.Service;
import org.dromara.productManagement.domain.bo.ContractualTasksBo;
import org.dromara.productManagement.service.IContractualTasksService;
import org.springframework.transaction.annotation.Transactional;
import org.dromara.productManagement.utils.MyHttpUtils;
import java.io.IOException;
import java.util.*;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* 合同任务Service业务层处理
@ -218,5 +220,78 @@ public class ContractualTasksServiceImpl extends AbstractTaskProcessor<Contractu
return entity.getId();
}
/**
* 启动合同审查任务
*
* @param request 审查请求数据
* @return 审查结果
*/
@Override
public Map<String, Object> startContractReview(StartContractReviewRequest request) throws Exception {
FileProcessResult fileProcessResult = processFile(Long.valueOf(request.getOssId()));
String filePath = fileProcessResult.getFilePath();
String fileName = fileProcessResult.getFileName();
// 1. 参数验证
if (request.getOssId() == null || request.getOssId().trim().isEmpty()) {
throw new IllegalArgumentException("文件ID不能为空");
}
// 3. 创建合同任务记录
ContractualTasks contractTask = new ContractualTasks();
contractTask.setOssId(Long.valueOf(request.getOssId()));
contractTask.setTaskName(TaskEnum.ContractTask.CONTRACT_REVIEW.getValue());
contractTask.setDocumentName(fileName);
contractTask.setTaskType(TaskEnum.TaskType.CONTRACT_REVIEW.getValue());
contractTask.setProgressStatus("PENDING");
String position = request.getReviewData().getSubstantive().getPosition();
String contractPartyRole;
switch (position) {
case "party-a":
contractPartyRole = "甲方";
break;
case "neutral":
contractPartyRole = "中立";
break;
case "party-b":
contractPartyRole = "乙方";
break;
default:
contractPartyRole = "中立";
break;
}
request.getReviewData().getSubstantive().setPosition(contractPartyRole);
contractTask.setContractPartyRole(contractPartyRole);
// 4. 将reviewData序列化并保存到review_data字段
ObjectMapper objectMapper = new ObjectMapper();
String reviewDataJson = objectMapper.writeValueAsString(request.getReviewData());
contractTask.setReviewData(reviewDataJson);
// 5. 保存到数据库
if (!saveTaskEntity(contractTask)) {
throw new RuntimeException("保存合同任务失败");
}
// 6. 调用Python接口启动任务
// String pythonUrl = "http://localhost:5000/api/contract/review";
// MyHttpUtils.sendTaskStartMessage(
// pythonUrl,
// contractTask.getId(),
// contractTask.getTaskName(),
// filePath,
// 1L
// );
// 7. 立即返回任务创建成功信息
Map<String, Object> result = new HashMap<>();
result.put("success", true);
result.put("message", "合同审查任务已创建,正在后台处理");
result.put("taskId", contractTask.getId());
result.put("taskName", contractTask.getTaskName());
result.put("status", "PENDING");
return result;
}
}

33
zaojiaManagement/zaojia-productManagement/src/main/java/org/dromara/productManagement/utils/MyHttpUtils.java

@ -24,37 +24,36 @@ public class MyHttpUtils {
MyHttpUtils.chatUrl = url;
}
public static void sendTaskStartMessage(String url,Long taskId, String taskName, String filename,Long priority) {
public static void sendTaskStartMessage(String url, Long taskId, String taskName, String filename, Long priority) throws IOException {
OkHttpClient client = new OkHttpClient.Builder().build();
if (url == null) {
throw new IllegalArgumentException("无效的任务名称: " + taskName);
throw new IllegalArgumentException("无效的URL: " + url);
}
// Request request = new Request.Builder()
// .url(url+"?userId="+ LoginHelper.getUserId()+"&taskId="+taskId+"&filename="+filename+"&taskName="+taskName+"&priority="+priority)
// .build();
// 构建请求URL
HttpUrl.Builder urlBuilder = HttpUrl.parse(url).newBuilder();
urlBuilder.addQueryParameter("userId", String.valueOf(LoginHelper.getUserId()));
urlBuilder.addQueryParameter("taskId", String.valueOf(taskId));
urlBuilder.addQueryParameter("filename", filename);
urlBuilder.addQueryParameter("taskName", taskName);
urlBuilder.addQueryParameter("priority", String.valueOf(priority));
Request request = new Request.Builder()
.url(urlBuilder.build())
.build();
// 使用异步调用
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace(); // 处理请求失败
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// 忽略返回内容
response.close(); // 确保响应被关闭
// 使用同步调用并检查状态码
try (Response response = client.newCall(request).execute()) {
if (!response.isSuccessful()) {
throw new IOException("任务启动失败: HTTP " + response.code() + " - " + response.message());
}
});
System.out.println("任务启动成功: HTTP " + response.code() + ", 任务ID: " + taskId);
} catch (IOException e) {
System.err.println("任务启动异常: " + e.getMessage());
throw e; // 重新抛出异常,让调用方处理
}
}
/**

Loading…
Cancel
Save