REQ-3046: a lot of staff

This commit is contained in:
yanglin 2024-10-17 09:55:37 +08:00
parent cf66d98fe4
commit 802917e303
22 changed files with 163 additions and 1305 deletions

View File

@ -7,13 +7,13 @@ import cn.axzo.msg.center.api.response.PendingMessageBriefRes;
import cn.axzo.msg.center.api.response.PendingMessageStatisticRes;
import cn.axzo.msg.center.api.response.PendingMessageTemporarilyStatisticRes;
import cn.axzo.msg.center.api.response.PendingMessageTemporarilyTypeRes;
import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig;
import cn.axzo.msg.center.inside.notices.service.PendingMessageService;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import java.util.Collections;
import java.util.List;
/**
@ -31,13 +31,10 @@ public class PendingMessageStatisticController implements PendingMessageServiceA
@Resource
private PendingMessageService pendingMessageService;
@Resource
private PendingMessageBizConfig pendingMessageBizConfig;
@Override
public CommonResponse<List<PendingMessageTemporarilyStatisticRes>> temporarilyStatistic(
PendingMessageTemporarilyStatisticReq request) {
return CommonResponse.success(pendingMessageService.temporarilyStatistic(request));
return CommonResponse.success(Collections.emptyList());
}
@Override

View File

@ -1,10 +1,8 @@
package cn.axzo.msg.center.inside.notices.service;
import cn.axzo.msg.center.api.request.PendingMessagePageReq;
import cn.axzo.msg.center.api.request.PendingMessageTemporarilyStatisticReq;
import cn.axzo.msg.center.api.response.PendingMessageBriefRes;
import cn.axzo.msg.center.api.response.PendingMessageStatisticRes;
import cn.axzo.msg.center.api.response.PendingMessageTemporarilyStatisticRes;
import cn.axzo.msg.center.api.response.PendingMessageTemporarilyTypeRes;
import cn.azxo.framework.common.model.Page;
@ -19,14 +17,6 @@ import java.util.List;
*/
public interface PendingMessageService {
/**
* 统计代办类消息
*
* @param request 统计请求的入参
* @return 符合条件的代办数量
*/
List<PendingMessageTemporarilyStatisticRes> temporarilyStatistic(PendingMessageTemporarilyStatisticReq request);
/**
* 根据消息的临时的业务分类分页查询个人相关的待办消息
*

View File

@ -9,7 +9,6 @@ import cn.axzo.msg.center.api.request.PendingMessageTemporarilyStatisticReq;
import cn.axzo.msg.center.api.response.MessageRouterInfoRes;
import cn.axzo.msg.center.api.response.PendingMessageBriefRes;
import cn.axzo.msg.center.api.response.PendingMessageStatisticRes;
import cn.axzo.msg.center.api.response.PendingMessageTemporarilyStatisticRes;
import cn.axzo.msg.center.api.response.PendingMessageTemporarilyTypeRes;
import cn.axzo.msg.center.common.utils.BeanConvertUtils;
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
@ -29,7 +28,6 @@ import cn.axzo.msg.center.inside.notices.service.MessageRelationService;
import cn.axzo.msg.center.inside.notices.service.MessageRouterService;
import cn.axzo.msg.center.inside.notices.service.PendingMessageService;
import cn.axzo.msg.center.inside.notices.utils.MessageRecordHelper;
import cn.axzo.msg.center.message.service.PendingMessageNewService;
import cn.axzo.msg.center.notices.common.enums.ReturnCodeEnum;
import cn.axzo.msg.center.notices.common.exception.BizException;
import cn.azxo.framework.common.model.Page;
@ -100,28 +98,6 @@ public class PendingMessageServiceImpl implements PendingMessageService {
private final MessageModuleService messageModuleService;
private final MessageRelationService messageRelationService;
private final PendingMessageBizConfig pendingMessageBizConfig;
private final PendingMessageNewService pendingMessageNewService;
@Override
public List<PendingMessageTemporarilyStatisticRes> temporarilyStatistic(PendingMessageTemporarilyStatisticReq request) {
// 参数检测
checkParam(request);
final List<MsgTempBizCategoryConfig> categoryConfigs = pendingMessageBizConfig.tempCategoriesConfig();
if (CollectionUtils.isEmpty(categoryConfigs)) {
log.warn("the nacos config is lost......");
return Collections.emptyList();
}
try {
return categoryConfigs.stream()
// 自然排序,前端仅做渲染,展示顺序的工作由后端配置
.sorted()
.map(e -> statistic(request, e))
.collect(Collectors.toList());
} catch (Exception e) {
log.error("broke out some exception while statistic pending message.", e);
throw new BizException(ReturnCodeEnum.SYSTEM_ERROR, "system exception.");
}
}
@Override
public PendingMessageStatisticRes temporarilyPage(PendingMessagePageReq request) {
@ -288,22 +264,6 @@ public class PendingMessageServiceImpl implements PendingMessageService {
return module;
}
private PendingMessageTemporarilyStatisticRes statistic(PendingMessageTemporarilyStatisticReq request,
MsgTempBizCategoryConfig categoryConfig) {
// 统计数量
Integer count = pendingMessageNewService.countUncompleted(request.getPersonId(), categoryConfig.getConfigRelationIds());
PendingMessageTemporarilyStatisticRes res = new PendingMessageTemporarilyStatisticRes();
res.setUnCompletedCount(count);
res.setCategoryCode(categoryConfig.getCategory().name());
res.setCategoryDesc(categoryConfig.getCategory().getDesc());
res.setIconUrl(categoryConfig.getIconUrl());
if (StringUtils.isNotBlank(categoryConfig.getJumpUrl())) {
// 分类指定了具体的跳转地址,则优先使用其指定的地址这里指定为原生APP
res.setRouter(new MessageRouterInfoRes(NativeTypeEnum.H5.getMessage(), categoryConfig.getJumpUrl(), ""));
}
return res;
}
private void checkParam(PendingMessageTemporarilyStatisticReq request) {
if (Objects.isNull(request)
|| Objects.isNull(request.getIdentifyId())) {

View File

@ -1,9 +1,7 @@
package cn.axzo.msg.center.message.controller;
import cn.axzo.msg.center.api.response.MessageDetailRes;
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam;
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
import cn.axzo.msg.center.message.service.PendingMessageNewService;
import cn.axzo.msg.center.message.service.todo.TodoRangeQueryService;
import cn.axzo.msg.center.message.service.todo.TodoSimpleQueryService;
import cn.axzo.msg.center.message.service.todo.TodoWorkerQueryService;
@ -66,7 +64,6 @@ import java.util.concurrent.TimeUnit;
@RequiredArgsConstructor
public class PendingMessageNewController implements PendingMessageClient {
private final PendingMessageNewService pendingMessageNewService;
private final TodoManager todoManager;
private final TodoRangeQueryService todoRangeQueryService;
private final TodoSimpleQueryService todoSimpleQueryService;
@ -138,11 +135,6 @@ public class PendingMessageNewController implements PendingMessageClient {
return CommonResponse.success(todoWorkerQueryService.getWorkerCalendar(request));
}
@Override
public CommonResponse<Page<MessageDetailRes>> compatiblePageQuery(PendingMessagePageRequest request) {
return CommonResponse.success(pendingMessageNewService.compatiblePageQuery(request));
}
@Override
public CommonResponse<PendingMessageResponse> query(PendingMessageQueryRequest request) {
log.info("query, request={}", JSON.toJSONString(request));
@ -155,14 +147,17 @@ public class PendingMessageNewController implements PendingMessageClient {
@Override
public CommonResponse<PendingMessageResponse> detail(
String msgIdentityCode, TerminalTypeEnum terminalType, TodoQueryType queryType) {
PendingMessageResponse response = todoSimpleQueryService.getDetail(msgIdentityCode, terminalType, queryType);
PendingMessageDetailRequestV3 request = new PendingMessageDetailRequestV3();
request.setMsgIdentityCode(msgIdentityCode);
request.setTerminalType(terminalType);
request.setQueryType(queryType);
PendingMessageResponse response = todoSimpleQueryService.getDetail(request);
return CommonResponse.success(response);
}
@Override
public CommonResponse<PendingMessageResponse> detailV3(PendingMessageDetailRequestV3 requestV3) {
PendingMessageResponse response = todoSimpleQueryService.getDetail(
requestV3.getMsgIdentityCode(), requestV3.getTerminalType(), requestV3.getQueryType());
public CommonResponse<PendingMessageResponse> detailV3(PendingMessageDetailRequestV3 request) {
PendingMessageResponse response = todoSimpleQueryService.getDetail(request);
return CommonResponse.success(response);
}
@ -182,7 +177,7 @@ public class PendingMessageNewController implements PendingMessageClient {
@Override
public CommonResponse<Page<PendingMessageIterateResponse>> iterate(PendingMessageIterateRequest request) {
return CommonResponse.success(pendingMessageNewService.iterate(request));
return CommonResponse.success(Page.zero());
}
@Override

View File

@ -2,20 +2,25 @@ package cn.axzo.msg.center.message.domain.dto;
import cn.axzo.msg.center.api.custombutton.ProposedButtons;
import cn.axzo.msg.center.domain.entity.PendingMessageRecord;
import cn.axzo.msg.center.service.domain.CardUrlConfig;
import cn.axzo.msg.center.service.dto.IdentityDTO;
import cn.axzo.msg.center.service.dto.MessageCardContentItemDTO;
import cn.axzo.msg.center.service.dto.PersonDTO;
import cn.axzo.msg.center.service.enums.BizCategoryEnum;
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
import cn.axzo.msg.center.service.enums.CardUrlOpenStrategy;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import cn.axzo.msg.center.service.enums.TodoType;
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.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.DateFormatUtil;
import cn.axzo.msg.center.utils.MessageRouterUtil;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
@ -24,6 +29,7 @@ import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import java.io.Serializable;
import java.time.LocalDateTime;
@ -38,6 +44,7 @@ import java.util.Optional;
* @date 2023/9/23
* @version 1.0
*/
@Slf4j
@Setter
@Getter
@Builder
@ -210,6 +217,21 @@ public class PendingMessageDTO implements Serializable {
private JSONObject bizExtParamObj;
private JSONObject routerExtParamObj;
/**
* 基于分组的待办信息
*/
private ParsedModelV3 modelV3;
/**
* 卡片跳转方式. NONE: 无跳转, OPEN_TODO_DETAIL: 打开待办详情, OPEN_CUSTOM_PAGE: 打开指定页面
*/
private CardUrlOpenStrategy cardUrlOpenStrategy;
/**
* 卡片跳转配置. 在links的基础上再包一层, 避免以后卡片增加自己的配置
*/
private CardUrlConfig cardUrlConfig;
@Deprecated
public static PendingMessageDTO from(PendingMessageRecord pendingMessageRecord) {
// 代办发起者信息
@ -259,13 +281,19 @@ public class PendingMessageDTO implements Serializable {
.build();
}
@Deprecated
public PendingMessageResponse toResponse(TerminalTypeEnum terminalType) {
log.warn("Invoking deprecated API, terminalType: {}", terminalType);
return null;
}
public PendingMessageResponse toResponse(TerminalProvider terminalProvider) {
boolean isCreatedToday = false;
if (createTime != null) {
Date createAt = DateFormatUtil.toDate(createTime);
isCreatedToday = DateUtil.isSameDay(createAt, new Date());
}
return PendingMessageResponse.builder()
PendingMessageResponse response = PendingMessageResponse.builder()
// 发起人单位项目信息
.promoterOuId(promoterOuId)
.promoterWorkspaceId(promoterWorkspaceId)
@ -294,7 +322,6 @@ public class PendingMessageDTO implements Serializable {
.templateCode(this.templateCode)
.title(this.title)
.content(this.content)
.cardItems(this.cardItems)
.promoterPersonId(Optional.ofNullable(this.promoter).map(PersonDTO::getId).orElse(null))
.promoterName(Optional.ofNullable(this.promoter).map(PersonDTO::getName).orElse(null))
.promoterIdentity(Optional.ofNullable(this.promoter).map(PersonDTO::getIdentity).orElse(null))
@ -310,11 +337,16 @@ public class PendingMessageDTO implements Serializable {
.createTimestamp(DateFormatUtil.toTimestamp(this.createTime))
.updateTimestamp(DateFormatUtil.toTimestamp(this.updateTime))
.deadlineTimestamp(DateFormatUtil.toTimestamp(this.deadline))
.detailRouter(MessageRouterUtil.fetchBizDetailRouter(this.msgTemplateRouter, terminalType).orElse(null))
.buttonRouters(MessageRouterUtil.fetchMessageRouterButtons(this.msgTemplateRouter, terminalType))
.bizFinalStateIcon(Optional.ofNullable(bizFinalState).map(BizFinalStateEnum::getIcon).orElse(null))
.bizFinalState(bizFinalState)
.modelV3(modelV3)
.displayOnCardKeyValues(modelV3.determineDisplayOnCardKeyValues())
.cardUrlOpenStrategy(cardUrlOpenStrategy)
.cardUrlConfig(cardUrlConfig)
.build();
if (modelV3 != null && terminalProvider != null)
ParsedModel3Walker.walkDown(modelV3, new ModelV2PropsPopulator(response, terminalProvider));
return response;
}
@Override

View File

@ -7,7 +7,6 @@ import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import cn.axzo.msg.center.service.enums.RouterCategoryEnum;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;
import org.jetbrains.annotations.NotNull;
import java.util.List;
@ -17,7 +16,7 @@ import java.util.List;
*/
@Setter
@Getter
public class ModelV3 {
public class TemplateModelV3 {
@NotNull private MessageTemplateV3 template;
@NotNull private List<MessageTemplateGroupV3> groups;

View File

@ -1,210 +0,0 @@
package cn.axzo.msg.center.message.service;
import cn.axzo.msg.center.api.response.MessageDetailRes;
import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO;
import cn.axzo.msg.center.message.domain.dto.PendingMessageStatisticDTO;
import cn.axzo.msg.center.message.domain.param.MessageGroupNodeStatisticParam;
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import cn.axzo.msg.center.service.pending.request.CompletePendingBySubCodeRequest;
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageByIdRequest;
import cn.axzo.msg.center.service.pending.request.CompletePendingMessageRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageByBizCodeRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageFixedTemplatePageRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageIterateRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest;
import cn.axzo.msg.center.service.pending.request.PendingMessageQueryRequest;
import cn.axzo.msg.center.service.pending.request.RevokePendingMessageByIdRequest;
import cn.axzo.msg.center.service.pending.request.SetHideRequest;
import cn.axzo.msg.center.service.pending.request.UpdatePendingMessageByIdRequest;
import cn.axzo.msg.center.service.pending.response.AnalysisPage;
import cn.axzo.msg.center.service.pending.response.PendingMessageIterateResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageSimpleDTO;
import cn.axzo.msg.center.service.pending.response.PushPendingMessageDTO;
import cn.azxo.framework.common.model.Page;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
/**
* @description
* 待办Service
* @author cold_blade
* @date 2023/9/20
* @version 1.0
*/
public interface PendingMessageNewService {
/**
* 分类统计待办的待处理状态的数量
*
* @param param 统计入参
* @return 分类信息及其对应的待处理的待办数量列表
*/
List<PendingMessageStatisticDTO> groupStatistic(MessageGroupNodeStatisticParam param);
/**
* 统计个人在某个应用终端的待处理的待办数量
*
* @param param 统计入参
* @return 待处理的待办数量
*/
Integer countUncompleted(MessageGroupNodeStatisticParam param);
/**
* 根据模板id列表统计指定的自然人的待办数量
*
* @param personId 自然人id
* @param templateIds 模板id列表
* @return 指定的人的待办数量
*/
Integer countUncompleted(Long personId, Collection<Long> templateIds);
/**
* 代办列表分页查询
*
* @param request 分页查询相关参数
* @return 代办列表
*/
AnalysisPage<PendingMessageResponse> pageQuery(PendingMessagePageRequest request);
/**
* 遍历待办数据
* @param request
* @return
*/
Page<PendingMessageIterateResponse> iterate(PendingMessageIterateRequest request);
/**
* 查询可以用于分页查询的模版
* @param request
*/
List<String> determinePageQueryTemplateCodes(PendingMessagePageRequest request);
/**
* 代办列表分页查询
*
* @param request 分页查询相关参数
* @return 代办列表
*/
List<PendingMessageResponse> getPendingMessageByAppWorker(PendingMessageFixedTemplatePageRequest request);
/**
* 代办列表分页查询
*
* @param request 分页查询相关参数
* @return 代办列表
*/
Page<MessageDetailRes> compatiblePageQuery(PendingMessagePageRequest request);
/**
* 代办列表指定item查询
*
* @param request 查询相关参数
* @return 指定的item数据
*/
PendingMessageResponse query(PendingMessageQueryRequest request);
/**
* 查询代办详情
*
* @param msgIdentityCode 消息的唯一标识
* @param terminalType APP终端类型
* @return 代办详情
*/
Optional<PendingMessageDTO> detail(String msgIdentityCode, TerminalTypeEnum terminalType);
/**
* 发送代办
*
* @param param 代办核心参数
* @return 代办唯一标识
*/
List<PushPendingMessageDTO> push(PendingMessagePushParam param);
/**
* 完成代办
*
* @param requestNo 代办唯一标识
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean complete(String requestNo);
/**
* 完成代办
*
* @param param 代办唯一标识
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean completeById(CompletePendingMessageByIdRequest param);
/**
* 撤销代办
*
* @param requestNo 代办唯一标识
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean revoke(String requestNo);
/**
* 通过ID撤销代办
*
* @param msgId 代办唯一标识
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean revokeByMsgId(String msgId);
/**
* 通过业务编码和模版编码完成代办
*
* @param param
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean completeByTemplateCodeBizCode(CompletePendingMessageRequest param);
/**
* 通过业务和子业务编码和模版编码完成代办
*
* @param param
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean completeByTemplateCodeSubBizCode(CompletePendingBySubCodeRequest param);
/**
* 通过业务编码和模版编码撤销代办
*
* @param param
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean revokeByTemplateCodeBizCode(CompletePendingMessageRequest param);
/**
* 通过ID撤销代办
*
* @param param
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean revokeById(RevokePendingMessageByIdRequest param);
/**
* 通过ID编辑代办bizParam
*
* @param param
* @return 成功返回 {@code true} 失败返回 {@code false}
*/
Boolean updateById(UpdatePendingMessageByIdRequest param);
/**
* 通过BizCode获取最新代办
* @param bizCode
* @return
*/
List<PendingMessageSimpleDTO> getLatestByBizCode(PendingMessageByBizCodeRequest bizCode);
/**
* 将待办设置为隐藏
*/
Boolean setHide(SetHideRequest req);
}

View File

@ -5,7 +5,7 @@ import cn.axzo.framework.jackson.utility.JSON;
import cn.axzo.msg.center.domain.entity.MessageEntity;
import cn.axzo.msg.center.domain.entity.MessageTemplateGroupV3;
import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig;
import cn.axzo.msg.center.message.domain.dto.ModelV3;
import cn.axzo.msg.center.message.domain.dto.TemplateModelV3;
import cn.axzo.msg.center.message.service.todo.manage.TodoExt;
import cn.axzo.msg.center.service.domain.UrlConfig;
import cn.axzo.msg.center.service.domain.UrlConfigVisitor;
@ -48,15 +48,16 @@ public class ModelV3Parser {
private final PendingMessageBizConfig cfg;
public ParsedModelV3 parseModel(ModelV3 model,
public ParsedModelV3 parseModel(TemplateModelV3 templateModel,
MessageEntity entity,
JSONObject bizParam,
JSONObject routerParam) {
JSONObject routerParam,
JSONObject appendRouterParam) {
ParsedModelV3 parsedModel = new ParsedModelV3();
parsedModel.setTemplate(BeanMapper.copyBean(model, ParsedTemplateV3.class));
parsedModel.setGroups(copyGroups(model.getGroups()));
parsedModel.setButtons(BeanMapper.copyList(model.getButtons(), ParsedButtonV3.class));
UrlParser urlParser = new UrlParser(entity, routerParam);
parsedModel.setTemplate(BeanMapper.copyBean(templateModel, ParsedTemplateV3.class));
parsedModel.setGroups(copyGroups(templateModel.getGroups()));
parsedModel.setButtons(BeanMapper.copyList(templateModel.getButtons(), ParsedButtonV3.class));
UrlParser urlParser = new UrlParser(entity, routerParam, appendRouterParam);
ParsedModel3Walker.walkDown(parsedModel, new ParsedModel3Visitor() {
@Override
@ -122,7 +123,7 @@ public class ModelV3Parser {
JSONObject routerParam) {
String json = JSON.toJSONString(urlConfig);
UrlConfig copy = JSON.parseObject(json, UrlConfig.class);
new UrlParser(entity, routerParam).parseUrlConfig(copy);
new UrlParser(entity, routerParam, routerParam).parseUrlConfig(copy);
return copy;
}
@ -131,6 +132,7 @@ public class ModelV3Parser {
final MessageEntity entity;
final JSONObject routerParam;
final JSONObject appendRouterParam;
void parseUrlConfig(UrlConfig urlConfig) {
UrlConfigWalker.walkDown(urlConfig, this);
@ -190,7 +192,7 @@ public class ModelV3Parser {
try {
String parsedUrl = getDefaultResolver().resolveByMap(url, routerParam);
if (cfg.isConcatRouterParams(entity.getTemplateCode()))
parsedUrl = appendRouterParam(parsedUrl, routerParam);
parsedUrl = appendRouterParam(parsedUrl, appendRouterParam);
return parsedUrl;
} finally {
if (populateWorkspaceId)
@ -199,6 +201,8 @@ public class ModelV3Parser {
}
String appendRouterParam(String url, JSONObject routerParam) {
if (routerParam == null)
return url;
Object ctx = routerParam.remove(TodoExt.CTX);
try {
if (routerParam.isEmpty()) {

View File

@ -6,7 +6,7 @@ import cn.axzo.msg.center.dal.MessageTemplateV3Dao;
import cn.axzo.msg.center.domain.entity.MessageTemplateButtonV3;
import cn.axzo.msg.center.domain.entity.MessageTemplateGroupV3;
import cn.axzo.msg.center.domain.entity.MessageTemplateV3;
import cn.axzo.msg.center.message.domain.dto.ModelV3;
import cn.axzo.msg.center.message.domain.dto.TemplateModelV3;
import cn.axzo.msg.center.service.enums.StatusEnum;
import lombok.RequiredArgsConstructor;
import org.apache.commons.collections4.CollectionUtils;
@ -32,7 +32,7 @@ public class ModelV3Service {
private final MessageTemplateGroupV3Dao messageTemplateGroupV3Dao;
private final MessageTemplateButtonV3Dao messageTemplateButtonV3Dao;
public Optional<ModelV3> findEnabledByCode(String templateCode) {
public Optional<TemplateModelV3> findEnabledByCode(String templateCode) {
MessageTemplateV3 template = messageTemplateV3Dao.lambdaQuery()
.eq(MessageTemplateV3::getCode, templateCode)
.eq(MessageTemplateV3::getIsDelete, 0)
@ -44,7 +44,7 @@ public class ModelV3Service {
return Optional.of(builder.build(template));
}
public List<ModelV3> getByCodes(List<String> templateCodes) {
public List<TemplateModelV3> getByCodes(List<String> templateCodes) {
if (CollectionUtils.isEmpty(templateCodes))
return Collections.emptyList();
List<MessageTemplateV3> templates = messageTemplateV3Dao.lambdaQuery()
@ -79,12 +79,12 @@ public class ModelV3Service {
}
}
ModelV3 build(MessageTemplateV3 template) {
ModelV3 model = new ModelV3();
model.setTemplate(template);
model.setGroups(templateCode2Groups.getOrDefault(template.getCode(), Collections.emptyList()));
model.setButtons(templateCode2Buttons.getOrDefault(template.getCode(), Collections.emptyList()));
return model;
TemplateModelV3 build(MessageTemplateV3 template) {
TemplateModelV3 templateModel = new TemplateModelV3();
templateModel.setTemplate(template);
templateModel.setGroups(templateCode2Groups.getOrDefault(template.getCode(), Collections.emptyList()));
templateModel.setButtons(templateCode2Buttons.getOrDefault(template.getCode(), Collections.emptyList()));
return templateModel;
}
}

View File

@ -101,7 +101,7 @@ public class TodoRangeQueryService {
// 可执行的/抄送我的
pageResult = pageQueryTodo(request, templateCodes);
List<PendingMessageResponse> messages = todoRespBuilder
.convertAdapter2MessageResponse(pageResult.getList(), request.getTerminalType());
.convertAdapter2MessageResponse(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.getTerminalType());
return todoRespBuilder.convertAdapter2MessageResponse(message, request);
}
@RequiredArgsConstructor

View File

@ -7,11 +7,11 @@ 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.MessageTemplateDTO;
import cn.axzo.msg.center.message.domain.dto.PendingMessageDTO;
import cn.axzo.msg.center.message.service.MessageTemplateNewService;
import cn.axzo.msg.center.message.domain.dto.TemplateModelV3;
import cn.axzo.msg.center.message.service.impl.PendingMessageNewServiceImpl;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import cn.axzo.msg.center.message.service.impl.v3.ModelV3Service;
import cn.axzo.msg.center.service.pending.TerminalProvider;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@ -38,22 +38,22 @@ class TodoRespBuilder {
private final TodoBusinessDao todoBusinessDao;
private final TodoDao todoDao;
private final MessageTemplateNewService messageTemplateNewService;
private final PendingMessageNewServiceImpl pendingMessageNewServiceImpl;
private final ModelV3Service modelV3Service;
// batch convert to old model to reuse the code and save some time
PendingMessageResponse convertAdapter2MessageResponse(
PendingRecordAdapter adapter, TerminalTypeEnum terminalType) {
PendingRecordAdapter adapter, TerminalProvider terminalProvider) {
List<PendingMessageResponse> responses = convertAdapter2MessageResponse(
Collections.singletonList(adapter), terminalType);
Collections.singletonList(adapter), terminalProvider);
return responses.get(0);
}
List<PendingMessageResponse> convertAdapter2MessageResponse(
List<PendingRecordAdapter> adapters, TerminalTypeEnum terminalType) {
List<PendingRecordAdapter> adapters, TerminalProvider terminalProvider) {
return convertAdapter2MessageDTO(adapters).stream()
.map(i -> i.toResponse(terminalType))
.map(i -> i.toResponse(terminalProvider))
.collect(toList());
}
@ -64,10 +64,9 @@ class TodoRespBuilder {
.distinct()
.collect(toList());
// 重新查询模版的收益大于成本
List<MessageTemplateDTO> messageTemplates = messageTemplateNewService
.listByTemplateCodes(templateCodes);
List<TemplateModelV3> templateModels = modelV3Service.getByCodes(templateCodes);
return adapters.stream()
.map(adapter -> pendingMessageNewServiceImpl.convert(adapter, messageTemplates))
.map(adapter -> pendingMessageNewServiceImpl.convertV3(adapter, templateModels))
.collect(toList());
}
@ -85,8 +84,8 @@ class TodoRespBuilder {
templateCodes.add(business.getTemplateCode());
if (todo != null)
templateCodes.add(todo.getTemplateCode());
List<MessageTemplateDTO> messageTemplates = messageTemplateNewService.listByTemplateCodes(templateCodes);
return pendingMessageNewServiceImpl.convert(adapter, messageTemplates);
List<TemplateModelV3> templateModels = modelV3Service.getByCodes(templateCodes);
return pendingMessageNewServiceImpl.convertV3(adapter, templateModels);
}
// !! build adapters

View File

@ -9,10 +9,11 @@ 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.inside.notices.config.PendingMessageBizConfig;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
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;
import cn.axzo.msg.center.service.pending.response.PendingMessageResponse;
import cn.axzo.msg.center.service.pending.response.PendingMessageSimpleDTO;
@ -63,22 +64,21 @@ public class TodoSimpleQueryService {
.one();
return todoRespBuilder
.convertTodoToMessage(business, todo)
.toResponse(req.getTerminalType());
.toResponse(req);
}
public PendingMessageResponse getDetail(
String identityCode, TerminalTypeEnum terminalType, TodoQueryType queryType) {
Todo todo = todoDao.findTodoByCode(identityCode).orElse(null);
public PendingMessageResponse getDetail(PendingMessageDetailRequestV3 request) {
Todo todo = todoDao.findTodoByCode(request.getMsgIdentityCode()).orElse(null);
if (todo == null)
return null;
if (queryType == TodoQueryType.SEND_BY_ME) {
if (request.getQueryType() == TodoQueryType.SEND_BY_ME) {
TodoBusiness business = todoBusinessDao.getById(todo.getTodoBusinessId());
PendingRecordAdapter adapter = todoRespBuilder.buildBusinessAdapter(business);
return todoRespBuilder.convertAdapter2MessageResponse(adapter, terminalType);
return todoRespBuilder.convertAdapter2MessageResponse(adapter, request);
}
return todoRespBuilder
.convertTodoToMessage(todo)
.toResponse(terminalType);
.toResponse(request);
}
public PendingMessageResponse getLatestTodoByBiz(
@ -90,7 +90,7 @@ public class TodoSimpleQueryService {
return null;
return todoRespBuilder
.convertTodoToMessage(todo)
.toResponse(null);
.toResponse((TerminalProvider) 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.getTerminalType());
return todoRespBuilder.convertAdapter2MessageResponse(adapters, request);
}
}

View File

@ -3,7 +3,7 @@ package cn.axzo.msg.center.message.service.todo.manage;
import cn.axzo.msg.center.common.utils.BizAssertions;
import cn.axzo.msg.center.common.utils.PlaceholderResolver;
import cn.axzo.msg.center.domain.entity.Todo;
import cn.axzo.msg.center.message.domain.dto.ModelV3;
import cn.axzo.msg.center.message.domain.dto.TemplateModelV3;
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
import cn.axzo.msg.center.service.util.JSONUtils;
import com.alibaba.fastjson.JSONObject;
@ -21,7 +21,7 @@ public class TodoExt {
public static final String CTX = "ctx";
private final PendingMessagePushParam request;
private final ModelV3 model;
private final TemplateModelV3 templateModel;
private JSONObject bizExt;
private JSONObject routerExt;
@ -48,7 +48,7 @@ public class TodoExt {
if (title == null) {
JSONObject ext = (JSONObject)parseBizExtParams().clone();
ext.put(CTX, ImmutableMap.of("request", request));
title = PlaceholderResolver.tryResolve(model.getTemplate().getTitle(), ext);
title = PlaceholderResolver.tryResolve(templateModel.getTemplate().getTitle(), ext);
}
return title;
}
@ -57,7 +57,7 @@ public class TodoExt {
if (content == null) {
JSONObject ext = (JSONObject)parseBizExtParams().clone();
ext.put(CTX, ImmutableMap.of("request", request));
content = PlaceholderResolver.tryResolve(model.getTemplate().getContent(), ext);
content = PlaceholderResolver.tryResolve(templateModel.getTemplate().getContent(), ext);
}
return content;
}

View File

@ -14,7 +14,7 @@ import cn.axzo.msg.center.domain.entity.TodoBusiness;
import cn.axzo.msg.center.domain.entity.TodoHandoverMapping;
import cn.axzo.msg.center.domain.persistence.BaseEntityExt;
import cn.axzo.msg.center.inside.notices.config.PendingMessageBizConfig;
import cn.axzo.msg.center.message.domain.dto.ModelV3;
import cn.axzo.msg.center.message.domain.dto.TemplateModelV3;
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
import cn.axzo.msg.center.message.service.impl.v3.ModelV3Service;
import cn.axzo.msg.center.message.service.todo.manage.broadcast.TodoBroadcaster;
@ -120,7 +120,7 @@ public class TodoManager {
*/
private List<PushPendingMessageDTO> sendImpl(TodoRequestContext ctx, PendingMessagePushParam request) {
// 可能会存在重新查询模版的情况, 成本不高
ModelV3 model = modelV3Service.findEnabledByCode(request.getTemplateCode())
TemplateModelV3 templateModel = modelV3Service.findEnabledByCode(request.getTemplateCode())
.orElseThrow(() -> new ServiceException(
String.format("Can't find template. templateCode=%s", request.getTemplateCode())));
BizAssertions.assertNotEmpty(request.getExecutor(), "接受者不能为空");
@ -130,7 +130,7 @@ public class TodoManager {
// 1. 让他们改造, 传bizCode
// 2. 待办自动生成bizCode
// 3. 如果是系统生成的待办, 那么就不会有问题. 目前生成上有2个模版(进场出场)都是系统生成的
boolean genBizCode = cfg.getGenBizCodeTemplates().contains(model.getTemplateCode());
boolean genBizCode = cfg.getGenBizCodeTemplates().contains(templateModel.getTemplateCode());
if (genBizCode)
request.setBizCode(UUIDUtil.uuidString());
else if (StringUtils.isBlank(request.getBizCode()))
@ -141,7 +141,7 @@ public class TodoManager {
.findByBiz(request.getTemplateCode(), request.getBizCode(), true)
.orElse(null);
boolean businessCreated = false;
TodoExt ext = new TodoExt(request, model);
TodoExt ext = new TodoExt(request, templateModel);
if (business == null) {
business = todoRecordBuilder.buildBusiness(request, ext);
business.getRecordExt().setGenBizCode(genBizCode);
@ -151,8 +151,8 @@ public class TodoManager {
//批量默认为false
YesOrNo supportBatchProcess = request.getSupportBatchProcess() == null ? YesOrNo.NO : request.getSupportBatchProcess();
//业务待办设置是否批量处理
if (model.getTemplateCategory() == MessageCategoryEnum.BIZ_PENDING_MESSAGE
&& model.hasPresetButtons())
if (templateModel.getTemplateCategory() == MessageCategoryEnum.BIZ_PENDING_MESSAGE
&& templateModel.hasPresetButtons())
supportBatchProcess = YesOrNo.YES;
request.setSupportBatchProcess(supportBatchProcess);
List<Todo> todos = todoRecordBuilder.buildTodos(
@ -166,8 +166,8 @@ public class TodoManager {
todoBroadcaster.fireTodoUpdates("send", todos);
// 记录日志
// @formatter:off
ctx.addLogContent("templateTitle", model.getTemplate().getTitle())
.addLogContent("templateContent", model.getTemplate().getContent())
ctx.addLogContent("templateTitle", templateModel.getTemplate().getTitle())
.addLogContent("templateContent", templateModel.getTemplate().getContent())
.addLogContent("title", ext.parseTitle())
.addLogContent("content", ext.parseContent())
.addLogContent("bizExtParams", ext.parseBizExtParams())
@ -178,7 +178,7 @@ public class TodoManager {
if (businessCreated)
todoLogger.logBusinessUpdated(ctx, business);
todoLogger.logTodosUpdated(ctx, todos);
applicationContext.publishEvent(new NewTodoEvent(this, model, todos));
applicationContext.publishEvent(new NewTodoEvent(this, templateModel, todos));
return todos.stream()
.map(todo -> new PushPendingMessageDTO(
todo.getId(), todo.getIdentityCode(),

View File

@ -1,7 +1,7 @@
package cn.axzo.msg.center.message.service.todo.manage.event;
import cn.axzo.msg.center.domain.entity.Todo;
import cn.axzo.msg.center.message.domain.dto.ModelV3;
import cn.axzo.msg.center.message.domain.dto.TemplateModelV3;
import com.alibaba.fastjson.JSON;
import lombok.Getter;
import org.springframework.context.ApplicationEvent;
@ -14,19 +14,19 @@ import java.util.List;
*/
@Getter
public class NewTodoEvent extends ApplicationEvent {
private final ModelV3 model;
private final TemplateModelV3 templateModel;
private final List<Todo> todos;
public NewTodoEvent(Object source, ModelV3 model, List<Todo> todos) {
public NewTodoEvent(Object source, TemplateModelV3 templateModel, List<Todo> todos) {
super(source);
this.model = model;
this.templateModel = templateModel;
this.todos = todos;
}
@Override
public String toString() {
HashMap<String, Object> fields = new HashMap<>();
fields.put("model", model);
fields.put("model", templateModel);
fields.put("todos", todos);
return JSON.toJSONString(fields);
}

View File

@ -4,7 +4,7 @@ import cn.axzo.msg.center.dal.TodoBusinessDao;
import cn.axzo.msg.center.dal.TodoBusinesses;
import cn.axzo.msg.center.domain.entity.Todo;
import cn.axzo.msg.center.domain.entity.TodoBusiness;
import cn.axzo.msg.center.message.domain.dto.ModelV3;
import cn.axzo.msg.center.message.domain.dto.TemplateModelV3;
import cn.axzo.msg.center.message.service.impl.v3.ModelV3Parser;
import cn.axzo.msg.center.message.service.todo.manage.TodoExt;
import cn.axzo.msg.center.message.service.youmeng.YoumengPush;
@ -48,7 +48,7 @@ class TodoPushSender implements ApplicationListener<NewTodoEvent> {
log.info("Prepare sending todo push. event={}", event);
ArrayList<YoumengPush> pushes = new ArrayList<>();
for (Todo todo : event.getTodos()) {
Set<PushNavigation> navigations = determineNavigations(event.getModel(), todo);
Set<PushNavigation> navigations = determineNavigations(event.getTemplateModel(), todo);
if (CollectionUtils.isEmpty(navigations))
continue;
YoumengPush push = new YoumengPush();
@ -60,11 +60,11 @@ class TodoPushSender implements ApplicationListener<NewTodoEvent> {
pushes.add(push);
}
if (CollectionUtils.isNotEmpty(pushes))
youmengTemplateClient.asyncSend(event.getModel().getTemplate().getId(), pushes);
youmengTemplateClient.asyncSend(event.getTemplateModel().getTemplate().getId(), pushes);
}
private Set<PushNavigation> determineNavigations(ModelV3 model, Todo todo) {
CardUrlConfig cardUrlConfig = model.getTemplate().getCardUrlConfig();
private Set<PushNavigation> determineNavigations(TemplateModelV3 templateModel, Todo todo) {
CardUrlConfig cardUrlConfig = templateModel.getTemplate().getCardUrlConfig();
if (cardUrlConfig == null) return Collections.emptySet();
UrlConfig urlConfig = cardUrlConfig.getUrlConfig();
if (urlConfig == null)

View File

@ -325,15 +325,15 @@ public class MigrateMessageTemplateV3Job {
TerminalTypeEnum.WEB_VIEW,
TerminalTypeEnum.MINI_PROGRAM,
TerminalTypeEnum.WECHAT_MINI_PROGRAM).ifPresent(router -> {
AppUrl appUrl = new AppUrl();
appUrl.setUrl(router.getUrl());
AppUrl app = new AppUrl();
app.setUrl(router.getUrl());
if (terminals.contains(PushTerminalEnum.B_ENTERPRISE_APP)) {
urlConfig.getOrCreateAppManager().setIos(appUrl);
urlConfig.getOrCreateAppManager().setAndroid(appUrl);
urlConfig.getOrCreateAppManager().setIos(app);
urlConfig.getOrCreateAppManager().setAndroid(app);
}
if (terminals.contains(PushTerminalEnum.C_WORKER_APP)) {
urlConfig.getOrCreateAppWorker().setIos(appUrl);
urlConfig.getOrCreateAppWorker().setAndroid(appUrl);
urlConfig.getOrCreateAppWorker().setIos(app);
urlConfig.getOrCreateAppWorker().setAndroid(app);
}
});

View File

@ -1,6 +1,5 @@
package cn.axzo.msg.center.service.pending.client;
import cn.axzo.msg.center.api.response.MessageDetailRes;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import cn.axzo.msg.center.service.enums.TodoQueryType;
import cn.axzo.msg.center.service.pending.request.CompletePendingBySubCodeRequest;
@ -134,16 +133,6 @@ public interface PendingMessageClient {
@PostMapping(value = "/pending-message/getPendingMessageByAppWorker", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<List<PendingMessageResponse>> getPendingMessageByAppWorker(@RequestBody @Valid PendingMessageFixedTemplatePageRequest request);
/**
* 代办列表分页查询
*
* @param request 分页查询相关参数
* @return 代办列表
*/
@Deprecated
@PostMapping(value = "/pending-message/record/compatible/page", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<Page<MessageDetailRes>> compatiblePageQuery(@RequestBody @Valid PendingMessagePageRequest request);
/**
* 代办列表指定待办的查询
*
@ -169,7 +158,7 @@ public interface PendingMessageClient {
@PostMapping(value = "/pending-message/record/detailV3", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<PendingMessageResponse> detailV3(
@RequestBody @Valid PendingMessageDetailRequestV3 requestV3);
@RequestBody @Valid PendingMessageDetailRequestV3 request);
/**
* 根据bizCode查询待办详情

View File

@ -16,9 +16,7 @@ import cn.axzo.msg.center.service.enums.OrganizationTypeEnum;
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
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.response.v3.ModelV2PropsPopulator;
import cn.axzo.msg.center.service.pending.response.v3.ParsedModel3Walker;
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.template.response.MessageDetailStyle;
import com.alibaba.fastjson.JSON;
@ -256,6 +254,11 @@ public class PendingMessageResponse implements Serializable, TodoButtonProvider
*/
private ParsedModelV3 modelV3;
/**
* 显示到卡片上的键值对
*/
private List<ParsedKV> displayOnCardKeyValues;
/**
* 卡片跳转方式. NONE: 无跳转, OPEN_TODO_DETAIL: 打开待办详情, OPEN_CUSTOM_PAGE: 打开指定页面
*/
@ -266,12 +269,6 @@ public class PendingMessageResponse implements Serializable, TodoButtonProvider
*/
private CardUrlConfig cardUrlConfig;
public void populateV2Props(TerminalProvider terminalProvider) {
if (modelV3 == null) return;
ParsedModel3Walker.walkDown(
modelV3, new ModelV2PropsPopulator(this, terminalProvider));
}
public void adjustProposedButtons(boolean forPromoter) {
ProposedButtonFilter.adjustProposedButtons(this, forPromoter);
}

View File

@ -7,8 +7,10 @@ import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import static java.util.stream.Collectors.toList;
@ -20,7 +22,7 @@ import static java.util.stream.Collectors.toList;
public class ParsedModelV3 {
/**
* 模板. 对前端来说没用
* 前端忽略
*/
@JsonIgnore @JSONField(serialize = false)
private ParsedTemplateV3 template;
@ -47,6 +49,16 @@ public class ParsedModelV3 {
@JsonIgnore @JSONField(serialize = false)
private List<ComponentWorkerGroup> componentWorkerGroups = new ArrayList<>();
public List<ParsedKV> determineDisplayOnCardKeyValues() {
return determineGroups().stream()
.filter(group -> group.getGroupType() == GroupType.KV_VALUES)
.map(ParsedGroupV3::getGroupInfo)
.filter(Objects::nonNull)
.map(ParsedGroupInfo::getKeyValues)
.flatMap(Collection::stream)
.collect(toList());
}
public void addPersonKV(ParsedKV kv) {
personKeyValues.add(kv);
}