REQ-3057-card: backup

This commit is contained in:
yanglin 2024-11-15 13:44:56 +08:00
parent 76eedce01e
commit d06767562a
12 changed files with 130 additions and 21 deletions

View File

@ -59,7 +59,8 @@ public interface MessageApi {
* @return
*/
@PostMapping("/api/im/template-message/async/send")
ApiResult<MessageTaskResp> sendTemplateMessageAsync(@RequestBody @Validated SendTemplateMessageParam sendMessageParam);
ApiResult<MessageTaskResp> sendTemplateMessageAsync(
@RequestBody @Validated SendTemplateMessageParam sendMessageParam);
/**
* 更新消息

View File

@ -22,11 +22,6 @@ import java.util.Set;
@AllArgsConstructor
public class SendTemplateMessageParam {
/**
* 指定发送机器人
*/
private String sendRobotAccount;
/**
* 发送人
*/
@ -74,7 +69,21 @@ public class SendTemplateMessageParam {
private TemplatedMsgType templatedMsgType = TemplatedMsgType.TEMPLATE;
private String refTemplateId;
public boolean isSendByRobot() {
return sender == null;
}
public Long determineSenderPersonId() {
if (sender != null)
return Long.parseLong(sender.getPersonId());
return 0L;
}
public Long determineSenderOuId() {
if (sender != null)
return sender.getOuId();
return 0L;
}
public boolean isUpdatable() {
return templatedMsgType.isUpdatable();

View File

@ -0,0 +1,23 @@
package cn.axzo.im.center.common.enums;
import cn.axzo.basics.common.constant.enums.CodeDefinition;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* @author yanglin
*/
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public enum YesOrNo implements CodeDefinition<String> {
YES("YES", ""),
NO("NO", "")
;
@EnumValue
private final String code;
private final String desc;
}

View File

@ -47,4 +47,8 @@ public class MessageBody {
*/
private Long dataVersion;
/**
* 端信息
*/
private Peer peer;
}

View File

@ -58,4 +58,8 @@ public class MessageCustomBody {
*/
private TemplatedMsgType msgType;
/**
* 端信息
*/
private Peer peer;
}

View File

@ -0,0 +1,28 @@
package cn.axzo.im.channel.netease.dto;
import lombok.Getter;
import lombok.Setter;
/**
* @author yanglin
*/
@Setter
@Getter
public class Peer {
/**
* IM是否为机器人发送
*/
private boolean isSenderRobot;
/**
* IM发送者自然人id, 机器人发送时为0
*/
private Long senderPersonId;
/**
* IM接收者自然人id
*/
private Long receiverPersonId;
}

View File

@ -175,22 +175,19 @@ public class MessageController implements MessageApi {
@Transactional
public ApiResult<MessageTaskResp> sendTemplateMessageAsync(SendTemplateMessageParam request) {
log.info("sendTemplateMessageAsync, request={}", request);
BizAssertions.assertTrue(request.getSender() != null || StringUtils.isNotBlank(request.getMsgTemplateId()),
PersonAccountAttribute sender = request.getSender();
BizAssertions.assertTrue(sender != null || StringUtils.isNotBlank(request.getMsgTemplateId()),
"消息模板ID和发送人必须选其一");
String sendImAccount;
if (StringUtils.isNotBlank(request.getSendRobotAccount())) {
UserAccountResp robotAccount = findRobotAccount(request.getSendRobotAccount()).orElse(null);
BizAssertions.assertNotNull(robotAccount, String.format(
"找不到指定的机器人账号: %s", request.getSendRobotAccount()));
sendImAccount = request.getSendRobotAccount();
} else if (request.getSender() != null) {
if (sender != null) {
AccountAbsentQuery accountQuery = new AccountAbsentQuery();
accountQuery.setAppType(request.getSender().getAppType().toNimAppType().getCode());
accountQuery.setPersonId(request.getSender().getPersonId());
accountQuery.setOuId(request.getSender().getOuId());
accountQuery.setAppType(sender.getAppType().toNimAppType().getCode());
accountQuery.setPersonId(sender.getPersonId());
accountQuery.setOuId(sender.getOuId());
List<UserAccountResp> accounts = accountService.registerAccountIfAbsent(accountQuery);
sendImAccount = accounts.get(0).getImAccount();
} else {
//todo: 根据类型验证模版是否配置了机器人
sendImAccount = check(request);
}
@ -198,7 +195,8 @@ public class MessageController implements MessageApi {
.msgTemplateContent(request.getMsgTemplateContent())
.msgTemplateId(request.getMsgTemplateId())
.templatedMsgType(request.getTemplatedMsgType())
.isSenderRobot(request.getSender() == null)
.isSenderRobot(request.isSendByRobot())
.senderPersonId(request.determineSenderPersonId())
.build();
Date now = new Date();
List<MessageTask.ReceivePerson> receivePersons = JSONArray.parseArray(

View File

@ -24,6 +24,7 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.cglib.beans.BeanMap;
import java.util.Date;
@ -157,6 +158,8 @@ public class MessageTask {
*/
private List<AppTypeEnum> appTypes;
private Long senderPersonId = 0L;
private Boolean isSenderRobot;
public TemplatedMsgType determineTemplatedMsgType() {
@ -198,6 +201,12 @@ public class MessageTask {
private Long workspaceId;
public Long personIdAsLong() {
if (NumberUtils.isDigits(personId))
return Long.parseLong(personId);
return 0L;
}
public String buildKey(Map<Long, Long> ouIdMap) {
if (StringUtils.isNotBlank(this.getImAccount())) {
return this.getImAccount();

View File

@ -4,6 +4,7 @@ import cn.axzo.im.center.api.vo.PersonAccountAttribute;
import cn.axzo.im.center.api.vo.req.MessageUpdateInfo;
import cn.axzo.im.center.common.enums.ImAppType;
import cn.axzo.im.center.common.enums.TemplatedMsgType;
import cn.axzo.im.center.common.enums.YesOrNo;
import cn.axzo.im.enums.UpdatableMessageState;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.TableField;
@ -11,6 +12,8 @@ import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import java.util.Date;
@ -25,13 +28,15 @@ public class UpdatableMessage implements MessageUpdateInfo {
private Long id;
private String batchNo;
private String templateId;
private String refTemplateId;
private String bizId;
private Long taskId;
private String fromAccount;
private String toAccount;
private String receiverPersonId;
private Long receiverOuId;
private String senderPersonId;
private Long senderOuId;
private YesOrNo isSenderRobot;
private ImAppType appType;
private TemplatedMsgType msgType;
private UpdatableMessageState state;
@ -78,6 +83,18 @@ public class UpdatableMessage implements MessageUpdateInfo {
return person;
}
public Long senderPersonIdAsLong() {
if (NumberUtils.isDigits(senderPersonId))
return NumberUtils.toLong(senderPersonId);
return 0L;
}
public Long receiverPersonIdAsLong() {
if (NumberUtils.isDigits(receiverPersonId))
return NumberUtils.toLong(receiverPersonId);
return 0L;
}
@Override
public String bizMessageId() {
return bizMessageId;

View File

@ -5,9 +5,9 @@ import cn.axzo.im.center.common.enums.AccountTypeEnum;
import cn.axzo.im.center.common.enums.AppTypeEnum;
import cn.axzo.im.channel.IMChannelProvider;
import cn.axzo.im.channel.netease.dto.MessageBody;
import cn.axzo.im.channel.netease.dto.Peer;
import cn.axzo.im.dao.mapper.MessageTaskMapper;
import cn.axzo.im.entity.AccountRegister;
import cn.axzo.im.entity.HistoryRecordExt;
import cn.axzo.im.entity.MessageHistory;
import cn.axzo.im.entity.MessageTask;
import cn.axzo.im.enums.MessageHistoryStatus;
@ -342,6 +342,11 @@ public class MessageTaskServiceImpl extends ServiceImpl<MessageTaskMapper, Messa
messageBody.setMsgType(bizData.determineTemplatedMsgType().getCode());
messageBody.setMsgContent(messageTask.getContent());
messageBody.setMsgHeader(messageTask.getTitle());
messageBody.setPeer(new Peer());
messageBody.getPeer().setSenderRobot(bizData.getIsSenderRobot());
messageBody.getPeer().setSenderPersonId(bizData.getSenderPersonId());
messageBody.getPeer().setReceiverPersonId(receivePerson.personIdAsLong());
Map<String, String> defaultExtMap = Maps.newHashMap();
if (StringUtils.isNotBlank(bizData.getMsgTemplateContent())) {

View File

@ -8,6 +8,7 @@ import cn.axzo.im.center.api.vo.resp.MessageUpdateResponse;
import cn.axzo.im.center.api.vo.resp.MessageUpdateResponse.NonUpdateMessageReason;
import cn.axzo.im.center.api.vo.resp.UpdatableMessageSendResult;
import cn.axzo.im.center.common.enums.ImAppType;
import cn.axzo.im.center.common.enums.YesOrNo;
import cn.axzo.im.channel.netease.dto.MessageBody;
import cn.axzo.im.dao.repository.MessageHistoryDao;
import cn.axzo.im.dao.repository.UpdatableMessageDao;
@ -80,7 +81,6 @@ public class UpdatableMessageManager {
collector.addMessage(message);
message.setBatchNo(batchNo);
message.setTemplateId(request.getMsgTemplateId());
message.setRefTemplateId(request.getRefTemplateId());
message.setBizId(request.getBizId());
message.setTaskId(task.getId());
message.setReceiverPersonId(person.getPersonId());
@ -90,6 +90,9 @@ public class UpdatableMessageManager {
message.setState(UpdatableMessageState.TASK_CREATED);
message.setBizMessageId(UUIDUtil.uuidString());
message.setDataVersion(1L);
message.setSenderPersonId(request.determineSenderPersonId() + "0");
message.setSenderOuId(request.determineSenderOuId());
message.setIsSenderRobot(request.isSendByRobot() ? YesOrNo.YES : YesOrNo.NO);
UpdatableMessageLog messageLog = message.toMessageLog();
collector.addLog(messageLog);

View File

@ -4,8 +4,10 @@ import cn.axzo.im.center.api.feign.SendPriority;
import cn.axzo.im.center.api.vo.ApiChannel;
import cn.axzo.im.center.api.vo.req.MessageUpdateInfo;
import cn.axzo.im.center.common.enums.BizTypeEnum;
import cn.axzo.im.center.common.enums.YesOrNo;
import cn.axzo.im.channel.IMChannelProvider;
import cn.axzo.im.channel.netease.dto.MessageCustomBody;
import cn.axzo.im.channel.netease.dto.Peer;
import cn.axzo.im.dao.repository.UpdatableMessageDao;
import cn.axzo.im.entity.HistoryRecordExt;
import cn.axzo.im.entity.MessageHistory;
@ -74,6 +76,12 @@ public class UpdateSupport {
messageBody.setDataVersion(messageUpdate.getDataVersion());
messageBody.setInitMessageId(message.getNimMessageId());
messageBody.setMsgType(message.getMsgType());
messageBody.setPeer(new Peer());
messageBody.getPeer().setSenderRobot(message.getIsSenderRobot() == YesOrNo.YES);
messageBody.getPeer().setSenderPersonId(message.senderPersonIdAsLong());
messageBody.getPeer().setReceiverPersonId(message.receiverPersonIdAsLong());
history.setMessageBody(JSON.toJSONString(messageBody));
messageUpdate.setMessageBody(JSON.parseObject(history.getMessageBody()));
messageUpdate.setBizBody(update.bizBody());