From 17528529bf97c8f4b9ed4a50646c5620663468e1 Mon Sep 17 00:00:00 2001 From: luoweijian <1329394916@qq.com> Date: Wed, 25 Feb 2026 17:29:36 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96jsapi=E9=89=B4=E6=9D=83?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 6 + .../project/ding/config/DingProperties.java | 3 +- .../ding/config/DingTalkConfiguration.java | 19 +++ .../com/project/ding/config/DtConfig.java | 2 +- .../ding/controller/DingJsApiController.java | 22 +++ .../java/com/project/ding/utils/DingUtil.java | 134 +++++++++++++++++- .../ExamRecordApplicationService.java | 3 + .../ExamRecordApplicationServiceImpl.java | 6 + .../controller/AdminExamRecordController.java | 19 +++ .../exam/controller/ExamRecordController.java | 4 - .../exam/domain/dto/ExamRecordDTO.java | 4 + .../exam/domain/dto/ExportExamRecordDTO.java | 26 ++++ .../AdminExportExamRecordDomainService.java | 9 ++ .../handler/ExamResultColorHandler.java | 54 +++++++ ...dminExportExamRecordDomainServiceImpl.java | 22 +++ ...dminSearchExamRecordDomainServiceImpl.java | 9 ++ src/main/resources/application.yml | 1 + 17 files changed, 333 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/project/ding/config/DingTalkConfiguration.java create mode 100644 src/main/java/com/project/ding/controller/DingJsApiController.java create mode 100644 src/main/java/com/project/exam/domain/dto/ExportExamRecordDTO.java create mode 100644 src/main/java/com/project/exam/domain/service/AdminExportExamRecordDomainService.java create mode 100644 src/main/java/com/project/exam/domain/service/handler/ExamResultColorHandler.java create mode 100644 src/main/java/com/project/exam/domain/service/impl/AdminExportExamRecordDomainServiceImpl.java diff --git a/pom.xml b/pom.xml index a527a70..bda0e0b 100644 --- a/pom.xml +++ b/pom.xml @@ -40,6 +40,12 @@ 1.18.30 + + + com.aliyun + dingtalk + 2.2.12 + io.minio minio diff --git a/src/main/java/com/project/ding/config/DingProperties.java b/src/main/java/com/project/ding/config/DingProperties.java index 2b14ce2..205c186 100644 --- a/src/main/java/com/project/ding/config/DingProperties.java +++ b/src/main/java/com/project/ding/config/DingProperties.java @@ -10,5 +10,6 @@ import org.springframework.stereotype.Component; public class DingProperties { private String appKey; private String appSecret; - private Long agentId; + private String agentId; + private String corpId; } \ No newline at end of file diff --git a/src/main/java/com/project/ding/config/DingTalkConfiguration.java b/src/main/java/com/project/ding/config/DingTalkConfiguration.java new file mode 100644 index 0000000..1de521d --- /dev/null +++ b/src/main/java/com/project/ding/config/DingTalkConfiguration.java @@ -0,0 +1,19 @@ +package com.project.ding.config; + +import com.aliyun.dingtalkoauth2_1_0.Client; +import com.aliyun.teaopenapi.models.Config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class DingTalkConfiguration { + + @Bean + public Client dingTalkClient() throws Exception { + // 使用 com.aliyun.teaopenapi.models.Config + Config config = new Config(); + config.protocol = "https"; + config.regionId = "central"; + return new Client(config); + } +} \ No newline at end of file diff --git a/src/main/java/com/project/ding/config/DtConfig.java b/src/main/java/com/project/ding/config/DtConfig.java index bddbbcc..1d4c9a0 100644 --- a/src/main/java/com/project/ding/config/DtConfig.java +++ b/src/main/java/com/project/ding/config/DtConfig.java @@ -22,7 +22,7 @@ public class DtConfig { config.setAppSecret(dingTalkProperties.getAppSecret()); if (dingTalkProperties.getAgentId() != null) { - config.setAgentId(dingTalkProperties.getAgentId()); + config.setAgentId(Long.valueOf(dingTalkProperties.getAgentId())); } DtService dtService = new DtServiceImpl(); diff --git a/src/main/java/com/project/ding/controller/DingJsApiController.java b/src/main/java/com/project/ding/controller/DingJsApiController.java new file mode 100644 index 0000000..780c312 --- /dev/null +++ b/src/main/java/com/project/ding/controller/DingJsApiController.java @@ -0,0 +1,22 @@ +package com.project.ding.controller; + +import com.project.base.domain.result.Result; +import com.project.ding.utils.DingUtil; +import jakarta.servlet.http.HttpServletRequest; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.Map; + +@RestController +@RequestMapping("/api/ding/jsApi") +public class DingJsApiController { + @Autowired + private DingUtil dingUtil; + @RequestMapping("/getConfig") + public Result> getConfig(HttpServletRequest request){ + //AuthHelper 就是上面方法的类 + return Result.success(dingUtil.getConfig(request)); + } +} diff --git a/src/main/java/com/project/ding/utils/DingUtil.java b/src/main/java/com/project/ding/utils/DingUtil.java index d598ccd..2874a54 100644 --- a/src/main/java/com/project/ding/utils/DingUtil.java +++ b/src/main/java/com/project/ding/utils/DingUtil.java @@ -1,11 +1,12 @@ package com.project.ding.utils; import cn.hutool.core.bean.BeanUtil; +import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketResponse; +import com.aliyun.teautil.models.RuntimeOptions; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.github.tingyugetc520.ali.dingtalk.api.DtService; import com.github.tingyugetc520.ali.dingtalk.bean.department.DtDepart; - import com.github.tingyugetc520.ali.dingtalk.bean.message.DtCorpConversationMessage; import com.github.tingyugetc520.ali.dingtalk.bean.message.DtMessage; import com.github.tingyugetc520.ali.dingtalk.error.DtErrorException; @@ -13,26 +14,49 @@ import com.google.common.collect.Lists; import com.google.gson.JsonObject; import com.jayway.jsonpath.JsonPath; import com.project.appeal.domain.dto.AppealDTO; +import com.project.ding.config.DingProperties; import com.project.ding.domain.dto.DepartmentDTO; import com.project.ding.domain.dto.DingUserDTO; import com.project.ding.domain.dto.UserDTO; import io.vavr.control.Try; +import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Component; +import com.aliyun.dingtalkoauth2_1_0.Client; +import com.aliyun.dingtalkoauth2_1_0.models.CreateJsapiTicketHeaders; +import java.net.URLDecoder; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; +import java.util.*; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; + + @Component public class DingUtil { @Autowired private DtService dtService; + @Autowired + private StringRedisTemplate redisTemplate; + + @Autowired + private Client dingTalkClient; // 之前创建好的新版 SDK Client + + + @Autowired + private DingProperties dingTalkProperties; + + + private static final String TICKET_KEY = "dingtalk:jsapi_ticket"; + + public List getAllDepartment() throws Exception { List list = dtService.getDepartmentService().list(null, true); @@ -42,10 +66,112 @@ public class DingUtil { BeanUtil.copyProperties(dtDepart , departmentDTO); res.add(departmentDTO); } + return res; } + public String getJsapiTicket(String url) throws Exception { + // 1. 先从 Redis 拿 + String ticket = redisTemplate.opsForValue().get(TICKET_KEY + url); + if (ticket != null) { + return ticket; + } + + // 2. 如果 Redis 没了,加锁去钉钉查,防止高并发下多个请求同时冲击钉钉接口 + synchronized (TICKET_KEY + url) { + // 二次检查 + ticket = redisTemplate.opsForValue().get(TICKET_KEY + url); + if (ticket != null) return ticket; + + // 3. 获取 AccessToken (也建议通过 Redis 拿,逻辑同下) + String accessToken = dtService.getAccessToken(); + + // 4. 调用新版 SDK 获取 Ticket + CreateJsapiTicketHeaders createJsapiTicketHeaders = new CreateJsapiTicketHeaders(); + createJsapiTicketHeaders.xAcsDingtalkAccessToken = accessToken; + String jsapiTicket = ""; + try { + CreateJsapiTicketResponse jsapiTicketResponse = dingTalkClient.createJsapiTicketWithOptions(createJsapiTicketHeaders, new RuntimeOptions()); + // 5. 存入 Redis,设置 7000 秒过期(留出 200 秒冗余) + jsapiTicket = jsapiTicketResponse.getBody().getJsapiTicket(); + redisTemplate.opsForValue().set(TICKET_KEY + url, jsapiTicket + , 7000, TimeUnit.SECONDS); + + + } catch (Exception e) { + // 如果 V2 接口报错,部分企业应用可能需要降级调用 V1 接口(钉钉目前的过渡期特征) + throw new Exception("获取JsapiTicket失败: " + e.getMessage()); + } + + return jsapiTicket; + } + } + + public Map getConfig(HttpServletRequest request) { + String urlString = request.getRequestURL().toString(); + String queryString = request.getQueryString(); + + String queryStringEncode = null; + String url; + if (queryString != null) { + queryStringEncode = URLDecoder.decode(queryString); + url = urlString + "?" + queryStringEncode; + } else { + url = urlString; + } + + String nonceStr = "abcdefg"; + long timeStamp = System.currentTimeMillis() / 1000; + String signedUrl = url; + String ticket = null; + String signature = null; + String agentid = null; + + try { + String path = request.getServletContext().getRealPath("/"); + ticket = getJsapiTicket(path); + signature = sign(ticket, nonceStr, timeStamp, signedUrl); + agentid = dingTalkProperties.getAgentId(); + + } catch (Exception e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + Map resMap = new HashMap<>(); + resMap.put("jsticket" , ticket); + resMap.put("signature" , signature); + resMap.put("nonceStr" , nonceStr); + resMap.put("corpId" , dingTalkProperties.getCorpId()); + resMap.put("agentid" , agentid); + + return resMap; + } + + public static String sign(String jsticket, String nonceStr, long timeStamp, String url) throws Exception { + // 1. 拼接字符串。注意:顺序必须固定,参数名必须全小写 + // 提示:url 建议直接用前端传过来的原始值(去掉 # 之后的部分) + String plain = "jsapi_ticket=" + jsticket + + "&noncestr=" + nonceStr + + "×tamp=" + timeStamp + + "&url=" + url; + + try { + // 2. 钉钉 JSAPI 签名必须使用 SHA-1 + MessageDigest sha1 = MessageDigest.getInstance("SHA-1"); + + // 3. 计算哈希值 + byte[] digest = sha1.digest(plain.getBytes(StandardCharsets.UTF_8)); + + // 4. JDK 17 优雅写法:将 byte 数组转为 16 进制字符串 + return HexFormat.of().formatHex(digest); + + } catch (Exception e) { + throw new RuntimeException("计算钉钉签名失败", e); + } + } + + public String getUserIdByCode(String code) { return Try.of(() -> dtService.getOauth2Service().getUserInfo(code).getUserId()) .getOrElse(""); diff --git a/src/main/java/com/project/exam/application/ExamRecordApplicationService.java b/src/main/java/com/project/exam/application/ExamRecordApplicationService.java index 8078285..a9c192e 100644 --- a/src/main/java/com/project/exam/application/ExamRecordApplicationService.java +++ b/src/main/java/com/project/exam/application/ExamRecordApplicationService.java @@ -5,6 +5,7 @@ import com.project.base.domain.result.Result; import com.project.exam.domain.dto.ExamRecordDTO; import com.project.exam.domain.dto.ExamRecordPictureDTO; import com.project.exam.domain.param.ExamRecordParam; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; public interface ExamRecordApplicationService { @@ -18,4 +19,6 @@ public interface ExamRecordApplicationService { Result savePicture(MultipartFile file, Long recordId) throws Exception; Result> adminSearch(ExamRecordParam param) throws Exception; + void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception; + } diff --git a/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java b/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java index 1b8a394..f4ffcaf 100644 --- a/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java +++ b/src/main/java/com/project/exam/application/impl/ExamRecordApplicationServiceImpl.java @@ -8,6 +8,7 @@ import com.project.exam.domain.dto.ExamRecordDTO; import com.project.exam.domain.dto.ExamRecordPictureDTO; import com.project.exam.domain.param.ExamRecordParam; import com.project.exam.domain.service.*; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; @@ -35,6 +36,11 @@ public class ExamRecordApplicationServiceImpl implements ExamRecordApplicationSe return adminSearchExamRecordDomainService.adminSearch(param); } + @Override + public void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception { + + } + @Override public Result assemblePaper(Long taskId) throws Exception { return Result.success(assemblePaperDomainService.assemblePaper(taskId , SecurityUtils.getUserId())); diff --git a/src/main/java/com/project/exam/controller/AdminExamRecordController.java b/src/main/java/com/project/exam/controller/AdminExamRecordController.java index 29b6a92..536c107 100644 --- a/src/main/java/com/project/exam/controller/AdminExamRecordController.java +++ b/src/main/java/com/project/exam/controller/AdminExamRecordController.java @@ -1,8 +1,17 @@ package com.project.exam.controller; +import com.github.tingyugetc520.ali.dingtalk.error.DtErrorException; +import com.project.appeal.domain.param.AppealParam; +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; import com.project.exam.application.ExamRecordApplicationService; +import com.project.exam.domain.dto.ExamRecordDTO; +import com.project.exam.domain.param.ExamRecordParam; +import jakarta.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -10,7 +19,17 @@ import org.springframework.web.bind.annotation.RestController; @RequestMapping("/api/admin/examRecord") public class AdminExamRecordController { + @Autowired private ExamRecordApplicationService examRecordApplicationService; + @GetMapping("/search") + public Result> adminSearch(ExamRecordParam param) throws Exception{ + return examRecordApplicationService.adminSearch(param); + } + + + @GetMapping("/export") + public void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception { + } } diff --git a/src/main/java/com/project/exam/controller/ExamRecordController.java b/src/main/java/com/project/exam/controller/ExamRecordController.java index 7cc5fe2..3f8be50 100644 --- a/src/main/java/com/project/exam/controller/ExamRecordController.java +++ b/src/main/java/com/project/exam/controller/ExamRecordController.java @@ -19,10 +19,6 @@ public class ExamRecordController { @Autowired private ExamRecordApplicationService examRecordApplicationService; - @PostMapping("/adminSearch") - public Result> adminSearch(ExamRecordParam param) throws Exception{ - return examRecordApplicationService.adminSearch(param); - } @PostMapping("/assemblePaper") public Result assemblePaper(Long taskId) throws Exception{ return examRecordApplicationService.assemblePaper(taskId); diff --git a/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java b/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java index ea94ef7..211a65c 100644 --- a/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java +++ b/src/main/java/com/project/exam/domain/dto/ExamRecordDTO.java @@ -17,6 +17,8 @@ import java.util.function.Supplier; public class ExamRecordDTO extends BaseDTO { private Long id; private Long taskUserId; + + private String userName; private Double score; private Boolean pass = Boolean.FALSE; @@ -38,6 +40,8 @@ public class ExamRecordDTO extends BaseDTO { private String taskName; + private Integer serialNumber; + private List pictureDTOList = new ArrayList<>(); @Data diff --git a/src/main/java/com/project/exam/domain/dto/ExportExamRecordDTO.java b/src/main/java/com/project/exam/domain/dto/ExportExamRecordDTO.java new file mode 100644 index 0000000..3e9c3e9 --- /dev/null +++ b/src/main/java/com/project/exam/domain/dto/ExportExamRecordDTO.java @@ -0,0 +1,26 @@ +package com.project.exam.domain.dto; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.project.base.domain.dto.BaseDTO; +import lombok.Data; + +@Data +public class ExportExamRecordDTO extends BaseDTO { + @ExcelProperty("序号") + private Integer serialNumber; + + @ExcelProperty("关联子产品产品线") + private String subLineName; + + @ExcelProperty("考试任务名称") + private String taskName; + + @ExcelProperty("用户名") + private String userName; + + @ExcelProperty("考试得分") + private String score; + + @ExcelProperty("考试结果") + private String result; +} diff --git a/src/main/java/com/project/exam/domain/service/AdminExportExamRecordDomainService.java b/src/main/java/com/project/exam/domain/service/AdminExportExamRecordDomainService.java new file mode 100644 index 0000000..2e4214e --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/AdminExportExamRecordDomainService.java @@ -0,0 +1,9 @@ +package com.project.exam.domain.service; + +import com.project.exam.domain.param.ExamRecordParam; +import jakarta.servlet.http.HttpServletResponse; + +public interface AdminExportExamRecordDomainService { + + void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception; +} diff --git a/src/main/java/com/project/exam/domain/service/handler/ExamResultColorHandler.java b/src/main/java/com/project/exam/domain/service/handler/ExamResultColorHandler.java new file mode 100644 index 0000000..ee5a6c0 --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/handler/ExamResultColorHandler.java @@ -0,0 +1,54 @@ +package com.project.exam.domain.service.handler; + +import com.alibaba.excel.metadata.Head; +import com.alibaba.excel.metadata.data.WriteCellData; +import com.alibaba.excel.write.handler.CellWriteHandler; +import com.alibaba.excel.write.metadata.holder.WriteSheetHolder; +import com.alibaba.excel.write.metadata.holder.WriteTableHolder; +import org.apache.poi.ss.usermodel.*; + +import java.util.List; + +public class ExamResultColorHandler implements CellWriteHandler { + private CellStyle redStyle = null; + private static final String COLUMN_EXAM_RESULT = "考试结果"; + private static final String VALUE_NOT_PASSED = "未通过"; + @Override + public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, + List> cellDataList, Cell cell, Head head, + Integer relativeRowIndex, Boolean isHead) { + + // 1. 跳过表头 + if (isHead) { + return; + } + + // 2. 找到“考试结果”这一列 (根据列名匹配更稳健) + if (head != null && COLUMN_EXAM_RESULT.equals(head.getHeadNameList().get(0))) { + + String cellValue = cell.getStringCellValue(); + if (VALUE_NOT_PASSED.equals(cellValue)) { + + // 3. 优化点:如果样式还没创建过,则创建它 + if (redStyle == null) { + Workbook workbook = writeSheetHolder.getSheet().getWorkbook(); + + // 创建新样式 + redStyle = workbook.createCellStyle(); + // 克隆当前单元格默认样式(保留边框、对齐等) + redStyle.cloneStyleFrom(cell.getCellStyle()); + + // 创建字体并设为红色 + Font font = workbook.createFont(); + font.setColor(IndexedColors.RED.getIndex()); + font.setBold(true); // 可选:加粗突出 + + redStyle.setFont(font); + } + + // 4. 直接应用缓存好的样式 + cell.setCellStyle(redStyle); + } + } + } +} diff --git a/src/main/java/com/project/exam/domain/service/impl/AdminExportExamRecordDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/AdminExportExamRecordDomainServiceImpl.java new file mode 100644 index 0000000..f68f0db --- /dev/null +++ b/src/main/java/com/project/exam/domain/service/impl/AdminExportExamRecordDomainServiceImpl.java @@ -0,0 +1,22 @@ +package com.project.exam.domain.service.impl; + +import com.project.base.domain.result.PageResult; +import com.project.base.domain.result.Result; +import com.project.exam.domain.dto.ExamRecordDTO; +import com.project.exam.domain.param.ExamRecordParam; +import com.project.exam.domain.service.AdminExportExamRecordDomainService; +import com.project.exam.domain.service.AdminSearchExamRecordDomainService; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +@Service +public class AdminExportExamRecordDomainServiceImpl implements AdminExportExamRecordDomainService { + @Autowired + private AdminSearchExamRecordDomainService adminSearchExamRecordDomainService; + @Override + public void export(ExamRecordParam appealParam, HttpServletResponse response) throws Exception { + Result> pageResultResult = adminSearchExamRecordDomainService.adminSearch(appealParam); + + } +} diff --git a/src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java b/src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java index 4fd2504..eb968a2 100644 --- a/src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java +++ b/src/main/java/com/project/exam/domain/service/impl/AdminSearchExamRecordDomainServiceImpl.java @@ -19,6 +19,9 @@ import com.project.exam.domain.service.ExamRecordPictureBaseService; import com.project.information.domain.entity.ProductLineEntity; import com.project.information.domain.service.ProductLineBaseService; import com.project.information.utils.MinIoUtils; +import com.project.task.domain.dto.TaskUserDTO; +import com.project.task.domain.entity.TaskUserEntity; +import com.project.task.domain.service.TaskUserBaseService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -40,6 +43,9 @@ public class AdminSearchExamRecordDomainServiceImpl implements AdminSearchExamRe @Autowired private MinIoUtils minIoUtils; + @Autowired + private TaskUserBaseService taskUserBaseService; + @Override public Result> adminSearch(ExamRecordParam param) throws Exception { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); @@ -84,6 +90,9 @@ public class AdminSearchExamRecordDomainServiceImpl implements AdminSearchExamRe dto.setPassHtml(ExamRecordPassTextEnum.Fail.getHtml()); } + TaskUserDTO taskUserDTO = taskUserBaseService.getById(dto.getTaskUserId()).toDTO(TaskUserDTO::new); + dto.setUserName(taskUserDTO.getUserName()); + return dto; } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 1ac894b..4b9c94b 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -71,6 +71,7 @@ ding: appKey: dinggl2ktuhdhoczkg2o appSecret: nK104mgXPbkCWjX1I-EcYiubjM0FJAYcfqBKPkVcyvrBsLMF9XK1g9Qd_QVOndcK agentId: 4283077101 + corpId: ding13d71da66ad91ff0f5bf40eda33b7ba0 algo: clusterUrl: /api/algorithm/v1/cluster baseUrl: / \ No newline at end of file