diff --git a/im-center-api/src/main/java/cn/axzo/im/center/api/feign/MessageApi.java b/im-center-api/src/main/java/cn/axzo/im/center/api/feign/MessageApi.java index a18b3ea..eff2f25 100644 --- a/im-center-api/src/main/java/cn/axzo/im/center/api/feign/MessageApi.java +++ b/im-center-api/src/main/java/cn/axzo/im/center/api/feign/MessageApi.java @@ -59,7 +59,8 @@ public interface MessageApi { * @return */ @PostMapping("/api/im/template-message/async/send") - ApiResult sendTemplateMessageAsync(@RequestBody @Validated SendTemplateMessageParam sendMessageParam); + ApiResult sendTemplateMessageAsync( + @RequestBody @Validated SendTemplateMessageParam sendMessageParam); /** * 更新消息 diff --git a/im-center-api/src/main/java/cn/axzo/im/center/api/vo/req/SendTemplateMessageParam.java b/im-center-api/src/main/java/cn/axzo/im/center/api/vo/req/SendTemplateMessageParam.java index f91bccc..44da93e 100644 --- a/im-center-api/src/main/java/cn/axzo/im/center/api/vo/req/SendTemplateMessageParam.java +++ b/im-center-api/src/main/java/cn/axzo/im/center/api/vo/req/SendTemplateMessageParam.java @@ -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(); diff --git a/im-center-common/src/main/java/cn/axzo/im/center/common/enums/YesOrNo.java b/im-center-common/src/main/java/cn/axzo/im/center/common/enums/YesOrNo.java new file mode 100644 index 0000000..7b836b5 --- /dev/null +++ b/im-center-common/src/main/java/cn/axzo/im/center/common/enums/YesOrNo.java @@ -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 { + YES("YES", "是"), + NO("NO", "是") + ; + + @EnumValue + private final String code; + private final String desc; + +} diff --git a/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/MessageBody.java b/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/MessageBody.java index 22122b2..a0ce53e 100644 --- a/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/MessageBody.java +++ b/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/MessageBody.java @@ -47,4 +47,8 @@ public class MessageBody { */ private Long dataVersion; + /** + * 端信息 + */ + private Peer peer; } diff --git a/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/MessageCustomBody.java b/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/MessageCustomBody.java index 04d1d82..1800523 100644 --- a/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/MessageCustomBody.java +++ b/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/MessageCustomBody.java @@ -58,4 +58,8 @@ public class MessageCustomBody { */ private TemplatedMsgType msgType; + /** + * 端信息 + */ + private Peer peer; } diff --git a/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/Peer.java b/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/Peer.java new file mode 100644 index 0000000..d8fefaa --- /dev/null +++ b/im-center-server/src/main/java/cn/axzo/im/channel/netease/dto/Peer.java @@ -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; + +} diff --git a/im-center-server/src/main/java/cn/axzo/im/controller/MessageController.java b/im-center-server/src/main/java/cn/axzo/im/controller/MessageController.java index fad8da1..91f659d 100644 --- a/im-center-server/src/main/java/cn/axzo/im/controller/MessageController.java +++ b/im-center-server/src/main/java/cn/axzo/im/controller/MessageController.java @@ -175,22 +175,19 @@ public class MessageController implements MessageApi { @Transactional public ApiResult 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 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 receivePersons = JSONArray.parseArray( diff --git a/im-center-server/src/main/java/cn/axzo/im/entity/MessageTask.java b/im-center-server/src/main/java/cn/axzo/im/entity/MessageTask.java index f54cc2f..77b8257 100644 --- a/im-center-server/src/main/java/cn/axzo/im/entity/MessageTask.java +++ b/im-center-server/src/main/java/cn/axzo/im/entity/MessageTask.java @@ -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 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 ouIdMap) { if (StringUtils.isNotBlank(this.getImAccount())) { return this.getImAccount(); diff --git a/im-center-server/src/main/java/cn/axzo/im/entity/UpdatableMessage.java b/im-center-server/src/main/java/cn/axzo/im/entity/UpdatableMessage.java index 52fc6d3..8958431 100644 --- a/im-center-server/src/main/java/cn/axzo/im/entity/UpdatableMessage.java +++ b/im-center-server/src/main/java/cn/axzo/im/entity/UpdatableMessage.java @@ -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; diff --git a/im-center-server/src/main/java/cn/axzo/im/service/impl/MessageTaskServiceImpl.java b/im-center-server/src/main/java/cn/axzo/im/service/impl/MessageTaskServiceImpl.java index 3004fdf..58e87ef 100644 --- a/im-center-server/src/main/java/cn/axzo/im/service/impl/MessageTaskServiceImpl.java +++ b/im-center-server/src/main/java/cn/axzo/im/service/impl/MessageTaskServiceImpl.java @@ -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 defaultExtMap = Maps.newHashMap(); if (StringUtils.isNotBlank(bizData.getMsgTemplateContent())) { diff --git a/im-center-server/src/main/java/cn/axzo/im/updatable/UpdatableMessageManager.java b/im-center-server/src/main/java/cn/axzo/im/updatable/UpdatableMessageManager.java index 10ff53f..64eeb5a 100644 --- a/im-center-server/src/main/java/cn/axzo/im/updatable/UpdatableMessageManager.java +++ b/im-center-server/src/main/java/cn/axzo/im/updatable/UpdatableMessageManager.java @@ -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); diff --git a/im-center-server/src/main/java/cn/axzo/im/updatable/UpdateSupport.java b/im-center-server/src/main/java/cn/axzo/im/updatable/UpdateSupport.java index 6f82bb0..638ee0c 100644 --- a/im-center-server/src/main/java/cn/axzo/im/updatable/UpdateSupport.java +++ b/im-center-server/src/main/java/cn/axzo/im/updatable/UpdateSupport.java @@ -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());