REQ-3046: 兼容老逻辑

This commit is contained in:
yanglin 2024-10-18 14:51:14 +08:00
parent d5a78772d4
commit bd5d2e1c68
6 changed files with 163 additions and 36 deletions

View File

@ -8,10 +8,12 @@ import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO.CardExtensionIt
import cn.axzo.msg.center.message.domain.vo.GeneralMessagePushVO.Subtitle;
import cn.axzo.msg.center.message.service.impl.v3.AppLink;
import cn.axzo.msg.center.message.service.impl.v3.AppLinkUrlConfigVisitor;
import cn.axzo.msg.center.message.service.impl.v3.ModelV3ExtPopulator;
import cn.axzo.msg.center.message.service.impl.v3.ModelV3Parser;
import cn.axzo.msg.center.service.domain.UrlConfig;
import cn.axzo.msg.center.service.domain.UrlConfigWalker;
import cn.axzo.msg.center.service.enums.ButtonStyleEnum;
import cn.axzo.msg.center.service.enums.KVContentType;
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import cn.axzo.msg.center.service.pending.response.v3.ParsedModel3Visitor;
@ -20,6 +22,7 @@ import cn.axzo.msg.center.service.pending.response.v3.model.ParsedButtonV3;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedGroupV3;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedKV;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedModelV3;
import cn.axzo.msg.center.service.pending.response.v3.model.PersonInfo;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
@ -35,6 +38,7 @@ import java.util.List;
public class MessageTemplateParserV3 {
private final ModelV3Parser modelV3Parser;
private final ModelV3ExtPopulator modelV3ExtPopulator;
GeneralMessagePushVO parse(MessageRecordV3 message, TemplateModelV3 templateModel) {
String orgIcon = templateModel.getTemplate().getIcon();
@ -73,7 +77,16 @@ public class MessageTemplateParserV3 {
return;
if (im.getCardExtension() == null)
im.setCardExtension(new ArrayList<>());
im.getCardExtension().add(new CardExtensionItem(kv.getKey(), kv.getValue()));
CardExtensionItem item = new CardExtensionItem(kv.getKey(), kv.getValue());
// IM人员: 张三(130****5556)
if (kv.getContentType() == KVContentType.PERSON_ID) {
modelV3ExtPopulator.populatePersonKV(kv);
PersonInfo person = kv.getPersonInfo();
if (person != null)
item = new CardExtensionItem(kv.getKey(), String.format(
"%s(%s)", person.getRealName(), person.getMobilePhoneCiphertext()));
}
im.getCardExtension().add(item);
}
@Override

View File

@ -20,6 +20,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@ -52,6 +53,10 @@ public class ModelV3ExtPopulator {
populateComponentWorkGroup(componentWorkerGroups);
}
public void populatePersonKV(ParsedKV keyValue) {
populatePersonKV(Collections.singletonList(keyValue));
}
private void populatePersonKV(List<ParsedKV> keyValues) {
if (CollectionUtils.isEmpty(keyValues)) return;
List<Long> personIds = keyValues.stream()

View File

@ -101,7 +101,7 @@ public class TodoRangeQueryService {
// 可执行的/抄送我的
pageResult = pageQueryTodo(request, templateCodes);
List<PendingMessageResponse> messages = todoRespBuilder
.convertAdapter2MessageResponse(pageResult.getList(), request);
.toResponse(pageResult.getList(), request);
if (request.determineQueryTemplateTerminals())
todoTerminalHelper.populateTemplateTerminals(messages);
messages.forEach(message -> message.setQueryType(request.getQueryType()));
@ -380,7 +380,7 @@ public class TodoRangeQueryService {
.in(CollectionUtils.isNotEmpty(request.getTemplateCodes()), Todo::getTemplateCode, request.getTemplateCodes())
.last("LIMIT " + request.determineLimit()));
List<PendingRecordAdapter> message = todoRespBuilder.buildTodoAdapters(todos);
return todoRespBuilder.convertAdapter2MessageResponse(message, request);
return todoRespBuilder.toResponse(message, request);
}
@RequiredArgsConstructor

View File

@ -7,12 +7,26 @@ import cn.axzo.msg.center.dal.TodoDao;
import cn.axzo.msg.center.domain.entity.PendingRecordAdapter;
import cn.axzo.msg.center.domain.entity.Todo;
import cn.axzo.msg.center.domain.entity.TodoBusiness;
import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO;
import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig;
import cn.axzo.msg.center.message.domain.dto.TemplateModelV3;
import cn.axzo.msg.center.message.service.impl.PendingMessageNewServiceImpl;
import cn.axzo.msg.center.message.service.impl.v3.ModelV3Parser;
import cn.axzo.msg.center.message.service.impl.v3.ModelV3Service;
import cn.axzo.msg.center.message.service.todo.manage.TodoExt;
import cn.axzo.msg.center.service.domain.UrlConfig;
import cn.axzo.msg.center.service.dto.IdentityDTO;
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import cn.axzo.msg.center.service.pending.TerminalProvider;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import cn.axzo.msg.center.service.pending.response.v3.ModelV2PropsPopulator;
import cn.axzo.msg.center.service.pending.response.v3.ParsedModel3Visitor;
import cn.axzo.msg.center.service.pending.response.v3.ParsedModel3Walker;
import cn.axzo.msg.center.service.pending.response.v3.model.ParsedModelV3;
import cn.axzo.msg.center.service.template.response.MessageDetailStyle;
import cn.axzo.msg.center.utils.JSONObjectUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONObject;
import com.google.common.collect.ImmutableMap;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
@ -21,10 +35,14 @@ import org.springframework.stereotype.Component;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import static java.util.function.UnaryOperator.identity;
import static java.util.stream.Collectors.toList;
import static java.util.stream.Collectors.toMap;
/**
* 尽量使用已有的逻辑
@ -38,26 +56,21 @@ class TodoRespBuilder {
private final TodoBusinessDao todoBusinessDao;
private final TodoDao todoDao;
private final PendingMessageNewServiceImpl pendingMessageNewServiceImpl;
private final ModelV3Service modelV3Service;
private final PendingMessageBizConfig pendingMessageBizConfig;
private final ModelV3Parser modelV3Parser;
// batch convert to old model to reuse the code and save some time
PendingMessageResponse convertAdapter2MessageResponse(
PendingRecordAdapter adapter, TerminalProvider terminalProvider) {
List<PendingMessageResponse> responses = convertAdapter2MessageResponse(
PendingMessageResponse toResponse(PendingRecordAdapter adapter,
TerminalProvider terminalProvider) {
List<PendingMessageResponse> responses = toResponse(
Collections.singletonList(adapter), terminalProvider);
return responses.get(0);
}
List<PendingMessageResponse> convertAdapter2MessageResponse(
List<PendingRecordAdapter> adapters, TerminalProvider terminalProvider) {
return convertAdapter2MessageDTO(adapters).stream()
.map(i -> i.toResponse(terminalProvider))
.collect(toList());
}
List<PendingMessageDTO> convertAdapter2MessageDTO(List<PendingRecordAdapter> adapters) {
List<PendingMessageResponse> toResponse(List<PendingRecordAdapter> adapters,
TerminalProvider terminalProvider) {
List<String> templateCodes = adapters.stream()
.map(PendingRecordAdapter::getTemplateCode)
.filter(Objects::nonNull)
@ -66,18 +79,21 @@ class TodoRespBuilder {
// 重新查询模版的收益大于成本
List<TemplateModelV3> templateModels = modelV3Service.getByCodes(templateCodes);
return adapters.stream()
.map(adapter -> pendingMessageNewServiceImpl.convertV3(adapter, templateModels))
.map(adapter -> toResponse(adapter, templateModels, terminalProvider))
.collect(toList());
}
// convert to old model to reuse the code and save some time
PendingMessageDTO convertTodoToMessage(Todo todo) {
PendingMessageResponse toResponse(Todo todo,
TerminalProvider terminalProvider) {
TodoBusiness business = todoBusinessDao.getById(todo.getTodoBusinessId());
return convertTodoToMessage(business, todo);
return toResponse(business, todo, terminalProvider);
}
PendingMessageDTO convertTodoToMessage(TodoBusiness business, Todo todo) {
PendingMessageResponse toResponse(TodoBusiness business,
Todo todo,
TerminalProvider terminalProvider) {
TodoRecordAdapter adapter = TodoRecordAdapter.adaptTodo(business, todo);
ArrayList<String> templateCodes = new ArrayList<>(2);
if (business != null)
@ -85,7 +101,7 @@ class TodoRespBuilder {
if (todo != null)
templateCodes.add(todo.getTemplateCode());
List<TemplateModelV3> templateModels = modelV3Service.getByCodes(templateCodes);
return pendingMessageNewServiceImpl.convertV3(adapter, templateModels);
return toResponse(adapter, templateModels, terminalProvider);
}
// !! build adapters
@ -131,4 +147,106 @@ class TodoRespBuilder {
.collect(toList());
}
private PendingMessageResponse toResponse(PendingRecordAdapter adapter,
List<TemplateModelV3> templateModels,
TerminalProvider terminalProvider) {
PendingMessageResponse response = new PendingMessageResponse();
// 发起人单位项目信息
response.setPromoterOuId(adapter.getPromoterOuId());
response.setPromoterWorkspaceId(adapter.getPromoterOrgId());
response.setPromoterWorkspaceName(adapter.getPromoterOrgName());
response.setPromoterWorkspaceType(adapter.getPromoterOrgType());
// 接收者单位项目信息
response.setExecutorOuId(adapter.getOuId());
response.setExecutorWorkspaceId(adapter.getOrgId());
response.setExecutorWorkspaceName(adapter.getOrgName());
response.setExecutorWorkspaceType(adapter.getExecutorOrgType());
// 兼容页面老逻辑
response.setWorkspaceId(adapter.getPromoterOrgId());
// 只有项目才设置发起人项目部名称, 单位的话不返回, 因为会导致待办详情中显示重复的单位信息
if (adapter.getPromoterOrgType() == OrganizationTypeEnum.PROJECT)
response.setWorkspaceName(adapter.getPromoterOrgName());
else
response.setWorkspaceName("");
// 其它信息
response.setTodoType(adapter.getTodoType());
response.setIsRead(adapter.isRead());
response.setProposedButtons(adapter.getCustomButtons());
response.setBizExtParamObj(adapter.getBizExtParamObj());
response.setRouterExtParamObj(adapter.getRouterParamObj());
Map<String, TemplateModelV3> templateCode2Template = templateModels.stream()
.collect(toMap(TemplateModelV3::getTemplateCode, identity()));
TemplateModelV3 templateModel = templateCode2Template.get(adapter.getTemplateCode());
if (templateModel != null)
response.setTemplateCategory(templateModel.getTemplate().getMsgCategory());
if (templateModel != null && templateModel.getTemplate().getDetailStyleCode() != null) {
MessageDetailStyle detailStyle = pendingMessageBizConfig
.findMessageDetailType(templateModel.getTemplate().getDetailStyleCode())
.orElse(null);
response.setDetailStyle(detailStyle);
}
// 解析并替换掉路由地址中的动态参数变量
JSONObject routerParam = JSONObjectUtil.parseObject(adapter.getRouterParams());
routerParam.put(TodoExt.CTX, ImmutableMap.of(
"business", adapter.getTodoBusiness(),
"todo", adapter.getTodo()));
JSONObject authParam = new JSONObject();
if (!routerParam.containsKey("ouId"))
authParam.put("ouId", adapter.getOuId());
if (!routerParam.containsKey("workspaceId"))
authParam.put("workspaceId", adapter.getOrgId());
authParam.putAll(routerParam);
// 流程待办 - url无身份ID手动拼接
if (adapter.getBizCategory() == BizCategoryEnum.FLOW
&& (!authParam.containsKey("identityCode") || null == authParam.get("identityCode"))) {
authParam.put("identityCode", adapter.getIdentityCode());
}
if (templateModel != null) {
ParsedModelV3 parsedModel = modelV3Parser.parseModel(templateModel, adapter,
adapter.getBizExtParamObj(), authParam, routerParam);
response.setModelV3(parsedModel);
ParsedModel3Walker.walkDown(parsedModel, new ModelV2PropsPopulator(response, terminalProvider));
response.setDisplayOnCardKeyValues(parsedModel.determineDisplayOnCardKeyValues());
response.setCardUrlOpenStrategy(templateModel.getTemplate().getCardUrlOpenStrategy());
ParsedModel3Walker.walkDown(parsedModel, new ParsedModel3Visitor() {
@Override
public void visitTemplateCardUrlConfig(UrlConfig urlConfig) {
response.setCardUrl(urlConfig);
}
});
}
response.setIdentityCode(adapter.getIdentityCode());
response.setTemplateCode(adapter.getTemplateCode());
response.setTitle(adapter.getTitle());
response.setContent(adapter.getContent());
response.setState(adapter.getState());
response.setBizCode(adapter.getBizCode());
response.setSubBizCode(adapter.getSubBizCode());
response.setBizDesc(adapter.getBizDesc());
response.setBizFlag(adapter.getBizFlag());
response.setOuId(adapter.getOuId());
response.setBizCategory(adapter.getBizCategory());
response.setBizFinalState(adapter.getBizFinalState());
if (adapter.getBizFinalState() != null)
response.setBizFinalStateIcon(response.getBizFinalState().getIcon());
response.setIsCreatedToday(adapter.getCreateAt() != null
&& DateUtil.isSameDay(adapter.getCreateAt(), new Date()));
response.setPromoterPersonId(adapter.getPromoterPersonId());
response.setPromoterName(adapter.getPromoterName());
response.setPromoterIdentity(IdentityDTO.builder()
.id(adapter.getPromoterId()).type(adapter.getPromoterType()).build());
response.setExecutorPersonId(adapter.getExecutorPersonId());
response.setExecutorName(adapter.getExecutorName());
response.setExecutorIdentity(IdentityDTO.builder()
.id(adapter.getExecutorId()).type(adapter.getExecutorType()).build());
response.setCreateTimestamp(adapter.getCreateAt() == null ? null : adapter.getCreateAt().getTime());
response.setUpdateTimestamp(adapter.getUpdateAt() == null ? null : adapter.getUpdateAt().getTime());
response.setDeadlineTimestamp(adapter.getDeadline() == null ? null : adapter.getDeadline().getTime());
return response;
}
}

View File

@ -12,7 +12,6 @@ import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig;
import cn.axzo.msg.center.message.service.impl.v3.ModelV3ExtPopulator;
import cn.axzo.msg.center.service.enums.TodoQueryType;
import cn.axzo.msg.center.service.enums.TodoType;
import cn.axzo.msg.center.service.pending.TerminalProvider;
import cn.axzo.msg.center.service.pending.request.PendingMessageByBizCodeRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageDetailRequestV3;
import cn.axzo.msg.center.service.pending.request.PendingMessageQueryRequest;
@ -64,9 +63,7 @@ public class TodoSimpleQueryService {
.like(StringUtils.isNotBlank(req.getTitle()), TodoBusiness::getTitle, req.getTitle())
.last("LIMIT 1")
.one();
PendingMessageResponse response = todoRespBuilder
.convertTodoToMessage(business, todo)
.toResponse(req);
PendingMessageResponse response = todoRespBuilder.toResponse(business, todo, req);
modelV3ExtPopulator.populate(response.getModelV3());
return response;
}
@ -78,11 +75,9 @@ public class TodoSimpleQueryService {
if (request.getQueryType() == TodoQueryType.SEND_BY_ME) {
TodoBusiness business = todoBusinessDao.getById(todo.getTodoBusinessId());
PendingRecordAdapter adapter = todoRespBuilder.buildBusinessAdapter(business);
return todoRespBuilder.convertAdapter2MessageResponse(adapter, request);
return todoRespBuilder.toResponse(adapter, request);
}
PendingMessageResponse response = todoRespBuilder
.convertTodoToMessage(todo)
.toResponse(request);
PendingMessageResponse response = todoRespBuilder.toResponse(todo, request);
modelV3ExtPopulator.populate(response.getModelV3());
return response;
}
@ -92,11 +87,7 @@ public class TodoSimpleQueryService {
Todo todo = todoDao
.getLatestByBiz(templateCode, bizCode, subBizCode, todoType)
.orElse(null);
if (todo == null)
return null;
return todoRespBuilder
.convertTodoToMessage(todo)
.toResponse((TerminalProvider) null);
return todo == null ? null : todoRespBuilder.toResponse(todo, null);
}
public List<PendingMessageSimpleDTO> getLatestTodosByBiz(PendingMessageByBizCodeRequest param) {

View File

@ -141,7 +141,7 @@ public class TodoWorkerQueryService {
});
}
List<PendingRecordAdapter> adapters = todoRespBuilder.buildTodoAdapters(todos);
return todoRespBuilder.convertAdapter2MessageResponse(adapters, request);
return todoRespBuilder.toResponse(adapters, request);
}
}