feat(message): 添加消息模板功能模块

- 新增 MessageTemplateController 提供 REST API 接口
- 定义 MessageTemplateServiceI 接口及其实现类
- 创建消息模板相关的 DTO 类 (CreateCmd、UpdateCmd、DestroyCmd、Qry、VO)
- 添加消息模板分类和场景枚举类
- 实现消息模板的数据访问层和业务逻辑层
- 集成 MyBatis-Plus 进行数据库操作
- 添加 MapStruct 映射转换器处理对象转换
This commit is contained in:
shenyifei 2026-01-15 09:00:54 +08:00
parent e02645531a
commit 8121f5cc5b
26 changed files with 1044 additions and 0 deletions

View File

@ -0,0 +1,79 @@
package com.xunhong.erp.turbo.admin.controller;
import cn.dev33.satoken.annotation.SaCheckLogin;
import com.alibaba.cola.dto.MultiResponse;
import com.alibaba.cola.dto.PageResponse;
import com.alibaba.cola.dto.Response;
import com.alibaba.cola.dto.SingleResponse;
import com.xunhong.erp.turbo.api.biz.api.MessageTemplateServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplatePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.base.dto.PageDTO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* @author shenyifei
*/
@Tag(name = "MessageTemplate", description = "消息模板管理")
@RestController("operationMessageTemplateController")
@RequestMapping(value = "/operation")
@RequiredArgsConstructor
public class MessageTemplateController {
@DubboReference(version = "1.0.0")
private final MessageTemplateServiceI messageTemplateService;
@SaCheckLogin
@GetMapping("listMessageTemplate")
@Operation(summary = "消息模板列表", method = "GET")
public MultiResponse<MessageTemplateVO> listMessageTemplate(@ModelAttribute @Validated MessageTemplateListQry messageTemplateListQry) {
return MultiResponse.of(messageTemplateService.list(messageTemplateListQry));
}
@SaCheckLogin
@PostMapping("createMessageTemplate")
@Operation(summary = "创建消息模板", method = "POST")
public SingleResponse<MessageTemplateVO> createMessageTemplate(@RequestBody @Validated MessageTemplateCreateCmd messageTemplateCreateCmd) {
return SingleResponse.of(messageTemplateService.create(messageTemplateCreateCmd));
}
@SaCheckLogin
@GetMapping("showMessageTemplate")
@Operation(summary = "消息模板详情", method = "GET")
public SingleResponse<MessageTemplateVO> showMessageTemplate(@ModelAttribute @Validated MessageTemplateShowQry messageTemplateShowQry) {
return SingleResponse.of(messageTemplateService.show(messageTemplateShowQry));
}
@SaCheckLogin
@GetMapping("pageMessageTemplate")
@Operation(summary = "消息模板列表", method = "GET")
public PageResponse<MessageTemplateVO> pageMessageTemplate(@ModelAttribute @Validated MessageTemplatePageQry messageTemplatePageQry) {
PageDTO<MessageTemplateVO> page = messageTemplateService.page(messageTemplatePageQry);
return PageResponse.of(page.getRecords(), (int) page.getTotal(), (int) page.getSize(), (int) page.getCurrent());
}
@SaCheckLogin
@RequestMapping(value = "updateMessageTemplate", method = {RequestMethod.PATCH, RequestMethod.PUT})
@Operation(summary = "消息模板更新", method = "PATCH")
public SingleResponse<MessageTemplateVO> updateMessageTemplate(@RequestBody @Validated MessageTemplateUpdateCmd messageTemplateUpdateCmd) {
return SingleResponse.of(messageTemplateService.update(messageTemplateUpdateCmd));
}
@SaCheckLogin
@DeleteMapping("destroyMessageTemplate")
@Operation(summary = "消息模板删除", method = "DELETE")
public Response destroyMessageTemplate(@RequestBody @Validated MessageTemplateDestroyCmd messageTemplateDestroyCmd) {
messageTemplateService.destroy(messageTemplateDestroyCmd);
return Response.buildSuccess();
}
}

View File

@ -0,0 +1,15 @@
package com.xunhong.erp.turbo.biz.app.assembler;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import org.mapstruct.Mapper;
import org.mapstruct.NullValueCheckStrategy;
/**
* @author shenyifei
*/
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface MessageTemplateAssembler {
MessageTemplateVO toMessageTemplateVO(MessageTemplate messageTemplate);
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.biz.app.assembler.MessageTemplateAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import com.xunhong.erp.turbo.biz.domain.gateway.MessageTemplateGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class MessageTemplateCreateCmdExe {
private final MessageTemplateAssembler messageTemplateAssembler;
private final MessageTemplateGateway messageTemplateGateway;
public MessageTemplateVO execute(MessageTemplateCreateCmd messageTemplateCreateCmd) {
MessageTemplate messageTemplate = messageTemplateGateway.save(messageTemplateCreateCmd);
return messageTemplateAssembler.toMessageTemplateVO(messageTemplate);
}
}

View File

@ -0,0 +1,22 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateDestroyCmd;
import com.xunhong.erp.turbo.biz.domain.gateway.MessageTemplateGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class MessageTemplateDestroyCmdExe {
private final MessageTemplateGateway messageTemplateGateway;
public void execute(MessageTemplateDestroyCmd messageTemplateDestroyCmd) {
messageTemplateGateway.destroy(messageTemplateDestroyCmd);
}
}

View File

@ -0,0 +1,27 @@
package com.xunhong.erp.turbo.biz.app.executor.cmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.biz.app.assembler.MessageTemplateAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import com.xunhong.erp.turbo.biz.domain.gateway.MessageTemplateGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class MessageTemplateUpdateCmdExe {
private final MessageTemplateAssembler messageTemplateAssembler;
private final MessageTemplateGateway messageTemplateGateway;
public MessageTemplateVO execute(MessageTemplateUpdateCmd messageTemplateUpdateCmd) {
MessageTemplate messageTemplate = messageTemplateGateway.update(messageTemplateUpdateCmd);
return messageTemplateAssembler.toMessageTemplateVO(messageTemplate);
}
}

View File

@ -0,0 +1,30 @@
package com.xunhong.erp.turbo.biz.app.executor.query;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateListQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.biz.app.assembler.MessageTemplateAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import com.xunhong.erp.turbo.biz.domain.gateway.MessageTemplateGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class MessageTemplateListQryExe {
private final MessageTemplateGateway messageTemplateGateway;
private final MessageTemplateAssembler messageTemplateAssembler;
public List<MessageTemplateVO> execute(MessageTemplateListQry messageTemplateListQry) {
List<MessageTemplate> messageTemplateList = messageTemplateGateway.list(messageTemplateListQry);
return messageTemplateList.stream().map(messageTemplateAssembler::toMessageTemplateVO).toList();
}
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.query;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplatePageQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.biz.app.assembler.MessageTemplateAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import com.xunhong.erp.turbo.biz.domain.gateway.MessageTemplateGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class MessageTemplatePageQryExe {
private final MessageTemplateGateway messageTemplateGateway;
private final MessageTemplateAssembler messageTemplateAssembler;
public IPage<MessageTemplateVO> execute(MessageTemplatePageQry messageTemplatePageQry) {
IPage<MessageTemplate> page = messageTemplateGateway.page(messageTemplatePageQry);
return page.convert(messageTemplateAssembler::toMessageTemplateVO);
}
}

View File

@ -0,0 +1,29 @@
package com.xunhong.erp.turbo.biz.app.executor.query;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.biz.app.assembler.MessageTemplateAssembler;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import com.xunhong.erp.turbo.biz.domain.gateway.MessageTemplateGateway;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author shenyifei
*/
@Slf4j
@Component
@RequiredArgsConstructor
public class MessageTemplateShowQryExe {
private final MessageTemplateAssembler messageTemplateAssembler;
private final MessageTemplateGateway messageTemplateGateway;
public MessageTemplateVO execute(MessageTemplateShowQry messageTemplateShowQry) {
MessageTemplate messageTemplate = messageTemplateGateway.show(messageTemplateShowQry);
return messageTemplateAssembler.toMessageTemplateVO(messageTemplate);
}
}

View File

@ -0,0 +1,71 @@
package com.xunhong.erp.turbo.biz.app.service;
import com.xunhong.erp.turbo.api.biz.api.MessageTemplateServiceI;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplatePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.base.dto.PageDTO;
import com.xunhong.erp.turbo.biz.app.executor.cmd.MessageTemplateCreateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.MessageTemplateDestroyCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.cmd.MessageTemplateUpdateCmdExe;
import com.xunhong.erp.turbo.biz.app.executor.query.MessageTemplateListQryExe;
import com.xunhong.erp.turbo.biz.app.executor.query.MessageTemplatePageQryExe;
import com.xunhong.erp.turbo.biz.app.executor.query.MessageTemplateShowQryExe;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author shenyifei
*/
@Slf4j
@Service
@DubboService(interfaceClass = MessageTemplateServiceI.class, version = "1.0.0")
@RequiredArgsConstructor
public class MessageTemplateServiceImpl implements MessageTemplateServiceI {
private final MessageTemplateCreateCmdExe messageTemplateCreateCmdExe;
private final MessageTemplateUpdateCmdExe messageTemplateUpdateCmdExe;
private final MessageTemplatePageQryExe messageTemplatePageQryExe;
private final MessageTemplateListQryExe messageTemplateListQryExe;
private final MessageTemplateShowQryExe messageTemplateShowQryExe;
private final MessageTemplateDestroyCmdExe messageTemplateDestroyCmdExe;
@Override
public MessageTemplateVO create(MessageTemplateCreateCmd messageTemplateCreateCmd) {
return messageTemplateCreateCmdExe.execute(messageTemplateCreateCmd);
}
@Override
public PageDTO<MessageTemplateVO> page(MessageTemplatePageQry messageTemplatePageQry) {
return PageDTO.of(messageTemplatePageQryExe.execute(messageTemplatePageQry));
}
@Override
public List<MessageTemplateVO> list(MessageTemplateListQry messageTemplateListQry) {
return messageTemplateListQryExe.execute(messageTemplateListQry);
}
@Override
public MessageTemplateVO update(MessageTemplateUpdateCmd messageTemplateUpdateCmd) {
return messageTemplateUpdateCmdExe.execute(messageTemplateUpdateCmd);
}
@Override
public MessageTemplateVO show(MessageTemplateShowQry messageTemplateShowQry) {
return messageTemplateShowQryExe.execute(messageTemplateShowQry);
}
@Override
public void destroy(MessageTemplateDestroyCmd messageTemplateDestroyCmd) {
messageTemplateDestroyCmdExe.execute(messageTemplateDestroyCmd);
}
}

View File

@ -0,0 +1,77 @@
package com.xunhong.erp.turbo.biz.domain.entity;
import com.alibaba.cola.domain.Entity;
import com.alibaba.cola.dto.DTO;
import com.xunhong.erp.turbo.api.biz.dto.enums.MessageTemplateCategoryEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.MessageTemplateSceneEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@Entity
@EqualsAndHashCode(callSuper = true)
public class MessageTemplate extends DTO {
/**
* 模板ID
*/
private Long messageTemplateId;
/**
* 模板分类1_采购单消息模板
*/
private MessageTemplateCategoryEnum templateCategory;
/**
* 触发场景1_待审核2_待审批3_审批通过4_审核驳回5_审批驳回
*/
private MessageTemplateSceneEnum templateScene;
/**
* 模板标题
*/
private String titleTemplate;
/**
* 内容模板
*/
private String contentTemplate;
/**
* 模板描述
*/
private String description;
/**
* 模板变量定义
*/
private String variables;
/**
* 通知角色
*/
private List<Long> roleIds;
/**
* 备注
*/
private String remark;
/**
* 状态1_启用0_禁用
*/
private Boolean status;
/**
* 创建时间
*/
private LocalDateTime createdAt;
}

View File

@ -0,0 +1,30 @@
package com.xunhong.erp.turbo.biz.domain.gateway;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplatePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import java.util.List;
/**
* @author shenyifei
*/
public interface MessageTemplateGateway {
MessageTemplate save(MessageTemplateCreateCmd messageTemplateCreateCmd);
IPage<MessageTemplate> page(MessageTemplatePageQry messageTemplatePageQry);
List<MessageTemplate> list(MessageTemplateListQry messageTemplateListQry);
MessageTemplate update(MessageTemplateUpdateCmd messageTemplateUpdateCmd);
MessageTemplate show(MessageTemplateShowQry messageTemplateShowQry);
void destroy(MessageTemplateDestroyCmd messageTemplateDestroyCmd);
}

View File

@ -0,0 +1,32 @@
package com.xunhong.erp.turbo.biz.infrastructure.convert;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateUpdateCmd;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import com.xunhong.erp.turbo.biz.infrastructure.entity.MessageTemplateDO;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.MappingTarget;
import org.mapstruct.NullValueCheckStrategy;
/**
* @author shenyifei
*/
@Mapper(componentModel = "spring", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
public interface MessageTemplateConvert {
MessageTemplate toMessageTemplate(MessageTemplateDO messageTemplateDO);
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
MessageTemplateDO toMessageTemplateDO(MessageTemplateCreateCmd messageTemplateCreateCmd);
@Mapping(target = "version", ignore = true)
@Mapping(target = "updatedAt", ignore = true)
@Mapping(target = "isDelete", ignore = true)
@Mapping(target = "createdAt", ignore = true)
void toMessageTemplateDO(@MappingTarget MessageTemplateDO messageTemplateDO, MessageTemplateUpdateCmd messageTemplateUpdateCmd);
}

View File

@ -0,0 +1,85 @@
package com.xunhong.erp.turbo.biz.infrastructure.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.xunhong.erp.turbo.api.biz.dto.enums.MessageTemplateCategoryEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.MessageTemplateSceneEnum;
import com.xunhong.erp.turbo.datasource.domain.entity.BaseDO;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@TableName(value = "message_template", autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
public class MessageTemplateDO extends BaseDO<MessageTemplateDO> {
/**
* 模板ID
*/
@TableId(value = "message_template_id", type = IdType.ASSIGN_ID)
private Long messageTemplateId;
/**
* 模板分类1_采购单消息模板
*/
@TableField(value = "template_category")
private MessageTemplateCategoryEnum templateCategory;
/**
* 触发场景1_待审核2_待审批3_审批通过4_审核驳回5_审批驳回
*/
@TableField(value = "template_scene")
private MessageTemplateSceneEnum templateScene;
/**
* 模板标题
*/
@TableField(value = "title_template")
private String titleTemplate;
/**
* 内容模板
*/
@TableField(value = "content_template")
private String contentTemplate;
/**
* 模板描述
*/
@TableField(value = "description")
private String description;
/**
* 模板变量定义
*/
@TableField(value = "variables")
private String variables;
/**
* 通知角色
*/
@TableField(value = "role_ids", typeHandler = JacksonTypeHandler.class)
private List<Long> roleIds;
/**
* 备注
*/
@TableField(value = "remark")
private String remark;
/**
* 状态1_启用0_禁用
*/
@TableField(value = "status")
private Boolean status;
}

View File

@ -0,0 +1,92 @@
package com.xunhong.erp.turbo.biz.infrastructure.gateway;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplatePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateShowQry;
import com.xunhong.erp.turbo.biz.domain.entity.MessageTemplate;
import com.xunhong.erp.turbo.biz.domain.gateway.MessageTemplateGateway;
import com.xunhong.erp.turbo.biz.infrastructure.convert.MessageTemplateConvert;
import com.xunhong.erp.turbo.biz.infrastructure.entity.MessageTemplateDO;
import com.xunhong.erp.turbo.biz.infrastructure.mapper.MessageTemplateMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import java.util.List;
/**
* @author shenyifei
*/
@Repository
@RequiredArgsConstructor
public class MessageTemplateGatewayImpl implements MessageTemplateGateway {
private final MessageTemplateMapper messageTemplateMapper;
private final MessageTemplateConvert messageTemplateConvert;
@Override
public MessageTemplate save(MessageTemplateCreateCmd messageTemplateCreateCmd) {
MessageTemplateDO messageTemplateDO = messageTemplateConvert.toMessageTemplateDO(messageTemplateCreateCmd);
messageTemplateMapper.insert(messageTemplateDO);
return messageTemplateConvert.toMessageTemplate(messageTemplateDO);
}
@Override
public IPage<MessageTemplate> page(MessageTemplatePageQry messageTemplatePageQry) {
LambdaQueryWrapper<MessageTemplateDO> queryWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class);
queryWrapper.orderByDesc(MessageTemplateDO::getCreatedAt);
IPage<MessageTemplateDO> page = new Page<>(messageTemplatePageQry.getPageIndex(), messageTemplatePageQry.getPageSize());
page = messageTemplateMapper.selectPage(page, queryWrapper);
return page.convert(messageTemplateConvert::toMessageTemplate);
}
@Override
public List<MessageTemplate> list(MessageTemplateListQry messageTemplateListQry) {
LambdaQueryWrapper<MessageTemplateDO> queryWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class);
List<MessageTemplateDO> messageTemplateDOList = messageTemplateMapper.selectList(queryWrapper);
return messageTemplateDOList.stream().map(messageTemplateConvert::toMessageTemplate).toList();
}
@Override
public MessageTemplate update(MessageTemplateUpdateCmd messageTemplateUpdateCmd) {
LambdaQueryWrapper<MessageTemplateDO> queryWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class);
queryWrapper.eq(MessageTemplateDO::getMessageTemplateId, messageTemplateUpdateCmd.getMessageTemplateId());
queryWrapper.last("limit 1");
MessageTemplateDO messageTemplateDO = messageTemplateMapper.selectOne(queryWrapper);
messageTemplateConvert.toMessageTemplateDO(messageTemplateDO, messageTemplateUpdateCmd);
messageTemplateMapper.updateById(messageTemplateDO);
return messageTemplateConvert.toMessageTemplate(messageTemplateDO);
}
@Override
public MessageTemplate show(MessageTemplateShowQry messageTemplateShowQry) {
LambdaQueryWrapper<MessageTemplateDO> queryWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class);
queryWrapper.eq(MessageTemplateDO::getMessageTemplateId, messageTemplateShowQry.getMessageTemplateId());
queryWrapper.last("limit 1");
MessageTemplateDO messageTemplateDO = messageTemplateMapper.selectOne(queryWrapper);
return messageTemplateConvert.toMessageTemplate(messageTemplateDO);
}
@Override
public void destroy(MessageTemplateDestroyCmd messageTemplateDestroyCmd) {
LambdaQueryWrapper<MessageTemplateDO> queryWrapper = Wrappers.lambdaQuery(MessageTemplateDO.class);
queryWrapper.eq(MessageTemplateDO::getMessageTemplateId, messageTemplateDestroyCmd.getMessageTemplateId());
queryWrapper.last("limit 1");
MessageTemplateDO messageTemplateDO = messageTemplateMapper.selectOne(queryWrapper);
messageTemplateDO.deleteById();
}
}

View File

@ -0,0 +1,13 @@
package com.xunhong.erp.turbo.biz.infrastructure.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xunhong.erp.turbo.biz.infrastructure.entity.MessageTemplateDO;
import org.apache.ibatis.annotations.Mapper;
/**
* @author shenyifei
*/
@Mapper
public interface MessageTemplateMapper extends BaseMapper<MessageTemplateDO> {
}

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper
namespace="com.xunhong.erp.turbo.biz.infrastructure.mapper.MessageTemplateMapper">
<resultMap id="BaseResultMap"
type="com.xunhong.erp.turbo.biz.infrastructure.entity.MessageTemplateDO">
<result property="messageTemplateId" column="message_template_id"/>
<result property="templateCategory" column="template_category"/>
<result property="templateScene" column="template_scene"/>
<result property="titleTemplate" column="title_template"/>
<result property="contentTemplate" column="content_template"/>
<result property="description" column="description"/>
<result property="variables" column="variables"/>
<result property="roleIds" column="role_ids"
typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler"/>
<result property="remark" column="remark"/>
<result property="status" column="status"/>
<result property="createdAt" column="created_at"/>
<result property="createdAt" column="created_at"/>
<result property="updatedAt" column="updated_at"/>
<result property="isDelete" column="is_delete"/>
<result property="version" column="version"/>
</resultMap>
</mapper>

View File

@ -0,0 +1,30 @@
package com.xunhong.erp.turbo.api.biz.api;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateCreateCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateDestroyCmd;
import com.xunhong.erp.turbo.api.biz.dto.cmd.MessageTemplateUpdateCmd;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateListQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplatePageQry;
import com.xunhong.erp.turbo.api.biz.dto.qry.MessageTemplateShowQry;
import com.xunhong.erp.turbo.api.biz.dto.vo.MessageTemplateVO;
import com.xunhong.erp.turbo.base.dto.PageDTO;
import java.util.List;
/**
* @author shenyifei
*/
public interface MessageTemplateServiceI {
MessageTemplateVO create(MessageTemplateCreateCmd messageTemplateCreateCmd);
PageDTO<MessageTemplateVO> page(MessageTemplatePageQry messageTemplatePageQry);
List<MessageTemplateVO> list(MessageTemplateListQry messageTemplateListQry);
MessageTemplateVO update(MessageTemplateUpdateCmd messageTemplateUpdateCmd);
MessageTemplateVO show(MessageTemplateShowQry messageTemplateShowQry);
void destroy(MessageTemplateDestroyCmd messageTemplateDestroyCmd);
}

View File

@ -0,0 +1,88 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.api.biz.dto.enums.MessageTemplateCategoryEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.MessageTemplateSceneEnum;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@Schema(title = "消息模板创建")
@EqualsAndHashCode(callSuper = true)
public class MessageTemplateCreateCmd extends Command {
/**
* 模板ID
*/
@Schema(title = "模板ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long messageTemplateId;
/**
* 模板分类1_采购单消息模板
*/
@Schema(title = "模板分类1_采购单消息模板", requiredMode = Schema.RequiredMode.REQUIRED)
private MessageTemplateCategoryEnum templateCategory;
/**
* 触发场景1_待审核2_待审批3_审批通过4_审核驳回5_审批驳回
*/
@Schema(title = "触发场景1_待审核2_待审批3_审批通过4_审核驳回5_审批驳回", requiredMode = Schema.RequiredMode.REQUIRED)
private MessageTemplateSceneEnum templateScene;
/**
* 模板标题
*/
@Schema(title = "模板标题")
private String titleTemplate;
/**
* 内容模板
*/
@Schema(title = "内容模板")
private String contentTemplate;
/**
* 模板描述
*/
@Schema(title = "模板描述")
private String description;
/**
* 模板变量定义
*/
@Schema(title = "模板变量定义")
private String variables;
/**
* 通知角色
*/
@Schema(title = "通知角色")
private List<Long> roleIds;
/**
* 备注
*/
@Schema(title = "备注")
private String remark;
/**
* 状态1_启用0_禁用
*/
@Schema(title = "状态1_启用0_禁用", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean status;
/**
* 创建时间
*/
@Schema(title = "创建时间")
private LocalDateTime createdAt;
}

View File

@ -0,0 +1,19 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import com.xunhong.erp.turbo.base.dto.Command;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "删除消息模板")
@EqualsAndHashCode(callSuper = true)
public class MessageTemplateDestroyCmd extends Command {
@Schema(title = "消息模板ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long messageTemplateId;
}

View File

@ -0,0 +1,18 @@
package com.xunhong.erp.turbo.api.biz.dto.cmd;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "消息模板更新")
@EqualsAndHashCode(callSuper = true)
public class MessageTemplateUpdateCmd extends MessageTemplateCreateCmd {
@Schema(title = "消息模板ID", requiredMode = Schema.RequiredMode.REQUIRED, type = "string")
private Long messageTemplateId;
}

View File

@ -0,0 +1,27 @@
package com.xunhong.erp.turbo.api.biz.dto.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 消息模板分类枚举
*
* @author shenyifei
*/
@Getter
@AllArgsConstructor
public enum MessageTemplateCategoryEnum {
/**
* 模板分类1_采购单消息模板
*/
PURCHASE_ORDER_MESSAGE_TEMPLATE(1, "采购单消息模板"),
;
@EnumValue
private final Integer type;
private final String message;
}

View File

@ -0,0 +1,31 @@
package com.xunhong.erp.turbo.api.biz.dto.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 消息模板分类枚举
*
* @author shenyifei
*/
@Getter
@AllArgsConstructor
public enum MessageTemplateSceneEnum {
/**
* 触发场景1_待审核2_待审批3_审批通过4_审核驳回5_审批驳回
*/
WAIT_AUDIT(1, "待审核"),
WAIT_APPROVE(2, "待审批"),
APPROVE_PASS(3, "审批通过"),
AUDIT_REJECT(4, "审核驳回"),
APPROVE_REJECT(5, "审批驳回"),
;
@EnumValue
private final Integer type;
private final String message;
}

View File

@ -0,0 +1,19 @@
package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.base.dto.Query;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "消息模板列表查询")
@EqualsAndHashCode(callSuper = true)
public class MessageTemplateListQry extends Query {
@Schema(title = "消息模板ID", type = "string")
private Long messageTemplateId;
}

View File

@ -0,0 +1,19 @@
package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.base.dto.PageQuery;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "消息模板分页查询")
@EqualsAndHashCode(callSuper = true)
public class MessageTemplatePageQry extends PageQuery {
@Schema(title = "消息模板ID", type = "string")
private Long messageTemplateId;
}

View File

@ -0,0 +1,19 @@
package com.xunhong.erp.turbo.api.biz.dto.qry;
import com.xunhong.erp.turbo.base.dto.Query;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @author shenyifei
*/
@Data
@Schema(title = "消息模板查询")
@EqualsAndHashCode(callSuper = true)
public class MessageTemplateShowQry extends Query {
@Schema(title = "消息模板ID", type = "string")
private Long messageTemplateId;
}

View File

@ -0,0 +1,88 @@
package com.xunhong.erp.turbo.api.biz.dto.vo;
import com.alibaba.cola.dto.DTO;
import com.xunhong.erp.turbo.api.biz.dto.enums.MessageTemplateCategoryEnum;
import com.xunhong.erp.turbo.api.biz.dto.enums.MessageTemplateSceneEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.time.LocalDateTime;
import java.util.List;
/**
* @author shenyifei
*/
@Data
@Schema(title = "消息模板")
@EqualsAndHashCode(callSuper = true)
public class MessageTemplateVO extends DTO {
/**
* 模板ID
*/
@Schema(title = "模板ID", type = "string", requiredMode = Schema.RequiredMode.REQUIRED)
private Long messageTemplateId;
/**
* 模板分类1_采购单消息模板
*/
@Schema(title = "模板分类1_采购单消息模板", requiredMode = Schema.RequiredMode.REQUIRED)
private MessageTemplateCategoryEnum templateCategory;
/**
* 触发场景1_待审核2_待审批3_审批通过4_审核驳回5_审批驳回
*/
@Schema(title = "触发场景1_待审核2_待审批3_审批通过4_审核驳回5_审批驳回", requiredMode = Schema.RequiredMode.REQUIRED)
private MessageTemplateSceneEnum templateScene;
/**
* 模板标题
*/
@Schema(title = "模板标题")
private String titleTemplate;
/**
* 内容模板
*/
@Schema(title = "内容模板")
private String contentTemplate;
/**
* 模板描述
*/
@Schema(title = "模板描述")
private String description;
/**
* 模板变量定义
*/
@Schema(title = "模板变量定义")
private String variables;
/**
* 通知角色
*/
@Schema(title = "通知角色")
private List<Long> roleIds;
/**
* 备注
*/
@Schema(title = "备注")
private String remark;
/**
* 状态1_启用0_禁用
*/
@Schema(title = "状态1_启用0_禁用", requiredMode = Schema.RequiredMode.REQUIRED)
private Boolean status;
/**
* 创建时间
*/
@Schema(title = "创建时间")
private LocalDateTime createdAt;
}