feat:即时通消息通知

This commit is contained in:
2025-12-18 18:06:12 +08:00
parent 905c5fafd1
commit 24d8a2564f
16 changed files with 164 additions and 11 deletions

View File

@@ -0,0 +1,36 @@
package com.sdm.common.feign.impl.system;
import com.alibaba.fastjson2.JSONObject;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.feign.inter.system.ISysExternalFeignClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Slf4j
@Component
public class SysExtetnalFeignClientImpl implements ISysExternalFeignClient {
@Autowired
private ISysExternalFeignClient sysExternalFeignClient;
@Override
public SdmResponse syncMessage(SendMsgReq req) {
SdmResponse response=null ;
try {
response = sysExternalFeignClient.syncMessage(req);
if(response==null || !response.isSuccess()){
log.error("syncMessage failed response:{}", JSONObject.toJSONString(Optional.ofNullable(response)));
return SdmResponse.failed("同步即时通消息通知失败");
}
} catch (Exception e) {
log.error("syncMessage error response:{}", JSONObject.toJSONString(Optional.ofNullable(response)));
return SdmResponse.failed("同步即时通消息通知异常");
}
return response;
}
}

View File

@@ -0,0 +1,15 @@
package com.sdm.common.feign.inter.system;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.SendMsgReq;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@FeignClient(name = "system",contextId = "systemExternalClient")
public interface ISysExternalFeignClient {
@PostMapping("/external/syncMessage")
SdmResponse syncMessage(@RequestBody SendMsgReq req);
}

View File

@@ -70,9 +70,12 @@ public class ExperimentResultReq extends BaseReq {
private String uploadTaskId;
// -------------------------------------------------------编辑使用---------------------------------------------------
@Schema(description = "删除的附件")
private List<Long> deleteFileIds;
@Schema(description = "新增的附件")
private List<ExperimentResultReq> addFileInfoList = new ArrayList<>();
@Schema(description = "新增的截图")
private ExperimentResultReq addImageInfo;
}

View File

@@ -1607,6 +1607,7 @@ public class SimulationRunServiceImpl extends ServiceImpl<SimulationRunMapper, S
String fileIds = oldFileIds.stream().map(String::valueOf).collect(Collectors.joining(","));
experimentResult.setFileId(fileIds);
simulationExpResultService.updateById(experimentResult);
// 删除文件
if (CollectionUtils.isNotEmpty(deleteFileIds)) {
for (Long deleteFileId : deleteFileIds) {
DelFileReq delFileReq = new DelFileReq();

View File

@@ -827,6 +827,7 @@ public class TaskServiceImpl implements ITaskService {
performanceNodePo.setProjectName(eachTaskVo.getProjectName());
performanceNodePo.setPhaseName(eachTaskVo.getPhaseName());
performanceNodePo.setDisciplineName(eachTaskVo.getDisciplineName());
performanceNodePo.setTaskName(eachTaskVo.getTaskName());
performanceNodePo.setPMemberList(eachTaskVo.getPMembers());
}
JSONObject jsonObject = new JSONObject();

View File

@@ -583,6 +583,7 @@
<if test="name != null and name != ''">
and nodeName like CONCAT('%',#{name},'%')
</if>
order by createTime desc
</select>
<select id="queryPerformanceNodeExtrasByNodeIdList" resultType="com.sdm.project.model.po.PerformanceNodeExtraPo">

View File

@@ -0,0 +1,30 @@
package com.sdm.system.controller;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.feign.inter.system.ISysExternalFeignClient;
import com.sdm.system.service.ISimulationExternalService;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Slf4j
@RestController
@RequestMapping("/external")
@Tag(name = "外部第三方接口模块")
public class SimulationExternalController implements ISysExternalFeignClient {
@Autowired
private ISimulationExternalService externalService;
@PostMapping("/syncMessage")
public SdmResponse syncMessage(@RequestBody SendMsgReq req) {
return externalService.syncMsgToFreelink(req);
}
}

View File

@@ -27,7 +27,7 @@ import java.util.List;
@Slf4j
@RestController
@RequestMapping("/systemLog")
@Tag(name = "系统评审")
@Tag(name = "日志模块")
public class SystemLogController implements ISysLogFeignClient {
@Autowired

View File

@@ -3,9 +3,13 @@ package com.sdm.system.model.thirdparty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
@Data
@Schema(description = "即时通消息通知参数")
public class FreeLinkParamDto {
public class FreeLinkParamDto implements Serializable {
private static final long serialVersionUID = 8272571598104873762L;
@Schema(description = "接收人工号")
private String id;
@@ -20,7 +24,7 @@ public class FreeLinkParamDto {
private String msg;
@Schema(description = "消息类型 默认text")
private String type;
private String type = "text";
@Schema(description = "业务系统APPID")
private String freelinkAppId = "d7eb3ef7c8e8c93e7c6e978fee848646";

View File

@@ -0,0 +1,17 @@
package com.sdm.system.model.thirdparty;
import lombok.Data;
import java.io.Serializable;
@Data
public class FreeLinkResp implements Serializable {
private static final long serialVersionUID = -5931003868521599036L;
private Integer code;
private String msg;
private String status;
private String data;
private String fileSize;
}

View File

@@ -10,6 +10,6 @@ import org.springframework.web.bind.annotation.RequestBody;
*/
public interface ISimulationExternalService {
SdmResponse syncMsgToFreelink(FreeLinkParamDto req);
SdmResponse syncMsgToFreelink(SendMsgReq req);
}

View File

@@ -3,11 +3,15 @@ package com.sdm.system.service.impl;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSON;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.common.ThreadLocalContext;
import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.entity.req.system.UserQueryReq;
import com.sdm.common.entity.resp.system.CIDUserResp;
import com.sdm.common.feign.impl.system.SysUserFeignClientImpl;
import com.sdm.common.utils.HttpClientUtil;
import com.sdm.system.model.thirdparty.FreeLinkParamDto;
import com.sdm.system.model.thirdparty.FreeLinkResp;
import com.sdm.system.service.ISimulationExternalService;
import com.sdm.system.service.ISimulationMessageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
@@ -24,15 +28,32 @@ public class SimulationExternalServiceImpl implements ISimulationExternalService
@Autowired
private HttpClientUtil httpClientUtil;
@Autowired
private SysUserFeignClientImpl sysUserFeignClient;
@Override
public SdmResponse syncMsgToFreelink(FreeLinkParamDto req) {
public SdmResponse syncMsgToFreelink(SendMsgReq req) {
// 同步即时通
FreeLinkParamDto paramDto = new FreeLinkParamDto();
// 根据userId查询工号
UserQueryReq userReq = new UserQueryReq();
userReq.setUserId(Long.valueOf(req.getUserId()));
userReq.setTenantId(ThreadLocalContext.getTenantId());
SdmResponse<CIDUserResp> sdmResponse = sysUserFeignClient.queryUserDetail(userReq);
if (sdmResponse.getData() != null) {
paramDto.setId(sdmResponse.getData().getUsername());
}
paramDto.setId("05687");
paramDto.setMsg(req.getContent());
String url = freeLinkUrl;
try {
log.info("[syncMsgToFreelink] url:{}, param:{}", url, JSONUtil.toJsonStr(req));
String resultString = httpClientUtil.doPostJson(url, JSON.toJSONString(req));
SdmResponse response = JSON.parseObject(resultString, SdmResponse.class);
if (response.isSuccess()) {
return response;
log.info("[syncMsgToFreelink] url:{}, param:{}", url, JSONUtil.toJsonStr(paramDto));
String resultString = httpClientUtil.doPostJson(url, JSON.toJSONString(paramDto));
log.info("[syncMsgToFreelink] url:{}, result:{}", url, resultString);
FreeLinkResp response = JSON.parseObject(resultString, FreeLinkResp.class);
if (0 == response.getCode()) {
return SdmResponse.success(response);
}
return SdmResponse.failed("同步即时通消息通知失败:");
} catch (Exception e) {

View File

@@ -5,6 +5,7 @@ import com.alibaba.fastjson2.JSON;
import com.sdm.common.common.SdmResponse;
import com.sdm.common.entity.req.system.SendMsgReq;
import com.sdm.common.utils.HttpClientUtil;
import com.sdm.system.service.ISimulationExternalService;
import com.sdm.system.service.ISimulationMessageService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,6 +26,9 @@ public class SimulationMessageServiceImpl implements ISimulationMessageService {
@Autowired
private HttpClientUtil httpClientUtil;
@Autowired
private ISimulationExternalService externalService;
@Override
public SdmResponse sendMessage(SendMsgReq req) {
String url = cidUrl + sendMessagePath;
@@ -33,6 +37,11 @@ public class SimulationMessageServiceImpl implements ISimulationMessageService {
String resultString = httpClientUtil.doPostJson(url, JSON.toJSONString(req));
SdmResponse response = JSON.parseObject(resultString, SdmResponse.class);
if (response.isSuccess()) {
// 同步即时通
SdmResponse sdmResponse = externalService.syncMsgToFreelink(req);
if (!sdmResponse.isSuccess()) {
return sdmResponse;
}
return response;
}
return SdmResponse.failed("发送消息通知失败:");

View File

@@ -173,6 +173,11 @@ cid:
log:
saveLog: /spdm-log/saveLog
thirdparty:
api:
# 即时通消息通知
freeLinkUrl: http://freelink.haihui.com/wechat/InformApi/FreelinkAndDingdingInform
security:
whitelist:
paths:

View File

@@ -173,6 +173,11 @@ cid:
log:
saveLog: /spdm-log/saveLog
thirdparty:
api:
# 即时通消息通知
freeLinkUrl: http://freelink.haihui.com/wechat/InformApi/FreelinkAndDingdingInform
security:
whitelist:
paths:

View File

@@ -173,6 +173,11 @@ cid:
log:
saveLog: /spdm-log/saveLog
thirdparty:
api:
# 即时通消息通知
freeLinkUrl: http://freelink.haihui.com/wechat/InformApi/FreelinkAndDingdingInform
security:
whitelist:
paths: