feat: 业务事件管理接口实现
This commit is contained in:
parent
2eee05b990
commit
9488b856ff
@ -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();
|
||||
}
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
@ -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);
|
||||
}
|
||||
@ -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()));
|
||||
}
|
||||
}
|
||||
@ -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> {
|
||||
}
|
||||
@ -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> {
|
||||
|
||||
}
|
||||
@ -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];
|
||||
}
|
||||
}
|
||||
@ -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"));
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user