Merge branch 'feature/REQ-2010' into pre

This commit is contained in:
yanglin 2024-02-27 11:25:49 +08:00
commit d470062a8e
13 changed files with 199 additions and 27 deletions

View File

@ -173,6 +173,7 @@ public class InsideNoticesApiImpl implements InsideNoticesApi {
@Override
public CommonResponse<Void> updateReadMsgStatus(CmsReadMsgReq req) {
log.info("updateReadMsgStatus, req={}", req);
messageRecordService.updateReadMsgStatus(req);
return CommonResponse.success();
}

View File

@ -0,0 +1,18 @@
package cn.axzo.msg.center.inside.notices.utils;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
/**
* @author yanglin
*/
public class Queries {
/**
* @param domainType help compiler
*/
public static <T> LambdaQueryWrapper<T> query(
@SuppressWarnings({"unused", "help compiler"}) Class<T> domainType) {
return new LambdaQueryWrapper<>();
}
}

View File

@ -22,6 +22,7 @@ import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest
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;
@ -68,7 +69,7 @@ public class PendingMessageNewController implements PendingMessageClient {
}
@Override
public CommonResponse<Page<PendingMessageResponse>> pageQuery(PendingMessagePageRequest request) {
public CommonResponse<AnalysisPage<PendingMessageResponse>> pageQuery(PendingMessagePageRequest request) {
log.info("pageQuery, request={}", request);
return CommonResponse.success(pendingMessageNewService.pageQuery(request));
}

View File

@ -1,5 +1,6 @@
package cn.axzo.msg.center.message.controller;
import cn.axzo.msg.center.message.domain.param.PendingMessagePushParam;
import cn.axzo.msg.center.message.service.PendingMessageNewService;
import cn.axzo.msg.center.service.pending.request.PendingMessagePageRequest;
import lombok.RequiredArgsConstructor;
@ -28,4 +29,11 @@ public class PrivateMessageController {
@RequestBody @Valid PendingMessagePageRequest request) {
return pendingMessageNewService.determinePageQueryTemplateCodes(request);
}
@RequestMapping("sendPendingMessage")
public Object sendPendingMessage(
@RequestBody @Valid PendingMessagePushParam request) {
return pendingMessageNewService.push(request);
}
}

View File

@ -17,6 +17,7 @@ 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;
@ -67,7 +68,7 @@ public interface PendingMessageNewService {
* @param request 分页查询相关参数
* @return 代办列表
*/
Page<PendingMessageResponse> pageQuery(PendingMessagePageRequest request);
AnalysisPage<PendingMessageResponse> pageQuery(PendingMessagePageRequest request);
/**
* 遍历待办数据

View File

@ -26,4 +26,10 @@ public class AnalysisPageFactory {
return page;
}
public <T> AnalysisPage<T> createPage() {
AnalysisPage<T> page = new AnalysisPage<>();
page.setEnableAnalysis(enableAnalysisProfiles.contains(profile));
return page;
}
}

View File

@ -29,6 +29,7 @@ import cn.axzo.msg.center.domain.dto.PendingCalendarCodeDTO;
import cn.axzo.msg.center.domain.entity.PendingMessageRecord;
import cn.axzo.msg.center.domain.enums.NativeTypeEnum;
import cn.axzo.msg.center.inside.notices.config.PendingCalendarCodeConfig;
import cn.axzo.msg.center.inside.notices.utils.Queries;
import cn.axzo.msg.center.message.domain.dto.GroupTreeNodePathDTO;
import cn.axzo.msg.center.message.domain.dto.MessageTemplateDTO;
import cn.axzo.msg.center.message.domain.dto.MessageTemplateRouterDTO;
@ -178,7 +179,7 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
}
@Override
public Page<PendingMessageResponse> pageQuery(PendingMessagePageRequest request) {
public AnalysisPage<PendingMessageResponse> pageQuery(PendingMessagePageRequest request) {
PersonDTO operator = PersonDTO.from(request.getPersonId(), request.getIdentityId(), request.getIdentityType());
PendingMessageStateEnum pendingMessageState = fetchPendingMessageState(request.getRoleCategory(), request.getMsgState());
BizFinalStateEnum bizFinalState = fetchBizFinalState(request.getRoleCategory(), request.getBizFinalState());
@ -189,8 +190,9 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
.eq(PendingMessageRecord::getIsDelete, IsDeletedEnum.NO.getCode())
.eq(Objects.nonNull(request.getWorkspaceId()), PendingMessageRecord::getOrgId, request.getWorkspaceId());
// REQ-1507期发起人不通过ouId过滤, 只有执行人对ouId进行过滤
List<Long> determinedOuIds = Collections.emptyList();
if (request.determineRoleCategory() == PendingMessageRoleCategoryEnum.EXECUTOR) {
appendExecutorOuIdExpr(query, request.getOuId());
determinedOuIds = appendExecutorOuIdExpr(query, request.getOuId());
}
if (StringUtils.isNotBlank(request.getTitle())) {
query.and(v -> v.like(PendingMessageRecord::getTitle, request.getTitle())
@ -204,7 +206,7 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
if (CollectionUtils.isEmpty(templateCodes)) {
// 如果该分类未关联任何模板直接返回空集合
log.info("there is not any template matched... appTerminal:[{}]", request.getAppTerminalType());
return PageHelperUtil.emptyPage(request.getPage(), request.getPageSize());
return AnalysisPage.emptyPage(request.getPage(), request.getPageSize());
}
query.in(PendingMessageRecord::getTemplateCode, templateCodes);
// query.groupBy(PendingMessageRecord::getTemplateCode,PendingMessageRecord::getBizCode);
@ -220,10 +222,21 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
.collect(Collectors.toList());
AnalysisPage<PendingMessageResponse> resultPage = analysisPageFactory
.createPage(request.getPage(), request.getPageSize(), page.getTotal(), responseRecords);
resultPage.addAnalysis("ouId=" + request.getOuId());
resultPage.addAnalysis("templateCodes=" + templateCodes);
resultPage.addAnalysis("personId=" + request.getPersonId());
resultPage.addAnalysis("operator=" + operator);
if (resultPage.isEnableAnalysis() && StringUtils.isNotBlank(request.getFetchTemplateCode())) {
List<PendingMessageRecord> templateMessages = pendingMessageRecordMapper.selectList(
Queries.query(PendingMessageRecord.class)
.eq(PendingMessageRecord::getTemplateCode, request.getFetchTemplateCode())
.eq(PendingMessageRecord::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.orderByDesc(PendingMessageRecord::getId)
.last("LIMIT " + request.getFetchLimit()));
resultPage.addAnalysis("fetchedTemplateMessages", templateMessages);
}
resultPage.addAnalysis("templateCodes", templateCodes);
resultPage.addAnalysis("personId", request.getPersonId());
resultPage.addAnalysis("operator", operator);
resultPage.addAnalysis("ouId", request.getOuId());
resultPage.addAnalysis("determinedOuIds", determinedOuIds);
resultPage.addAnalysis("request", request);
return resultPage;
}
@ -855,15 +868,16 @@ public class PendingMessageNewServiceImpl implements PendingMessageNewService {
});
}
private void appendExecutorOuIdExpr(LambdaQueryChainWrapper<PendingMessageRecord> query, Long ouId) {
private List<Long> appendExecutorOuIdExpr(LambdaQueryChainWrapper<PendingMessageRecord> query, Long ouId) {
List<Long> ouIds = determineOuIds(ouId);
if (ouIds.isEmpty()) return;
if (ouIds.isEmpty()) return Collections.emptyList();
query.and(expr -> expr
// 查询ouId下面所有的平台班组id当成ouId
.in(!ouIds.isEmpty(), PendingMessageRecord::getOuId, ouIds)
.or()
// 或者 ouId = 0 的数据
.eq(PendingMessageRecord::getOuId, 0));
return ouIds;
}
private List<Long> determineOuIds(Long ouId) {

View File

@ -16,6 +16,7 @@ import cn.axzo.msg.center.service.pending.request.PendingMessageStatisticRequest
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;
@ -71,7 +72,7 @@ public interface PendingMessageClient {
* @return 代办列表
*/
@PostMapping(value = "/pending-message/record/page", produces = {MediaType.APPLICATION_JSON_VALUE})
CommonResponse<Page<PendingMessageResponse>> pageQuery(@RequestBody @Valid PendingMessagePageRequest request);
CommonResponse<AnalysisPage<PendingMessageResponse>> pageQuery(@RequestBody @Valid PendingMessagePageRequest request);
/**
* 指定几种代办模型列表分页查询

View File

@ -105,6 +105,10 @@ public class PendingMessagePageRequest extends PageRequest implements Serializab
*/
private Collection<QueryOrderByDTO> orderFields;
// !! 用于排查问题
private String fetchTemplateCode;
private int fetchLimit = 5;
public PendingMessageRoleCategoryEnum determineRoleCategory() {
return roleCategory != null ? roleCategory : PendingMessageRoleCategoryEnum.EXECUTOR;
}

View File

@ -5,16 +5,17 @@ import lombok.Getter;
import lombok.Setter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/**
* @author yanglin
*/
@Setter
@Getter
public class AnalysisPage<T> extends Page<T> {
private List<String> analysis = new ArrayList<>();
private TreeMap<String, Object> analysis = new TreeMap<>();
private boolean enableAnalysis;
public AnalysisPage() {
@ -24,13 +25,50 @@ public class AnalysisPage<T> extends Page<T> {
super(pageNum, pageSize, totalElements, list);
}
public static <T> Page<T> toPage(Long pageNum, Long pageSize, Long totalCount, List<T> list) {
public static <T> AnalysisPage<T> toPage(Long pageNum, Long pageSize, Long totalCount, List<T> list) {
return new AnalysisPage<>(pageNum, pageSize, totalCount, list);
}
public void addAnalysis(String something) {
public static <T> AnalysisPage<T> emptyPage(Long pageNum, Long pageSize) {
return toPage(pageNum, pageSize, 0L, Collections.emptyList());
}
public AnalysisPage<T> copy() {
AnalysisPage<T> copy = new AnalysisPage<>();
copy.setPageNum(getPageNum());
copy.setPageSize(getPageSize());
copy.setTotalElements(getTotalElements());
copy.setList(new ArrayList<>(getList()));
copy.setEnableAnalysis(enableAnalysis);
copy.addAnalysis(analysis);
return copy;
}
public void addAnalysis(Map<String, Object> analysis) {
if (enableAnalysis) {
analysis.add(something);
this.analysis.putAll(analysis);
}
}
public void addAnalysis(String key, Object value) {
if (enableAnalysis) {
analysis.put(key, value);
}
}
public TreeMap<String, Object> getAnalysis() {
return analysis;
}
public void setAnalysis(TreeMap<String, Object> analysis) {
this.analysis = analysis;
}
public boolean isEnableAnalysis() {
return enableAnalysis;
}
public void setEnableAnalysis(boolean enableAnalysis) {
this.enableAnalysis = enableAnalysis;
}
}

View File

@ -61,10 +61,6 @@ public class MessageRecordDao extends
public void readMsg(InsideCmsReadMsgReq req,
Long personId, Long identityId) {
lambdaUpdate().set(MessageRecord::getState, MsgStateEnum.HAVE_READ)
.and(i -> i.and(
a -> a.eq(MessageRecord::getPersonId, personId).eq(MessageRecord::getReceiveType,
ReceiveTypeEnum.NOT_IDENTITY)).or()
.eq(MessageRecord::getToId, identityId))
.eq(MessageRecord::getIsDelete, 0L)
.eq(req.getMsgId() != -1L, MessageRecord::getId, req.getMsgId())
.eq(MessageRecord::getType, MsgTypeEnum.GENERAL_MESSAGE)
@ -72,9 +68,9 @@ public class MessageRecordDao extends
}
public void readAllMsg(InsideCmsReadMsgReq req, Long personId, Long identityId) {
List<MessageRecord> list = this.lambdaQuery().and(i -> i.and(
a -> a.eq(MessageRecord::getPersonId, personId).eq(MessageRecord::getReceiveType,
ReceiveTypeEnum.NOT_IDENTITY)).or()
List<MessageRecord> list = this.lambdaQuery()
.and(nested -> nested.eq(MessageRecord::getPersonId, personId)
.or()
.eq(MessageRecord::getToId, identityId))
.eq(MessageRecord::getIsDelete, 0L)
.eq(MessageRecord::getType, MsgTypeEnum.GENERAL_MESSAGE)

View File

@ -0,0 +1,35 @@
package cn.axzo.msg.center.inside.notices.service;
import cn.axzo.msg.center.MsgCenterApplication;
import cn.axzo.msg.center.api.enums.BizTypeEnum;
import cn.axzo.msg.center.api.request.CmsReadMsgReq;
import lombok.RequiredArgsConstructor;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.annotation.Commit;
import static org.junit.jupiter.api.Assertions.*;
/**
* @author yanglin
*/
@SpringBootTest(classes = MsgCenterApplication.class)
@RequiredArgsConstructor(onConstructor_ = @Autowired)
class MessageRecordServiceTest {
private final MessageRecordService messageRecordService;
@Test
@Commit
void foo() {
// CmsReadMsgReq(msgId=1790536, personId=9000399060, identityId=2004201, bizTypeEnum=CONSTRUCTION)
CmsReadMsgReq req = new CmsReadMsgReq();
req.setMsgId(1790536L);
req.setPersonId(9000399060L);
req.setPersonId(2004201L);
req.setBizTypeEnum(BizTypeEnum.CONSTRUCTION);
messageRecordService.updateReadMsgStatus(req);
}
}

View File

@ -18,9 +18,58 @@ class PendingMessageNewServiceTest {
private final PendingMessageNewService pendingMessageNewService;
@Test
@Commit
void foo() {
String str = "{\"bizCategory\":\"OTHER\",\"bizCode\":\"200000700321808\",\"bizExtParams\":\"{\\\"teamLeaderName\\\":\\\"袁均清\\\"}\",\"executor\":[{\"id\":16562,\"identity\":{\"id\":0,\"type\":\"NOT_SUPPORT\",\"valid\":true},\"name\":\"马元猛\",\"valid\":true},{\"id\":16563,\"identity\":{\"id\":0,\"type\":\"NOT_SUPPORT\",\"valid\":true},\"name\":\"辛宁\",\"valid\":true}],\"orgType\":\"PROJECT\",\"ouId\":6066,\"promoter\":{\"id\":16444,\"identity\":{\"id\":2004889,\"type\":\"PRACTITIONER\",\"valid\":true},\"name\":\"袁均清\",\"valid\":true},\"routerParams\":\"{\\\"acceptanceNo\\\":\\\"700013411\\\",\\\"status\\\":\\\"1\\\"}\",\"templateCode\":\"52ae3e8ec48242e485e9389202e102ce\",\"workspaceId\":375}";
String str = "{\n" +
" \"bizCategory\": \"OTHER\",\n" +
" \"bizCode\": \"200000500324319\",\n" +
" \"bizExtParams\": \"{\\\"teamLeaderName\\\":\\\"罗顺江\\\"}\",\n" +
" \"executor\": [\n" +
" {\n" +
" \"id\": 22373,\n" +
" \"identity\": {\n" +
" \"id\": 0,\n" +
" \"type\": \"NOT_SUPPORT\",\n" +
" \"valid\": true\n" +
" },\n" +
" \"name\": \"阮新宇\",\n" +
" \"valid\": true\n" +
" },\n" +
" {\n" +
" \"id\": 3549,\n" +
" \"identity\": {\n" +
" \"id\": 0,\n" +
" \"type\": \"NOT_SUPPORT\",\n" +
" \"valid\": true\n" +
" },\n" +
" \"name\": \"张苏秦\",\n" +
" \"valid\": true\n" +
" },\n" +
" {\n" +
" \"id\": 3470,\n" +
" \"identity\": {\n" +
" \"id\": 0,\n" +
" \"type\": \"NOT_SUPPORT\",\n" +
" \"valid\": true\n" +
" },\n" +
" \"name\": \"皮俊\",\n" +
" \"valid\": true\n" +
" }\n" +
" ],\n" +
" \"orgType\": \"PROJECT\",\n" +
" \"ouId\": 5425,\n" +
" \"promoter\": {\n" +
" \"id\": 59242,\n" +
" \"identity\": {\n" +
" \"type\": \"NOT_SUPPORT\",\n" +
" \"valid\": false\n" +
" },\n" +
" \"name\": \"罗顺江\",\n" +
" \"valid\": false\n" +
" },\n" +
" \"routerParams\": \"{\\\"ouId\\\":\\\"5425\\\",\\\"acceptanceNo\\\":\\\"500015004\\\",\\\"status\\\":\\\"5\\\",\\\"workspaceId\\\":\\\"272\\\"}\",\n" +
" \"templateCode\": \"52ae3e8ec48242e485e9389202e102ce\",\n" +
" \"workspaceId\": 272\n" +
"}";
PendingMessagePushParam param = JSON.parseObject(str, PendingMessagePushParam.class);
pendingMessageNewService.push(param);
}