From 7936451d6131383b8467f0f2819a8752a8c5ab2d Mon Sep 17 00:00:00 2001 From: Your Name Date: Wed, 7 Jan 2026 14:23:31 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=EF=BC=9A1.=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E7=B4=A0=E6=9D=90API=E9=85=8D=E7=BD=AE=E9=A1=B9=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=202.RestTemplate=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E4=BF=A1=E4=BB=BB=E6=89=80=E6=9C=89HTTPS=E8=AF=81=E4=B9=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../designhub/config/RestTemplateConfig.java | 45 +++- .../service/TaskApprovalService.java | 2 +- .../com/designhub/service/TaskService.java | 4 +- .../com/designhub/service/UserService.java | 6 +- frontend/src/views/Settings.vue | 120 +++++------ frontend/src/views/TaskHall.vue | 192 +++++++++--------- 6 files changed, 205 insertions(+), 164 deletions(-) diff --git a/backend/src/main/java/com/designhub/config/RestTemplateConfig.java b/backend/src/main/java/com/designhub/config/RestTemplateConfig.java index 4305904..808cca0 100644 --- a/backend/src/main/java/com/designhub/config/RestTemplateConfig.java +++ b/backend/src/main/java/com/designhub/config/RestTemplateConfig.java @@ -5,17 +5,58 @@ import org.springframework.context.annotation.Configuration; import org.springframework.http.client.SimpleClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; +import javax.net.ssl.*; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.security.KeyManagementException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.X509Certificate; + /** * RestTemplate配置类 + * 支持调用HTTPS接口(信任所有证书) */ @Configuration public class RestTemplateConfig { @Bean - public RestTemplate restTemplate() { - SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory(); + public RestTemplate restTemplate() throws NoSuchAlgorithmException, KeyManagementException { + // 创建信任所有证书的 TrustManager + TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + public X509Certificate[] getAcceptedIssuers() { return null; } + public void checkClientTrusted(X509Certificate[] certs, String authType) {} + public void checkServerTrusted(X509Certificate[] certs, String authType) {} + } + }; + + // 安装信任所有证书的 TrustManager + SSLContext sslContext = SSLContext.getInstance("TLS"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + HttpsURLConnection.setDefaultSSLSocketFactory(sslContext.getSocketFactory()); + + // 设置 HostnameVerifier 为信任所有主机名 + HttpsURLConnection.setDefaultHostnameVerifier((hostname, session) -> true); + + // 创建自定义的 RequestFactory + SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory() { + @Override + protected void prepareConnection(HttpURLConnection connection, String httpMethod) throws IOException { + if (connection instanceof HttpsURLConnection) { + ((HttpsURLConnection) connection).setHostnameVerifier((hostname, session) -> true); + try { + ((HttpsURLConnection) connection).setSSLSocketFactory(sslContext.getSocketFactory()); + } catch (Exception e) { + // ignore + } + } + super.prepareConnection(connection, httpMethod); + } + }; + factory.setConnectTimeout(10000); // 连接超时10秒 factory.setReadTimeout(30000); // 读取超时30秒 + return new RestTemplate(factory); } } diff --git a/backend/src/main/java/com/designhub/service/TaskApprovalService.java b/backend/src/main/java/com/designhub/service/TaskApprovalService.java index 6331e72..1cf0b54 100644 --- a/backend/src/main/java/com/designhub/service/TaskApprovalService.java +++ b/backend/src/main/java/com/designhub/service/TaskApprovalService.java @@ -466,7 +466,7 @@ public class TaskApprovalService { } else { // 没有子任务时显示总积分和工时 content.append("**任务积分**:").append(task.getScore()).append(" 分 \n"); - if (task.getEstimatedHours() != null) { + if (task.getEstimatedHours() != null) { content.append("**预估工时**:").append(formatEstimatedHours(task.getEstimatedHours())).append(" \n"); } } diff --git a/backend/src/main/java/com/designhub/service/TaskService.java b/backend/src/main/java/com/designhub/service/TaskService.java index 5f44fcd..6fe060e 100644 --- a/backend/src/main/java/com/designhub/service/TaskService.java +++ b/backend/src/main/java/com/designhub/service/TaskService.java @@ -432,7 +432,7 @@ public class TaskService { java.util.List> typeDetailsList = new java.util.ArrayList<>(); for (com.designhub.dto.PipelineTaskDTO.TaskItemDTO itemDto : groupItems) { - var demandType = configService.getDemandTypeById(itemDto.getTaskTypeId()); + var demandType = configService.getDemandTypeById(itemDto.getTaskTypeId()); int itemScore = demandType.getUnitScore().multiply(BigDecimal.valueOf(itemDto.getQuantity())).intValue(); BigDecimal itemHours = demandType.getEstimatedHours() != null ? demandType.getEstimatedHours().multiply(BigDecimal.valueOf(itemDto.getQuantity())) @@ -491,7 +491,7 @@ public class TaskService { } } else { // 并行流水线:全部待接单 - item.setStatus("pending"); + item.setStatus("pending"); item.setIsLocked(0); } diff --git a/backend/src/main/java/com/designhub/service/UserService.java b/backend/src/main/java/com/designhub/service/UserService.java index f5afdcb..ae02fa9 100644 --- a/backend/src/main/java/com/designhub/service/UserService.java +++ b/backend/src/main/java/com/designhub/service/UserService.java @@ -1338,10 +1338,10 @@ public class UserService { int diffB = Math.abs(b.getDeptName().length() - dingDeptName.length()); return Integer.compare(diffA, diffB); }) - .findFirst() - .orElse(null); + .findFirst() + .orElse(null); - if (matched != null) { + if (matched != null) { log.info("通过部门名称模糊匹配: {} -> {} (候选数: {})", dingDeptName, matched.getDeptName(), fuzzyMatched.size()); } diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue index 36e9ba0..0a7c2c4 100644 --- a/frontend/src/views/Settings.vue +++ b/frontend/src/views/Settings.vue @@ -600,21 +600,21 @@ @@ -1787,13 +1787,13 @@ 顶级部门(一级) - - {{ dept.deptName }} - + :key="dept.id" + :value="dept.id" + > + {{ dept.deptName }} + diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 9f330f1..b4054b6 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -200,10 +200,10 @@ class="task-card chart-card" @click="handleTaskClick(task)" > - -
-

{{ task.title }}

-
+ +
+

{{ task.title }}

+
子任务 @@ -216,12 +216,12 @@ 高分 - - - 紧急 - -
-
+ + + 紧急 + +
+
@@ -233,17 +233,17 @@
-
-
- 任务类型 +
+
+ 任务类型 {{ getTaskTypeName(task.taskTypeId, task.taskTypeName, task.taskSubType) }} -
-
- 预估积分 +
+
+ 预估积分 {{ task.totalScore || task.score || '--' }} 分 -
-
- 数量 +
+
+ 数量 {{ task.quantity || 1 }} 个
@@ -550,17 +550,17 @@
-
- 任务类型 +
+ 任务类型 {{ getTaskTypeName(task.taskTypeId, task.taskTypeName, task.taskSubType) }} -
-
- 预估积分 +
+
+ 预估积分 {{ task.totalScore || task.score }} 分 -
-
- 数量 - {{ task.quantity || '--' }} 个 +
+
+ 数量 + {{ task.quantity || '--' }} 个
@@ -866,17 +866,17 @@
-
- 任务类型 +
+ 任务类型 {{ getTaskTypeName(task.taskTypeId, task.taskTypeName, task.taskSubType) }} -
-
- 预估积分 +
+
+ 预估积分 {{ task.totalScore || task.score }} 分 -
-
- 数量 - {{ task.quantity || '--' }} 个 +
+
+ 数量 + {{ task.quantity || '--' }} 个
@@ -1215,17 +1215,17 @@
-
- 任务类型 +
+ 任务类型 {{ getTaskTypeName(task.taskTypeId, task.taskTypeName, task.taskSubType) }} -
-
- 获得积分 - {{ task.score }} 分 -
-
- 数量 - {{ task.quantity || '--' }} 个 +
+
+ 获得积分 + {{ task.score }} 分 +
+
+ 数量 + {{ task.quantity || '--' }} 个
@@ -1554,17 +1554,17 @@
-
- 任务类型 +
+ 任务类型 {{ getTaskTypeName(task.taskTypeId, task.taskTypeName, task.taskSubType) }} -
-
- 积分 - {{ task.score }} 分 -
-
- 数量 - {{ task.quantity || '--' }} 个 +
+
+ 积分 + {{ task.score }} 分 +
+
+ 数量 + {{ task.quantity || '--' }} 个
@@ -1791,22 +1791,22 @@
-
-
- 任务类型 - {{ getTaskTypeName(item.data.taskTypeId) }} -
-
- 子任务数量 - {{ item.data.items?.length || 0 }} 个 -
-
- 预估积分 - {{ item.score }} 分 -
-
- 数量 - {{ item.data.quantity || '--' }} 个 +
+
+ 任务类型 + {{ getTaskTypeName(item.data.taskTypeId) }} +
+
+ 子任务数量 + {{ item.data.items?.length || 0 }} 个 +
+
+ 预估积分 + {{ item.score }} 分 +
+
+ 数量 + {{ item.data.quantity || '--' }} 个
@@ -2920,7 +2920,7 @@ const loadCompletedTasks = async () => { } } else if (userDeptType === 'demand') { // 需求部门用户:看到自己发起的已完成的母任务 - const response = await taskApi.getCompletedTasks(params) + const response = await taskApi.getCompletedTasks(params) if (response.data && response.data.records) { allTasks = response.data.records.map((task: any) => ({ ...task, @@ -3207,12 +3207,12 @@ const showAssignDesignerModal = async (task: Task) => { })) } else { // 兼容旧数据:从 taskTypeIds 获取 - const taskTypeIdsStr = task.taskTypeIds || task.taskTypeId?.toString() || '' - const taskTypeIdArray = taskTypeIdsStr.split(',').filter(id => id.trim()) - approveTaskTypes.value = taskTypeIdArray.map(id => ({ - typeId: parseInt(id.trim()), - quantity: task.quantity || 1 - })) + const taskTypeIdsStr = task.taskTypeIds || task.taskTypeId?.toString() || '' + const taskTypeIdArray = taskTypeIdsStr.split(',').filter(id => id.trim()) + approveTaskTypes.value = taskTypeIdArray.map(id => ({ + typeId: parseInt(id.trim()), + quantity: task.quantity || 1 + })) } approveModalVisible.value = true @@ -3657,26 +3657,26 @@ const loadInProgressTasks = async () => { // 根据部门类型决定加载哪些任务 if (isAdmin) { // 管理员:看到所有任务(母任务和子任务) - const [taskResponse, itemResponse] = await Promise.all([ - taskApi.getTasks(params), - taskApi.getInProgressTaskItems(params) - ]) + const [taskResponse, itemResponse] = await Promise.all([ + taskApi.getTasks(params), + taskApi.getInProgressTaskItems(params) + ]) - // 处理普通任务 - if (taskResponse.data && taskResponse.data.records) { - const tasks = taskResponse.data.records.map((task: any) => ({ - ...task, + // 处理普通任务 + if (taskResponse.data && taskResponse.data.records) { + const tasks = taskResponse.data.records.map((task: any) => ({ + ...task, isSubTask: false - })) - allTasks = [...allTasks, ...tasks] - totalCount += taskResponse.data.total || 0 - } + })) + allTasks = [...allTasks, ...tasks] + totalCount += taskResponse.data.total || 0 + } - // 处理子任务 - if (itemResponse.data && itemResponse.data.records) { + // 处理子任务 + if (itemResponse.data && itemResponse.data.records) { const items = itemResponse.data.records.map((item: any) => mapTaskItemToTask(item)) - allTasks = [...allTasks, ...items] - totalCount += itemResponse.data.total || 0 + allTasks = [...allTasks, ...items] + totalCount += itemResponse.data.total || 0 } } else if (userDeptType === 'demand') { // 需求部门用户:只看母任务卡片(自己发起的任务)