feat: 业务事件管理接口实现

This commit is contained in:
songyuanlun 2023-12-15 14:34:39 +08:00
parent 2eee05b990
commit 9488b856ff
9 changed files with 417 additions and 0 deletions

View File

@ -0,0 +1,59 @@
package cn.axzo.msg.center.message.controller;
import cn.axzo.msg.center.message.domain.param.BizEventMappingQueryParam;
import cn.axzo.msg.center.message.domain.param.BizEventSaveOrUpdateParam;
import cn.axzo.msg.center.message.service.BizEventMappingService;
import cn.axzo.msg.center.service.bizevent.client.BizEventMappingClient;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingCreateRequest;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingPageRequest;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingPageResponse;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingRemoveRequest;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingUpdateRequest;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.json.JSONUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RestController;
/**
* 消息业务事件管理
*
*/
@Slf4j
@RestController
@RequiredArgsConstructor
public class BizEventMappingController implements BizEventMappingClient {
private final BizEventMappingService bizEventMappingService;
@Override
public CommonResponse<String> save(BizEventMappingCreateRequest param) {
log.info("BizEventMappingCreate param= [{}]", JSONUtil.toJsonStr(param));
return CommonResponse.success(bizEventMappingService.create(BeanUtil.copyProperties(param,
BizEventSaveOrUpdateParam.class)));
}
@Override
public CommonResponse<Void> update(BizEventMappingUpdateRequest param) {
log.info("BizEventMappingUpdate param= [{}]", JSONUtil.toJsonStr(param));
bizEventMappingService.update(BeanUtil.copyProperties(param,
BizEventSaveOrUpdateParam.class));
return CommonResponse.success();
}
@Override
public CommonResponse<Page<BizEventMappingPageResponse>> page(
BizEventMappingPageRequest param) {
return CommonResponse.success(bizEventMappingService.page(BeanUtil.copyProperties(param,
BizEventMappingQueryParam.class)));
}
@Override
public CommonResponse<Void> remove(BizEventMappingRemoveRequest param) {
log.info("BizEventMappingRemove param= [{}]", JSONUtil.toJsonStr(param));
bizEventMappingService.remove(param);
return CommonResponse.success();
}
}

View File

@ -0,0 +1,33 @@
package cn.axzo.msg.center.message.domain.param;
import cn.axzo.basics.common.page.PageRequest;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author syl
* @date 2023/12/14
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BizEventMappingQueryParam extends PageRequest {
/**
* 业务名称模糊查询
*/
private String bizNameLike;
/**
* 业务code
*/
private String bizCode;
/**
* 模板编码
*/
private String templateCode;
}

View File

@ -0,0 +1,58 @@
package cn.axzo.msg.center.message.domain.param;
import cn.axzo.msg.center.domain.entity.BizEventMapping;
import cn.axzo.msg.center.service.bizevent.request.ReachDto;
import cn.hutool.core.bean.BeanUtil;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.apache.commons.lang3.BooleanUtils;
/**
* @author syl
* @date 2023/12/14
*/
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class BizEventSaveOrUpdateParam {
/**
* 操作者的自然人id
*/
private Long operatorId;
/**
* 业务事件code
* 尽量保证唯一
*/
private String bizCode;
/**
* 业务事件名称
*/
private String bizName;
/**
* 业务动作配置
*/
private List<ReachDto> reachConfig;
/**
* 是否删除
*/
private Boolean isDelete;
public BizEventMapping convertUpdateEntity(BizEventMapping exist){
BizEventMapping entity = BeanUtil.copyProperties(this, BizEventMapping.class);
entity.setUpdaterId(operatorId);
if (BooleanUtils.isTrue(isDelete)) {
entity.setIsDelete(exist.getId());
}
entity.setId(exist.getId());
return entity;
}
}

View File

@ -0,0 +1,22 @@
package cn.axzo.msg.center.message.service;
import cn.axzo.msg.center.message.domain.param.BizEventMappingQueryParam;
import cn.axzo.msg.center.message.domain.param.BizEventSaveOrUpdateParam;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingPageResponse;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingRemoveRequest;
import cn.azxo.framework.common.model.Page;
/**
* @author syl
* @date 2023/12/14
*/
public interface BizEventMappingService {
String create(BizEventSaveOrUpdateParam param);
void update(BizEventSaveOrUpdateParam param);
Page<BizEventMappingPageResponse> page(BizEventMappingQueryParam param);
void remove(BizEventMappingRemoveRequest param);
}

View File

@ -0,0 +1,128 @@
package cn.axzo.msg.center.message.service.impl;
import cn.axzo.basics.common.util.AssertUtil;
import cn.axzo.msg.center.common.enums.TableIsDeleteEnum;
import cn.axzo.msg.center.common.utils.PageHelperUtil;
import cn.axzo.msg.center.dal.BizEventMappingDao;
import cn.axzo.msg.center.dal.MessageBaseTemplateDao;
import cn.axzo.msg.center.domain.entity.BizEventMapping;
import cn.axzo.msg.center.domain.entity.MessageBaseTemplate;
import cn.axzo.msg.center.domain.enums.BizActionCategory;
import cn.axzo.msg.center.message.domain.param.BizEventMappingQueryParam;
import cn.axzo.msg.center.message.domain.param.BizEventSaveOrUpdateParam;
import cn.axzo.msg.center.message.service.BizEventMappingService;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingPageResponse;
import cn.axzo.msg.center.service.bizevent.request.BizEventMappingRemoveRequest;
import cn.azxo.framework.common.model.Page;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* @author syl
* @date 2023/12/14
*/
@Slf4j
@Service
public class BizEventMappingServiceImpl implements BizEventMappingService {
@Autowired
private BizEventMappingDao bizEventMappingDao;
@Autowired
private MessageBaseTemplateDao messageBaseTemplateDao;
@Override
public String create(BizEventSaveOrUpdateParam param) {
// BizCode校验
checkCreateBizCode(param);
// 消息模板校验
checkTemplateCode(param);
BizEventMapping eventMapping = BizEventMapping.builder()
.bizCode(param.getBizCode())
.bizName(param.getBizName())
.reachConfig(param.getReachConfig())
.creatorId(param.getOperatorId())
.build();
bizEventMappingDao.save(eventMapping);
return eventMapping.getBizCode();
}
private void checkTemplateCode(BizEventSaveOrUpdateParam param) {
param.getReachConfig().forEach(c -> {
BizActionCategory category = BizActionCategory.getCategory(c.getCategory());
Optional<MessageBaseTemplate> templateOpt = messageBaseTemplateDao.lambdaQuery()
.eq(MessageBaseTemplate::getCode, c.getTemplateCode())
.in(MessageBaseTemplate::getMsgCategory, category.getBizCategoryList())
.eq(MessageBaseTemplate::getIsDelete, TableIsDeleteEnum.NORMAL.value)
.oneOpt();
AssertUtil.isTrue(templateOpt.isPresent(), String.format("消息模板code不存在: %s", c.getTemplateCode()));
});
}
private void checkCreateBizCode(BizEventSaveOrUpdateParam param) {
List<BizEventMapping> bizEvents = build(BizEventMappingQueryParam.builder()
.bizCode(param.getBizCode()).build()).list();
AssertUtil.isTrue(CollUtil.isEmpty(bizEvents), "编码code已存在");
}
@Override
public void update(BizEventSaveOrUpdateParam param) {
// BizCode校验
BizEventMapping exist = checkUpdateBizCodeParam(param);
// 消息模板校验
if (CollUtil.isNotEmpty(param.getReachConfig())) {
checkTemplateCode(param);
}
bizEventMappingDao.updateById(param.convertUpdateEntity(exist));
}
private BizEventMapping checkUpdateBizCodeParam(BizEventSaveOrUpdateParam param) {
List<BizEventMapping> bizEvents = build(BizEventMappingQueryParam.builder()
.bizCode(param.getBizCode()).build()).list();
AssertUtil.notEmpty(bizEvents, "编码code不存在");
return bizEvents.stream().findFirst().get();
}
@Override
public Page<BizEventMappingPageResponse> page(BizEventMappingQueryParam param) {
IPage<BizEventMapping> result = build(param).page(param.toPage());
if (Objects.isNull(result) || CollUtil.isEmpty(result.getRecords())) {
return PageHelperUtil.emptyPage(param.getPage(), param.getPageSize());
}
List<BizEventMappingPageResponse> records = BeanUtil.copyToList(result.getRecords(),
BizEventMappingPageResponse.class);
return Page.toPage(param.getPage(), param.getPageSize(), result.getTotal(), records);
}
@Override
public void remove(BizEventMappingRemoveRequest param) {
// BizCode校验
log.info("remove BizEventMapping: bizCode= [{}]", param.getBizCode());
this.update(BizEventSaveOrUpdateParam.builder()
.bizCode(param.getBizCode())
.operatorId(param.getOperatorId())
.isDelete(true).build());
}
public LambdaQueryChainWrapper<BizEventMapping> build(BizEventMappingQueryParam bo) {
return bizEventMappingDao.lambdaQuery()
.eq(StringUtils.isNotBlank(bo.getBizCode()), BizEventMapping::getBizCode,
bo.getBizCode())
.eq(BizEventMapping::getIsDelete, 0)
.and(StringUtils.isNotBlank(bo.getBizNameLike()),
o -> o.like(BizEventMapping::getBizName, bo.getBizNameLike()))
.and(StringUtils.isNotBlank(bo.getTemplateCode()),
w -> w.apply(" JSON_CONTAINS(`reach_config`, JSON_OBJECT('templateCode',{0}))", bo.getTemplateCode()));
}
}

View File

@ -0,0 +1,12 @@
package cn.axzo.msg.center.dal;
import cn.axzo.msg.center.dal.mapper.BizEventMappingMapper;
import cn.axzo.msg.center.domain.entity.BizEventMapping;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class BizEventMappingDao extends ServiceImpl<BizEventMappingMapper, BizEventMapping> {
}

View File

@ -0,0 +1,14 @@
package cn.axzo.msg.center.dal.mapper;
import cn.axzo.msg.center.domain.entity.BizEventMapping;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
* @author syl
* @date 2023/12/14
*/
@Mapper
public interface BizEventMappingMapper extends BaseMapper<BizEventMapping> {
}

View File

@ -0,0 +1,50 @@
package cn.axzo.msg.center.domain.config;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.serializer.SerializerFeature;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public abstract class BaseListTypeHandler<T> extends BaseTypeHandler<List<T>> {
private Class<T> type = getGenericType();
@Override
public void setNonNullParameter(PreparedStatement preparedStatement, int i,
List<T> list, JdbcType jdbcType) throws SQLException {
preparedStatement.setString(i, JSONArray.toJSONString(list, SerializerFeature.WriteMapNullValue,
SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty));
}
@Override
public List<T> getNullableResult(ResultSet resultSet, String s) throws SQLException {
return JSONArray.parseArray(resultSet.getString(s), type);
}
@Override
public List<T> getNullableResult(ResultSet resultSet, int i) throws SQLException {
return JSONArray.parseArray(resultSet.getString(i), type);
}
@Override
public List<T> getNullableResult(CallableStatement callableStatement, int i) throws SQLException {
return JSONArray.parseArray(callableStatement.getString(i), type);
}
private Class<T> getGenericType() {
Type t = getClass().getGenericSuperclass();
Type[] params = ((ParameterizedType) t).getActualTypeArguments();
return (Class<T>) params[0];
}
}

View File

@ -0,0 +1,41 @@
package cn.axzo.msg.center.domain.enums;
import cn.axzo.basics.common.exception.ServiceException;
import cn.axzo.msg.center.service.enums.MessageCategoryEnum;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 业务动作分类
*
* @author syl
* @date 2023/12/14
*/
@Getter
@AllArgsConstructor
public enum BizActionCategory {
/**
* 通知
*/
NOTIFICATION("NOTIFICATION","通知",
Collections.singletonList(MessageCategoryEnum.GENERAL_MESSAGE)),
/**
* 待办
*/
PENDING("PENDING", "待办", Arrays.asList(MessageCategoryEnum.BIZ_PENDING_MESSAGE,
MessageCategoryEnum.APPROVAL_PENDING_MESSAGE)),
;
private final String code;
private final String desc;
private final List<MessageCategoryEnum> bizCategoryList;
public static BizActionCategory getCategory(String code) {
return Arrays.stream(values()).filter(it -> it.getCode().equals(code))
.findFirst()
.orElseThrow(() -> new ServiceException("BizEvent Action is invalid"));
}
}